Pulse Oximeter (NONIN) communicates with mbed via Bluetooth dongle and sends Heart Rate and Oxygen Saturation via GPRS module

Dependencies:   C12832 GPS GSM mbed

Fork of myBlueUSB_localfix by Nobuaki Aoki

Committer:
samialshorman
Date:
Tue Apr 14 21:48:07 2015 +0000
Revision:
3:55a622e3dbb5
Parent:
0:003889bc474f
Nonin (Pulse Oximeter) connected to mbed lpc 1768 by Bluetooth dongle and sends SMS including Heart Rate and Oxygen saturation by GPRS module

Who changed what in which revision?

UserRevisionLine numberNew contents of line
nobukuma 0:003889bc474f 1 #include "mbed.h"
nobukuma 0:003889bc474f 2 #include <vector>
nobukuma 0:003889bc474f 3 #include "Utils.h"
nobukuma 0:003889bc474f 4 #include "hci.h"
nobukuma 0:003889bc474f 5 #include "ftclasslibusbdevbt.h"
nobukuma 0:003889bc474f 6
nobukuma 0:003889bc474f 7 //extern HCI* gHCI;
nobukuma 0:003889bc474f 8 class application;
nobukuma 0:003889bc474f 9 extern application App;
nobukuma 0:003889bc474f 10
nobukuma 0:003889bc474f 11 void printf(const BD_ADDR* addr);
nobukuma 0:003889bc474f 12
nobukuma 0:003889bc474f 13 void ftdev::receive(int socket, SocketState state, const u8* data, int len) {
nobukuma 0:003889bc474f 14 printf("ftdev::receive was called: socket %d, state=%d, length=%d\n", socket, state, len);
nobukuma 0:003889bc474f 15 // unsigned char req[] = "\xdget_ser_num\xd";
nobukuma 0:003889bc474f 16 unsigned char req[] = {0xbe, 0xef, 6, 0xfc, 0,0,0,0,0, 0xaf};
nobukuma 0:003889bc474f 17 if (len==0) {
nobukuma 0:003889bc474f 18 switch (state) {
nobukuma 0:003889bc474f 19 case SocketState_Opening:
nobukuma 0:003889bc474f 20 break;
nobukuma 0:003889bc474f 21 case SocketState_Open:
nobukuma 0:003889bc474f 22 printf("sending request \n%s\n", req);
nobukuma 0:003889bc474f 23 Socket_Send(sock, req, sizeof(req));
nobukuma 0:003889bc474f 24 break;
nobukuma 0:003889bc474f 25 case SocketState_Closing:
nobukuma 0:003889bc474f 26 case SocketState_Closed:
nobukuma 0:003889bc474f 27 return;
nobukuma 0:003889bc474f 28 }
nobukuma 0:003889bc474f 29 } else {
nobukuma 0:003889bc474f 30 //printHex(data, len);
nobukuma 0:003889bc474f 31 parse(data, len);
nobukuma 0:003889bc474f 32 if (state==SocketState_Open)
nobukuma 0:003889bc474f 33 ;//Socket_Close(sock);//replace with ft primitive
nobukuma 0:003889bc474f 34 }
nobukuma 0:003889bc474f 35 }
nobukuma 0:003889bc474f 36
nobukuma 0:003889bc474f 37 unsigned short ftdev::chksum() {
nobukuma 0:003889bc474f 38 unsigned short sum = (X1_len & 0xFF) + (X1_len >> 8);
nobukuma 0:003889bc474f 39 for (int i = 0; i < X1_len; i++)
nobukuma 0:003889bc474f 40 sum += X1_pkt[i];
nobukuma 0:003889bc474f 41 return -sum;
nobukuma 0:003889bc474f 42 }
nobukuma 0:003889bc474f 43
nobukuma 0:003889bc474f 44 void ftdev::parse (const unsigned char *buf, unsigned len) {
nobukuma 0:003889bc474f 45 unsigned i = 0;
nobukuma 0:003889bc474f 46 while (i < len) {
nobukuma 0:003889bc474f 47 char c = buf[i++];
nobukuma 0:003889bc474f 48 switch (parseState) {
nobukuma 0:003889bc474f 49 case 0: //ascii state
nobukuma 0:003889bc474f 50 if (c==2)
nobukuma 0:003889bc474f 51 parseState = 1;
nobukuma 0:003889bc474f 52 else
nobukuma 0:003889bc474f 53 putc(c, stdout);
nobukuma 0:003889bc474f 54 break;
nobukuma 0:003889bc474f 55 case 1:
nobukuma 0:003889bc474f 56 if (c==0x55)
nobukuma 0:003889bc474f 57 parseState = 2;
nobukuma 0:003889bc474f 58 else {
nobukuma 0:003889bc474f 59 parseState = 0;
nobukuma 0:003889bc474f 60 printf("expected 0x55 in X1 header, found %02X\n", c);
nobukuma 0:003889bc474f 61 }
nobukuma 0:003889bc474f 62 break;
nobukuma 0:003889bc474f 63 case 2:
nobukuma 0:003889bc474f 64 X1_len = c<<8;
nobukuma 0:003889bc474f 65 parseState= 3;
nobukuma 0:003889bc474f 66 break;
nobukuma 0:003889bc474f 67 case 3:
nobukuma 0:003889bc474f 68 X1_len += c;
nobukuma 0:003889bc474f 69 parseState= 4;
nobukuma 0:003889bc474f 70 X1_pkt = new unsigned char[X1_len];
nobukuma 0:003889bc474f 71 X1_pos = 0;
nobukuma 0:003889bc474f 72 break;
nobukuma 0:003889bc474f 73 case 4:
nobukuma 0:003889bc474f 74 if (X1_pos < X1_len) X1_pkt[X1_pos++] = c;
nobukuma 0:003889bc474f 75 else parseState = 5;
nobukuma 0:003889bc474f 76 break;
nobukuma 0:003889bc474f 77 case 5:
nobukuma 0:003889bc474f 78 X1_crc = c<<8;
nobukuma 0:003889bc474f 79 parseState= 6;
nobukuma 0:003889bc474f 80 break;
nobukuma 0:003889bc474f 81 case 6:
nobukuma 0:003889bc474f 82 X1_crc += c;
nobukuma 0:003889bc474f 83 parseState= 7;
nobukuma 0:003889bc474f 84 break;
nobukuma 0:003889bc474f 85 case 7:
nobukuma 0:003889bc474f 86 if (c == 3 && X1_crc == chksum()) {
nobukuma 0:003889bc474f 87 //handlePkt();
nobukuma 0:003889bc474f 88 printHex(X1_pkt, X1_len);
nobukuma 0:003889bc474f 89 }else
nobukuma 0:003889bc474f 90 printf("framing or checksum error, end char = %02X\n", c);
nobukuma 0:003889bc474f 91
nobukuma 0:003889bc474f 92 parseState = 0;
nobukuma 0:003889bc474f 93 break;
nobukuma 0:003889bc474f 94 }
nobukuma 0:003889bc474f 95 }
nobukuma 0:003889bc474f 96 }
nobukuma 0:003889bc474f 97
nobukuma 0:003889bc474f 98 vector<ftbtdev*> ft_devs;
nobukuma 0:003889bc474f 99 ftdev _ftdev; //single instance, just for test
nobukuma 0:003889bc474f 100
nobukuma 0:003889bc474f 101 int GetNrOfFtBtDevices() {
nobukuma 0:003889bc474f 102 return ft_devs.size();
nobukuma 0:003889bc474f 103 }
nobukuma 0:003889bc474f 104
nobukuma 0:003889bc474f 105 unsigned InitFtBtDeviceList() {//assume inquiry has been done
nobukuma 0:003889bc474f 106 static char FtDevClass[3] = {0x00, 0x1F, 0x82 };
nobukuma 0:003889bc474f 107 BTDevice* devs[8];
nobukuma 0:003889bc474f 108 int count = ((HCI*)&App)->GetDevices(devs,8);
nobukuma 0:003889bc474f 109 int n = 0;
nobukuma 0:003889bc474f 110 for (int i = 0; i < count; i++) {
nobukuma 0:003889bc474f 111 if (memcmp(devs[i]->_info.dev_class, FtDevClass, 3)==0) {
nobukuma 0:003889bc474f 112 ft_devs.push_back(new ftbtdev(&devs[i]->_info));
nobukuma 0:003889bc474f 113 printf("%d: %s\n", n++, devs[i]->_name);
nobukuma 0:003889bc474f 114 }
nobukuma 0:003889bc474f 115 // printf("device %d (handle=%d) ", i, devs[i]->_handle);
nobukuma 0:003889bc474f 116 // printfBytes("devclass: ", devs[i]->_info.dev_class, 3);
nobukuma 0:003889bc474f 117 }
nobukuma 0:003889bc474f 118 return n;
nobukuma 0:003889bc474f 119 }
nobukuma 0:003889bc474f 120
nobukuma 0:003889bc474f 121 ftbtdev* GetFtUsbDeviceHandle(unsigned Num) {
nobukuma 0:003889bc474f 122 if (Num < ft_devs.size()) {
nobukuma 0:003889bc474f 123 return ft_devs[Num];
nobukuma 0:003889bc474f 124 }
nobukuma 0:003889bc474f 125 return 0;
nobukuma 0:003889bc474f 126 }
nobukuma 0:003889bc474f 127
nobukuma 0:003889bc474f 128 unsigned OpenFtBtDevice(ftbtdev* d) {
nobukuma 0:003889bc474f 129 BD_ADDR* bd = d->BtAddr();
nobukuma 0:003889bc474f 130 printf("Connecting to ");
nobukuma 0:003889bc474f 131 printf(bd);
nobukuma 0:003889bc474f 132 printf("\n");
nobukuma 0:003889bc474f 133 return _ftdev.Open(bd, 1); //TODO: everything can go wrong here
nobukuma 0:003889bc474f 134 }