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

Dependencies:   mbed vt100

Committer:
Rhyme
Date:
Sun Dec 03 23:58:11 2017 +0000
Revision:
2:778a4d4436ff
Parent:
1:66c21c62c449
Child:
3:cac964851bb6
attribute values are replaced with defined macro names

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Rhyme 0:f0de320e23ac 1 #include "mbed.h"
Rhyme 0:f0de320e23ac 2 #include <ctype.h>
Rhyme 0:f0de320e23ac 3 #include "af_attributes.h"
Rhyme 0:f0de320e23ac 4 #include "edge_time.h"
Rhyme 0:f0de320e23ac 5 #include "edge_sensor.h"
Rhyme 0:f0de320e23ac 6 #include "edge_accel.h"
Rhyme 0:f0de320e23ac 7 #include "edge_color.h"
Rhyme 0:f0de320e23ac 8 #include "edge_temp.h"
Rhyme 0:f0de320e23ac 9 #include "edge_pressure.h"
Rhyme 0:f0de320e23ac 10 #include "edge_mgr.h"
Rhyme 1:66c21c62c449 11 #include "edge_reset_mgr.h"
Rhyme 1:66c21c62c449 12 #include "SO1602A.h"
Rhyme 0:f0de320e23ac 13 #include "pending.h"
Rhyme 0:f0de320e23ac 14
Rhyme 1:66c21c62c449 15 extern SO1602A *so1602a ;
Rhyme 0:f0de320e23ac 16 extern pending_class *pending ;
Rhyme 0:f0de320e23ac 17
Rhyme 0:f0de320e23ac 18 static const af_attribute_type af_attr[] = {
Rhyme 2:778a4d4436ff 19 /* ID, Description, Type, Size */
Rhyme 2:778a4d4436ff 20 { ATTR_SENSE_VAL, "Sensor Value", ATTRIBUTE_TYPE_UTF8S, 255 },
Rhyme 2:778a4d4436ff 21 { ATTR_ACCEL_PRESENT, "Accel Present", ATTRIBUTE_TYPE_BOOLEAN, 1 },
Rhyme 2:778a4d4436ff 22 { ATTR_ACCEL_ENABLE, "Accel Enable", ATTRIBUTE_TYPE_BOOLEAN, 1 },
Rhyme 2:778a4d4436ff 23 { ATTR_ACCEL_INTERVAL, "Accel Interval", ATTRIBUTE_TYPE_SINT16, 2 },
Rhyme 2:778a4d4436ff 24 { ATTR_ACCEL_VALUE, "Accel Value", ATTRIBUTE_TYPE_FIXED_15_16, 4},
Rhyme 2:778a4d4436ff 25 /* first color sensor (VEML6040) and LED set */
Rhyme 2:778a4d4436ff 26 { ATTR_COLOR0_PRESENT, "Color0 Present", ATTRIBUTE_TYPE_BOOLEAN, 1 },
Rhyme 2:778a4d4436ff 27 { ATTR_COLOR0_ENABLE, "Color0 Enable", ATTRIBUTE_TYPE_BOOLEAN, 1 },
Rhyme 2:778a4d4436ff 28 { ATTR_COLOR0_INTERVAL, "Color0 Interval", ATTRIBUTE_TYPE_SINT16, 2 },
Rhyme 2:778a4d4436ff 29 { ATTR_COLOR0_TRIGMODE, "Color0 Trigger Mode", ATTRIBUTE_TYPE_SINT8, 1 },
Rhyme 2:778a4d4436ff 30 { ATTR_COLOR0_ITIME, "Color0 Integration Time", ATTRIBUTE_TYPE_SINT8, 1 },
Rhyme 2:778a4d4436ff 31 { ATTR_COLOR0_CALIBRATE, "Color0 Calibrate", ATTRIBUTE_TYPE_BOOLEAN, 1 },
Rhyme 2:778a4d4436ff 32 { ATTR_COLOR0_PWM_R, "Color0 PWM R", ATTRIBUTE_TYPE_SINT32, 4 },
Rhyme 2:778a4d4436ff 33 { ATTR_COLOR0_PWM_G, "Color0 PWM G", ATTRIBUTE_TYPE_SINT32, 4 },
Rhyme 2:778a4d4436ff 34 { ATTR_COLOR0_PWM_B, "Color0 PWM B", ATTRIBUTE_TYPE_SINT32, 4 },
Rhyme 2:778a4d4436ff 35 { ATTR_COLOR0_PWM_PERIOD, "Color0 PWM Period", ATTRIBUTE_TYPE_SINT16, 2 },
Rhyme 2:778a4d4436ff 36 { ATTR_COLOR0_PWM_TARGET, "Color0 PWM Target", ATTRIBUTE_TYPE_SINT16, 2 },
Rhyme 2:778a4d4436ff 37 { ATTR_COLOR0_R_VALUE, "Color0 R", ATTRIBUTE_TYPE_SINT16, 2 },
Rhyme 2:778a4d4436ff 38 { ATTR_COLOR0_G_VALUE, "Color0 G", ATTRIBUTE_TYPE_SINT16, 2 },
Rhyme 2:778a4d4436ff 39 { ATTR_COLOR0_B_VALUE, "Color0 B", ATTRIBUTE_TYPE_SINT16, 2 },
Rhyme 2:778a4d4436ff 40 /* second color sensor (VEML6040) and LED set */
Rhyme 2:778a4d4436ff 41 { ATTR_COLOR1_PRESENT, "Color1 Present", ATTRIBUTE_TYPE_BOOLEAN, 1 },
Rhyme 2:778a4d4436ff 42 { ATTR_COLOR1_ENABLE, "Color1 Enable", ATTRIBUTE_TYPE_BOOLEAN, 1 },
Rhyme 2:778a4d4436ff 43 { ATTR_COLOR1_INTERVAL, "Color1 Interval", ATTRIBUTE_TYPE_SINT16, 2 },
Rhyme 2:778a4d4436ff 44 { ATTR_COLOR1_TRIGMODE, "Color1 Trigger Mode", ATTRIBUTE_TYPE_SINT8, 1 },
Rhyme 2:778a4d4436ff 45 { ATTR_COLOR0_ITIME, "Color1 Integration Time", ATTRIBUTE_TYPE_SINT8, 1 },
Rhyme 2:778a4d4436ff 46 { ATTR_COLOR0_CALIBRATE, "Color1 Calibrate", ATTRIBUTE_TYPE_BOOLEAN, 1 },
Rhyme 2:778a4d4436ff 47 { ATTR_COLOR1_PWM_R, "Color1 PWM R", ATTRIBUTE_TYPE_SINT32, 4 },
Rhyme 2:778a4d4436ff 48 { ATTR_COLOR1_PWM_G, "Color1 PWM G", ATTRIBUTE_TYPE_SINT32, 4 },
Rhyme 2:778a4d4436ff 49 { ATTR_COLOR1_PWM_B, "Color1 PWM B", ATTRIBUTE_TYPE_SINT32, 4 },
Rhyme 2:778a4d4436ff 50 { ATTR_COLOR1_PWM_PERIOD, "Color1 PWM Period", ATTRIBUTE_TYPE_SINT16, 2 },
Rhyme 2:778a4d4436ff 51 { ATTR_COLOR1_PWM_TARGET, "Color1 PWM Target", ATTRIBUTE_TYPE_SINT16, 2 },
Rhyme 2:778a4d4436ff 52 { ATTR_COLOR1_R_VALUE, "Color1 R", ATTRIBUTE_TYPE_SINT16, 2 },
Rhyme 2:778a4d4436ff 53 { ATTR_COLOR1_G_VALUE, "Color1 G", ATTRIBUTE_TYPE_SINT16, 2 },
Rhyme 2:778a4d4436ff 54 { ATTR_COLOR1_B_VALUE, "Color1 B", ATTRIBUTE_TYPE_SINT16, 2 },
Rhyme 2:778a4d4436ff 55 /* first temperature sensor (LM75B) */
Rhyme 2:778a4d4436ff 56 { ATTR_TEMP0_PRESENT, "Temp0 Present", ATTRIBUTE_TYPE_BOOLEAN, 1 },
Rhyme 2:778a4d4436ff 57 { ATTR_TEMP0_ENABLE, "Temp0 Enable", ATTRIBUTE_TYPE_BOOLEAN, 1 },
Rhyme 2:778a4d4436ff 58 { ATTR_TEMP0_INTERVAL, "Temp0 Interval", ATTRIBUTE_TYPE_SINT16, 2 },
Rhyme 2:778a4d4436ff 59 { ATTR_TEMP0_VALUE, "Temp0 Value", ATTRIBUTE_TYPE_FIXED_15_16, 4},
Rhyme 2:778a4d4436ff 60 /* second temperature sensor (SMTC502AT/Before) */
Rhyme 2:778a4d4436ff 61 { ATTR_TEMP1_PRESENT, "Temp1 Present", ATTRIBUTE_TYPE_BOOLEAN, 1 },
Rhyme 2:778a4d4436ff 62 { ATTR_TEMP1_ENABLE, "Temp1 Enable", ATTRIBUTE_TYPE_BOOLEAN, 1 },
Rhyme 2:778a4d4436ff 63 { ATTR_TEMP1_INTERVAL, "Temp1 Interval", ATTRIBUTE_TYPE_SINT16, 2 },
Rhyme 2:778a4d4436ff 64 { ATTR_TEMP1_VALUE, "Temp1 Value", ATTRIBUTE_TYPE_FIXED_15_16, 4},
Rhyme 2:778a4d4436ff 65 /* third temperature sensor (SMTC502AT/After) */
Rhyme 2:778a4d4436ff 66 { ATTR_TEMP2_PRESENT, "Temp2 Present", ATTRIBUTE_TYPE_BOOLEAN, 1 },
Rhyme 2:778a4d4436ff 67 { ATTR_TEMP2_ENABLE, "Temp2 Enable", ATTRIBUTE_TYPE_BOOLEAN, 1 },
Rhyme 2:778a4d4436ff 68 { ATTR_TEMP2_INTERVAL, "Temp2 Interval", ATTRIBUTE_TYPE_SINT16, 2 },
Rhyme 2:778a4d4436ff 69 { ATTR_TEMP2_VALUE, "Temp2 Value", ATTRIBUTE_TYPE_FIXED_15_16, 4},
Rhyme 2:778a4d4436ff 70 /* fouth temperateure sensor (LM75B) */
Rhyme 2:778a4d4436ff 71 { ATTR_TEMP3_PRESENT, "Temp3 Present", ATTRIBUTE_TYPE_BOOLEAN, 1 },
Rhyme 2:778a4d4436ff 72 { ATTR_TEMP3_ENABLE, "Temp3 Enable", ATTRIBUTE_TYPE_BOOLEAN, 1 },
Rhyme 2:778a4d4436ff 73 { ATTR_TEMP3_INTERVAL, "Temp3 Interval", ATTRIBUTE_TYPE_SINT16, 2 },
Rhyme 2:778a4d4436ff 74 { ATTR_TEMP3_VALUE, "Temp3 Value", ATTRIBUTE_TYPE_FIXED_15_16, 4},
Rhyme 2:778a4d4436ff 75 /* Gas Pressure sensor (PSE530) */
Rhyme 2:778a4d4436ff 76 { ATTR_GAS_PRESENT, "Gas Pressure Present", ATTRIBUTE_TYPE_BOOLEAN, 1 },
Rhyme 2:778a4d4436ff 77 { ATTR_GAS_ENABLE, "Gas Pressure Enable", ATTRIBUTE_TYPE_BOOLEAN, 1 },
Rhyme 2:778a4d4436ff 78 { ATTR_GAS_INTERVAL, "Gas Pressure Interval", ATTRIBUTE_TYPE_SINT16, 2 },
Rhyme 2:778a4d4436ff 79 { ATTR_GAS_VALUE, "Gas Pressure Value", ATTRIBUTE_TYPE_FIXED_15_16, 4},
Rhyme 2:778a4d4436ff 80 /* Software Reset Request */
Rhyme 2:778a4d4436ff 81 { ATTR_SOFTWARE_RESET, "Software Reset", ATTRIBUTE_TYPE_BOOLEAN, 1 },
Rhyme 0:f0de320e23ac 82
Rhyme 0:f0de320e23ac 83 { 1024, "LED", ATTRIBUTE_TYPE_SINT16, 2 },
Rhyme 0:f0de320e23ac 84 { 1025, "I/O 0", ATTRIBUTE_TYPE_SINT64, 8 },
Rhyme 0:f0de320e23ac 85 { 1026, "I/O 1", ATTRIBUTE_TYPE_SINT64, 8 },
Rhyme 0:f0de320e23ac 86 { 1028, "I/O 2", ATTRIBUTE_TYPE_SINT64, 8 },
Rhyme 0:f0de320e23ac 87 { 1030, "BUTTON", ATTRIBUTE_TYPE_BOOLEAN, 2 },
Rhyme 0:f0de320e23ac 88 { 1031, "I/O 3", ATTRIBUTE_TYPE_SINT64, 8 },
Rhyme 0:f0de320e23ac 89 { 2001, "Bootloader Version", ATTRIBUTE_TYPE_SINT64, 8 },
Rhyme 0:f0de320e23ac 90 { 2002, "BLE Stack Version", ATTRIBUTE_TYPE_SINT64, 8 },
Rhyme 0:f0de320e23ac 91 { 2003, "FW Application Version", ATTRIBUTE_TYPE_SINT64, 8 },
Rhyme 0:f0de320e23ac 92 { 2004, "Device Description", ATTRIBUTE_TYPE_SINT64, 8 },
Rhyme 0:f0de320e23ac 93 { 2006, "Wi-Fi chip", ATTRIBUTE_TYPE_SINT64, 8 },
Rhyme 0:f0de320e23ac 94 { 59001, "Offline Schedules enable", ATTRIBUTE_TYPE_SINT16, 2 },
Rhyme 0:f0de320e23ac 95 { 60000, "Security Enabled", ATTRIBUTE_TYPE_SINT8, 1 }, /* ? */
Rhyme 0:f0de320e23ac 96 { 65001, "UTC offset data", ATTRIBUTE_TYPE_BYTES, 8 },
Rhyme 0:f0de320e23ac 97 { 65004, "Configured SSID", ATTRIBUTE_TYPE_UTF8S, 10 }, /* ? */
Rhyme 0:f0de320e23ac 98 { 65005, "Wi-Fi Bars", ATTRIBUTE_TYPE_SINT8, 1 },
Rhyme 0:f0de320e23ac 99 { 65006, "Wi-Fi Steady State", ATTRIBUTE_TYPE_SINT8, 1 },
Rhyme 0:f0de320e23ac 100 { 65012, "Command", ATTRIBUTE_TYPE_BYTES, 8 }, /* ? */
Rhyme 0:f0de320e23ac 101 { 65013, "ASR State", ATTRIBUTE_TYPE_SINT8, 1 },
Rhyme 0:f0de320e23ac 102 { 65014, "Low Battery Warning", ATTRIBUTE_TYPE_SINT8, 1 },
Rhyme 0:f0de320e23ac 103 { 65015, "Linked Timestamp", ATTRIBUTE_TYPE_SINT32, 4 },
Rhyme 0:f0de320e23ac 104 { 65018, "Attribute ACK", ATTRIBUTE_TYPE_SINT16, 8 },
Rhyme 0:f0de320e23ac 105 { 65019, "Reboot Reason", ATTRIBUTE_TYPE_UTF8S, 100 },
Rhyme 0:f0de320e23ac 106 { 65020, "BLE Comms", ATTRIBUTE_TYPE_BYTES, 12 },
Rhyme 0:f0de320e23ac 107 { 65021, "MCU Interface", ATTRIBUTE_TYPE_SINT8, 1 },
Rhyme 0:f0de320e23ac 108 { 0, 0, 0, 0 }
Rhyme 0:f0de320e23ac 109 } ;
Rhyme 0:f0de320e23ac 110
Rhyme 0:f0de320e23ac 111 int get_af_attr(uint16_t id)
Rhyme 0:f0de320e23ac 112 {
Rhyme 0:f0de320e23ac 113 int i ;
Rhyme 0:f0de320e23ac 114 for (i = 0 ; af_attr[i].id != 0 ; i++ ) {
Rhyme 0:f0de320e23ac 115 if (id == af_attr[i].id) {
Rhyme 0:f0de320e23ac 116 break ;
Rhyme 0:f0de320e23ac 117 }
Rhyme 0:f0de320e23ac 118 }
Rhyme 0:f0de320e23ac 119 return (i) ;
Rhyme 0:f0de320e23ac 120 }
Rhyme 0:f0de320e23ac 121
Rhyme 0:f0de320e23ac 122 void print_af_error(int resultCode)
Rhyme 0:f0de320e23ac 123 {
Rhyme 0:f0de320e23ac 124 switch(resultCode) {
Rhyme 0:f0de320e23ac 125 case afSUCCESS:
Rhyme 0:f0de320e23ac 126 printf("Operation completed successfully\n") ;
Rhyme 0:f0de320e23ac 127 break ;
Rhyme 0:f0de320e23ac 128 case afERROR_NO_SUCH_ATTRIBUTE:
Rhyme 0:f0de320e23ac 129 printf("Request was made for unknown attribute id\n") ;
Rhyme 0:f0de320e23ac 130 break ;
Rhyme 0:f0de320e23ac 131 case afERROR_BUSY:
Rhyme 0:f0de320e23ac 132 printf("Request already in progress, try again\n") ;
Rhyme 0:f0de320e23ac 133 break ;
Rhyme 0:f0de320e23ac 134 case afERROR_INVALID_COMMAND:
Rhyme 0:f0de320e23ac 135 printf("Command could not be parsed\n") ;
Rhyme 0:f0de320e23ac 136 break ;
Rhyme 0:f0de320e23ac 137 case afERROR_QUEUE_OVERFLOW:
Rhyme 0:f0de320e23ac 138 printf("Queue is full\n") ;
Rhyme 0:f0de320e23ac 139 break ;
Rhyme 0:f0de320e23ac 140 case afERROR_QUEUE_UNDERFLOW:
Rhyme 0:f0de320e23ac 141 printf("Queue is empty\n") ;
Rhyme 0:f0de320e23ac 142 break ;
Rhyme 0:f0de320e23ac 143 case afERROR_INVALID_PARAM:
Rhyme 0:f0de320e23ac 144 printf("Bad input parameter\n") ;
Rhyme 0:f0de320e23ac 145 break ;
Rhyme 0:f0de320e23ac 146 default:
Rhyme 0:f0de320e23ac 147 printf("Unknown error code %d\n", resultCode) ;
Rhyme 0:f0de320e23ac 148 break ;
Rhyme 0:f0de320e23ac 149 }
Rhyme 0:f0de320e23ac 150 }
Rhyme 0:f0de320e23ac 151
Rhyme 0:f0de320e23ac 152 void af_print_values(
Rhyme 0:f0de320e23ac 153 const uint8_t requestId,
Rhyme 0:f0de320e23ac 154 const uint16_t attributeId,
Rhyme 0:f0de320e23ac 155 const uint16_t valueLen,
Rhyme 0:f0de320e23ac 156 const uint8_t *value
Rhyme 0:f0de320e23ac 157 )
Rhyme 0:f0de320e23ac 158 {
Rhyme 0:f0de320e23ac 159 int i, id ;
Rhyme 0:f0de320e23ac 160
Rhyme 0:f0de320e23ac 161 id = get_af_attr(attributeId) ;
Rhyme 0:f0de320e23ac 162
Rhyme 0:f0de320e23ac 163 if (af_attr[id].id != 0) {
Rhyme 0:f0de320e23ac 164 printf(af_attr[id].description) ;
Rhyme 0:f0de320e23ac 165 printf(" : ") ;
Rhyme 0:f0de320e23ac 166 switch(af_attr[id].attribute_type) {
Rhyme 0:f0de320e23ac 167 case ATTRIBUTE_TYPE_BOOLEAN:
Rhyme 0:f0de320e23ac 168 case ATTRIBUTE_TYPE_SINT8:
Rhyme 0:f0de320e23ac 169 if (valueLen >= 1) {
Rhyme 0:f0de320e23ac 170 printf("%02X\n", value[0]) ;
Rhyme 0:f0de320e23ac 171 }
Rhyme 0:f0de320e23ac 172 break ;
Rhyme 0:f0de320e23ac 173 case ATTRIBUTE_TYPE_SINT16:
Rhyme 0:f0de320e23ac 174 if (valueLen >= 2) {
Rhyme 0:f0de320e23ac 175 printf("%02X%02X\n", value[1], value[0]) ;
Rhyme 0:f0de320e23ac 176 }
Rhyme 0:f0de320e23ac 177 break ;
Rhyme 0:f0de320e23ac 178 case ATTRIBUTE_TYPE_SINT32:
Rhyme 0:f0de320e23ac 179 if (valueLen >= 4) {
Rhyme 0:f0de320e23ac 180 printf("%02X%02X%02X%02X\n",
Rhyme 0:f0de320e23ac 181 value[3],value[2],value[1],value[0]) ;
Rhyme 0:f0de320e23ac 182 }
Rhyme 0:f0de320e23ac 183 break ;
Rhyme 0:f0de320e23ac 184 case ATTRIBUTE_TYPE_SINT64:
Rhyme 0:f0de320e23ac 185 if (valueLen >= 8) {
Rhyme 0:f0de320e23ac 186 printf("%02X%02X %02X%02X %02X%02X %02X%02X\n",
Rhyme 0:f0de320e23ac 187 value[7], value[6], value[5], value[4],
Rhyme 0:f0de320e23ac 188 value[3], value[2], value[1], value[0]) ;
Rhyme 0:f0de320e23ac 189 }
Rhyme 0:f0de320e23ac 190 break ;
Rhyme 0:f0de320e23ac 191 case ATTRIBUTE_TYPE_UTF8S:
Rhyme 0:f0de320e23ac 192 if (valueLen > 0) {
Rhyme 0:f0de320e23ac 193 for (i = 0 ; i < valueLen ; i++) {
Rhyme 0:f0de320e23ac 194 if (isprint(value[i])) {
Rhyme 0:f0de320e23ac 195 printf("%c", value[i]) ;
Rhyme 0:f0de320e23ac 196 } else if (value[i] == 0) { /* string terminator NULL */
Rhyme 0:f0de320e23ac 197 break ;
Rhyme 0:f0de320e23ac 198 } else {
Rhyme 0:f0de320e23ac 199 printf("\'%02X\'",value[i]) ;
Rhyme 0:f0de320e23ac 200 }
Rhyme 0:f0de320e23ac 201 }
Rhyme 0:f0de320e23ac 202 printf("\n") ;
Rhyme 0:f0de320e23ac 203 }
Rhyme 0:f0de320e23ac 204 break ;
Rhyme 0:f0de320e23ac 205 case ATTRIBUTE_TYPE_BYTES:
Rhyme 0:f0de320e23ac 206 default:
Rhyme 0:f0de320e23ac 207 if (valueLen > 0) {
Rhyme 0:f0de320e23ac 208 for (i = 0 ; i < valueLen ; i++ ) {
Rhyme 0:f0de320e23ac 209 printf("%02X ", value[i]) ;
Rhyme 0:f0de320e23ac 210 }
Rhyme 0:f0de320e23ac 211 printf("\n") ;
Rhyme 0:f0de320e23ac 212 }
Rhyme 0:f0de320e23ac 213 break ;
Rhyme 0:f0de320e23ac 214 }
Rhyme 0:f0de320e23ac 215 } else {
Rhyme 0:f0de320e23ac 216 if (valueLen > 0) {
Rhyme 0:f0de320e23ac 217 for (i = 0 ; i < valueLen ; i++ ) {
Rhyme 0:f0de320e23ac 218 printf("%02X ", value[i]) ;
Rhyme 0:f0de320e23ac 219 }
Rhyme 0:f0de320e23ac 220 printf("\n") ;
Rhyme 0:f0de320e23ac 221 }
Rhyme 0:f0de320e23ac 222 }
Rhyme 0:f0de320e23ac 223 // printf("\n") ;
Rhyme 0:f0de320e23ac 224 }
Rhyme 0:f0de320e23ac 225
Rhyme 0:f0de320e23ac 226 /*
Rhyme 0:f0de320e23ac 227 * Callback that allows ASR to request an MCU attribute be changed.
Rhyme 0:f0de320e23ac 228 * You should define this function in your MCU firmware to perform application-specific actions
Rhyme 0:f0de320e23ac 229 * your code must take (e.g., updating the state of the hardware),
Rhyme 0:f0de320e23ac 230 * in light of the attribute value change.
Rhyme 0:f0de320e23ac 231 */
Rhyme 0:f0de320e23ac 232 void attributeChangeRequest(
Rhyme 0:f0de320e23ac 233 const uint8_t requestId,
Rhyme 0:f0de320e23ac 234 const uint16_t attributeId,
Rhyme 0:f0de320e23ac 235 const uint16_t valueLen,
Rhyme 0:f0de320e23ac 236 const uint8_t *value
Rhyme 0:f0de320e23ac 237 )
Rhyme 0:f0de320e23ac 238 {
Rhyme 0:f0de320e23ac 239 // int result ;
Rhyme 0:f0de320e23ac 240 uint32_t timestamp = edge_time ;
Rhyme 0:f0de320e23ac 241 if ((pending != 0)&&(pending->request->requestId == requestId)) {
Rhyme 0:f0de320e23ac 242 pending->replied_time = timestamp ;
Rhyme 0:f0de320e23ac 243
Rhyme 0:f0de320e23ac 244 }
Rhyme 0:f0de320e23ac 245 ts2time(timestamp, &current_time) ;
Rhyme 0:f0de320e23ac 246 print_time(&current_time) ;
Rhyme 0:f0de320e23ac 247 printf(" %5d ASR requested [%d] : ", attributeId, requestId) ;
Rhyme 0:f0de320e23ac 248 af_print_values(requestId, attributeId, valueLen, value) ;
Rhyme 0:f0de320e23ac 249 switch(attributeId) {
Rhyme 0:f0de320e23ac 250 case AF_SYSTEM_LINKED_TIMESTAMP: /* timestamp */
Rhyme 0:f0de320e23ac 251 set_time(valueLen, value) ;
Rhyme 0:f0de320e23ac 252 printf("timestampe = %d\n", timestamp) ;
Rhyme 0:f0de320e23ac 253 // print_date(&current_time) ;
Rhyme 0:f0de320e23ac 254 print_time(&current_time) ;
Rhyme 0:f0de320e23ac 255 break ;
Rhyme 1:66c21c62c449 256 case ATTR_SOFTWARE_RESET: /* software reset requested! */
Rhyme 1:66c21c62c449 257 if (value[0]) {
Rhyme 1:66c21c62c449 258 printf("Software Reset Requested!\n") ;
Rhyme 1:66c21c62c449 259 if (so1602a != 0) {
Rhyme 1:66c21c62c449 260 so1602a->clearDisplay() ;
Rhyme 1:66c21c62c449 261 so1602a->locate(0,0) ;
Rhyme 1:66c21c62c449 262 so1602a->putStr("System Rebooting!") ;
Rhyme 1:66c21c62c449 263 }
Rhyme 1:66c21c62c449 264 wait(1) ;
Rhyme 1:66c21c62c449 265 software_reset() ;
Rhyme 1:66c21c62c449 266 }
Rhyme 1:66c21c62c449 267 break ;
Rhyme 0:f0de320e23ac 268 case ATTR_ACCEL_ENABLE: /* accel enable */
Rhyme 0:f0de320e23ac 269 if (sensor[0]) {
Rhyme 0:f0de320e23ac 270 if (value[0]) {
Rhyme 0:f0de320e23ac 271 printf("Accel Enabled\n") ;
Rhyme 0:f0de320e23ac 272 sensor[0]->reset() ;
Rhyme 0:f0de320e23ac 273 sensor[0]->enable() ;
Rhyme 0:f0de320e23ac 274 afero->setAttributeBool(ATTR_ACCEL_ENABLE, true) ;
Rhyme 0:f0de320e23ac 275 } else if (sensor[0]){
Rhyme 0:f0de320e23ac 276 printf("Accel Disabled\n") ;
Rhyme 0:f0de320e23ac 277 sensor[0]->disable() ;
Rhyme 0:f0de320e23ac 278 afero->setAttributeBool(ATTR_ACCEL_ENABLE, false) ;
Rhyme 0:f0de320e23ac 279 }
Rhyme 0:f0de320e23ac 280 }
Rhyme 0:f0de320e23ac 281 break ;
Rhyme 0:f0de320e23ac 282 case ATTR_ACCEL_INTERVAL:
Rhyme 0:f0de320e23ac 283 if (sensor[0]) {
Rhyme 0:f0de320e23ac 284 sensor[0]->setInterval((value[1] << 8) | value[0]) ;
Rhyme 0:f0de320e23ac 285 afero->setAttribute(ATTR_ACCEL_INTERVAL, 2, value) ;
Rhyme 0:f0de320e23ac 286 }
Rhyme 0:f0de320e23ac 287 break ;
Rhyme 0:f0de320e23ac 288 case ATTR_COLOR0_ENABLE: /* color0 enable */
Rhyme 0:f0de320e23ac 289 if (sensor[1]) {
Rhyme 0:f0de320e23ac 290 if (value[0]) {
Rhyme 0:f0de320e23ac 291 sensor[1]->reset() ;
Rhyme 0:f0de320e23ac 292 sensor[1]->enable() ;
Rhyme 0:f0de320e23ac 293 afero->setAttributeBool(ATTR_COLOR0_ENABLE, true) ;
Rhyme 0:f0de320e23ac 294 } else {
Rhyme 0:f0de320e23ac 295 sensor[1]->disable() ;
Rhyme 0:f0de320e23ac 296 afero->setAttributeBool(ATTR_COLOR0_ENABLE, false) ;
Rhyme 0:f0de320e23ac 297 }
Rhyme 0:f0de320e23ac 298 }
Rhyme 0:f0de320e23ac 299 break ;
Rhyme 0:f0de320e23ac 300 case ATTR_COLOR0_INTERVAL:
Rhyme 0:f0de320e23ac 301 if (sensor[1]) {
Rhyme 0:f0de320e23ac 302 sensor[1]->setInterval((value[1] << 8) | value[0]) ;
Rhyme 0:f0de320e23ac 303 afero->setAttribute(ATTR_COLOR0_INTERVAL, 2, value) ;
Rhyme 0:f0de320e23ac 304 }
Rhyme 0:f0de320e23ac 305 break ;
Rhyme 0:f0de320e23ac 306 case ATTR_COLOR0_TRIGMODE: /* color0 config */
Rhyme 0:f0de320e23ac 307 if (sensor[1]) {
Rhyme 0:f0de320e23ac 308 uint8_t config = ((edge_color*)sensor[1])->getConfig() & 0x70 ;
Rhyme 0:f0de320e23ac 309 if (value[0]) {
Rhyme 0:f0de320e23ac 310 config = config | 0x06 ;
Rhyme 0:f0de320e23ac 311 }
Rhyme 0:f0de320e23ac 312 ((edge_color*)sensor[1])->setConfig(config) ;
Rhyme 0:f0de320e23ac 313 afero->setAttribute(ATTR_COLOR0_TRIGMODE, 1, value) ;
Rhyme 0:f0de320e23ac 314 }
Rhyme 0:f0de320e23ac 315 break ;
Rhyme 0:f0de320e23ac 316 case ATTR_COLOR0_ITIME: /* color0 config */
Rhyme 0:f0de320e23ac 317 if (sensor[1]) {
Rhyme 0:f0de320e23ac 318 uint8_t config = ((edge_color*)sensor[1])->getConfig() & 0x07 ;
Rhyme 0:f0de320e23ac 319 config = (value[0] << 4) | config ;
Rhyme 0:f0de320e23ac 320 ((edge_color*)sensor[1])->setConfig(config) ;
Rhyme 0:f0de320e23ac 321 afero->setAttribute(ATTR_COLOR0_ITIME, 1, value) ;
Rhyme 0:f0de320e23ac 322 }
Rhyme 0:f0de320e23ac 323 break ;
Rhyme 0:f0de320e23ac 324 case ATTR_COLOR0_PWM_PERIOD: /* color0 pwm period */
Rhyme 0:f0de320e23ac 325 if (sensor[1]) {
Rhyme 0:f0de320e23ac 326 ((edge_color*)sensor[1])->set_pwm_period((value[1] << 8) | value[0]) ;
Rhyme 0:f0de320e23ac 327 afero->setAttribute(ATTR_COLOR0_PWM_PERIOD, 2, value) ;
Rhyme 0:f0de320e23ac 328 }
Rhyme 0:f0de320e23ac 329 break ;
Rhyme 0:f0de320e23ac 330 case ATTR_COLOR0_PWM_TARGET: /* color0 pwm calibration target */
Rhyme 0:f0de320e23ac 331 if (sensor[1]) {
Rhyme 0:f0de320e23ac 332 color0_target[0] = (value[1] << 8) | value[0] ;
Rhyme 0:f0de320e23ac 333 color0_target[1] = color0_target[0] ;
Rhyme 0:f0de320e23ac 334 color0_target[2] = color0_target[1] ;
Rhyme 0:f0de320e23ac 335 afero->setAttribute(ATTR_COLOR0_PWM_TARGET, 2, value) ;
Rhyme 0:f0de320e23ac 336 }
Rhyme 0:f0de320e23ac 337 break ;
Rhyme 0:f0de320e23ac 338 case ATTR_COLOR0_CALIBRATE: /* calibrate color0 */
Rhyme 0:f0de320e23ac 339 if (sensor[1] && value[0]) { /* do calibration! */
Rhyme 0:f0de320e23ac 340 ((edge_color*)sensor[1])->calibrate(color0_target, color0_pwm, 10) ;
Rhyme 0:f0de320e23ac 341 afero->setAttribute32(ATTR_COLOR0_PWM_R, color0_pwm[0]) ;
Rhyme 0:f0de320e23ac 342 afero->setAttribute32(ATTR_COLOR0_PWM_G, color0_pwm[1]) ;
Rhyme 0:f0de320e23ac 343 afero->setAttribute32(ATTR_COLOR0_PWM_B, color0_pwm[2]) ;
Rhyme 0:f0de320e23ac 344 }
Rhyme 0:f0de320e23ac 345 afero->setAttributeBool(ATTR_COLOR0_CALIBRATE, false) ;
Rhyme 0:f0de320e23ac 346 break ;
Rhyme 0:f0de320e23ac 347 case ATTR_COLOR1_ENABLE: /* color1 enable */
Rhyme 0:f0de320e23ac 348 if (sensor[2]) {
Rhyme 0:f0de320e23ac 349 if (value[0]) {
Rhyme 0:f0de320e23ac 350 sensor[2]->reset() ;
Rhyme 0:f0de320e23ac 351 sensor[2]->enable() ;
Rhyme 0:f0de320e23ac 352 afero->setAttributeBool(ATTR_COLOR1_ENABLE, true) ;
Rhyme 0:f0de320e23ac 353 } else {
Rhyme 0:f0de320e23ac 354 sensor[2]->disable() ;
Rhyme 0:f0de320e23ac 355 afero->setAttributeBool(ATTR_COLOR1_ENABLE, false) ;
Rhyme 0:f0de320e23ac 356 }
Rhyme 0:f0de320e23ac 357 }
Rhyme 0:f0de320e23ac 358 break ;
Rhyme 0:f0de320e23ac 359 case ATTR_COLOR1_INTERVAL:
Rhyme 0:f0de320e23ac 360 if (sensor[2]) {
Rhyme 0:f0de320e23ac 361 sensor[2]->setInterval((value[1] << 8) | value[0]) ;
Rhyme 0:f0de320e23ac 362 afero->setAttribute(ATTR_COLOR1_INTERVAL, 2, value) ;
Rhyme 0:f0de320e23ac 363 }
Rhyme 0:f0de320e23ac 364 break ;
Rhyme 0:f0de320e23ac 365 case ATTR_COLOR1_TRIGMODE: /* color0 config */
Rhyme 0:f0de320e23ac 366 if (sensor[2]) {
Rhyme 0:f0de320e23ac 367 uint8_t config = ((edge_color*)sensor[2])->getConfig() & 0x70 ;
Rhyme 0:f0de320e23ac 368 if (value[0]) {
Rhyme 0:f0de320e23ac 369 config = config | 0x06 ;
Rhyme 0:f0de320e23ac 370 }
Rhyme 0:f0de320e23ac 371 ((edge_color*)sensor[2])->setConfig(config) ;
Rhyme 0:f0de320e23ac 372 afero->setAttribute(ATTR_COLOR1_TRIGMODE, 1, value) ;
Rhyme 0:f0de320e23ac 373 }
Rhyme 0:f0de320e23ac 374 break ;
Rhyme 0:f0de320e23ac 375 case ATTR_COLOR1_ITIME: /* color0 config */
Rhyme 0:f0de320e23ac 376 if (sensor[2]) {
Rhyme 0:f0de320e23ac 377 uint8_t config = ((edge_color*)sensor[2])->getConfig() & 0x07 ;
Rhyme 0:f0de320e23ac 378 config = (value[0] << 4) | config ;
Rhyme 0:f0de320e23ac 379 ((edge_color*)sensor[2])->setConfig(config) ;
Rhyme 0:f0de320e23ac 380 afero->setAttribute(ATTR_COLOR1_ITIME, 1, value) ;
Rhyme 0:f0de320e23ac 381 }
Rhyme 0:f0de320e23ac 382 break ;
Rhyme 0:f0de320e23ac 383 case ATTR_COLOR1_PWM_PERIOD: /* color0 pwm period */
Rhyme 0:f0de320e23ac 384 if (sensor[2]) {
Rhyme 0:f0de320e23ac 385 ((edge_color*)sensor[2])->set_pwm_period((value[1] << 8) | value[0]) ;
Rhyme 0:f0de320e23ac 386 afero->setAttribute(ATTR_COLOR1_PWM_PERIOD, 2, value) ;
Rhyme 0:f0de320e23ac 387 }
Rhyme 0:f0de320e23ac 388 break ;
Rhyme 0:f0de320e23ac 389 case ATTR_COLOR1_PWM_TARGET: /* color0 pwm calibration target */
Rhyme 0:f0de320e23ac 390 if (sensor[2]) {
Rhyme 0:f0de320e23ac 391 color1_target[0] = (value[1] << 8) | value[0] ;
Rhyme 0:f0de320e23ac 392 color1_target[1] = color0_target[0] ;
Rhyme 0:f0de320e23ac 393 color1_target[2] = color0_target[1] ;
Rhyme 0:f0de320e23ac 394 afero->setAttribute(ATTR_COLOR1_PWM_TARGET, 2, value) ;
Rhyme 0:f0de320e23ac 395 }
Rhyme 0:f0de320e23ac 396 break ;
Rhyme 0:f0de320e23ac 397 case ATTR_COLOR1_CALIBRATE: /* calibrate color1 */
Rhyme 0:f0de320e23ac 398 if (sensor[2] && value[0]) { /* do calibration! */
Rhyme 0:f0de320e23ac 399 ((edge_color*)sensor[2])->calibrate(color1_target, color1_pwm, 10) ;
Rhyme 0:f0de320e23ac 400 afero->setAttribute32(ATTR_COLOR1_PWM_R, color1_pwm[0]) ;
Rhyme 0:f0de320e23ac 401 afero->setAttribute32(ATTR_COLOR1_PWM_G, color1_pwm[1]) ;
Rhyme 0:f0de320e23ac 402 afero->setAttribute32(ATTR_COLOR1_PWM_B, color1_pwm[2]) ;
Rhyme 0:f0de320e23ac 403 }
Rhyme 0:f0de320e23ac 404 afero->setAttributeBool(ATTR_COLOR1_CALIBRATE, false) ;
Rhyme 0:f0de320e23ac 405 break ;
Rhyme 0:f0de320e23ac 406 case ATTR_TEMP0_ENABLE: /* temp0 is used to control temp-sensors */
Rhyme 0:f0de320e23ac 407 if (sensor[3]) {
Rhyme 0:f0de320e23ac 408 if (value[0]) {
Rhyme 0:f0de320e23ac 409 sensor[3]->reset() ;
Rhyme 0:f0de320e23ac 410 sensor[3]->enable() ;
Rhyme 0:f0de320e23ac 411 afero->setAttributeBool(ATTR_TEMP0_ENABLE, true) ;
Rhyme 0:f0de320e23ac 412 } else {
Rhyme 0:f0de320e23ac 413 sensor[3]->disable() ;
Rhyme 0:f0de320e23ac 414 afero->setAttributeBool(ATTR_TEMP0_ENABLE, false) ;
Rhyme 0:f0de320e23ac 415 }
Rhyme 0:f0de320e23ac 416 }
Rhyme 0:f0de320e23ac 417 break ;
Rhyme 0:f0de320e23ac 418 case ATTR_TEMP0_INTERVAL:
Rhyme 0:f0de320e23ac 419 if (sensor[3]) {
Rhyme 0:f0de320e23ac 420 sensor[3]->setInterval((value[1] << 8) | value[0]) ;
Rhyme 0:f0de320e23ac 421 afero->setAttribute(ATTR_TEMP0_INTERVAL, 2, value) ;
Rhyme 0:f0de320e23ac 422 }
Rhyme 0:f0de320e23ac 423 break ;
Rhyme 0:f0de320e23ac 424 case ATTR_TEMP3_ENABLE: /* temp3 enable */
Rhyme 0:f0de320e23ac 425 break ;
Rhyme 0:f0de320e23ac 426 case ATTR_GAS_ENABLE: /* pressure enable */
Rhyme 0:f0de320e23ac 427 if (sensor[4]) {
Rhyme 0:f0de320e23ac 428 if (value[0]) {
Rhyme 0:f0de320e23ac 429 sensor[4]->reset() ;
Rhyme 0:f0de320e23ac 430 sensor[4]->enable() ;
Rhyme 0:f0de320e23ac 431 afero->setAttributeBool(ATTR_GAS_ENABLE, true) ;
Rhyme 0:f0de320e23ac 432 } else {
Rhyme 0:f0de320e23ac 433 sensor[4]->disable() ;
Rhyme 0:f0de320e23ac 434 afero->setAttributeBool(ATTR_GAS_ENABLE, false) ;
Rhyme 0:f0de320e23ac 435 }
Rhyme 0:f0de320e23ac 436 }
Rhyme 0:f0de320e23ac 437 break ;
Rhyme 0:f0de320e23ac 438 case ATTR_GAS_INTERVAL:
Rhyme 0:f0de320e23ac 439 if (sensor[4]) {
Rhyme 0:f0de320e23ac 440 sensor[4]->setInterval((value[1] << 8) | value[0]) ;
Rhyme 0:f0de320e23ac 441 afero->setAttribute(ATTR_GAS_INTERVAL, 2, value) ;
Rhyme 0:f0de320e23ac 442 }
Rhyme 0:f0de320e23ac 443 break ;
Rhyme 0:f0de320e23ac 444 default:
Rhyme 0:f0de320e23ac 445 break ;
Rhyme 0:f0de320e23ac 446 }
Rhyme 0:f0de320e23ac 447 // af_print_values(requestId, attributeId, valueLen, value) ;
Rhyme 0:f0de320e23ac 448 if ((pending != 0)&&(pending->request->requestId == requestId)) {
Rhyme 0:f0de320e23ac 449 printf("Request [%d] replied in %d sec!\n", requestId, pending->replied_time - pending->submit_time) ;
Rhyme 0:f0de320e23ac 450 delete pending ;
Rhyme 0:f0de320e23ac 451 pending = 0 ;
Rhyme 0:f0de320e23ac 452 }
Rhyme 0:f0de320e23ac 453 }
Rhyme 0:f0de320e23ac 454
Rhyme 0:f0de320e23ac 455 /*
Rhyme 0:f0de320e23ac 456 * Application callback that allows afLib to notify that an attribute has changed.
Rhyme 0:f0de320e23ac 457 * This method will be called in response to a getAttribute call from the application
Rhyme 0:f0de320e23ac 458 * and whenever a ASR module attribute changes.
Rhyme 0:f0de320e23ac 459 */
Rhyme 0:f0de320e23ac 460 void attributeUpdatedReport(
Rhyme 0:f0de320e23ac 461 const uint8_t requestId,
Rhyme 0:f0de320e23ac 462 const uint16_t attributeId,
Rhyme 0:f0de320e23ac 463 const uint16_t valueLen,
Rhyme 0:f0de320e23ac 464 const uint8_t *value
Rhyme 0:f0de320e23ac 465 )
Rhyme 0:f0de320e23ac 466 {
Rhyme 0:f0de320e23ac 467 uint32_t timestamp = edge_time ;
Rhyme 0:f0de320e23ac 468 if ((pending != 0)&&(pending->request->requestId == requestId)) {
Rhyme 0:f0de320e23ac 469 pending->replied_time = timestamp ;
Rhyme 0:f0de320e23ac 470 }
Rhyme 0:f0de320e23ac 471 ts2time(timestamp, &current_time) ;
Rhyme 0:f0de320e23ac 472 print_time(&current_time) ;
Rhyme 0:f0de320e23ac 473 printf(" %5d ASR reported [%d]: ", attributeId, requestId) ;
Rhyme 0:f0de320e23ac 474 if (attributeId == 65015) { /* timestamp! */
Rhyme 0:f0de320e23ac 475 set_time(valueLen, value) ;
Rhyme 0:f0de320e23ac 476 printf("timestampe = %d\n", timestamp) ;
Rhyme 0:f0de320e23ac 477 print_date(&current_time) ;
Rhyme 0:f0de320e23ac 478 // print_time(&current_time) ;
Rhyme 0:f0de320e23ac 479 printf("\n") ;
Rhyme 0:f0de320e23ac 480 }
Rhyme 0:f0de320e23ac 481 af_print_values(requestId, attributeId, valueLen, value) ;
Rhyme 0:f0de320e23ac 482 switch(attributeId) {
Rhyme 0:f0de320e23ac 483 case AF_SYSTEM_ASR_STATE:
Rhyme 0:f0de320e23ac 484 printf("ASR state: ") ;
Rhyme 0:f0de320e23ac 485 switch(value[0]) {
Rhyme 0:f0de320e23ac 486 case MODULE_STATE_REBOOTED:
Rhyme 0:f0de320e23ac 487 printf("Rebooted\n") ;
Rhyme 0:f0de320e23ac 488 break ;
Rhyme 0:f0de320e23ac 489 case MODULE_STATE_LINKED:
Rhyme 0:f0de320e23ac 490 printf("Linked\n") ;
Rhyme 0:f0de320e23ac 491 break ;
Rhyme 0:f0de320e23ac 492 case MODULE_STATE_UPDATING:
Rhyme 0:f0de320e23ac 493 printf("Updating\n") ;
Rhyme 0:f0de320e23ac 494 break ;
Rhyme 0:f0de320e23ac 495 case MOUDLE_STATE_UPDATE_READY:
Rhyme 0:f0de320e23ac 496 printf("Update ready - rebooting\n") ;
Rhyme 0:f0de320e23ac 497 while(afero->setAttribute32(AF_SYSTEM_COMMAND, MODULE_COMMAND_REBOOT) != afSUCCESS) {
Rhyme 0:f0de320e23ac 498 afero->loop() ;
Rhyme 0:f0de320e23ac 499 wait(0.1) ;
Rhyme 0:f0de320e23ac 500 }
Rhyme 0:f0de320e23ac 501 break ;
Rhyme 0:f0de320e23ac 502 default:
Rhyme 0:f0de320e23ac 503 break ;
Rhyme 0:f0de320e23ac 504 }
Rhyme 0:f0de320e23ac 505 break ;
Rhyme 0:f0de320e23ac 506 default:
Rhyme 0:f0de320e23ac 507 break ;
Rhyme 0:f0de320e23ac 508 }
Rhyme 0:f0de320e23ac 509 if ((pending != 0)&&(pending->request->requestId == requestId)) {
Rhyme 0:f0de320e23ac 510 printf("Request [%d] replied in %d sec!\n", requestId, pending->replied_time - pending->submit_time) ;
Rhyme 0:f0de320e23ac 511 delete pending ;
Rhyme 0:f0de320e23ac 512 pending = 0 ;
Rhyme 0:f0de320e23ac 513 }
Rhyme 0:f0de320e23ac 514 }