#include "bluetooth.h"
#include <stdlib.h>
#include "error.h"
Bluetooth::Bluetooth(){
this->comport = 0;
}
Bluetooth::~Bluetooth(){
disconnect();
};
void Bluetooth::send(unsigned char *buffer, unsigned int num_bytes){
unsigned int i=0;
if (handle == INVALID_HANDLE_VALUE){
throw Nxt_exception::Nxt_exception("send","Bluetooth", BT_INVALID_COM_PORT);
}
byte = (BYTE *) malloc(num_bytes*sizeof(BYTE));
while(i<num_bytes){
byte[i]=buffer[i];
i++;
}
if(!WriteFile(handle, byte, num_bytes, &number_bytes, NULL)!=0){
free(byte);
throw Nxt_exception::Nxt_exception("send","Bluetooth", BT_ERROR_WRITING_COM_PORT);
}
if(number_bytes!= num_bytes){
free(byte);
throw Nxt_exception::Nxt_exception("send","Bluetooth", BT_ERROR_WRITING_COM_PORT);
}
free(byte);
return;
}
void Bluetooth::connect(unsigned int comport){
/***************************************************************************
*** See http://www.robbayer.com/files//serial-win.pdf for dokumentation ****
***************************************************************************/
std::stringstream temp;
temp << comport;
string port = "\\\\.\\COM" + temp.str();
handle = CreateFile(port.c_str(), GENERIC_READ | GENERIC_WRITE, 0,0,OPEN_EXISTING,0,0);
if (handle == INVALID_HANDLE_VALUE){
throw Nxt_exception::Nxt_exception("connect","Bluetooth", BT_INVALID_COM_PORT);
}
this->comport = comport;
dcb.ByteSize = 8;//sets bit-size
dcb.BaudRate = CBR_9600;//sets baudrate
//Sets timeout for reading - 0 = deactivate
timeout.ReadIntervalTimeout=3000;
timeout.ReadTotalTimeoutConstant=0;
timeout.ReadTotalTimeoutMultiplier=200;
timeout.WriteTotalTimeoutConstant=3000;
timeout.WriteTotalTimeoutMultiplier=200;
SetCommTimeouts(handle, &timeout);
dcb.Parity=0;
SetCommState(handle, &dcb);
flush();
//Try to read firmware check if a NXT is at the other end
unsigned char answer[NXT_BUFFER_SIZE];
unsigned char command[4];
command[0]=0x02; //command length
command[1]=0x00;
command[2]=0x01;
command[3]=0x88;
try{
this->send(&command[0],4);
this->receive(&answer[0],9);
}
catch (Nxt_exception& e){
this->disconnect();
throw Nxt_exception::Nxt_exception("connect","Bluetooth", BT_UNABLE_TO_CONNECT);
}
return;
}
void Bluetooth::disconnect(){
if(handle!=INVALID_HANDLE_VALUE){
CloseHandle(handle);
handle=INVALID_HANDLE_VALUE;
}
this->comport=0;
return;
}
void Bluetooth::receive(unsigned char *buffer, unsigned int length){
unsigned int i=0;
byte = (BYTE *) malloc(length*sizeof(BYTE));
number_bytes=0;
buffer[0]='\0';
if(ReadFile(handle, byte, length, &number_bytes, NULL) == 0){
free(byte);
throw Nxt_exception::Nxt_exception("receive","Bluetooth", BT_ERROR_READING_COM_PORT);
}
//printf("Reveive length %d No of bytes %d\n",length, nrBytes);
if(number_bytes==0 && length != 0){
free(byte);
throw Nxt_exception::Nxt_exception("receive","Bluetooth", BT_NO_REPLY);
}
i=(unsigned int) number_bytes;
//printf("No bytes received:%d\n", i);
if(number_bytes<length){
free(byte);
throw Nxt_exception::Nxt_exception("receive","Bluetooth", BT_NOT_ENOUGH_BYTES);
}
i=0;
while(i<number_bytes){
buffer[i]=byte[i];
//printf("Receive: %d\n ",buffer[i]);
i++;
}
buffer[i]='\0';
free(byte);
return;
}
void Bluetooth::flush(){
PurgeComm(handle, PURGE_RXCLEAR|PURGE_TXCLEAR);
}
Connection_type Bluetooth::get_type(){
return BT;
}