/* Notes
   Sample program from "Bluetooth Essentials for Programmers" 
      by Albert S. Huang and Larry Rudolph, Cambridge University Press, 2007.  
   The program is also available from the textbook's home page

   Additional notes by Henry Walker
   2013-06-19:  hardcode Scribbler 2 MAC address in dest array
                Scribbler 2 requires 9-byte message
                Use IPRE documentation from Keith O'Hara for 
                    command code 113 to beep
                Use Scribbler.cpp C++ code from John Hoare to
                    determine how to encode duration and frequency data
   2013-06-19:  compile with the line
      gcc -o rfcomm-client rfcomm-client.c -lbluetooth
*/

#include <stdio.h>
#include <unistd.h>
#include <sys/socket.h>
#include <bluetooth/bluetooth.h>
#include <bluetooth/rfcomm.h>

int main(int argc, char **argv)
{
    struct sockaddr_rc addr = { 0 };
    int s, status;
    char dest[18] = "00:1E:19:01:07:58";
    char message[9];

    // allocate a socket
    s = socket(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM);

    // set the connection parameters (who to connect to)
    addr.rc_family = AF_BLUETOOTH;
    addr.rc_channel = 1;
    str2ba( dest, &addr.rc_bdaddr );

    // connect to server
    status = connect(s, (struct sockaddr *)&addr, sizeof(addr));

    // send a message
    if( 0 == status ) {
      int duration, frequency;
      message[0]=113; // set speaker
      duration = 2000; // 2000 milleseconds = 2 seconds
      message[1]= duration >> 8;  // high-order 8 bits
      message[2]= duration % 256;  // low-order 8 bits
      frequency = 880; // A above middle C
      message[3]= frequency >> 8; // high-order 8 bits
      message[4]= frequency % 256;// low-order 8 bits
      message[5]= -1 ; // end of data set
      message[6]= 0;   // not used
      message[7]= 0;   // not used
      message[8]= 0;   // not used

      status = send(s, message, 9, 0);

      message[0]=113; // set speaker
      duration = 3000; // 3000 milleseconds = 3 seconds
      message[1]= duration >> 8;  // high-order 8 bits
      message[2]= duration % 256;  // low-order 8 bits
      frequency = 440; // A near middle C
      message[3]= frequency >> 8; // high-order 8 bits
      message[4]= frequency % 256;// low-order 8 bits
      message[5]= -1 ; // end of data set
      message[6]= 0;   // not used
      message[7]= 0;   // not used
      message[8]= 0;   // not used

      status = send(s, message, 9, 0);
      }

    if( status < 0 ) perror("uh oh");

    close(s);
    return 0;
}
