afLib 1.3 which is supporting both SPI and UART
Dependencies: vt100 mbed afLib_1_3
af_attriburtes.cpp
00001 #include "mbed.h" 00002 #include <ctype.h> 00003 #include "af_attributes.h" 00004 #include "af_mgr.h" 00005 #include "edge_time.h" 00006 #include "edge_mgr.h" 00007 #include "edge_reset_mgr.h" 00008 00009 00010 static const af_attribute_type af_attr[] = { 00011 #if 1 00012 /* ID, Description, Type, Size */ 00013 /* Software Reset Request */ 00014 { ATTR_SOFTWARE_RESET, "Software Reset", ATTRIBUTE_TYPE_BOOLEAN, 1 }, 00015 { ATTR_MCU_RESET_REASON, "MCU Reset Reason", ATTRIBUTE_TYPE_UTF8S, 64 }, 00016 00017 { ATTR_LED, "LED", ATTRIBUTE_TYPE_SINT16, 2 }, 00018 { ATTR_IO0, "I/O 0", ATTRIBUTE_TYPE_SINT64, 8 }, 00019 { ATTR_IO1, "I/O 1", ATTRIBUTE_TYPE_SINT64, 8 }, 00020 { ATTR_IO2, "I/O 2", ATTRIBUTE_TYPE_SINT64, 8 }, 00021 { ATTR_BUTTON, "BUTTON", ATTRIBUTE_TYPE_BOOLEAN, 2 }, 00022 { ATTR_IO3, "I/O 3", ATTRIBUTE_TYPE_SINT64, 8 }, 00023 { ATTR_BOOT_LOADER_VER, "Bootloader Version", ATTRIBUTE_TYPE_SINT64, 8 }, 00024 { ATTR_BLE_STACK_VER, "BLE Stack Version", ATTRIBUTE_TYPE_SINT64, 8 }, 00025 { ATTR_FW_APP_VER, "FW Application Version", ATTRIBUTE_TYPE_SINT64, 8 }, 00026 { ATTR_DEVICE_DESC, "Device Description", ATTRIBUTE_TYPE_SINT64, 8 }, 00027 { ATTR_WIFI_VER, "Wi-Fi chip", ATTRIBUTE_TYPE_SINT64, 8 }, 00028 { ATTR_OFFLINE_SCHED, "Offline Schedules enable", ATTRIBUTE_TYPE_SINT16, 2 }, 00029 { ATTR_SECURITY_ENABLED, "Security Enabled", ATTRIBUTE_TYPE_SINT8, 1 }, /* ? */ 00030 { ATTR_UTC_OFFSET, "UTC offset data", ATTRIBUTE_TYPE_BYTES, 8 }, 00031 { ATTR_CONFIGURES_SSID, "Configured SSID", ATTRIBUTE_TYPE_UTF8S, 10 }, /* ? */ 00032 { ATTR_WIFI_BARS, "Wi-Fi Bars", ATTRIBUTE_TYPE_SINT8, 1 }, 00033 { ATTR_WIFI_STDY_STATE, "Wi-Fi Steady State", ATTRIBUTE_TYPE_SINT8, 1 }, 00034 { ATTR_COMMAND, "Command", ATTRIBUTE_TYPE_BYTES, 8 }, /* ? */ 00035 { ATTR_ASR_STATE, "ASR State", ATTRIBUTE_TYPE_SINT8, 1 }, 00036 { ATTR_LOW_BATTERY, "Low Battery Warning", ATTRIBUTE_TYPE_SINT8, 1 }, 00037 { ATTR_LINKED_TIMESTAMP, "Linked Timestamp", ATTRIBUTE_TYPE_SINT32, 4 }, 00038 { ATTR_ATTR_ACK, "Attribute ACK", ATTRIBUTE_TYPE_SINT16, 8 }, 00039 { ATTR_REBOOT_REASON, "Reboot Reason", ATTRIBUTE_TYPE_UTF8S, 100 }, 00040 { ATTR_BLE_COMMS, "BLE Comms", ATTRIBUTE_TYPE_BYTES, 12 }, 00041 { ATTR_MCU_INTERFACE, "MCU Interface", ATTRIBUTE_TYPE_SINT8, 1 }, 00042 { 0, 0, 0, 0 } 00043 } ; 00044 #endif 00045 00046 int get_af_attr(uint16_t id) 00047 { 00048 int i ; 00049 for (i = 0 ; af_attr[i].id != 0 ; i++ ) { 00050 if (id == af_attr[i].id) { 00051 break ; 00052 } 00053 } 00054 return (i) ; 00055 } 00056 00057 void print_af_error(int resultCode) 00058 { 00059 switch(resultCode) { 00060 case afSUCCESS: 00061 tty->printf("Operation completed successfully\n") ; 00062 break ; 00063 case afERROR_NO_SUCH_ATTRIBUTE: 00064 tty->printf("Request was made for unknown attribute id\n") ; 00065 break ; 00066 case afERROR_BUSY: 00067 tty->printf("Request already in progress, try again\n") ; 00068 break ; 00069 case afERROR_INVALID_COMMAND: 00070 tty->printf("Command could not be parsed\n") ; 00071 break ; 00072 case afERROR_QUEUE_OVERFLOW: 00073 tty->printf("Queue is full\n") ; 00074 break ; 00075 case afERROR_QUEUE_UNDERFLOW: 00076 tty->printf("Queue is empty\n") ; 00077 break ; 00078 case afERROR_INVALID_PARAM: 00079 tty->printf("Bad input parameter\n") ; 00080 break ; 00081 default: 00082 tty->printf("Unknown error code %d\n", resultCode) ; 00083 break ; 00084 } 00085 } 00086 00087 void af_print_values( 00088 const uint8_t requestId, 00089 const uint16_t attributeId, 00090 const uint16_t valueLen, 00091 const uint8_t *value 00092 ) 00093 { 00094 int i, id ; 00095 00096 id = get_af_attr(attributeId) ; 00097 00098 if (af_attr[id].id != 0) { 00099 tty->printf(af_attr[id].description) ; 00100 tty->printf(" : ") ; 00101 switch(af_attr[id].attribute_type) { 00102 case ATTRIBUTE_TYPE_BOOLEAN: 00103 case ATTRIBUTE_TYPE_SINT8: 00104 if (valueLen >= 1) { 00105 tty->printf("%02X\n", value[0]) ; 00106 } 00107 break ; 00108 case ATTRIBUTE_TYPE_SINT16: 00109 if (valueLen >= 2) { 00110 tty->printf("%02X%02X\n", value[1], value[0]) ; 00111 } 00112 break ; 00113 case ATTRIBUTE_TYPE_SINT32: 00114 if (valueLen >= 4) { 00115 tty->printf("%02X%02X%02X%02X\n", 00116 value[3],value[2],value[1],value[0]) ; 00117 } 00118 break ; 00119 case ATTRIBUTE_TYPE_SINT64: 00120 if (valueLen >= 8) { 00121 tty->printf("%02X%02X %02X%02X %02X%02X %02X%02X\n", 00122 value[7], value[6], value[5], value[4], 00123 value[3], value[2], value[1], value[0]) ; 00124 } 00125 break ; 00126 case ATTRIBUTE_TYPE_UTF8S: 00127 if (valueLen > 0) { 00128 for (i = 0 ; i < valueLen ; i++) { 00129 if (isprint(value[i])) { 00130 tty->printf("%c", value[i]) ; 00131 } else if (value[i] == 0) { /* string terminator NULL */ 00132 break ; 00133 } else { 00134 tty->printf("\'%02X\'",value[i]) ; 00135 } 00136 } 00137 tty->printf("\n") ; 00138 } 00139 break ; 00140 case ATTRIBUTE_TYPE_BYTES: 00141 default: 00142 if (valueLen > 0) { 00143 for (i = 0 ; i < valueLen ; i++ ) { 00144 tty->printf("%02X ", value[i]) ; 00145 } 00146 tty->printf("\n") ; 00147 } 00148 break ; 00149 } 00150 } else { 00151 if (valueLen > 0) { 00152 for (i = 0 ; i < valueLen ; i++ ) { 00153 tty->printf("%02X ", value[i]) ; 00154 } 00155 tty->printf("\n") ; 00156 } 00157 } 00158 // tty->printf("\n") ; 00159 } 00160 00161 bool assignAttribute( 00162 const uint8_t requestId, 00163 const uint16_t attributeId, 00164 const uint16_t valueLen, 00165 const uint8_t *value, 00166 bool fromRequest 00167 ) 00168 { 00169 bool result = true ; 00170 switch(attributeId) { 00171 case ATTR_LINKED_TIMESTAMP: /* timestamp */ 00172 set_time(valueLen, value) ; /* 68 us */ 00173 // if (fromRequest) afero->setAttributeComplete(requestId, attributeId, valueLen, value) ; 00174 tty->printf("timestamp = ") ; 00175 print_date_wd(¤t_time) ; 00176 // print_time(¤t_time) ; 00177 tty->printf("\n") ; 00178 break ; 00179 case ATTR_SOFTWARE_RESET: /* software reset requested! */ 00180 if (value[0]) { 00181 printf("Software Reset Requested!\n") ; 00182 reset_watch_dog() ; 00183 // if (fromRequest) afero->setAttributeComplete(requestId, attributeId, valueLen, value) ; 00184 wait(0.5) ; 00185 reboot_edge() ; 00186 } 00187 break ; 00188 default: 00189 break ; 00190 } 00191 return result ; 00192 } 00193 00194 /* 00195 * Callback that allows ASR to request an MCU attribute be changed. 00196 * You should define this function in your MCU firmware to perform application-specific actions 00197 * your code must take (e.g., updating the state of the hardware), 00198 * in light of the attribute value change. 00199 */ 00200 bool attributeChangeRequest( 00201 const uint8_t requestId, 00202 const uint16_t attributeId, 00203 const uint16_t valueLen, 00204 const uint8_t *value 00205 ) 00206 { 00207 int result ; 00208 uint32_t timestamp = edge_time ; 00209 00210 ts2time(timestamp, ¤t_time) ; /* 12 us */ 00211 // if (verbos) { 00212 print_time(¤t_time) ; 00213 tty->printf(" %5d ASR requested [%d] : ", attributeId, requestId) ; 00214 af_print_values(requestId, attributeId, valueLen, value) ; 00215 // } 00216 00217 result = assignAttribute(requestId, attributeId, valueLen, value, true) ; 00218 00219 // af_print_values(requestId, attributeId, valueLen, value) ; 00220 return(result == afSUCCESS) ; 00221 } 00222 00223 /* 00224 * Application callback that allows afLib to notify that an attribute has changed. 00225 * This method will be called in response to a getAttribute call from the application 00226 * and whenever a ASR module attribute changes. 00227 */ 00228 void attributeUpdatedReport( 00229 const uint8_t requestId, 00230 const uint16_t attributeId, 00231 const uint16_t valueLen, 00232 const uint8_t *value 00233 ) 00234 { 00235 uint32_t timestamp = edge_time ; 00236 int result ; 00237 00238 ts2time(timestamp, ¤t_time) ; /* 12us */ 00239 // if (verbos) { 00240 print_time(¤t_time) ; 00241 tty->printf(" %5d ASR reported [%d]: ", attributeId, requestId) ; 00242 af_print_values(requestId, attributeId, valueLen, value) ; 00243 // } 00244 00245 switch(attributeId) { 00246 case ATTR_LED: 00247 tty->printf("LED : ") ; 00248 if (value[0]) { 00249 tty->printf("ON\n") ; 00250 } else { 00251 tty->printf("OFF\n") ; 00252 } 00253 break ; 00254 case ATTR_LINKED_TIMESTAMP: 00255 set_time(valueLen, value) ; /* 68 us */ 00256 tty->printf("timestamp = ") ; 00257 print_date_wd(¤t_time) ; 00258 // print_time(¤t_time) ; 00259 tty->printf("\n") ; 00260 break ; 00261 case ATTR_WIFI_STDY_STATE: 00262 gConnected = false ; 00263 tty->printf("WiFi Steady State: ") ; 00264 switch(value[0]) { 00265 case 0: tty->printf("Not Connected\n") ; break ; 00266 case 1: tty->printf("Pending\n") ; break ; 00267 case 2: 00268 tty->printf("Connected\n") ; 00269 gConnected = true ; // the only case Connected state is OK 00270 break ; 00271 case 3: tty->printf("Unknown Failure\n") ; break ; 00272 case 4: tty->printf("Association Failed\n") ; break ; 00273 case 5: tty->printf("Handshake Failed\n") ; break ; 00274 case 6: tty->printf("Echo Failed\n") ; break ; 00275 case 7: tty->printf("SSID Not Found\n") ; break ; 00276 case 8: tty->printf("NTP Failed\n") ; break ; 00277 default: tty->printf("Unknown [%d]\n", value[0]) ; break ; 00278 } 00279 break ; 00280 case ATTR_REBOOT_REASON: 00281 tty->printf("Reboot Reason: ") ; 00282 switch(value[0]) { 00283 case 1: tty->printf("Reset pin asserted\n") ; break ; 00284 case 2: tty->printf("Watchdog reset\n") ; break ; 00285 case 4: tty->printf("Software reset\n") ; break ; 00286 case 8: tty->printf("CPU Lock up\n") ; break ; 00287 default: tty->printf("Unknown [%d]\n", value[0]) ; break ; 00288 } 00289 break ; 00290 case ATTR_MCU_INTERFACE: 00291 tty->printf("MCU Interface: ") ; 00292 switch(value[0]) { 00293 case 0: tty->printf("No MCU\n") ; break ; 00294 case 1: tty->printf("SPI Slave\n") ; break ; 00295 case 2: tty->printf("UART\n") ; break ; 00296 default: tty->printf("Unknown\n") ; break ; 00297 } 00298 break ; 00299 case AF_SYSTEM_ASR_STATE: 00300 tty->printf("ASR state: ") ; 00301 switch(value[0]) { 00302 case MODULE_STATE_REBOOTED: 00303 gLinked = false ; 00304 tty->printf("Rebooted\n") ; 00305 wait_ms(100) ; 00306 if (edge_mgr_status == EDGE_MGR_RUNNING) { 00307 reboot_edge() ; 00308 } 00309 break ; 00310 case MODULE_STATE_LINKED: 00311 if (gLinked == false) { /* new link established */ 00312 result = afero->getAttribute(ATTR_LINKED_TIMESTAMP) ; 00313 } 00314 gLinked = true ; 00315 tty->printf("Linked\n") ; 00316 break ; 00317 case MODULE_STATE_UPDATING: 00318 gLinked = true ; 00319 tty->printf("Updating\n") ; 00320 break ; 00321 case MOUDLE_STATE_UPDATE_READY: 00322 gLinked = false ; 00323 tty->printf("Update ready - rebooting\n") ; 00324 while(afero->setAttribute32(AF_SYSTEM_COMMAND, MODULE_COMMAND_REBOOT) != afSUCCESS) { 00325 afero->loop() ; 00326 wait_us(100) ; 00327 } 00328 reboot_edge() ; 00329 break ; 00330 default: 00331 break ; 00332 } 00333 break ; 00334 default: 00335 assignAttribute(requestId, attributeId, valueLen, value, false) ; 00336 break ; 00337 } 00338 }
Generated on Wed Jul 20 2022 21:24:28 by
1.7.2