afLib 1.3 which is supporting both SPI and UART

Dependencies:   vt100 mbed afLib_1_3

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 "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(&current_time) ;
00176 //        print_time(&current_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, &current_time) ; /* 12 us */
00211 //    if (verbos) {
00212         print_time(&current_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, &current_time) ; /* 12us */
00239 //    if (verbos) {
00240         print_time(&current_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(&current_time) ;
00258 //        print_time(&current_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 }