Allows my home wiz lights to be timed on and off according to a schedule.
wiz/wiz-recv.c@7:3035a540ef65, 2021-06-09 (annotated)
- Committer:
- andrewboyson
- Date:
- Wed Jun 09 09:23:54 2021 +0000
- Revision:
- 7:3035a540ef65
- Parent:
- 0:9af80a39adcc
Changed WizSchedMinutesUtcToLocal function so that local midnight in summer is 00h00 rather than 24h00.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
andrewboyson | 0:9af80a39adcc | 1 | #include <stdint.h> |
andrewboyson | 0:9af80a39adcc | 2 | #include <stdbool.h> |
andrewboyson | 0:9af80a39adcc | 3 | #include <string.h> |
andrewboyson | 0:9af80a39adcc | 4 | |
andrewboyson | 0:9af80a39adcc | 5 | #include "user.h" |
andrewboyson | 0:9af80a39adcc | 6 | #include "log.h" |
andrewboyson | 0:9af80a39adcc | 7 | #include "eth.h" |
andrewboyson | 0:9af80a39adcc | 8 | #include "mac.h" |
andrewboyson | 0:9af80a39adcc | 9 | #include "ip4.h" |
andrewboyson | 0:9af80a39adcc | 10 | #include "ip4addr.h" |
andrewboyson | 0:9af80a39adcc | 11 | #include "wiz.h" |
andrewboyson | 0:9af80a39adcc | 12 | #include "wiz-list.h" |
andrewboyson | 0:9af80a39adcc | 13 | |
andrewboyson | 0:9af80a39adcc | 14 | static char method [20]; |
andrewboyson | 0:9af80a39adcc | 15 | static char env [20]; |
andrewboyson | 0:9af80a39adcc | 16 | static char mac [20]; |
andrewboyson | 0:9af80a39adcc | 17 | static char rssi [20]; |
andrewboyson | 0:9af80a39adcc | 18 | static char src [20]; |
andrewboyson | 0:9af80a39adcc | 19 | static char mqttCd [20]; |
andrewboyson | 0:9af80a39adcc | 20 | static char ts [20]; |
andrewboyson | 0:9af80a39adcc | 21 | static char state [20]; |
andrewboyson | 0:9af80a39adcc | 22 | static char sceneId[20]; |
andrewboyson | 0:9af80a39adcc | 23 | static char temp [20]; |
andrewboyson | 0:9af80a39adcc | 24 | static char dimming[20]; |
andrewboyson | 0:9af80a39adcc | 25 | static char id [20]; |
andrewboyson | 0:9af80a39adcc | 26 | static char result [20]; |
andrewboyson | 0:9af80a39adcc | 27 | static char success[20]; |
andrewboyson | 0:9af80a39adcc | 28 | |
andrewboyson | 0:9af80a39adcc | 29 | static void log() |
andrewboyson | 0:9af80a39adcc | 30 | { |
andrewboyson | 0:9af80a39adcc | 31 | MacLog(EthMacRemote); |
andrewboyson | 0:9af80a39adcc | 32 | Log(" "); |
andrewboyson | 0:9af80a39adcc | 33 | Ip4AddrLog(Ip4Remote); |
andrewboyson | 0:9af80a39adcc | 34 | if (*method ) { Log(" method:" ); Log(method ); } |
andrewboyson | 0:9af80a39adcc | 35 | if (*env ) { Log(" env:" ); Log(env ); } |
andrewboyson | 0:9af80a39adcc | 36 | if (*mac ) { Log(" mac:" ); Log(mac ); } |
andrewboyson | 0:9af80a39adcc | 37 | if (*rssi ) { Log(" rssi:" ); Log(rssi ); } |
andrewboyson | 0:9af80a39adcc | 38 | if (*src ) { Log(" src:" ); Log(src ); } |
andrewboyson | 0:9af80a39adcc | 39 | if (*mqttCd ) { Log(" mqttCd:" ); Log(mqttCd ); } |
andrewboyson | 0:9af80a39adcc | 40 | if (*ts ) { Log(" ts:" ); Log(ts ); } |
andrewboyson | 0:9af80a39adcc | 41 | if (*state ) { Log(" state:" ); Log(state ); } |
andrewboyson | 0:9af80a39adcc | 42 | if (*sceneId) { Log(" sceneId:"); Log(sceneId); } |
andrewboyson | 0:9af80a39adcc | 43 | if (*temp ) { Log(" temp:" ); Log(temp ); } |
andrewboyson | 0:9af80a39adcc | 44 | if (*dimming) { Log(" dimming:"); Log(dimming); } |
andrewboyson | 0:9af80a39adcc | 45 | if (*id ) { Log(" id:" ); Log(id ); } |
andrewboyson | 0:9af80a39adcc | 46 | if (*result ) { Log(" result:" ); Log(result ); } |
andrewboyson | 0:9af80a39adcc | 47 | if (*success) { Log(" success:"); Log(success); } |
andrewboyson | 0:9af80a39adcc | 48 | Log("\r\n"); |
andrewboyson | 0:9af80a39adcc | 49 | } |
andrewboyson | 0:9af80a39adcc | 50 | |
andrewboyson | 0:9af80a39adcc | 51 | static void handleNameValue(char* pName, char* pValue) |
andrewboyson | 0:9af80a39adcc | 52 | { |
andrewboyson | 0:9af80a39adcc | 53 | if (*pName == 0 ) return; //Ignore an empty name |
andrewboyson | 0:9af80a39adcc | 54 | if (*pName == '\n') return; //Ignore an empty name |
andrewboyson | 0:9af80a39adcc | 55 | if (*pName == '\r') return; //Ignore an empty name |
andrewboyson | 0:9af80a39adcc | 56 | if (strcmp(pName, "params" ) == 0) return; //Ignore the params name |
andrewboyson | 0:9af80a39adcc | 57 | else if (strcmp(pName, "method" ) == 0) strncpy(method , pValue, sizeof(method )); |
andrewboyson | 0:9af80a39adcc | 58 | else if (strcmp(pName, "env" ) == 0) strncpy(env , pValue, sizeof(env )); |
andrewboyson | 0:9af80a39adcc | 59 | else if (strcmp(pName, "mac" ) == 0) strncpy(mac , pValue, sizeof(mac )); |
andrewboyson | 0:9af80a39adcc | 60 | else if (strcmp(pName, "rssi" ) == 0) strncpy(rssi , pValue, sizeof(rssi )); |
andrewboyson | 0:9af80a39adcc | 61 | else if (strcmp(pName, "src" ) == 0) strncpy(src , pValue, sizeof(src )); |
andrewboyson | 0:9af80a39adcc | 62 | else if (strcmp(pName, "mqttCd" ) == 0) strncpy(mqttCd , pValue, sizeof(mqttCd )); |
andrewboyson | 0:9af80a39adcc | 63 | else if (strcmp(pName, "ts" ) == 0) strncpy(ts , pValue, sizeof(ts )); |
andrewboyson | 0:9af80a39adcc | 64 | else if (strcmp(pName, "state" ) == 0) strncpy(state , pValue, sizeof(state )); |
andrewboyson | 0:9af80a39adcc | 65 | else if (strcmp(pName, "sceneId" ) == 0) strncpy(sceneId, pValue, sizeof(sceneId)); |
andrewboyson | 0:9af80a39adcc | 66 | else if (strcmp(pName, "temp" ) == 0) strncpy(temp , pValue, sizeof(temp )); |
andrewboyson | 0:9af80a39adcc | 67 | else if (strcmp(pName, "dimming" ) == 0) strncpy(dimming, pValue, sizeof(dimming)); |
andrewboyson | 0:9af80a39adcc | 68 | else if (strcmp(pName, "id" ) == 0) strncpy(id , pValue, sizeof(id )); |
andrewboyson | 0:9af80a39adcc | 69 | else if (strcmp(pName, "result" ) == 0) strncpy(result , pValue, sizeof(result )); |
andrewboyson | 0:9af80a39adcc | 70 | else if (strcmp(pName, "success" ) == 0) strncpy(success, pValue, sizeof(success)); |
andrewboyson | 0:9af80a39adcc | 71 | else if (strcmp(pName, "fwVersion" ) == 0) return; //Ignore |
andrewboyson | 0:9af80a39adcc | 72 | else if (strcmp(pName, "homeId" ) == 0) return; //Ignore |
andrewboyson | 0:9af80a39adcc | 73 | else if (strcmp(pName, "phoneIp" ) == 0) return; //Ignore |
andrewboyson | 0:9af80a39adcc | 74 | else if (strcmp(pName, "phoneMac" ) == 0) return; //Ignore |
andrewboyson | 0:9af80a39adcc | 75 | else if (strcmp(pName, "register" ) == 0) return; //Ignore |
andrewboyson | 0:9af80a39adcc | 76 | else if (strcmp(pName, "rad" ) == 0) return; //Ignore |
andrewboyson | 0:9af80a39adcc | 77 | else if (strcmp(pName, "updateStatus") == 0) return; //Ignore |
andrewboyson | 0:9af80a39adcc | 78 | else if (strcmp(pName, "speed" ) == 0) return; //Ignore |
andrewboyson | 0:9af80a39adcc | 79 | |
andrewboyson | 0:9af80a39adcc | 80 | else LogF("Unrecognised name '%s'\r\n", pName); |
andrewboyson | 0:9af80a39adcc | 81 | } |
andrewboyson | 0:9af80a39adcc | 82 | static void clear() |
andrewboyson | 0:9af80a39adcc | 83 | { |
andrewboyson | 0:9af80a39adcc | 84 | *method = 0; |
andrewboyson | 0:9af80a39adcc | 85 | *env = 0; |
andrewboyson | 0:9af80a39adcc | 86 | *mac = 0; |
andrewboyson | 0:9af80a39adcc | 87 | *rssi = 0; |
andrewboyson | 0:9af80a39adcc | 88 | *src = 0; |
andrewboyson | 0:9af80a39adcc | 89 | *mqttCd = 0; |
andrewboyson | 0:9af80a39adcc | 90 | *ts = 0; |
andrewboyson | 0:9af80a39adcc | 91 | *state = 0; |
andrewboyson | 0:9af80a39adcc | 92 | *sceneId = 0; |
andrewboyson | 0:9af80a39adcc | 93 | *temp = 0; |
andrewboyson | 0:9af80a39adcc | 94 | *dimming = 0; |
andrewboyson | 0:9af80a39adcc | 95 | *id = 0; |
andrewboyson | 0:9af80a39adcc | 96 | *result = 0; |
andrewboyson | 0:9af80a39adcc | 97 | *success = 0; |
andrewboyson | 0:9af80a39adcc | 98 | } |
andrewboyson | 0:9af80a39adcc | 99 | static void decodePacket(int length, char* pData) |
andrewboyson | 0:9af80a39adcc | 100 | { |
andrewboyson | 0:9af80a39adcc | 101 | clear(); |
andrewboyson | 0:9af80a39adcc | 102 | int i = 0; |
andrewboyson | 0:9af80a39adcc | 103 | bool finished = length <= 0; |
andrewboyson | 0:9af80a39adcc | 104 | char name[20]; |
andrewboyson | 0:9af80a39adcc | 105 | char value[20]; |
andrewboyson | 0:9af80a39adcc | 106 | char* pName = name; |
andrewboyson | 0:9af80a39adcc | 107 | char* pValue = value; |
andrewboyson | 0:9af80a39adcc | 108 | char* p = name; |
andrewboyson | 0:9af80a39adcc | 109 | *pValue = 0; |
andrewboyson | 0:9af80a39adcc | 110 | while(!finished) |
andrewboyson | 0:9af80a39adcc | 111 | { |
andrewboyson | 0:9af80a39adcc | 112 | switch (pData[i]) |
andrewboyson | 0:9af80a39adcc | 113 | { |
andrewboyson | 0:9af80a39adcc | 114 | case 0: //Finish if EoS |
andrewboyson | 0:9af80a39adcc | 115 | finished = true; |
andrewboyson | 0:9af80a39adcc | 116 | *p = 0; |
andrewboyson | 0:9af80a39adcc | 117 | handleNameValue(name, value); |
andrewboyson | 0:9af80a39adcc | 118 | break; |
andrewboyson | 0:9af80a39adcc | 119 | case '\"': //Ignore paranthesis |
andrewboyson | 0:9af80a39adcc | 120 | break; |
andrewboyson | 0:9af80a39adcc | 121 | case '{': //End of name value pair |
andrewboyson | 0:9af80a39adcc | 122 | case '}': |
andrewboyson | 0:9af80a39adcc | 123 | case ',': |
andrewboyson | 0:9af80a39adcc | 124 | *p = 0; |
andrewboyson | 0:9af80a39adcc | 125 | handleNameValue(name, value); |
andrewboyson | 0:9af80a39adcc | 126 | p = name; |
andrewboyson | 0:9af80a39adcc | 127 | *pValue = 0; |
andrewboyson | 0:9af80a39adcc | 128 | *p = 0; |
andrewboyson | 0:9af80a39adcc | 129 | break; |
andrewboyson | 0:9af80a39adcc | 130 | case ':': |
andrewboyson | 0:9af80a39adcc | 131 | *p = 0; |
andrewboyson | 0:9af80a39adcc | 132 | p = value; |
andrewboyson | 0:9af80a39adcc | 133 | *p = 0; |
andrewboyson | 0:9af80a39adcc | 134 | break; |
andrewboyson | 0:9af80a39adcc | 135 | default: |
andrewboyson | 0:9af80a39adcc | 136 | *p++ = pData[i]; |
andrewboyson | 0:9af80a39adcc | 137 | break; |
andrewboyson | 0:9af80a39adcc | 138 | } |
andrewboyson | 0:9af80a39adcc | 139 | i++; |
andrewboyson | 0:9af80a39adcc | 140 | if (i == length) |
andrewboyson | 0:9af80a39adcc | 141 | { |
andrewboyson | 0:9af80a39adcc | 142 | finished = true; |
andrewboyson | 0:9af80a39adcc | 143 | *p = 0; |
andrewboyson | 0:9af80a39adcc | 144 | handleNameValue(name, value); |
andrewboyson | 0:9af80a39adcc | 145 | } |
andrewboyson | 0:9af80a39adcc | 146 | } |
andrewboyson | 0:9af80a39adcc | 147 | if (WizTrace) log(); |
andrewboyson | 0:9af80a39adcc | 148 | |
andrewboyson | 0:9af80a39adcc | 149 | if (strcmp(method, "syncPilot" ) == 0 ) WizListStatusAdd(EthMacRemote, rssi, state, sceneId, dimming); |
andrewboyson | 0:9af80a39adcc | 150 | else if (strcmp(method, "registration") == 0 ) ; //Ignore registration method |
andrewboyson | 0:9af80a39adcc | 151 | else if (strcmp(method, "firstBeat" ) == 0 ) ; //Ignore firstBeat method |
andrewboyson | 0:9af80a39adcc | 152 | else if (strcmp(method, "syncAccEvt" ) == 0 ) ; //Ignore syncAccEvt method |
andrewboyson | 0:9af80a39adcc | 153 | else if (strcmp(method, "updateOta" ) == 0 ) ; //Ignore updateOta method |
andrewboyson | 0:9af80a39adcc | 154 | else if (strcmp(method, "setPilot" ) == 0 && strcmp(success, "true") == 0) WizListReceivedSuccess(EthMacRemote); |
andrewboyson | 0:9af80a39adcc | 155 | else LogF("Unrecognised method '%s' in %.*s\r\n", method, length, pData); |
andrewboyson | 0:9af80a39adcc | 156 | } |
andrewboyson | 0:9af80a39adcc | 157 | |
andrewboyson | 0:9af80a39adcc | 158 | static int handleReceivedPacket(uint16_t port, void (*traceback)(void), int dataLengthRx, char* pDataRx, int* pPataLengthTx, char* pDataTx) |
andrewboyson | 0:9af80a39adcc | 159 | { |
andrewboyson | 0:9af80a39adcc | 160 | if (WizTrace) |
andrewboyson | 0:9af80a39adcc | 161 | { |
andrewboyson | 0:9af80a39adcc | 162 | LogTimeF("WIZ packet received on port %u\r\n", port); |
andrewboyson | 0:9af80a39adcc | 163 | traceback(); |
andrewboyson | 0:9af80a39adcc | 164 | LogF("%.*s\r\n", dataLengthRx, pDataRx); |
andrewboyson | 0:9af80a39adcc | 165 | } |
andrewboyson | 0:9af80a39adcc | 166 | decodePacket(dataLengthRx, pDataRx); |
andrewboyson | 0:9af80a39adcc | 167 | pPataLengthTx = 0; |
andrewboyson | 0:9af80a39adcc | 168 | return 0; |
andrewboyson | 0:9af80a39adcc | 169 | } |
andrewboyson | 0:9af80a39adcc | 170 | |
andrewboyson | 0:9af80a39adcc | 171 | void WizRecvInit() |
andrewboyson | 0:9af80a39adcc | 172 | { |
andrewboyson | 0:9af80a39adcc | 173 | UserUdpPort1 = 38899; |
andrewboyson | 0:9af80a39adcc | 174 | UserUdpPort2 = 38900; |
andrewboyson | 0:9af80a39adcc | 175 | UserHandleReceivedUdpPacket = handleReceivedPacket; |
andrewboyson | 0:9af80a39adcc | 176 | } |