Sooner Competitive Robotics / Mbed 2 deprecated IEEE_14_Freescale

Dependencies:   mbed

Fork of IEEE_14_Freescale by IEEE 2014 Mbed

Committer:
sswatek
Date:
Tue Mar 11 20:22:18 2014 +0000
Revision:
17:e247d58d9f42
Parent:
16:6d900f687c18
Child:
19:3d77dc964d4b
Child:
20:5b8fde077301
Integrated bluetooth library

Who changed what in which revision?

UserRevisionLine numberNew contents of line
soonerbot 16:6d900f687c18 1 #include "droidBT.h"
soonerbot 16:6d900f687c18 2 #include "dbgprint.h"
soonerbot 16:6d900f687c18 3
soonerbot 16:6d900f687c18 4 droidBT::droidBT(PinName tx, PinName rx) : droid(tx,rx){
soonerbot 16:6d900f687c18 5 BTStart=0;
soonerbot 16:6d900f687c18 6 BTEnd=0;
soonerbot 16:6d900f687c18 7 DCStart=0;
soonerbot 16:6d900f687c18 8 DCEnd=0;
soonerbot 16:6d900f687c18 9 droid.baud(115200);
soonerbot 16:6d900f687c18 10 droid.attach(this,&droidBT::BTEnqueue);
soonerbot 16:6d900f687c18 11 }
soonerbot 16:6d900f687c18 12
soonerbot 16:6d900f687c18 13 void droidBT::BTEnqueue(){
soonerbot 16:6d900f687c18 14 //while(droid.readable()){
soonerbot 16:6d900f687c18 15 //led1=1;
soonerbot 16:6d900f687c18 16 BTBuffer[BTEnd]=droid.getc();
soonerbot 16:6d900f687c18 17 //int a = LPC_UART1->RBR;
soonerbot 16:6d900f687c18 18 //led2=1;
soonerbot 16:6d900f687c18 19 //int b = LPC_UART2->RBR;
soonerbot 16:6d900f687c18 20 //led3=1;
soonerbot 16:6d900f687c18 21 //int c = LPC_UART3->RBR;
soonerbot 16:6d900f687c18 22 //led4=1;
soonerbot 16:6d900f687c18 23 //DBGPRINT("Got %x\n", BTBuffer[BTEnd]);
soonerbot 16:6d900f687c18 24 BTEnd++;
soonerbot 16:6d900f687c18 25 BTEnd%=BTBUFSIZE;
soonerbot 16:6d900f687c18 26 //led1=0;
soonerbot 16:6d900f687c18 27 //}
soonerbot 16:6d900f687c18 28 }
soonerbot 16:6d900f687c18 29
soonerbot 16:6d900f687c18 30 int droidBT::clearData(){
soonerbot 16:6d900f687c18 31 DCStart=DCEnd=0;
soonerbot 16:6d900f687c18 32 return 1;
soonerbot 16:6d900f687c18 33 }
soonerbot 16:6d900f687c18 34
soonerbot 16:6d900f687c18 35 int droidBT::getData(int cmd, int* dest){
soonerbot 16:6d900f687c18 36 procBuf(1);
soonerbot 16:6d900f687c18 37 int i;
soonerbot 16:6d900f687c18 38 for(i=DCStart;i!=DCEnd;i=(i+1)%DCHUNKSIZE){
soonerbot 16:6d900f687c18 39 if((DataChunk[i][0]&0xF0)==0x60 && DataChunk[i][1]==cmd){
soonerbot 16:6d900f687c18 40 DataChunk[i][0]=0;
soonerbot 16:6d900f687c18 41 if(i==DCStart){
soonerbot 16:6d900f687c18 42 DCStart++;
soonerbot 16:6d900f687c18 43 }
soonerbot 16:6d900f687c18 44 for(int j=0;j<17;j++)
soonerbot 16:6d900f687c18 45 dest[j]=DataChunk[i][j];
soonerbot 16:6d900f687c18 46 return 1;
soonerbot 16:6d900f687c18 47 }
soonerbot 16:6d900f687c18 48 }
soonerbot 16:6d900f687c18 49 return 0;
soonerbot 16:6d900f687c18 50 }
soonerbot 16:6d900f687c18 51
soonerbot 16:6d900f687c18 52 int droidBT::procBuf(int cmd){
soonerbot 16:6d900f687c18 53 int i=BTStart;
soonerbot 16:6d900f687c18 54 int startChunk=i;
soonerbot 16:6d900f687c18 55 int seen=0;
soonerbot 16:6d900f687c18 56 while (i!=BTEnd) {
soonerbot 16:6d900f687c18 57 if(i==startChunk){ //first bit in the chunk
soonerbot 16:6d900f687c18 58 if((BTBuffer[i]&0xF0)==0x60){//data returned
soonerbot 16:6d900f687c18 59 i++;
soonerbot 16:6d900f687c18 60 DBGPRINT("gettin data\r\n",1);
soonerbot 16:6d900f687c18 61 } else if((BTBuffer[i]&0xF0)==0xC0){//ack
soonerbot 16:6d900f687c18 62 i++;
soonerbot 16:6d900f687c18 63 DBGPRINT("gettin ack\r\n",1);
soonerbot 16:6d900f687c18 64 } else {//dunno what this data is, toss
soonerbot 16:6d900f687c18 65 BTStart++;
soonerbot 16:6d900f687c18 66 i++;
soonerbot 16:6d900f687c18 67 startChunk=i;
soonerbot 16:6d900f687c18 68 DBGPRINT("throwing away\r\n",1);
soonerbot 16:6d900f687c18 69 }
soonerbot 16:6d900f687c18 70 } else {
soonerbot 16:6d900f687c18 71 DBGPRINT("not first\r\n",1);
soonerbot 16:6d900f687c18 72 if(bufSize()>=(BTBuffer[startChunk]&0xF)+1){
soonerbot 16:6d900f687c18 73 DBGPRINT("got enough space %x, %d\r\n",BTBuffer[startChunk]&0xF, DCEnd);
soonerbot 16:6d900f687c18 74 DataChunk[DCEnd][0]=BTBuffer[startChunk];
soonerbot 16:6d900f687c18 75 int j;
soonerbot 16:6d900f687c18 76 for(j=0;j<(BTBuffer[startChunk]&0xF);j++){
soonerbot 16:6d900f687c18 77 DBGPRINT("copying %d, %d\r\n",BTBuffer[i+j], j);
soonerbot 16:6d900f687c18 78 DataChunk[DCEnd][j+1]=BTBuffer[i+j];
soonerbot 16:6d900f687c18 79 }
soonerbot 16:6d900f687c18 80 if(DCEnd>=DCHUNKSIZE)
soonerbot 16:6d900f687c18 81 DCEnd=0;
soonerbot 16:6d900f687c18 82 DBGPRINT("Got Data of size %d [%x %d %d]\n", BTBuffer[startChunk]&0xF, DataChunk[DCEnd][1], DataChunk[DCEnd][2], DataChunk[DCEnd][3]);
soonerbot 16:6d900f687c18 83 DCEnd++;
soonerbot 16:6d900f687c18 84 BTStart=i+j;
soonerbot 16:6d900f687c18 85 startChunk=i=BTStart;
soonerbot 16:6d900f687c18 86 } else {
soonerbot 16:6d900f687c18 87 break;
soonerbot 16:6d900f687c18 88 }
soonerbot 16:6d900f687c18 89 }
soonerbot 16:6d900f687c18 90
soonerbot 16:6d900f687c18 91 }
soonerbot 16:6d900f687c18 92 return seen;
soonerbot 16:6d900f687c18 93 }
soonerbot 16:6d900f687c18 94 int droidBT::bufSize(){
soonerbot 16:6d900f687c18 95 return (BTEnd+BTBUFSIZE-BTStart)%BTBUFSIZE;
soonerbot 16:6d900f687c18 96 }
soonerbot 16:6d900f687c18 97
soonerbot 16:6d900f687c18 98 //returns both bits in an int form to look for
soonerbot 16:6d900f687c18 99 int droidBT::setState(char State) {
soonerbot 16:6d900f687c18 100 int sendbuf[10];
soonerbot 16:6d900f687c18 101 sendbuf[0]=0xF3;
soonerbot 16:6d900f687c18 102 sendbuf[1]=State;
soonerbot 16:6d900f687c18 103 sendbuf[2]=0x11;
soonerbot 16:6d900f687c18 104 sendbuf[3]=0x44;
soonerbot 16:6d900f687c18 105 int i, cheapHash=0;
soonerbot 16:6d900f687c18 106 droid.putc(sendbuf[0]);
soonerbot 16:6d900f687c18 107 for(i=1;i<4;i++){
soonerbot 16:6d900f687c18 108 droid.putc(sendbuf[i]);
soonerbot 16:6d900f687c18 109 cheapHash^=sendbuf[i];
soonerbot 16:6d900f687c18 110 }
soonerbot 16:6d900f687c18 111 return 0xF300|cheapHash;
soonerbot 16:6d900f687c18 112 }
soonerbot 16:6d900f687c18 113
soonerbot 16:6d900f687c18 114 int droidBT::sendCmd(int cmd, int* info, int len) {
sswatek 17:e247d58d9f42 115 //int sendbuf[10];
sswatek 17:e247d58d9f42 116 //sendbuf[0]=(0xF0|(len+1));
sswatek 17:e247d58d9f42 117 //sendbuf[1]=cmd;
sswatek 17:e247d58d9f42 118 //sendbuf[2]=0x11;
sswatek 17:e247d58d9f42 119 //sendbuf[3]=0x44;
soonerbot 16:6d900f687c18 120 int i, cheapHash=cmd;
soonerbot 16:6d900f687c18 121 droid.putc((0xF0|(len+1)));
soonerbot 16:6d900f687c18 122 droid.putc(cmd);
soonerbot 16:6d900f687c18 123 for(i=0;i<len;i++){
soonerbot 16:6d900f687c18 124 droid.putc(info[i]);
soonerbot 16:6d900f687c18 125 cheapHash^=info[i];
soonerbot 16:6d900f687c18 126 }
soonerbot 16:6d900f687c18 127 return 0xF000|((len+1)<<2)|cheapHash;
soonerbot 16:6d900f687c18 128 }
soonerbot 16:6d900f687c18 129
soonerbot 16:6d900f687c18 130 int droidBT::getAck(int hashetc){
soonerbot 16:6d900f687c18 131 int firstbit=(hashetc&0xFF00)>>8;
soonerbot 16:6d900f687c18 132 int secondbit=hashetc&0xFF;
soonerbot 16:6d900f687c18 133 int i;
soonerbot 16:6d900f687c18 134 if(BTStart==BTEnd) return 0;
soonerbot 16:6d900f687c18 135 for(i=BTStart;i!=BTEnd-1;i=(i+1)%BTBUFSIZE){
soonerbot 16:6d900f687c18 136 if(BTBuffer[i]==firstbit && BTBuffer[i+1]==secondbit){
soonerbot 16:6d900f687c18 137 BTBuffer[i]=BTBuffer[i+1]=0;
soonerbot 16:6d900f687c18 138 if(i==BTStart)
soonerbot 16:6d900f687c18 139 BTStart+=2;
soonerbot 16:6d900f687c18 140 return 1;
soonerbot 16:6d900f687c18 141 }
soonerbot 16:6d900f687c18 142 }
soonerbot 16:6d900f687c18 143 return 0;
soonerbot 16:6d900f687c18 144 }