Fork from Sog Yang

Dependencies:   BNO055_AS7000 NNN50_WIFI_API

Fork of NNN50_BLEWIFISensor by Sog Yang

Committer:
tsungta
Date:
Mon May 22 08:23:33 2017 +0000
Revision:
14:62377c06ead2
Parent:
13:5b96cb34bc70
Fix I2C hangup issue when enable WIFI by sending 0x00; Comment out set_blocking to make sure tcp socket connection is completed

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sog_yang 5:ffe1a4c4881e 1 #include "mbed.h"
sog_yang 7:06495d54d107 2 #include "BNO055.h"
tsungta 13:5b96cb34bc70 3 //#include "AS7000.h"
sog_yang 5:ffe1a4c4881e 4 #include "ble/BLE.h"
sog_yang 5:ffe1a4c4881e 5 #include "ble/Gap.h"
sog_yang 5:ffe1a4c4881e 6 #include "ble/services/BatteryService.h"
sog_yang 5:ffe1a4c4881e 7 #include "DOORService.h"
sog_yang 5:ffe1a4c4881e 8 #include "EthernetInterface.h"
sog_yang 5:ffe1a4c4881e 9 #include "WIFIDevice.h"
sog_yang 5:ffe1a4c4881e 10
tsungta 13:5b96cb34bc70 11 #define DEBUG_LOG 1
sog_yang 5:ffe1a4c4881e 12
sog_yang 5:ffe1a4c4881e 13 union IP {
sog_yang 5:ffe1a4c4881e 14 unsigned int ip;
sog_yang 5:ffe1a4c4881e 15 struct {
sog_yang 5:ffe1a4c4881e 16 unsigned char d;
sog_yang 5:ffe1a4c4881e 17 unsigned char c;
sog_yang 5:ffe1a4c4881e 18 unsigned char b;
sog_yang 5:ffe1a4c4881e 19 unsigned char a;
sog_yang 5:ffe1a4c4881e 20 } ip2;
sog_yang 5:ffe1a4c4881e 21 };
sog_yang 5:ffe1a4c4881e 22
sog_yang 5:ffe1a4c4881e 23 char ips[20];
sog_yang 5:ffe1a4c4881e 24 IP ip;
sog_yang 7:06495d54d107 25
sog_yang 7:06495d54d107 26 DOORService *doorServicePtr;
sog_yang 7:06495d54d107 27
sog_yang 7:06495d54d107 28 BNO055 imu(p0,p30);
tsungta 13:5b96cb34bc70 29 //AS7000 hrm(p0,p30);
sog_yang 7:06495d54d107 30 Serial pc(USBTX, USBRX);
sog_yang 9:d1861b00e0fd 31 DigitalInOut myOutputPin(USBTX);
sog_yang 5:ffe1a4c4881e 32 EthernetInterface eth;
sog_yang 5:ffe1a4c4881e 33 WIFIDevice wifi;
sog_yang 7:06495d54d107 34
sog_yang 5:ffe1a4c4881e 35 TCPSocketConnection sock_tcp;
tsungta 13:5b96cb34bc70 36 char* AP_SSID = "TWCYNPC0209_Mac mini";
tsungta 13:5b96cb34bc70 37 char* AP_PWD = "mayday55555";
tsungta 13:5b96cb34bc70 38 char* TCP_SERVER_ADDRESS = "192.168.2.7";
sog_yang 11:54a1a576df9f 39 int TCP_SERVER_PORT = 1030;
sog_yang 5:ffe1a4c4881e 40
sog_yang 7:06495d54d107 41 uint8_t initialValueForDOORCharacteristic = 0xFF;
sog_yang 7:06495d54d107 42 uint8_t BLE_RX_CMD = 0xFF;
sog_yang 8:ff7fdd152f14 43 const char DEVICE_NAME[] = "FITNCTL";
sog_yang 7:06495d54d107 44 uint8_t ADV_manuf[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
sog_yang 11:54a1a576df9f 45 char out_buffer[45];
sog_yang 5:ffe1a4c4881e 46 static EventQueue eventQueue(
sog_yang 5:ffe1a4c4881e 47 /* event count */ 16 * /* event size */ 32
sog_yang 5:ffe1a4c4881e 48 );
sog_yang 7:06495d54d107 49
sog_yang 7:06495d54d107 50 bool isConnect = false;
sog_yang 7:06495d54d107 51 bool isWiFiEnable = false;
sog_yang 8:ff7fdd152f14 52 bool isCloudFiling = false;
sog_yang 7:06495d54d107 53
sog_yang 5:ffe1a4c4881e 54
sog_yang 5:ffe1a4c4881e 55 void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params)
sog_yang 5:ffe1a4c4881e 56 {
sog_yang 5:ffe1a4c4881e 57 BLE::Instance().gap().startAdvertising();
sog_yang 5:ffe1a4c4881e 58 }
sog_yang 5:ffe1a4c4881e 59
sog_yang 5:ffe1a4c4881e 60 void onDataWrittenCallback(const GattWriteCallbackParams *params) {
sog_yang 5:ffe1a4c4881e 61
sog_yang 5:ffe1a4c4881e 62
sog_yang 5:ffe1a4c4881e 63 if ((params->handle == doorServicePtr->getValueHandle()) && (params->len == 1)) {
sog_yang 5:ffe1a4c4881e 64 {
sog_yang 7:06495d54d107 65 BLE_RX_CMD = *(params->data);
sog_yang 5:ffe1a4c4881e 66 }
sog_yang 5:ffe1a4c4881e 67 }
sog_yang 5:ffe1a4c4881e 68 }
sog_yang 5:ffe1a4c4881e 69
sog_yang 5:ffe1a4c4881e 70 /**
sog_yang 5:ffe1a4c4881e 71 * This function is called when the ble initialization process has failled
sog_yang 5:ffe1a4c4881e 72 */
sog_yang 5:ffe1a4c4881e 73 void onBleInitError(BLE &ble, ble_error_t error)
sog_yang 5:ffe1a4c4881e 74 {
sog_yang 5:ffe1a4c4881e 75 /* Initialization error handling should go here */
sog_yang 5:ffe1a4c4881e 76 }
sog_yang 5:ffe1a4c4881e 77
sog_yang 5:ffe1a4c4881e 78 /**
sog_yang 5:ffe1a4c4881e 79 * Callback triggered when the ble initialization process has finished
sog_yang 5:ffe1a4c4881e 80 */
sog_yang 5:ffe1a4c4881e 81 void bleInitComplete(BLE::InitializationCompleteCallbackContext *params)
sog_yang 5:ffe1a4c4881e 82 {
sog_yang 5:ffe1a4c4881e 83 BLE& ble = params->ble;
sog_yang 5:ffe1a4c4881e 84 ble_error_t error = params->error;
sog_yang 5:ffe1a4c4881e 85
sog_yang 5:ffe1a4c4881e 86 if (error != BLE_ERROR_NONE) {
sog_yang 5:ffe1a4c4881e 87 /* In case of error, forward the error handling to onBleInitError */
sog_yang 5:ffe1a4c4881e 88 onBleInitError(ble, error);
sog_yang 5:ffe1a4c4881e 89 return;
sog_yang 5:ffe1a4c4881e 90 }
sog_yang 5:ffe1a4c4881e 91
sog_yang 5:ffe1a4c4881e 92 /* Ensure that it is the default instance of BLE */
sog_yang 5:ffe1a4c4881e 93 if(ble.getInstanceID() != BLE::DEFAULT_INSTANCE) {
sog_yang 5:ffe1a4c4881e 94 return;
sog_yang 5:ffe1a4c4881e 95 }
sog_yang 5:ffe1a4c4881e 96
sog_yang 5:ffe1a4c4881e 97 ble.gap().onDisconnection(disconnectionCallback);
sog_yang 5:ffe1a4c4881e 98 ble.gattServer().onDataWritten(onDataWrittenCallback);
sog_yang 5:ffe1a4c4881e 99
sog_yang 5:ffe1a4c4881e 100 /* Setup primary services */
sog_yang 5:ffe1a4c4881e 101 doorServicePtr = new DOORService(ble, initialValueForDOORCharacteristic);
sog_yang 5:ffe1a4c4881e 102
sog_yang 5:ffe1a4c4881e 103 /* Setup advertising */
sog_yang 5:ffe1a4c4881e 104 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME));
sog_yang 5:ffe1a4c4881e 105 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::MANUFACTURER_SPECIFIC_DATA, ADV_manuf, sizeof(ADV_manuf));
sog_yang 5:ffe1a4c4881e 106 ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
sog_yang 7:06495d54d107 107 ble.gap().setAdvertisingInterval(150); /* 1000ms */
sog_yang 5:ffe1a4c4881e 108 ble.gap().startAdvertising();
sog_yang 5:ffe1a4c4881e 109 }
sog_yang 5:ffe1a4c4881e 110
sog_yang 5:ffe1a4c4881e 111 void scheduleBleEventsProcessing(BLE::OnEventsToProcessCallbackContext* context) {
sog_yang 5:ffe1a4c4881e 112 BLE &ble = BLE::Instance();
sog_yang 5:ffe1a4c4881e 113 eventQueue.call(Callback<void()>(&ble, &BLE::processEvents));
sog_yang 5:ffe1a4c4881e 114 }
sog_yang 7:06495d54d107 115
sog_yang 7:06495d54d107 116
sog_yang 5:ffe1a4c4881e 117 int main (void) {
sog_yang 9:d1861b00e0fd 118 myOutputPin.mode(PullUp);
sog_yang 9:d1861b00e0fd 119 pc.baud(38400);
tsungta 13:5b96cb34bc70 120 imu.enable();
sog_yang 7:06495d54d107 121 imu.reset();
sog_yang 5:ffe1a4c4881e 122 imu.setmode(OPERATION_MODE_NDOF);
sog_yang 5:ffe1a4c4881e 123
sog_yang 5:ffe1a4c4881e 124
sog_yang 5:ffe1a4c4881e 125 BLE &ble = BLE::Instance();
sog_yang 5:ffe1a4c4881e 126 ble.onEventsToProcess(scheduleBleEventsProcessing);
sog_yang 5:ffe1a4c4881e 127 ble.init(bleInitComplete);
sog_yang 7:06495d54d107 128
sog_yang 9:d1861b00e0fd 129 int i = 0;
sog_yang 9:d1861b00e0fd 130 int j = 0;
sog_yang 9:d1861b00e0fd 131 BLE_RX_CMD = 0xFF;
sog_yang 9:d1861b00e0fd 132 wait_ms(10);
sog_yang 9:d1861b00e0fd 133 sprintf(out_buffer,"\r\n");
sog_yang 9:d1861b00e0fd 134
sog_yang 9:d1861b00e0fd 135
sog_yang 5:ffe1a4c4881e 136 while (true) {
tsungta 13:5b96cb34bc70 137 wait_ms(8);
tsungta 13:5b96cb34bc70 138 imu.hr_only();
sog_yang 9:d1861b00e0fd 139 wait_ms(2);
sog_yang 7:06495d54d107 140 imu.get_angles(); //query the i2c device
sog_yang 9:d1861b00e0fd 141 wait_ms(8);
sog_yang 9:d1861b00e0fd 142 if (BLE_RX_CMD != 0xA1) {
sog_yang 9:d1861b00e0fd 143 if (i > 40){
tsungta 13:5b96cb34bc70 144 pc.printf("*HR=%03d# yaw:%6.2f#", imu.hrm.hreat_rate, imu.euler.yaw);
sog_yang 9:d1861b00e0fd 145 i=0;
sog_yang 9:d1861b00e0fd 146 } i++;
sog_yang 9:d1861b00e0fd 147 }
sog_yang 7:06495d54d107 148 /* GATT Command 0xA1 Cloud Data Transfer*/
sog_yang 8:ff7fdd152f14 149 if (BLE_RX_CMD == 0xA1){
sog_yang 8:ff7fdd152f14 150 ADV_manuf[5] = 0xF1;
sog_yang 8:ff7fdd152f14 151 if (isWiFiEnable == true){
sog_yang 10:248b81efda00 152 if (isConnect == true) {
sog_yang 9:d1861b00e0fd 153 if (j > 2){
tsungta 13:5b96cb34bc70 154 pc.printf("*HR=%03d#", imu.hrm.hreat_rate);
sog_yang 9:d1861b00e0fd 155 j = 0;
sog_yang 10:248b81efda00 156 }j++;
tsungta 13:5b96cb34bc70 157 sprintf(out_buffer,"hrm:%03d yaw:%6.2f pitch:%6.2f roll:%6.2f\n", imu.hrm.hreat_rate, imu.euler.yaw, imu.euler.pitch, imu.euler.roll);
tsungta 13:5b96cb34bc70 158 //sock_tcp.set_blocking(false, 1500);// Timeout after 0.2s
sog_yang 8:ff7fdd152f14 159 sock_tcp.send_all(out_buffer, sizeof(out_buffer) - 1);
sog_yang 8:ff7fdd152f14 160 isCloudFiling = true;
sog_yang 7:06495d54d107 161 } else {
sog_yang 11:54a1a576df9f 162 if (sock_tcp.connect(TCP_SERVER_ADDRESS, TCP_SERVER_PORT) < 0) {
sog_yang 8:ff7fdd152f14 163 isConnect = false;
sog_yang 8:ff7fdd152f14 164 BLE_RX_CMD = 0xFF;
sog_yang 8:ff7fdd152f14 165 #if DEBUG_LOG
tsungta 13:5b96cb34bc70 166 pc.printf("Unable to connect to (%s) on port (%d)\n", TCP_SERVER_ADDRESS, TCP_SERVER_PORT);
sog_yang 8:ff7fdd152f14 167 #endif
sog_yang 8:ff7fdd152f14 168 ADV_manuf[4] = 0xCF;
sog_yang 8:ff7fdd152f14 169 BLE_RX_CMD = 0xFF;
sog_yang 8:ff7fdd152f14 170 } else {
sog_yang 8:ff7fdd152f14 171 isConnect = true;
sog_yang 8:ff7fdd152f14 172 ADV_manuf[4] = 0xF1;
sog_yang 8:ff7fdd152f14 173 #if DEBUG_LOG
tsungta 13:5b96cb34bc70 174 pc.printf("Connected to Server at %s\n",TCP_SERVER_ADDRESS);
sog_yang 8:ff7fdd152f14 175 #endif
sog_yang 8:ff7fdd152f14 176 }
sog_yang 7:06495d54d107 177 }
sog_yang 7:06495d54d107 178 }
sog_yang 7:06495d54d107 179 }
sog_yang 7:06495d54d107 180 /* GATT Command 0x02 WiFI & Cloud Connection Close*/
sog_yang 7:06495d54d107 181 if (BLE_RX_CMD == 0x02){
sog_yang 9:d1861b00e0fd 182 BLE_RX_CMD = 0xFF;
sog_yang 7:06495d54d107 183 ADV_manuf[5] = 0xF2;
sog_yang 7:06495d54d107 184 if ( isConnect == true ) {
sog_yang 7:06495d54d107 185 sock_tcp.close();
sog_yang 7:06495d54d107 186 isConnect = false;
sog_yang 5:ffe1a4c4881e 187 }
sog_yang 7:06495d54d107 188 if ( isWiFiEnable == true ) {
sog_yang 7:06495d54d107 189 eth.disconnect();
sog_yang 7:06495d54d107 190 wifi.sleep();
sog_yang 7:06495d54d107 191 isWiFiEnable = false;
sog_yang 7:06495d54d107 192 }
sog_yang 9:d1861b00e0fd 193 while(true) {
sog_yang 9:d1861b00e0fd 194 if (wifi.is_AP_connected()==0) break; //make sure wifi disconnect
sog_yang 9:d1861b00e0fd 195 }
sog_yang 8:ff7fdd152f14 196 if (isConnect == true) isConnect = false;
sog_yang 8:ff7fdd152f14 197 isConnect = false;
sog_yang 8:ff7fdd152f14 198 isWiFiEnable = false;
sog_yang 9:d1861b00e0fd 199 isCloudFiling = false;
sog_yang 9:d1861b00e0fd 200
sog_yang 7:06495d54d107 201 ADV_manuf[0] = 0x00;
sog_yang 7:06495d54d107 202 ADV_manuf[1] = 0x00;
sog_yang 7:06495d54d107 203 ADV_manuf[2] = 0x00;
sog_yang 8:ff7fdd152f14 204 ADV_manuf[3] = 0x00;
sog_yang 9:d1861b00e0fd 205 ADV_manuf[4] = 0x00;
sog_yang 9:d1861b00e0fd 206 sprintf(out_buffer,"\n");
sog_yang 7:06495d54d107 207 }
sog_yang 7:06495d54d107 208 /* GATT Command 0x0 init WiFI & Cloud Connection*/
sog_yang 7:06495d54d107 209 if (BLE_RX_CMD == 0x00){
sog_yang 8:ff7fdd152f14 210 if(isCloudFiling == false) {
sog_yang 8:ff7fdd152f14 211 BLE_RX_CMD = 0xFF;
sog_yang 8:ff7fdd152f14 212 ADV_manuf[5] = 0xF0;
sog_yang 7:06495d54d107 213
sog_yang 8:ff7fdd152f14 214 if (isWiFiEnable == false) {
sog_yang 8:ff7fdd152f14 215 eth.init();
sog_yang 11:54a1a576df9f 216 wifi.setNetwork(M2M_WIFI_SEC_WPA_PSK, AP_SSID, AP_PWD);
sog_yang 8:ff7fdd152f14 217 eth.connect();
sog_yang 8:ff7fdd152f14 218 while(true) {
sog_yang 8:ff7fdd152f14 219 if (wifi.is_AP_connected()==1) break;
sog_yang 8:ff7fdd152f14 220 }
tsungta 13:5b96cb34bc70 221 //sock_tcp.set_blocking(false, 1200);// Timeout after 1.2s
sog_yang 8:ff7fdd152f14 222 #if DEBUG_LOG
sog_yang 8:ff7fdd152f14 223 pc.printf("Connect Success! \n");
sog_yang 8:ff7fdd152f14 224 pc.printf("MAC: %s\n", eth.getMACAddress());
sog_yang 8:ff7fdd152f14 225 pc.printf("IP: %s\n", eth.getIPAddress());
sog_yang 8:ff7fdd152f14 226 pc.printf("Gateway: %s\n", eth.getGateway());
sog_yang 8:ff7fdd152f14 227 pc.printf("NetworkMask: %s\n", eth.getNetworkMask());
sog_yang 8:ff7fdd152f14 228 #endif
sog_yang 8:ff7fdd152f14 229 snprintf(ips, sizeof(ips), "%s",eth.getIPAddress());
sog_yang 8:ff7fdd152f14 230 unsigned short a, b, c, d;
sog_yang 8:ff7fdd152f14 231 sscanf(ips, "%hu.%hu.%hu.%hu", &a, &b, &c, &d);
sog_yang 8:ff7fdd152f14 232 sprintf(ips, "%x.%x.%x.%x", a, b, c, d);
sog_yang 8:ff7fdd152f14 233 ADV_manuf[0] = a;
sog_yang 8:ff7fdd152f14 234 ADV_manuf[1] = b;
sog_yang 8:ff7fdd152f14 235 ADV_manuf[2] = c;
sog_yang 8:ff7fdd152f14 236 ADV_manuf[3] = d;
sog_yang 8:ff7fdd152f14 237 isWiFiEnable = true;
sog_yang 8:ff7fdd152f14 238 }
sog_yang 8:ff7fdd152f14 239
sog_yang 8:ff7fdd152f14 240 if (isConnect == false) {
sog_yang 8:ff7fdd152f14 241 if (isWiFiEnable == true) {
sog_yang 11:54a1a576df9f 242 if (sock_tcp.connect(TCP_SERVER_ADDRESS, TCP_SERVER_PORT) < 0) {
sog_yang 8:ff7fdd152f14 243 #if DEBUG_LOG
tsungta 13:5b96cb34bc70 244 pc.printf("Unable to connect to (%s) on port (%d)\n", TCP_SERVER_ADDRESS, TCP_SERVER_PORT);
sog_yang 8:ff7fdd152f14 245 #endif
sog_yang 8:ff7fdd152f14 246 sock_tcp.close();
sog_yang 8:ff7fdd152f14 247 ADV_manuf[4] = 0xCF;
sog_yang 8:ff7fdd152f14 248 } else {
sog_yang 8:ff7fdd152f14 249 isConnect = true;
sog_yang 8:ff7fdd152f14 250 isCloudFiling = false;
sog_yang 8:ff7fdd152f14 251 ADV_manuf[4] = 0xF1;
sog_yang 8:ff7fdd152f14 252 #if DEBUG_LOG
tsungta 13:5b96cb34bc70 253 pc.printf("Connected to Server at %s\n",TCP_SERVER_ADDRESS);
sog_yang 8:ff7fdd152f14 254 #endif
sog_yang 8:ff7fdd152f14 255 }
sog_yang 8:ff7fdd152f14 256 }
sog_yang 8:ff7fdd152f14 257 }
sog_yang 7:06495d54d107 258 }
sog_yang 7:06495d54d107 259 }
sog_yang 8:ff7fdd152f14 260 BLE::Instance(BLE::DEFAULT_INSTANCE).gap().updateAdvertisingPayload(GapAdvertisingData::MANUFACTURER_SPECIFIC_DATA, ADV_manuf, sizeof(ADV_manuf));
sog_yang 8:ff7fdd152f14 261 ble.waitForEvent();
sog_yang 5:ffe1a4c4881e 262 }
sog_yang 7:06495d54d107 263 }