POC1.5 prototype 2 x color sensor 2 x LM75B 3 x AnalogIn 1 x accel

Dependencies:   mbed vt100

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers af_attriburtes.cpp Source File

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, &current_time) ; /* 12 us */
00250     if (verbos) {
00251         print_time(&current_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(&current_time) ;
00262 //        print_time(&current_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, &current_time) ; /* 12us */
00538     if (verbos) {
00539         print_time(&current_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(&current_time) ;
00549 //        print_time(&current_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 }