Orefatoi
/
afero_poc15_171201
POC1.5 prototype 2 x color sensor 2 x LM75B 3 x AnalogIn 1 x accel
Embed:
(wiki syntax)
Show/hide line numbers
af_attriburtes.cpp
00001 #include "mbed.h" 00002 #include <ctype.h> 00003 #include "af_attributes.h" 00004 #include "edge_time.h" 00005 #include "edge_sensor.h" 00006 #include "edge_accel.h" 00007 #include "edge_color.h" 00008 #include "edge_temp.h" 00009 #include "edge_pressure.h" 00010 #include "edge_mgr.h" 00011 #include "edge_reset_mgr.h" 00012 #include "SO1602A.h" 00013 #include "pending.h" 00014 00015 extern SO1602A *display ; 00016 extern pending_class *pending ; 00017 00018 static const af_attribute_type af_attr[] = { 00019 /* ID, Description, Type, Size */ 00020 { ATTR_SENSE_VAL, "Sensor Value", ATTRIBUTE_TYPE_UTF8S, 255 }, 00021 { ATTR_ACCEL_PRESENT, "Accel Present", ATTRIBUTE_TYPE_BOOLEAN, 1 }, 00022 { ATTR_ACCEL_ENABLE, "Accel Enable", ATTRIBUTE_TYPE_BOOLEAN, 1 }, 00023 { ATTR_ACCEL_INTERVAL, "Accel Interval", ATTRIBUTE_TYPE_SINT16, 2 }, 00024 { ATTR_ACCEL_VALUE, "Accel Value", ATTRIBUTE_TYPE_FIXED_15_16, 4}, 00025 /* first color sensor (VEML6040) and LED set */ 00026 { ATTR_COLOR0_PRESENT, "Color1 Present", ATTRIBUTE_TYPE_BOOLEAN, 1 }, 00027 { ATTR_COLOR0_ENABLE, "Color1 Enable", ATTRIBUTE_TYPE_BOOLEAN, 1 }, 00028 { ATTR_COLOR0_INTERVAL, "Color1 Interval", ATTRIBUTE_TYPE_SINT16, 2 }, 00029 { ATTR_COLOR0_TRIGMODE, "Color1 Trigger Mode", ATTRIBUTE_TYPE_SINT8, 1 }, 00030 { ATTR_COLOR0_ITIME, "Color1 Integration Time", ATTRIBUTE_TYPE_SINT8, 1 }, 00031 { ATTR_COLOR0_CALIBRATE, "Color1 Calibrate", ATTRIBUTE_TYPE_BOOLEAN, 1 }, 00032 { ATTR_COLOR0_PWM_R, "Color1 PWM R", ATTRIBUTE_TYPE_SINT32, 4 }, 00033 { ATTR_COLOR0_PWM_G, "Color1 PWM G", ATTRIBUTE_TYPE_SINT32, 4 }, 00034 { ATTR_COLOR0_PWM_B, "Color1 PWM B", ATTRIBUTE_TYPE_SINT32, 4 }, 00035 { ATTR_COLOR0_PWM_PERIOD, "Color1 PWM Period", ATTRIBUTE_TYPE_SINT16, 2 }, 00036 { ATTR_COLOR0_PWM_TARGET, "Color1 PWM Target", ATTRIBUTE_TYPE_SINT16, 2 }, 00037 { ATTR_COLOR0_R_VALUE, "Color1 R", ATTRIBUTE_TYPE_SINT16, 2 }, 00038 { ATTR_COLOR0_G_VALUE, "Color1 G", ATTRIBUTE_TYPE_SINT16, 2 }, 00039 { ATTR_COLOR0_B_VALUE, "Color1 B", ATTRIBUTE_TYPE_SINT16, 2 }, 00040 /* second color sensor (VEML6040) and LED set */ 00041 { ATTR_COLOR1_PRESENT, "Color2 Present", ATTRIBUTE_TYPE_BOOLEAN, 1 }, 00042 { ATTR_COLOR1_ENABLE, "Color2 Enable", ATTRIBUTE_TYPE_BOOLEAN, 1 }, 00043 { ATTR_COLOR1_INTERVAL, "Color2 Interval", ATTRIBUTE_TYPE_SINT16, 2 }, 00044 { ATTR_COLOR1_TRIGMODE, "Color2 Trigger Mode", ATTRIBUTE_TYPE_SINT8, 1 }, 00045 { ATTR_COLOR0_ITIME, "Color2 Integration Time", ATTRIBUTE_TYPE_SINT8, 1 }, 00046 { ATTR_COLOR0_CALIBRATE, "Color2 Calibrate", ATTRIBUTE_TYPE_BOOLEAN, 1 }, 00047 { ATTR_COLOR1_PWM_R, "Color2 PWM R", ATTRIBUTE_TYPE_SINT32, 4 }, 00048 { ATTR_COLOR1_PWM_G, "Color2 PWM G", ATTRIBUTE_TYPE_SINT32, 4 }, 00049 { ATTR_COLOR1_PWM_B, "Color2 PWM B", ATTRIBUTE_TYPE_SINT32, 4 }, 00050 { ATTR_COLOR1_PWM_PERIOD, "Color2 PWM Period", ATTRIBUTE_TYPE_SINT16, 2 }, 00051 { ATTR_COLOR1_PWM_TARGET, "Color2 PWM Target", ATTRIBUTE_TYPE_SINT16, 2 }, 00052 { ATTR_COLOR1_R_VALUE, "Color2 R", ATTRIBUTE_TYPE_SINT16, 2 }, 00053 { ATTR_COLOR1_G_VALUE, "Color2 G", ATTRIBUTE_TYPE_SINT16, 2 }, 00054 { ATTR_COLOR1_B_VALUE, "Color2 B", ATTRIBUTE_TYPE_SINT16, 2 }, 00055 /* first temperature sensor (LM75B) */ 00056 { ATTR_TEMP0_PRESENT, "Temp0 Present", ATTRIBUTE_TYPE_BOOLEAN, 1 }, 00057 { ATTR_TEMP0_ENABLE, "Temp0 Enable", ATTRIBUTE_TYPE_BOOLEAN, 1 }, 00058 { ATTR_TEMP0_INTERVAL, "Temp0 Interval", ATTRIBUTE_TYPE_SINT16, 2 }, 00059 { ATTR_TEMP0_VALUE, "Temp0 Value", ATTRIBUTE_TYPE_FIXED_15_16, 4}, 00060 /* second temperature sensor (SMTC502AT/Before) */ 00061 { ATTR_TEMP1_PRESENT, "Temp1 Present", ATTRIBUTE_TYPE_BOOLEAN, 1 }, 00062 { ATTR_TEMP1_ENABLE, "Temp1 Enable", ATTRIBUTE_TYPE_BOOLEAN, 1 }, 00063 { ATTR_TEMP1_INTERVAL, "Temp1 Interval", ATTRIBUTE_TYPE_SINT16, 2 }, 00064 { ATTR_TEMP1_VALUE, "Temp1 Value", ATTRIBUTE_TYPE_FIXED_15_16, 4}, 00065 /* third temperature sensor (SMTC502AT/After) */ 00066 { ATTR_TEMP2_PRESENT, "Temp2 Present", ATTRIBUTE_TYPE_BOOLEAN, 1 }, 00067 { ATTR_TEMP2_ENABLE, "Temp2 Enable", ATTRIBUTE_TYPE_BOOLEAN, 1 }, 00068 { ATTR_TEMP2_INTERVAL, "Temp2 Interval", ATTRIBUTE_TYPE_SINT16, 2 }, 00069 { ATTR_TEMP2_VALUE, "Temp2 Value", ATTRIBUTE_TYPE_FIXED_15_16, 4}, 00070 /* fouth temperateure sensor (LM75B) */ 00071 { ATTR_TEMP3_PRESENT, "Temp3 Present", ATTRIBUTE_TYPE_BOOLEAN, 1 }, 00072 { ATTR_TEMP3_ENABLE, "Temp3 Enable", ATTRIBUTE_TYPE_BOOLEAN, 1 }, 00073 { ATTR_TEMP3_INTERVAL, "Temp3 Interval", ATTRIBUTE_TYPE_SINT16, 2 }, 00074 { ATTR_TEMP3_VALUE, "Temp3 Value", ATTRIBUTE_TYPE_FIXED_15_16, 4}, 00075 /* Gas Pressure sensor (PSE530) */ 00076 { ATTR_GAS_PRESENT, "Gas Pressure Present", ATTRIBUTE_TYPE_BOOLEAN, 1 }, 00077 { ATTR_GAS_ENABLE, "Gas Pressure Enable", ATTRIBUTE_TYPE_BOOLEAN, 1 }, 00078 { ATTR_GAS_INTERVAL, "Gas Pressure Interval", ATTRIBUTE_TYPE_SINT16, 2 }, 00079 { ATTR_GAS_VALUE, "Gas Pressure Value", ATTRIBUTE_TYPE_FIXED_15_16, 4}, 00080 { ATTR_GAS_THR_MODE, "Gas Press Threshold Mode", ATTRIBUTE_TYPE_SINT8, 1 }, 00081 { ATTR_GAS_THR_HIGH, "Gas Press High Thresh", ATTRIBUTE_TYPE_SINT16, 2 }, 00082 { ATTR_GAS_THR_LOW, "Gas Press Low Thresh", ATTRIBUTE_TYPE_SINT16, 2 }, 00083 /* Software Reset Request */ 00084 { ATTR_SOFTWARE_RESET, "Software Reset", ATTRIBUTE_TYPE_BOOLEAN, 1 }, 00085 { ATTR_MCU_RESET_REASON, "MCU Reset Reason", ATTRIBUTE_TYPE_UTF8S, 64 }, 00086 00087 { ATTR_LED, "LED", ATTRIBUTE_TYPE_SINT16, 2 }, 00088 { ATTR_IO0, "I/O 0", ATTRIBUTE_TYPE_SINT64, 8 }, 00089 { ATTR_IO1, "I/O 1", ATTRIBUTE_TYPE_SINT64, 8 }, 00090 { ATTR_IO2, "I/O 2", ATTRIBUTE_TYPE_SINT64, 8 }, 00091 { ATTR_BUTTON, "BUTTON", ATTRIBUTE_TYPE_BOOLEAN, 2 }, 00092 { ATTR_IO3, "I/O 3", ATTRIBUTE_TYPE_SINT64, 8 }, 00093 { ATTR_BOOT_LOADER_VER, "Bootloader Version", ATTRIBUTE_TYPE_SINT64, 8 }, 00094 { ATTR_BLE_STACK_VER, "BLE Stack Version", ATTRIBUTE_TYPE_SINT64, 8 }, 00095 { ATTR_FW_APP_VER, "FW Application Version", ATTRIBUTE_TYPE_SINT64, 8 }, 00096 { ATTR_DEVICE_DESC, "Device Description", ATTRIBUTE_TYPE_SINT64, 8 }, 00097 { ATTR_WIFI_VER, "Wi-Fi chip", ATTRIBUTE_TYPE_SINT64, 8 }, 00098 { ATTR_OFFLINE_SCHED, "Offline Schedules enable", ATTRIBUTE_TYPE_SINT16, 2 }, 00099 { ATTR_SECURITY_ENABLED, "Security Enabled", ATTRIBUTE_TYPE_SINT8, 1 }, /* ? */ 00100 { ATTR_UTC_OFFSET, "UTC offset data", ATTRIBUTE_TYPE_BYTES, 8 }, 00101 { ATTR_CONFIGURES_SSID, "Configured SSID", ATTRIBUTE_TYPE_UTF8S, 10 }, /* ? */ 00102 { ATTR_WIFI_BARS, "Wi-Fi Bars", ATTRIBUTE_TYPE_SINT8, 1 }, 00103 { ATTR_WIFI_STDY_STATE, "Wi-Fi Steady State", ATTRIBUTE_TYPE_SINT8, 1 }, 00104 { ATTR_COMMAND, "Command", ATTRIBUTE_TYPE_BYTES, 8 }, /* ? */ 00105 { ATTR_ASR_STATE, "ASR State", ATTRIBUTE_TYPE_SINT8, 1 }, 00106 { ATTR_LOW_BATTERY, "Low Battery Warning", ATTRIBUTE_TYPE_SINT8, 1 }, 00107 { ATTR_LINKED_TIMESTAMP, "Linked Timestamp", ATTRIBUTE_TYPE_SINT32, 4 }, 00108 { ATTR_ATTR_ACK, "Attribute ACK", ATTRIBUTE_TYPE_SINT16, 8 }, 00109 { ATTR_REBOOT_REASON, "Reboot Reason", ATTRIBUTE_TYPE_UTF8S, 100 }, 00110 { ATTR_BLE_COMMS, "BLE Comms", ATTRIBUTE_TYPE_BYTES, 12 }, 00111 { ATTR_MCU_INTERFACE, "MCU Interface", ATTRIBUTE_TYPE_SINT8, 1 }, 00112 { 0, 0, 0, 0 } 00113 } ; 00114 00115 int get_af_attr(uint16_t id) 00116 { 00117 int i ; 00118 for (i = 0 ; af_attr[i].id != 0 ; i++ ) { 00119 if (id == af_attr[i].id) { 00120 break ; 00121 } 00122 } 00123 return (i) ; 00124 } 00125 00126 void print_af_error(int resultCode) 00127 { 00128 switch(resultCode) { 00129 case afSUCCESS: 00130 printf("Operation completed successfully\n") ; 00131 break ; 00132 case afERROR_NO_SUCH_ATTRIBUTE: 00133 printf("Request was made for unknown attribute id\n") ; 00134 break ; 00135 case afERROR_BUSY: 00136 printf("Request already in progress, try again\n") ; 00137 break ; 00138 case afERROR_INVALID_COMMAND: 00139 printf("Command could not be parsed\n") ; 00140 break ; 00141 case afERROR_QUEUE_OVERFLOW: 00142 printf("Queue is full\n") ; 00143 break ; 00144 case afERROR_QUEUE_UNDERFLOW: 00145 printf("Queue is empty\n") ; 00146 break ; 00147 case afERROR_INVALID_PARAM: 00148 printf("Bad input parameter\n") ; 00149 break ; 00150 default: 00151 printf("Unknown error code %d\n", resultCode) ; 00152 break ; 00153 } 00154 } 00155 00156 void af_print_values( 00157 const uint8_t requestId, 00158 const uint16_t attributeId, 00159 const uint16_t valueLen, 00160 const uint8_t *value 00161 ) 00162 { 00163 int i, id ; 00164 00165 id = get_af_attr(attributeId) ; 00166 00167 if (af_attr[id].id != 0) { 00168 printf(af_attr[id].description) ; 00169 printf(" : ") ; 00170 switch(af_attr[id].attribute_type) { 00171 case ATTRIBUTE_TYPE_BOOLEAN: 00172 case ATTRIBUTE_TYPE_SINT8: 00173 if (valueLen >= 1) { 00174 printf("%02X\n", value[0]) ; 00175 } 00176 break ; 00177 case ATTRIBUTE_TYPE_SINT16: 00178 if (valueLen >= 2) { 00179 printf("%02X%02X\n", value[1], value[0]) ; 00180 } 00181 break ; 00182 case ATTRIBUTE_TYPE_SINT32: 00183 if (valueLen >= 4) { 00184 printf("%02X%02X%02X%02X\n", 00185 value[3],value[2],value[1],value[0]) ; 00186 } 00187 break ; 00188 case ATTRIBUTE_TYPE_SINT64: 00189 if (valueLen >= 8) { 00190 printf("%02X%02X %02X%02X %02X%02X %02X%02X\n", 00191 value[7], value[6], value[5], value[4], 00192 value[3], value[2], value[1], value[0]) ; 00193 } 00194 break ; 00195 case ATTRIBUTE_TYPE_UTF8S: 00196 if (valueLen > 0) { 00197 for (i = 0 ; i < valueLen ; i++) { 00198 if (isprint(value[i])) { 00199 printf("%c", value[i]) ; 00200 } else if (value[i] == 0) { /* string terminator NULL */ 00201 break ; 00202 } else { 00203 printf("\'%02X\'",value[i]) ; 00204 } 00205 } 00206 printf("\n") ; 00207 } 00208 break ; 00209 case ATTRIBUTE_TYPE_BYTES: 00210 default: 00211 if (valueLen > 0) { 00212 for (i = 0 ; i < valueLen ; i++ ) { 00213 printf("%02X ", value[i]) ; 00214 } 00215 printf("\n") ; 00216 } 00217 break ; 00218 } 00219 } else { 00220 if (valueLen > 0) { 00221 for (i = 0 ; i < valueLen ; i++ ) { 00222 printf("%02X ", value[i]) ; 00223 } 00224 printf("\n") ; 00225 } 00226 } 00227 // printf("\n") ; 00228 } 00229 00230 /* 00231 * Callback that allows ASR to request an MCU attribute be changed. 00232 * You should define this function in your MCU firmware to perform application-specific actions 00233 * your code must take (e.g., updating the state of the hardware), 00234 * in light of the attribute value change. 00235 */ 00236 void attributeChangeRequest( 00237 const uint8_t requestId, 00238 const uint16_t attributeId, 00239 const uint16_t valueLen, 00240 const uint8_t *value 00241 ) 00242 { 00243 // int result ; 00244 uint32_t timestamp = edge_time ; 00245 if ((pending != 0)&&(pending->request->requestId == requestId)) { 00246 pending->replied_time = timestamp ; 00247 00248 } 00249 ts2time(timestamp, ¤t_time) ; /* 12 us */ 00250 if (verbos) { 00251 print_time(¤t_time) ; 00252 printf(" %5d ASR requested [%d] : ", attributeId, requestId) ; 00253 af_print_values(requestId, attributeId, valueLen, value) ; 00254 } 00255 00256 switch(attributeId) { 00257 case ATTR_LINKED_TIMESTAMP: /* timestamp */ 00258 set_time(valueLen, value) ; /* 68 us */ 00259 afero->setAttributeComplete(requestId, attributeId, valueLen, value) ; 00260 printf("timestampe = ") ; 00261 print_date_wd(¤t_time) ; 00262 // print_time(¤t_time) ; 00263 printf("\n") ; 00264 break ; 00265 case ATTR_SOFTWARE_RESET: /* software reset requested! */ 00266 if (value[0]) { 00267 printf("Software Reset Requested!\n") ; 00268 if (display != 0) { 00269 display->cls() ; 00270 display->locate(0,0) ; 00271 display->putStr("System Rebooting!") ; 00272 } 00273 afero->setAttributeComplete(requestId, attributeId, valueLen, value) ; 00274 wait(1) ; 00275 software_reset() ; 00276 } 00277 break ; 00278 case ATTR_ACCEL_ENABLE: /* accel enable */ 00279 if (sensor[0]) { 00280 if (value[0]) { 00281 printf("Accel Enabled\n") ; 00282 sensor[0]->reset() ; 00283 sensor[0]->enable() ; 00284 } else if (sensor[0]){ 00285 printf("Accel Disabled\n") ; 00286 sensor[0]->disable() ; 00287 } 00288 afero->setAttributeComplete(requestId, attributeId, valueLen, value) ; 00289 } 00290 break ; 00291 case ATTR_ACCEL_INTERVAL: 00292 if (sensor[0]) { 00293 sensor[0]->setInterval((value[1] << 8) | value[0]) ; 00294 afero->setAttributeComplete(requestId, attributeId, valueLen, value) ; 00295 } 00296 break ; 00297 case ATTR_COLOR0_ENABLE: /* color0 enable */ 00298 if (sensor[1]) { 00299 if (value[0]) { 00300 sensor[1]->reset() ; 00301 sensor[1]->enable() ; 00302 } else { 00303 sensor[1]->disable() ; 00304 } 00305 afero->setAttributeComplete(requestId, attributeId, valueLen, value) ; 00306 } 00307 break ; 00308 case ATTR_COLOR0_INTERVAL: 00309 if (sensor[1]) { 00310 sensor[1]->setInterval((value[1] << 8) | value[0]) ; 00311 afero->setAttributeComplete(requestId, attributeId, valueLen, value) ; 00312 } 00313 break ; 00314 case ATTR_COLOR0_TRIGMODE: /* color0 config */ 00315 if (sensor[1]) { 00316 uint8_t config = ((edge_color*)sensor[1])->getConfig() & 0x70 ; 00317 if (value[0]) { 00318 config = config | 0x06 ; 00319 } 00320 ((edge_color*)sensor[1])->setConfig(config) ; 00321 afero->setAttributeComplete(requestId, attributeId, valueLen, value) ; 00322 } 00323 break ; 00324 case ATTR_COLOR0_ITIME: /* color0 config */ 00325 if (sensor[1]) { 00326 uint8_t config = ((edge_color*)sensor[1])->getConfig() & 0x07 ; 00327 config = (value[0] << 4) | config ; 00328 ((edge_color*)sensor[1])->setConfig(config) ; 00329 afero->setAttributeComplete(requestId, attributeId, valueLen, value) ; 00330 } 00331 break ; 00332 case ATTR_COLOR0_PWM_PERIOD: /* color0 pwm period */ 00333 if (sensor[1]) { 00334 ((edge_color*)sensor[1])->set_pwm_period((value[1] << 8) | value[0]) ; 00335 afero->setAttributeComplete(requestId, attributeId, valueLen, value) ; 00336 } 00337 break ; 00338 case ATTR_COLOR0_PWM_TARGET: /* color0 pwm calibration target */ 00339 if (sensor[1]) { 00340 color0_target[0] = (value[1] << 8) | value[0] ; 00341 color0_target[1] = color0_target[0] ; 00342 color0_target[2] = color0_target[1] ; 00343 afero->setAttributeComplete(requestId, attributeId, valueLen, value) ; 00344 } 00345 break ; 00346 case ATTR_COLOR0_CALIBRATE: /* calibrate color0 */ 00347 if (sensor[1]) { 00348 if (value[0]) { /* do calibration! */ 00349 ((edge_color*)sensor[1])->calibrate(color0_target, color0_pwm, 10) ; 00350 afero->setAttribute32(ATTR_COLOR0_PWM_R, color0_pwm[0]) ; 00351 afero->setAttribute32(ATTR_COLOR0_PWM_G, color0_pwm[1]) ; 00352 afero->setAttribute32(ATTR_COLOR0_PWM_B, color0_pwm[2]) ; 00353 } 00354 // afero->setAttributeComplete(requestId, attributeId, valueLen, value) ; 00355 afero->setAttributeBool(ATTR_COLOR0_CALIBRATE, false) ; 00356 } 00357 break ; 00358 case ATTR_COLOR0_PWM_R: 00359 if (sensor[1]) { 00360 color0_pwm[0] = (value[1] << 8) | value[0] ; 00361 } 00362 afero->setAttributeComplete(requestId, attributeId, valueLen, value) ; 00363 break ; 00364 case ATTR_COLOR0_PWM_G: 00365 if (sensor[1]) { 00366 color0_pwm[1] = (value[1] << 8) | value[0] ; 00367 } 00368 afero->setAttributeComplete(requestId, attributeId, valueLen, value) ; 00369 break ; 00370 case ATTR_COLOR0_PWM_B: 00371 if (sensor[1]) { 00372 color0_pwm[2] = (value[1] << 8) | value[0] ; 00373 } 00374 afero->setAttributeComplete(requestId, attributeId, valueLen, value) ; 00375 break ; 00376 case ATTR_COLOR1_ENABLE: /* color1 enable */ 00377 if (sensor[2]) { 00378 if (value[0]) { 00379 sensor[2]->reset() ; 00380 sensor[2]->enable() ; 00381 } else { 00382 sensor[2]->disable() ; 00383 } 00384 afero->setAttributeComplete(requestId, attributeId, valueLen, value) ; 00385 } 00386 break ; 00387 case ATTR_COLOR1_INTERVAL: 00388 if (sensor[2]) { 00389 sensor[2]->setInterval((value[1] << 8) | value[0]) ; 00390 afero->setAttributeComplete(requestId, attributeId, valueLen, value) ; 00391 } 00392 break ; 00393 case ATTR_COLOR1_TRIGMODE: /* color0 config */ 00394 if (sensor[2]) { 00395 uint8_t config = ((edge_color*)sensor[2])->getConfig() & 0x70 ; 00396 if (value[0]) { 00397 config = config | 0x06 ; 00398 } 00399 ((edge_color*)sensor[2])->setConfig(config) ; 00400 afero->setAttributeComplete(requestId, attributeId, valueLen, value) ; 00401 } 00402 break ; 00403 case ATTR_COLOR1_ITIME: /* color0 config */ 00404 if (sensor[2]) { 00405 uint8_t config = ((edge_color*)sensor[2])->getConfig() & 0x07 ; 00406 config = (value[0] << 4) | config ; 00407 ((edge_color*)sensor[2])->setConfig(config) ; 00408 afero->setAttributeComplete(requestId, attributeId, valueLen, value) ; 00409 } 00410 break ; 00411 case ATTR_COLOR1_PWM_PERIOD: /* color0 pwm period */ 00412 if (sensor[2]) { 00413 ((edge_color*)sensor[2])->set_pwm_period((value[1] << 8) | value[0]) ; 00414 afero->setAttributeComplete(requestId, attributeId, valueLen, value) ; 00415 } 00416 break ; 00417 case ATTR_COLOR1_PWM_TARGET: /* color0 pwm calibration target */ 00418 if (sensor[2]) { 00419 color1_target[0] = (value[1] << 8) | value[0] ; 00420 color1_target[1] = color1_target[0] ; 00421 color1_target[2] = color1_target[1] ; 00422 afero->setAttributeComplete(requestId, attributeId, valueLen, value) ; 00423 } 00424 break ; 00425 case ATTR_COLOR1_CALIBRATE: /* calibrate color1 */ 00426 if (sensor[2]) { 00427 if (value[0]) { /* do calibration! */ 00428 ((edge_color*)sensor[2])->calibrate(color1_target, color1_pwm, 10) ; 00429 afero->setAttribute32(ATTR_COLOR1_PWM_R, color1_pwm[0]) ; 00430 afero->setAttribute32(ATTR_COLOR1_PWM_G, color1_pwm[1]) ; 00431 afero->setAttribute32(ATTR_COLOR1_PWM_B, color1_pwm[2]) ; 00432 } 00433 // afero->setAttributeComplete(requestId, attributeId, valueLen, value) ; 00434 afero->setAttributeBool(ATTR_COLOR1_CALIBRATE, false) ; 00435 } 00436 00437 break ; 00438 case ATTR_COLOR1_PWM_R: 00439 if (sensor[2]) { 00440 color1_pwm[0] = (value[1] << 8) | value[0] ; 00441 } 00442 afero->setAttributeComplete(requestId, attributeId, valueLen, value) ; 00443 break ; 00444 case ATTR_COLOR1_PWM_G: 00445 if (sensor[2]) { 00446 color1_pwm[1] = (value[1] << 8) | value[0] ; 00447 } 00448 afero->setAttributeComplete(requestId, attributeId, valueLen, value) ; 00449 break ; 00450 case ATTR_COLOR1_PWM_B: 00451 if (sensor[2]) { 00452 color1_pwm[2] = (value[1] << 8) | value[0] ; 00453 } 00454 afero->setAttributeComplete(requestId, attributeId, valueLen, value) ; 00455 break ; 00456 case ATTR_TEMP0_ENABLE: /* temp0 is used to control temp-sensors */ 00457 if (sensor[3]) { 00458 if (value[0]) { 00459 sensor[3]->reset() ; 00460 sensor[3]->enable() ; 00461 } else { 00462 sensor[3]->disable() ; 00463 } 00464 afero->setAttributeComplete(requestId, attributeId, valueLen, value) ; 00465 } 00466 break ; 00467 case ATTR_TEMP0_INTERVAL: 00468 if (sensor[3]) { 00469 sensor[3]->setInterval((value[1] << 8) | value[0]) ; 00470 afero->setAttributeComplete(requestId, attributeId, valueLen, value) ; 00471 } 00472 break ; 00473 case ATTR_TEMP3_ENABLE: /* temp3 enable */ 00474 break ; 00475 case ATTR_GAS_ENABLE: /* pressure enable */ 00476 if (sensor[4]) { 00477 if (value[0]) { 00478 sensor[4]->reset() ; 00479 sensor[4]->enable() ; 00480 } else { 00481 sensor[4]->disable() ; 00482 } 00483 afero->setAttributeComplete(requestId, attributeId, valueLen, value) ; 00484 } 00485 break ; 00486 case ATTR_GAS_INTERVAL: 00487 if (sensor[4]) { 00488 sensor[4]->setInterval((value[1] << 8) | value[0]) ; 00489 afero->setAttributeComplete(requestId, attributeId, valueLen, value) ; 00490 } 00491 break ; 00492 case ATTR_GAS_THR_MODE: 00493 if (sensor[4]) { 00494 ((edge_pressure*)sensor[4])->set_thr_mode(value[0]) ; 00495 afero->setAttributeComplete(requestId, attributeId, valueLen, value) ; 00496 } 00497 break ; 00498 case ATTR_GAS_THR_HIGH: 00499 if (sensor[4]) { 00500 ((edge_pressure*)sensor[4])->set_thr_high((value[1] << 8) | value[0]) ; 00501 afero->setAttributeComplete(requestId, attributeId, valueLen, value) ; 00502 } 00503 break ; 00504 case ATTR_GAS_THR_LOW: 00505 if (sensor[4]) { 00506 ((edge_pressure*)sensor[4])->set_thr_low((value[1] << 8) | value[0]) ; 00507 afero->setAttributeComplete(requestId, attributeId, valueLen, value) ; 00508 } 00509 break ; 00510 default: 00511 break ; 00512 } 00513 // af_print_values(requestId, attributeId, valueLen, value) ; 00514 if ((pending != 0)&&(pending->request->requestId == requestId)) { 00515 printf("Request [%d] replied in %d sec!\n", requestId, pending->replied_time - pending->submit_time) ; 00516 delete pending ; 00517 pending = 0 ; 00518 } 00519 } 00520 00521 /* 00522 * Application callback that allows afLib to notify that an attribute has changed. 00523 * This method will be called in response to a getAttribute call from the application 00524 * and whenever a ASR module attribute changes. 00525 */ 00526 void attributeUpdatedReport( 00527 const uint8_t requestId, 00528 const uint16_t attributeId, 00529 const uint16_t valueLen, 00530 const uint8_t *value 00531 ) 00532 { 00533 uint32_t timestamp = edge_time ; 00534 if ((pending != 0)&&(pending->request->requestId == requestId)) { 00535 pending->replied_time = timestamp ; 00536 } 00537 ts2time(timestamp, ¤t_time) ; /* 12us */ 00538 if (verbos) { 00539 print_time(¤t_time) ; 00540 printf(" %5d ASR reported [%d]: ", attributeId, requestId) ; 00541 af_print_values(requestId, attributeId, valueLen, value) ; 00542 } 00543 00544 switch(attributeId) { 00545 case ATTR_LINKED_TIMESTAMP: 00546 set_time(valueLen, value) ; /* 68 us */ 00547 printf("timestampe = ") ; 00548 print_date_wd(¤t_time) ; 00549 // print_time(¤t_time) ; 00550 printf("\n") ; 00551 break ; 00552 case ATTR_REBOOT_REASON: 00553 printf("Reboot Reason: ") ; 00554 switch(value[0]) { 00555 case 1: printf("Reset pin asserted\n") ; break ; 00556 case 2: printf("Watchdog reset\n") ; break ; 00557 case 4: printf("Software reset\n") ; break ; 00558 case 8: printf("CPU Lock up\n") ; break ; 00559 default: printf("Unknown\n") ; break ; 00560 } 00561 break ; 00562 case ATTR_MCU_INTERFACE: 00563 printf("MCU Interface: ") ; 00564 switch(value[0]) { 00565 case 0: printf("No MCU\n") ; break ; 00566 case 1: printf("SPI Slave\n") ; break ; 00567 case 2: printf("UART\n") ; break ; 00568 default: printf("Unknown\n") ; break ; 00569 } 00570 break ; 00571 case AF_SYSTEM_ASR_STATE: 00572 printf("ASR state: ") ; 00573 switch(value[0]) { 00574 case MODULE_STATE_REBOOTED: 00575 gLinkedState = false ; 00576 printf("Rebooted\n") ; 00577 break ; 00578 case MODULE_STATE_LINKED: 00579 gLinkedState = true ; 00580 printf("Linked\n") ; 00581 break ; 00582 case MODULE_STATE_UPDATING: 00583 gLinkedState = true ; 00584 printf("Updating\n") ; 00585 if (display) { 00586 display->cls() ; 00587 display->putStr("FW Updating...") ; 00588 } 00589 break ; 00590 case MOUDLE_STATE_UPDATE_READY: 00591 gLinkedState = false ; 00592 printf("Update ready - rebooting\n") ; 00593 if (display) { 00594 display->cls() ; 00595 display->putStr("Rebooting...") ; 00596 } 00597 while(afero->setAttribute32(AF_SYSTEM_COMMAND, MODULE_COMMAND_REBOOT) != afSUCCESS) { 00598 afero->loop() ; 00599 wait_us(100) ; 00600 } 00601 software_reset() ; 00602 break ; 00603 default: 00604 break ; 00605 } 00606 break ; 00607 default: 00608 break ; 00609 } 00610 if ((pending != 0)&&(pending->request->requestId == requestId)) { 00611 printf("Request [%d] replied in %d sec!\n", requestId, pending->replied_time - pending->submit_time) ; 00612 delete pending ; 00613 pending = 0 ; 00614 } 00615 }
Generated on Tue Jul 12 2022 21:13:41 by 1.7.2