updated
Dependencies: MTS-Serial libmDot mbed-rtos mbed
Fork of mDot_LoRa_Street_light by
lora-task.cpp@9:531bddbe36a9, 2017-10-17 (annotated)
- Committer:
- venubk
- Date:
- Tue Oct 17 11:52:13 2017 +0000
- Revision:
- 9:531bddbe36a9
- Parent:
- 8:525a53f54326
energy meter integrated
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
hariom | 2:20a5d4681abf | 1 | #include<stdio.h> |
hariom | 2:20a5d4681abf | 2 | #include "mbed.h" |
hariom | 2:20a5d4681abf | 3 | #include "mDot.h" |
hariom | 2:20a5d4681abf | 4 | #include "rtos.h" |
hariom | 2:20a5d4681abf | 5 | #include "wrapper.h" |
hariom | 2:20a5d4681abf | 6 | #include "MTSLog.h" |
hariom | 2:20a5d4681abf | 7 | #include"Thread.h" |
hariom | 2:20a5d4681abf | 8 | //#include"MTSLogs.h" |
hariom | 2:20a5d4681abf | 9 | |
hariom | 2:20a5d4681abf | 10 | int spi_write(int *buf); |
venubk | 6:db60638d7f9a | 11 | int spi_read(int *buf); |
hariom | 2:20a5d4681abf | 12 | void zigbee_func(int deviceId,int state); |
hariom | 2:20a5d4681abf | 13 | |
hariom | 2:20a5d4681abf | 14 | void ble_task(void const *args); |
hariom | 2:20a5d4681abf | 15 | void zigbee_task(void const *args); |
hariom | 2:20a5d4681abf | 16 | |
hariom | 2:20a5d4681abf | 17 | Mutex my_mutex; |
hariom | 2:20a5d4681abf | 18 | //static int flag; |
hariom | 2:20a5d4681abf | 19 | extern int ble_flag; |
hariom | 2:20a5d4681abf | 20 | extern int zigbee_flag; |
hariom | 2:20a5d4681abf | 21 | char gateway_buffer[128]; |
hariom | 2:20a5d4681abf | 22 | int device_buffer[8]; |
hariom | 2:20a5d4681abf | 23 | |
hariom | 2:20a5d4681abf | 24 | int process_gateway_data(const char *device_type, int *device_buffer, char *data_buffer) |
hariom | 2:20a5d4681abf | 25 | { |
hariom | 2:20a5d4681abf | 26 | const char *pBuf; |
hariom | 2:20a5d4681abf | 27 | int len; |
hariom | 2:20a5d4681abf | 28 | int i; |
hariom | 2:20a5d4681abf | 29 | |
hariom | 2:20a5d4681abf | 30 | my_mutex.lock(); |
hariom | 2:20a5d4681abf | 31 | for (i = 0; i < 8; i++) |
hariom | 2:20a5d4681abf | 32 | device_buffer[i] = 0; |
hariom | 2:20a5d4681abf | 33 | //memset(device_buffer, 0, 8); |
hariom | 2:20a5d4681abf | 34 | pBuf = strstr(data_buffer, "DeviceType"); |
hariom | 2:20a5d4681abf | 35 | if (!pBuf) { |
hariom | 2:20a5d4681abf | 36 | printf("device type not found\r\n"); |
hariom | 2:20a5d4681abf | 37 | my_mutex.unlock(); |
hariom | 2:20a5d4681abf | 38 | return false; |
hariom | 2:20a5d4681abf | 39 | } |
hariom | 2:20a5d4681abf | 40 | |
hariom | 2:20a5d4681abf | 41 | pBuf += 13; |
hariom | 2:20a5d4681abf | 42 | |
hariom | 2:20a5d4681abf | 43 | len = strstr((const char *)pBuf, ",") - (char *)pBuf - 1; /* ends with / */ |
hariom | 2:20a5d4681abf | 44 | if (len <= 0) { |
hariom | 2:20a5d4681abf | 45 | my_mutex.unlock(); |
hariom | 2:20a5d4681abf | 46 | return false; |
hariom | 2:20a5d4681abf | 47 | } |
hariom | 2:20a5d4681abf | 48 | strncpy ((char *)device_type, (const char *)pBuf, len); |
hariom | 2:20a5d4681abf | 49 | printf("device type is %s\r\n", device_type); |
hariom | 2:20a5d4681abf | 50 | if (!strcmp(device_type, "ble_bulbs")) { |
hariom | 2:20a5d4681abf | 51 | device_buffer[0] = 0xB3; |
hariom | 2:20a5d4681abf | 52 | device_buffer[1] = 0x01; |
hariom | 2:20a5d4681abf | 53 | |
hariom | 2:20a5d4681abf | 54 | pBuf = strstr((const char *)pBuf, "powered"); |
hariom | 2:20a5d4681abf | 55 | if (!pBuf) { |
hariom | 2:20a5d4681abf | 56 | printf("device action not found\r\n"); |
hariom | 2:20a5d4681abf | 57 | my_mutex.unlock(); |
hariom | 2:20a5d4681abf | 58 | return false; |
hariom | 2:20a5d4681abf | 59 | } |
hariom | 2:20a5d4681abf | 60 | |
hariom | 2:20a5d4681abf | 61 | pBuf += 9; |
hariom | 2:20a5d4681abf | 62 | len = strstr((const char *)pBuf, ",") - (char *)pBuf; /* ends with / */ |
hariom | 2:20a5d4681abf | 63 | if (len <= 0) { |
hariom | 2:20a5d4681abf | 64 | my_mutex.unlock(); |
hariom | 2:20a5d4681abf | 65 | return false; |
hariom | 2:20a5d4681abf | 66 | } |
hariom | 2:20a5d4681abf | 67 | |
hariom | 2:20a5d4681abf | 68 | if (!strncmp ((char *)pBuf, "true", len)) { |
hariom | 2:20a5d4681abf | 69 | device_buffer[2] = 0x01; |
hariom | 2:20a5d4681abf | 70 | } |
hariom | 2:20a5d4681abf | 71 | else if (!strncmp ((char *)pBuf, "false", len)) { |
hariom | 2:20a5d4681abf | 72 | device_buffer[2] = 0x00; |
hariom | 2:20a5d4681abf | 73 | } |
hariom | 2:20a5d4681abf | 74 | else { |
hariom | 2:20a5d4681abf | 75 | device_buffer[2] = 0x02; |
hariom | 2:20a5d4681abf | 76 | } |
hariom | 2:20a5d4681abf | 77 | |
hariom | 2:20a5d4681abf | 78 | pBuf = strstr((const char *)pBuf, "color"); |
hariom | 2:20a5d4681abf | 79 | if (!pBuf) { |
hariom | 2:20a5d4681abf | 80 | printf("device color not found\r\n"); |
hariom | 2:20a5d4681abf | 81 | my_mutex.unlock(); |
hariom | 2:20a5d4681abf | 82 | return false; |
hariom | 2:20a5d4681abf | 83 | } |
hariom | 2:20a5d4681abf | 84 | |
hariom | 2:20a5d4681abf | 85 | pBuf += 8; |
hariom | 2:20a5d4681abf | 86 | len = strstr((const char *)pBuf, ",") - (char *)pBuf - 1; /* ends with / */ |
hariom | 2:20a5d4681abf | 87 | if (len <= 0) { |
hariom | 2:20a5d4681abf | 88 | my_mutex.unlock(); |
hariom | 2:20a5d4681abf | 89 | return false; |
hariom | 2:20a5d4681abf | 90 | } |
hariom | 2:20a5d4681abf | 91 | |
hariom | 2:20a5d4681abf | 92 | if (!strncmp ((char *)pBuf, "red", len)) { |
hariom | 2:20a5d4681abf | 93 | device_buffer[3] = 0x00; |
hariom | 2:20a5d4681abf | 94 | } |
hariom | 2:20a5d4681abf | 95 | else if (!strncmp ((char *)pBuf, "green", len)) { |
hariom | 2:20a5d4681abf | 96 | device_buffer[3] = 0x01; |
hariom | 2:20a5d4681abf | 97 | } |
hariom | 2:20a5d4681abf | 98 | else if (!strncmp ((char *)pBuf, "blue", len)){ |
hariom | 2:20a5d4681abf | 99 | device_buffer[3] = 0x02; |
hariom | 2:20a5d4681abf | 100 | } |
hariom | 2:20a5d4681abf | 101 | else if (!strncmp ((char *)pBuf, "yellow", len)){ |
hariom | 2:20a5d4681abf | 102 | device_buffer[3] = 0x03; |
hariom | 2:20a5d4681abf | 103 | } |
hariom | 2:20a5d4681abf | 104 | else if (!strncmp ((char *)pBuf, "cyan", len)){ |
hariom | 2:20a5d4681abf | 105 | device_buffer[3] = 0x04; |
hariom | 2:20a5d4681abf | 106 | } |
hariom | 2:20a5d4681abf | 107 | else if (!strncmp ((char *)pBuf, "magenta", len)){ |
hariom | 2:20a5d4681abf | 108 | device_buffer[3] = 0x05; |
hariom | 2:20a5d4681abf | 109 | } |
hariom | 2:20a5d4681abf | 110 | else { |
hariom | 2:20a5d4681abf | 111 | device_buffer[3] = 0x06; |
hariom | 2:20a5d4681abf | 112 | } |
hariom | 2:20a5d4681abf | 113 | pBuf = strstr((const char *)pBuf, "dim"); |
hariom | 2:20a5d4681abf | 114 | if (!pBuf) { |
hariom | 2:20a5d4681abf | 115 | printf("device dim not found\r\n"); |
hariom | 2:20a5d4681abf | 116 | my_mutex.unlock(); |
hariom | 2:20a5d4681abf | 117 | return false; |
hariom | 2:20a5d4681abf | 118 | } |
hariom | 2:20a5d4681abf | 119 | |
hariom | 2:20a5d4681abf | 120 | pBuf += 5; |
hariom | 2:20a5d4681abf | 121 | device_buffer[4] = atoi(pBuf); |
hariom | 2:20a5d4681abf | 122 | my_mutex.unlock(); |
hariom | 2:20a5d4681abf | 123 | return true; |
hariom | 2:20a5d4681abf | 124 | } |
hariom | 2:20a5d4681abf | 125 | if (!strcmp(device_type, "zigbee")) { |
hariom | 2:20a5d4681abf | 126 | pBuf = strstr((const char *)pBuf, "DeviceName"); |
hariom | 2:20a5d4681abf | 127 | if (!pBuf) { |
hariom | 2:20a5d4681abf | 128 | printf("device name not found\r\n"); |
hariom | 2:20a5d4681abf | 129 | my_mutex.unlock(); |
hariom | 2:20a5d4681abf | 130 | return false; |
hariom | 2:20a5d4681abf | 131 | } |
hariom | 2:20a5d4681abf | 132 | |
hariom | 2:20a5d4681abf | 133 | pBuf += 13; |
hariom | 2:20a5d4681abf | 134 | len = strstr((const char *)pBuf, ",") - (char *)pBuf - 1; |
hariom | 2:20a5d4681abf | 135 | if (len <= 0) { |
hariom | 2:20a5d4681abf | 136 | my_mutex.unlock(); |
hariom | 2:20a5d4681abf | 137 | return false; |
hariom | 2:20a5d4681abf | 138 | } |
hariom | 2:20a5d4681abf | 139 | |
hariom | 2:20a5d4681abf | 140 | if (!strncmp ((char *)pBuf, "Light_bulb", len)) { |
hariom | 2:20a5d4681abf | 141 | device_buffer[0] = 1; |
hariom | 2:20a5d4681abf | 142 | } |
hariom | 2:20a5d4681abf | 143 | else if (!strncmp ((char *)pBuf, "Light_lamp", len)) { |
hariom | 2:20a5d4681abf | 144 | device_buffer[0] = 2; |
hariom | 2:20a5d4681abf | 145 | } |
hariom | 2:20a5d4681abf | 146 | else if (!strncmp ((char *)pBuf, "Tv", len)) { |
hariom | 2:20a5d4681abf | 147 | device_buffer[0] = 3; |
hariom | 2:20a5d4681abf | 148 | } |
hariom | 2:20a5d4681abf | 149 | else { |
hariom | 2:20a5d4681abf | 150 | device_buffer[0] = 4; |
hariom | 2:20a5d4681abf | 151 | } |
hariom | 2:20a5d4681abf | 152 | |
hariom | 2:20a5d4681abf | 153 | pBuf = strstr((const char *)pBuf, "powered"); |
hariom | 2:20a5d4681abf | 154 | if (!pBuf) { |
hariom | 2:20a5d4681abf | 155 | printf("device action not found\r\n"); |
hariom | 2:20a5d4681abf | 156 | my_mutex.unlock(); |
hariom | 2:20a5d4681abf | 157 | return false; |
hariom | 2:20a5d4681abf | 158 | } |
hariom | 2:20a5d4681abf | 159 | |
hariom | 2:20a5d4681abf | 160 | pBuf += 9; |
hariom | 2:20a5d4681abf | 161 | len = strstr((const char *)pBuf, ",") - (char *)pBuf; /* ends with / */ |
hariom | 2:20a5d4681abf | 162 | if (len <= 0) { |
hariom | 2:20a5d4681abf | 163 | my_mutex.unlock(); |
hariom | 2:20a5d4681abf | 164 | return false; |
hariom | 2:20a5d4681abf | 165 | } |
hariom | 2:20a5d4681abf | 166 | |
hariom | 2:20a5d4681abf | 167 | if (!strncmp ((char *)pBuf, "true", len)) { |
hariom | 2:20a5d4681abf | 168 | device_buffer[1] = 0x01; |
hariom | 2:20a5d4681abf | 169 | } |
hariom | 2:20a5d4681abf | 170 | else if (!strncmp ((char *)pBuf, "false", len)) { |
hariom | 2:20a5d4681abf | 171 | device_buffer[1] = 0x00; |
hariom | 2:20a5d4681abf | 172 | } |
hariom | 2:20a5d4681abf | 173 | else { |
hariom | 2:20a5d4681abf | 174 | device_buffer[1] = 0x02; |
hariom | 2:20a5d4681abf | 175 | } |
hariom | 2:20a5d4681abf | 176 | my_mutex.unlock(); |
hariom | 2:20a5d4681abf | 177 | return true; |
hariom | 2:20a5d4681abf | 178 | } |
hariom | 2:20a5d4681abf | 179 | printf("wrong device type\r\n"); |
hariom | 2:20a5d4681abf | 180 | my_mutex.unlock(); |
hariom | 2:20a5d4681abf | 181 | return false; |
hariom | 2:20a5d4681abf | 182 | } |
hariom | 2:20a5d4681abf | 183 | |
venubk | 6:db60638d7f9a | 184 | char data_to_gw[100]; |
venubk | 6:db60638d7f9a | 185 | int data_from_ble[100]; |
venubk | 6:db60638d7f9a | 186 | int bufferSize = 0; |
venubk | 6:db60638d7f9a | 187 | |
venubk | 6:db60638d7f9a | 188 | void convertAsciiToChar(int *inBuff, char *outBuff) |
venubk | 6:db60638d7f9a | 189 | { |
venubk | 6:db60638d7f9a | 190 | for(int i = 0; i < bufferSize; i++) |
venubk | 6:db60638d7f9a | 191 | { |
venubk | 8:525a53f54326 | 192 | if(inBuff[i] == 0x20) |
venubk | 8:525a53f54326 | 193 | { |
venubk | 8:525a53f54326 | 194 | outBuff[i] = ' '; |
venubk | 8:525a53f54326 | 195 | } |
venubk | 8:525a53f54326 | 196 | else if(inBuff[i] == 0x2E) |
venubk | 8:525a53f54326 | 197 | { |
venubk | 8:525a53f54326 | 198 | outBuff[i] = '.'; |
venubk | 8:525a53f54326 | 199 | } |
venubk | 8:525a53f54326 | 200 | else if(inBuff[i] == 0xFE) |
venubk | 8:525a53f54326 | 201 | { |
venubk | 8:525a53f54326 | 202 | // printf("buffer size %d\n", bufferSize); |
venubk | 8:525a53f54326 | 203 | outBuff[i] = '\0'; |
venubk | 8:525a53f54326 | 204 | printf("data received = %s\n",outBuff); |
venubk | 8:525a53f54326 | 205 | } |
venubk | 8:525a53f54326 | 206 | else |
venubk | 8:525a53f54326 | 207 | { |
venubk | 8:525a53f54326 | 208 | if(inBuff[i] >= 0x30) |
venubk | 8:525a53f54326 | 209 | outBuff[i] = (char)inBuff[i]; |
venubk | 8:525a53f54326 | 210 | } |
venubk | 8:525a53f54326 | 211 | |
venubk | 8:525a53f54326 | 212 | |
venubk | 6:db60638d7f9a | 213 | } |
venubk | 6:db60638d7f9a | 214 | return; |
venubk | 6:db60638d7f9a | 215 | } |
venubk | 6:db60638d7f9a | 216 | |
hariom | 2:20a5d4681abf | 217 | void send_data_to_gateway(void const *args) |
hariom | 2:20a5d4681abf | 218 | { |
hariom | 2:20a5d4681abf | 219 | //int light_status; |
hariom | 2:20a5d4681abf | 220 | //int light_color; |
varshaberya123 | 5:f16b067257b6 | 221 | |
varshaberya123 | 5:f16b067257b6 | 222 | //Thread ble_thread(ble_etask); |
varshaberya123 | 5:f16b067257b6 | 223 | // LogInfo("created thead for ble_Energymeter\r\n"); |
varshaberya123 | 5:f16b067257b6 | 224 | //need to form packet to send to gateway before that need to figure out ble reading data |
venubk | 6:db60638d7f9a | 225 | |
venubk | 6:db60638d7f9a | 226 | |
hariom | 2:20a5d4681abf | 227 | logInfo("sending data to gateway"); |
hariom | 2:20a5d4681abf | 228 | while (true) { |
venubk | 6:db60638d7f9a | 229 | if(!ble_flag) |
venubk | 6:db60638d7f9a | 230 | { |
venubk | 6:db60638d7f9a | 231 | spi_read(data_from_ble); |
venubk | 6:db60638d7f9a | 232 | convertAsciiToChar(data_from_ble, data_to_gw); |
venubk | 8:525a53f54326 | 233 | printf("********* data %s***********\n",data_to_gw); |
venubk | 6:db60638d7f9a | 234 | send(data_to_gw); |
venubk | 6:db60638d7f9a | 235 | } |
hariom | 2:20a5d4681abf | 236 | osDelay(1000); |
hariom | 2:20a5d4681abf | 237 | } |
hariom | 2:20a5d4681abf | 238 | } |
hariom | 2:20a5d4681abf | 239 | |
hariom | 2:20a5d4681abf | 240 | void receive_data_from_gateway(void const *args) |
hariom | 2:20a5d4681abf | 241 | { |
hariom | 2:20a5d4681abf | 242 | |
hariom | 2:20a5d4681abf | 243 | int res; |
hariom | 2:20a5d4681abf | 244 | char device_type[16]; |
hariom | 2:20a5d4681abf | 245 | |
hariom | 2:20a5d4681abf | 246 | logInfo("receiving data from gateway thread started\r\n"); |
hariom | 2:20a5d4681abf | 247 | |
hariom | 2:20a5d4681abf | 248 | Thread ble_thread(ble_task); |
hariom | 2:20a5d4681abf | 249 | Thread zigbee_thread(zigbee_task); |
hariom | 2:20a5d4681abf | 250 | |
hariom | 2:20a5d4681abf | 251 | logInfo("created thread for ble and zigbee\r\n"); |
hariom | 2:20a5d4681abf | 252 | |
hariom | 2:20a5d4681abf | 253 | while(true) { |
hariom | 2:20a5d4681abf | 254 | |
hariom | 2:20a5d4681abf | 255 | memset(gateway_buffer, 0, 128); |
hariom | 2:20a5d4681abf | 256 | send("dummy"); |
hariom | 2:20a5d4681abf | 257 | res = receive_data(gateway_buffer); |
hariom | 2:20a5d4681abf | 258 | if (res == false) { |
hariom | 2:20a5d4681abf | 259 | printf("no data received form gateway\r\n"); |
hariom | 2:20a5d4681abf | 260 | osDelay(1000); |
hariom | 4:dfe5d73d6726 | 261 | //continue; |
hariom | 2:20a5d4681abf | 262 | } |
hariom | 4:dfe5d73d6726 | 263 | //strcpy(gateway_buffer, "{\"DeviceType\":\"ble_bulbs\",\"DeviceName\":\"bulb1\",\"DeviceCommand\":\"desired_state\": {\"powered\":true,\"color\":\"red\",\"dim\":50}}"); |
hariom | 2:20a5d4681abf | 264 | printf("data received in mdot from gateway: %s\r\n", gateway_buffer); |
hariom | 2:20a5d4681abf | 265 | |
hariom | 2:20a5d4681abf | 266 | memset(device_type, 0, 16); |
hariom | 2:20a5d4681abf | 267 | res = process_gateway_data(device_type, device_buffer, gateway_buffer); |
hariom | 2:20a5d4681abf | 268 | if (res == true) { |
hariom | 2:20a5d4681abf | 269 | printf("device_buffer data is: %X, %X, %X, %X, %d\r\n", device_buffer[0], device_buffer[1], device_buffer[2], device_buffer[3], device_buffer[4]); |
hariom | 2:20a5d4681abf | 270 | |
hariom | 2:20a5d4681abf | 271 | if (strcmp(device_type, "ble_bulbs") == 0) { |
hariom | 2:20a5d4681abf | 272 | printf("sending data to BLE\r\n"); |
hariom | 2:20a5d4681abf | 273 | //spi_write(device_buffer); |
hariom | 2:20a5d4681abf | 274 | ble_flag = 1; |
hariom | 2:20a5d4681abf | 275 | } |
hariom | 2:20a5d4681abf | 276 | else if (strcmp(device_type, "zigbee") == 0) { |
hariom | 2:20a5d4681abf | 277 | printf("sending data to zigbee\r\n"); |
hariom | 2:20a5d4681abf | 278 | zigbee_flag = 1; |
hariom | 2:20a5d4681abf | 279 | //zigbee_func(device_buffer[0], device_buffer[1]); |
hariom | 2:20a5d4681abf | 280 | } |
hariom | 2:20a5d4681abf | 281 | else { |
hariom | 2:20a5d4681abf | 282 | printf("wrong device type\r\n"); |
hariom | 2:20a5d4681abf | 283 | } |
hariom | 2:20a5d4681abf | 284 | } |
hariom | 2:20a5d4681abf | 285 | /* else { |
hariom | 2:20a5d4681abf | 286 | printf("error in processing gateway data\r\n"); |
hariom | 2:20a5d4681abf | 287 | } |
hariom | 2:20a5d4681abf | 288 | */ |
hariom | 2:20a5d4681abf | 289 | osDelay(1000); |
hariom | 2:20a5d4681abf | 290 | } |
hariom | 2:20a5d4681abf | 291 | } |