the firmware for xadow smartstrap for pebble
Dependencies: BufferedSerial USBDevice XadowGPS XadowNFC mbed mbedPebbleSerial IAP
main.cpp@3:40e13433d193, 2015-11-06 (annotated)
- Committer:
- KillingJacky
- Date:
- Fri Nov 06 03:26:26 2015 +0000
- Revision:
- 3:40e13433d193
- Parent:
- 2:281fa9ce92c0
**added notification enhancement
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
KillingJacky | 0:5a372b5a35bb | 1 | #include "mbed.h" |
KillingJacky | 0:5a372b5a35bb | 2 | #include "USBSerial.h" |
KillingJacky | 0:5a372b5a35bb | 3 | #include "BufferedSerial.h" |
KillingJacky | 0:5a372b5a35bb | 4 | #include "XadowGPS.h" |
KillingJacky | 0:5a372b5a35bb | 5 | #include "XadowNFC.h" |
KillingJacky | 0:5a372b5a35bb | 6 | #include "mbedPebbleSerial.h" |
KillingJacky | 1:8d2e8f504ba3 | 7 | #include "IAP.h" |
KillingJacky | 1:8d2e8f504ba3 | 8 | |
KillingJacky | 1:8d2e8f504ba3 | 9 | #define EEP_BLOCK_SIZE 256 |
KillingJacky | 1:8d2e8f504ba3 | 10 | |
KillingJacky | 1:8d2e8f504ba3 | 11 | #define TARGET_SECTOR 7 // use sector 7 as target sector if it is on LPC11U24 |
KillingJacky | 1:8d2e8f504ba3 | 12 | #define TARGET_EEPROM_ADDRESS 64 |
KillingJacky | 1:8d2e8f504ba3 | 13 | #define TARGET_EEPROM_ADDRESS 64 |
KillingJacky | 0:5a372b5a35bb | 14 | |
KillingJacky | 0:5a372b5a35bb | 15 | #define max(a,b) (((a) > (b)) ? (a) : (b)) |
KillingJacky | 0:5a372b5a35bb | 16 | #define min(a,b) (((a) < (b)) ? (a) : (b)) |
KillingJacky | 0:5a372b5a35bb | 17 | |
KillingJacky | 0:5a372b5a35bb | 18 | #define SERVICE_BAT 0x2003 |
KillingJacky | 0:5a372b5a35bb | 19 | #define ATTR_BAT_V 0x1001 |
KillingJacky | 0:5a372b5a35bb | 20 | #define ATTR_BAT_CHG 0x1002 |
KillingJacky | 0:5a372b5a35bb | 21 | |
KillingJacky | 0:5a372b5a35bb | 22 | #define SERVICE_GPS 0x2001 //SPEC |
KillingJacky | 0:5a372b5a35bb | 23 | #define ATTR_GPS_LOCATION 0x0001 //SPEC |
KillingJacky | 0:5a372b5a35bb | 24 | #define ATTR_GPS_SPEED 0x0003 //spec |
KillingJacky | 0:5a372b5a35bb | 25 | #define ATTR_GPS_ALTITUDE 0x1001 |
KillingJacky | 0:5a372b5a35bb | 26 | #define ATTR_GPS_FIX_QUALITY 0x0102 //SPEC |
KillingJacky | 0:5a372b5a35bb | 27 | #define ATTR_GPS_SATELLITES 0x0101 //spec |
KillingJacky | 0:5a372b5a35bb | 28 | |
KillingJacky | 0:5a372b5a35bb | 29 | #define SERVICE_NFC 0x1E01 //NFC is not in spec now, we chose id from experimentation range |
KillingJacky | 0:5a372b5a35bb | 30 | #define ATTR_NFC_GET_UID 0x1001 |
KillingJacky | 0:5a372b5a35bb | 31 | #define ATTR_NFC_READ_NDEF 0x1002 |
KillingJacky | 0:5a372b5a35bb | 32 | #define ATTR_NFC_WRITE_NDEF 0x1003 |
KillingJacky | 0:5a372b5a35bb | 33 | #define ATTR_NFC_ERASE_NDEF 0x1004 |
KillingJacky | 2:281fa9ce92c0 | 34 | |
KillingJacky | 2:281fa9ce92c0 | 35 | uint8_t nfc_online, gps_online; |
KillingJacky | 3:40e13433d193 | 36 | bool need_notify = false; |
KillingJacky | 0:5a372b5a35bb | 37 | |
KillingJacky | 1:8d2e8f504ba3 | 38 | char eep_block[ EEP_BLOCK_SIZE ]; |
KillingJacky | 0:5a372b5a35bb | 39 | |
KillingJacky | 0:5a372b5a35bb | 40 | static uint16_t SUPPORTED_SERVICES[20] = {0}; |
KillingJacky | 0:5a372b5a35bb | 41 | #define BUFFER_SIZE 200 |
KillingJacky | 0:5a372b5a35bb | 42 | static uint8_t s_pebble_buffer[GET_PAYLOAD_BUFFER_SIZE(BUFFER_SIZE)]; |
KillingJacky | 0:5a372b5a35bb | 43 | |
KillingJacky | 0:5a372b5a35bb | 44 | DigitalOut pin_chg_led_on(P0_2); |
KillingJacky | 0:5a372b5a35bb | 45 | DigitalOut pin_5v_en(P1_19); |
KillingJacky | 0:5a372b5a35bb | 46 | AnalogIn ain(P0_11); |
KillingJacky | 0:5a372b5a35bb | 47 | |
KillingJacky | 0:5a372b5a35bb | 48 | USBSerial dbg_serial; |
KillingJacky | 0:5a372b5a35bb | 49 | BufferedSerial serial(P0_19, P0_18); //(tx,rx) |
KillingJacky | 0:5a372b5a35bb | 50 | |
KillingJacky | 0:5a372b5a35bb | 51 | I2C i2c(P0_5, P0_4); |
KillingJacky | 0:5a372b5a35bb | 52 | |
KillingJacky | 2:281fa9ce92c0 | 53 | Timer timer_notify; |
KillingJacky | 2:281fa9ce92c0 | 54 | Timer timer_service; |
KillingJacky | 0:5a372b5a35bb | 55 | |
KillingJacky | 1:8d2e8f504ba3 | 56 | IAP iap; |
KillingJacky | 1:8d2e8f504ba3 | 57 | |
KillingJacky | 0:5a372b5a35bb | 58 | static uint8_t last_tagid[10] = {0}; |
KillingJacky | 0:5a372b5a35bb | 59 | static uint8_t last_tagid_len = 0; |
KillingJacky | 0:5a372b5a35bb | 60 | |
KillingJacky | 0:5a372b5a35bb | 61 | |
KillingJacky | 0:5a372b5a35bb | 62 | float get_vbat() |
KillingJacky | 0:5a372b5a35bb | 63 | { |
KillingJacky | 0:5a372b5a35bb | 64 | return 3.3f*ain*2.25; |
KillingJacky | 0:5a372b5a35bb | 65 | } |
KillingJacky | 0:5a372b5a35bb | 66 | |
KillingJacky | 2:281fa9ce92c0 | 67 | void add_services() |
KillingJacky | 2:281fa9ce92c0 | 68 | { |
KillingJacky | 2:281fa9ce92c0 | 69 | int i = 0; |
KillingJacky | 2:281fa9ce92c0 | 70 | |
KillingJacky | 2:281fa9ce92c0 | 71 | /* Raw data service */ |
KillingJacky | 2:281fa9ce92c0 | 72 | SUPPORTED_SERVICES[i++] = 0x0000; |
KillingJacky | 2:281fa9ce92c0 | 73 | |
KillingJacky | 2:281fa9ce92c0 | 74 | /* battery service */ |
KillingJacky | 2:281fa9ce92c0 | 75 | SUPPORTED_SERVICES[i++] = SERVICE_BAT; |
KillingJacky | 2:281fa9ce92c0 | 76 | |
KillingJacky | 2:281fa9ce92c0 | 77 | /* GPS service */ |
KillingJacky | 2:281fa9ce92c0 | 78 | if (gps_online) |
KillingJacky | 2:281fa9ce92c0 | 79 | { |
KillingJacky | 2:281fa9ce92c0 | 80 | SUPPORTED_SERVICES[i++] = SERVICE_GPS; |
KillingJacky | 2:281fa9ce92c0 | 81 | } |
KillingJacky | 2:281fa9ce92c0 | 82 | |
KillingJacky | 2:281fa9ce92c0 | 83 | /* NFC Service*/ |
KillingJacky | 2:281fa9ce92c0 | 84 | if (nfc_online) |
KillingJacky | 2:281fa9ce92c0 | 85 | { |
KillingJacky | 2:281fa9ce92c0 | 86 | SUPPORTED_SERVICES[i++] = SERVICE_NFC; |
KillingJacky | 2:281fa9ce92c0 | 87 | nfc_adapter_init(); |
KillingJacky | 2:281fa9ce92c0 | 88 | } |
KillingJacky | 2:281fa9ce92c0 | 89 | |
KillingJacky | 2:281fa9ce92c0 | 90 | mbedPebbleSerial::begin(s_pebble_buffer, sizeof(s_pebble_buffer), Baud9600, SUPPORTED_SERVICES, i); |
KillingJacky | 2:281fa9ce92c0 | 91 | } |
KillingJacky | 2:281fa9ce92c0 | 92 | |
KillingJacky | 0:5a372b5a35bb | 93 | int main() |
KillingJacky | 0:5a372b5a35bb | 94 | { |
KillingJacky | 0:5a372b5a35bb | 95 | /* init io */ |
KillingJacky | 0:5a372b5a35bb | 96 | pin_chg_led_on = 0; //pull low to enable charge led |
KillingJacky | 1:8d2e8f504ba3 | 97 | //pin_5v_en = 1; //pull high to enable battery to charge pebble |
KillingJacky | 0:5a372b5a35bb | 98 | |
KillingJacky | 0:5a372b5a35bb | 99 | /* init uart */ |
KillingJacky | 0:5a372b5a35bb | 100 | serial.baud(9600); |
KillingJacky | 0:5a372b5a35bb | 101 | |
KillingJacky | 0:5a372b5a35bb | 102 | wait(1); |
KillingJacky | 0:5a372b5a35bb | 103 | dbg_serial.printf("Detecting connected device...\r\n"); |
KillingJacky | 0:5a372b5a35bb | 104 | |
KillingJacky | 0:5a372b5a35bb | 105 | /* GPS service */ |
KillingJacky | 2:281fa9ce92c0 | 106 | gps_online = gps_check_online(); |
KillingJacky | 0:5a372b5a35bb | 107 | dbg_serial.printf("gps online: %d\r\n", gps_online); |
KillingJacky | 0:5a372b5a35bb | 108 | |
KillingJacky | 0:5a372b5a35bb | 109 | /* NFC Service*/ |
KillingJacky | 2:281fa9ce92c0 | 110 | nfc_online = nfc_check_online(); |
KillingJacky | 0:5a372b5a35bb | 111 | dbg_serial.printf("nfc online: %d\r\n", nfc_online); |
KillingJacky | 0:5a372b5a35bb | 112 | |
KillingJacky | 0:5a372b5a35bb | 113 | dbg_serial.printf("Service self detecting done!\r\n"); |
KillingJacky | 0:5a372b5a35bb | 114 | |
KillingJacky | 2:281fa9ce92c0 | 115 | add_services(); |
KillingJacky | 2:281fa9ce92c0 | 116 | |
KillingJacky | 0:5a372b5a35bb | 117 | |
KillingJacky | 0:5a372b5a35bb | 118 | /* init i2c */ |
KillingJacky | 0:5a372b5a35bb | 119 | i2c.frequency(100000); //100khz |
KillingJacky | 0:5a372b5a35bb | 120 | |
KillingJacky | 2:281fa9ce92c0 | 121 | /* start a timer_notify */ |
KillingJacky | 2:281fa9ce92c0 | 122 | timer_notify.start(); |
KillingJacky | 2:281fa9ce92c0 | 123 | timer_service.start(); |
KillingJacky | 0:5a372b5a35bb | 124 | |
KillingJacky | 1:8d2e8f504ba3 | 125 | /* reload the last configure for charging pebble or not */ |
KillingJacky | 1:8d2e8f504ba3 | 126 | int r; |
KillingJacky | 1:8d2e8f504ba3 | 127 | r = iap.blank_check( TARGET_SECTOR, TARGET_SECTOR ); |
KillingJacky | 1:8d2e8f504ba3 | 128 | dbg_serial.printf( "blank check result = 0x%08X\r\n", r ); |
KillingJacky | 1:8d2e8f504ba3 | 129 | |
KillingJacky | 1:8d2e8f504ba3 | 130 | iap.prepare( TARGET_SECTOR, TARGET_SECTOR ); |
KillingJacky | 1:8d2e8f504ba3 | 131 | |
KillingJacky | 1:8d2e8f504ba3 | 132 | if ( r == SECTOR_NOT_BLANK ) { |
KillingJacky | 1:8d2e8f504ba3 | 133 | r = iap.read_eeprom( (char*)TARGET_EEPROM_ADDRESS, eep_block, EEP_BLOCK_SIZE ); |
KillingJacky | 1:8d2e8f504ba3 | 134 | dbg_serial.printf( "read eep result = 0x%08X, var: %d\r\n", r, eep_block[0] ); |
KillingJacky | 1:8d2e8f504ba3 | 135 | |
KillingJacky | 1:8d2e8f504ba3 | 136 | pin_5v_en = eep_block[0] > 0?1:0; |
KillingJacky | 1:8d2e8f504ba3 | 137 | }else |
KillingJacky | 1:8d2e8f504ba3 | 138 | { |
KillingJacky | 1:8d2e8f504ba3 | 139 | eep_block[0] = 1; |
KillingJacky | 1:8d2e8f504ba3 | 140 | pin_5v_en = 1; |
KillingJacky | 1:8d2e8f504ba3 | 141 | r = iap.write_eeprom( eep_block, (char*)TARGET_EEPROM_ADDRESS, EEP_BLOCK_SIZE ); |
KillingJacky | 1:8d2e8f504ba3 | 142 | dbg_serial.printf( "write eep result = 0x%08X\r\n", r ); |
KillingJacky | 1:8d2e8f504ba3 | 143 | } |
KillingJacky | 1:8d2e8f504ba3 | 144 | |
KillingJacky | 0:5a372b5a35bb | 145 | size_t length; |
KillingJacky | 0:5a372b5a35bb | 146 | uint16_t service_id; |
KillingJacky | 0:5a372b5a35bb | 147 | uint16_t attribute_id; |
KillingJacky | 0:5a372b5a35bb | 148 | RequestType type; |
KillingJacky | 0:5a372b5a35bb | 149 | |
KillingJacky | 0:5a372b5a35bb | 150 | while(1) { |
KillingJacky | 0:5a372b5a35bb | 151 | if(mbedPebbleSerial::feed(&service_id, &attribute_id, &length, &type)) |
KillingJacky | 0:5a372b5a35bb | 152 | { |
KillingJacky | 0:5a372b5a35bb | 153 | // we have a raw data frame to process |
KillingJacky | 0:5a372b5a35bb | 154 | if ((service_id == 0) && (attribute_id == 0)) |
KillingJacky | 0:5a372b5a35bb | 155 | { |
KillingJacky | 0:5a372b5a35bb | 156 | ; |
KillingJacky | 0:5a372b5a35bb | 157 | } |
KillingJacky | 0:5a372b5a35bb | 158 | else if (service_id == SERVICE_BAT) |
KillingJacky | 0:5a372b5a35bb | 159 | { |
KillingJacky | 0:5a372b5a35bb | 160 | if ((attribute_id == ATTR_BAT_V) && (type == RequestTypeRead)) |
KillingJacky | 0:5a372b5a35bb | 161 | { |
KillingJacky | 0:5a372b5a35bb | 162 | float vbat_f = get_vbat(); |
KillingJacky | 0:5a372b5a35bb | 163 | uint16_t vbat = (uint16_t)(vbat_f * 100); |
KillingJacky | 0:5a372b5a35bb | 164 | dbg_serial.printf("ATTR_BAT_V, vbat: %f, %d\r\n", vbat_f, vbat); |
KillingJacky | 0:5a372b5a35bb | 165 | memcpy(s_pebble_buffer, &vbat, sizeof(vbat)); |
KillingJacky | 0:5a372b5a35bb | 166 | mbedPebbleSerial::write(true, s_pebble_buffer, sizeof(vbat)); |
KillingJacky | 0:5a372b5a35bb | 167 | } |
KillingJacky | 0:5a372b5a35bb | 168 | else if((attribute_id == ATTR_BAT_CHG) && (type == RequestTypeWrite)) |
KillingJacky | 0:5a372b5a35bb | 169 | { |
KillingJacky | 0:5a372b5a35bb | 170 | uint8_t enable_charge; |
KillingJacky | 0:5a372b5a35bb | 171 | memcpy(&enable_charge, s_pebble_buffer, sizeof(enable_charge)); |
KillingJacky | 0:5a372b5a35bb | 172 | dbg_serial.printf("ATTR_BAT_CHG: %d\r\n", enable_charge); |
KillingJacky | 0:5a372b5a35bb | 173 | pin_5v_en = enable_charge; |
KillingJacky | 0:5a372b5a35bb | 174 | mbedPebbleSerial::write(true, NULL, 0); |
KillingJacky | 1:8d2e8f504ba3 | 175 | eep_block[0] = enable_charge; |
KillingJacky | 1:8d2e8f504ba3 | 176 | r = iap.write_eeprom( eep_block, (char*)TARGET_EEPROM_ADDRESS, EEP_BLOCK_SIZE ); |
KillingJacky | 1:8d2e8f504ba3 | 177 | dbg_serial.printf( "write %d to eep result = 0x%08X\r\n", enable_charge, r ); |
KillingJacky | 0:5a372b5a35bb | 178 | } |
KillingJacky | 0:5a372b5a35bb | 179 | else |
KillingJacky | 0:5a372b5a35bb | 180 | { |
KillingJacky | 0:5a372b5a35bb | 181 | mbedPebbleSerial::write(false, NULL, 0); |
KillingJacky | 0:5a372b5a35bb | 182 | } |
KillingJacky | 0:5a372b5a35bb | 183 | } |
KillingJacky | 2:281fa9ce92c0 | 184 | else if (service_id == SERVICE_GPS && gps_online) |
KillingJacky | 0:5a372b5a35bb | 185 | { |
KillingJacky | 0:5a372b5a35bb | 186 | if (attribute_id == ATTR_GPS_LOCATION && type == RequestTypeRead) |
KillingJacky | 0:5a372b5a35bb | 187 | { |
KillingJacky | 0:5a372b5a35bb | 188 | float lat_f, lon_f; |
KillingJacky | 0:5a372b5a35bb | 189 | lat_f = gps_get_latitude(); |
KillingJacky | 0:5a372b5a35bb | 190 | lon_f = gps_get_longitude(); |
KillingJacky | 0:5a372b5a35bb | 191 | int32_t lat = (int32_t)(lat_f * (10000000)); |
KillingJacky | 0:5a372b5a35bb | 192 | int32_t lon = (int32_t)(lon_f * (10000000)); |
KillingJacky | 0:5a372b5a35bb | 193 | dbg_serial.printf("ATTR_GPS_LOCATION: %f, %f ---- %d, %d\r\n", lat_f,lon_f,lat,lon); |
KillingJacky | 0:5a372b5a35bb | 194 | memcpy(s_pebble_buffer, &lat, sizeof(lat)); |
KillingJacky | 0:5a372b5a35bb | 195 | memcpy(s_pebble_buffer+sizeof(lat), &lon, sizeof(lon)); |
KillingJacky | 0:5a372b5a35bb | 196 | mbedPebbleSerial::write(true, s_pebble_buffer, sizeof(lat)*2); |
KillingJacky | 0:5a372b5a35bb | 197 | } |
KillingJacky | 0:5a372b5a35bb | 198 | else if (attribute_id == ATTR_GPS_SPEED && type == RequestTypeRead) |
KillingJacky | 0:5a372b5a35bb | 199 | { |
KillingJacky | 0:5a372b5a35bb | 200 | float v = gps_get_speed(); |
KillingJacky | 0:5a372b5a35bb | 201 | uint16_t speed = (uint16_t)(v * 100); |
KillingJacky | 0:5a372b5a35bb | 202 | dbg_serial.printf("ATTR_GPS_SPEED: %f, %d\r\n", v,speed); |
KillingJacky | 0:5a372b5a35bb | 203 | memcpy(s_pebble_buffer, &speed, sizeof(speed)); |
KillingJacky | 0:5a372b5a35bb | 204 | mbedPebbleSerial::write(true, s_pebble_buffer, sizeof(speed)); |
KillingJacky | 0:5a372b5a35bb | 205 | } |
KillingJacky | 0:5a372b5a35bb | 206 | else if (attribute_id == ATTR_GPS_ALTITUDE && type == RequestTypeRead) |
KillingJacky | 0:5a372b5a35bb | 207 | { |
KillingJacky | 0:5a372b5a35bb | 208 | float alt_f = gps_get_altitude(); |
KillingJacky | 0:5a372b5a35bb | 209 | uint16_t alt = (uint16_t)(alt_f * 100); |
KillingJacky | 0:5a372b5a35bb | 210 | dbg_serial.printf("ATTR_GPS_ALTITUDE: %f, %d\r\n", alt_f,alt); |
KillingJacky | 0:5a372b5a35bb | 211 | memcpy(s_pebble_buffer, &alt, sizeof(alt)); |
KillingJacky | 0:5a372b5a35bb | 212 | mbedPebbleSerial::write(true, s_pebble_buffer, sizeof(alt)); |
KillingJacky | 0:5a372b5a35bb | 213 | } |
KillingJacky | 0:5a372b5a35bb | 214 | else if (attribute_id == ATTR_GPS_FIX_QUALITY && type == RequestTypeRead) |
KillingJacky | 0:5a372b5a35bb | 215 | { |
KillingJacky | 0:5a372b5a35bb | 216 | uint8_t fixq = gps_get_position_fix(); |
KillingJacky | 2:281fa9ce92c0 | 217 | fixq = (fixq>8)?0:fixq; |
KillingJacky | 0:5a372b5a35bb | 218 | dbg_serial.printf("ATTR_GPS_FIX_QUALITY: %d\r\n", fixq); |
KillingJacky | 0:5a372b5a35bb | 219 | memcpy(s_pebble_buffer, &fixq, sizeof(fixq)); |
KillingJacky | 0:5a372b5a35bb | 220 | mbedPebbleSerial::write(true, s_pebble_buffer, sizeof(fixq)); |
KillingJacky | 0:5a372b5a35bb | 221 | } |
KillingJacky | 0:5a372b5a35bb | 222 | else if (attribute_id == ATTR_GPS_SATELLITES && type == RequestTypeRead) |
KillingJacky | 0:5a372b5a35bb | 223 | { |
KillingJacky | 1:8d2e8f504ba3 | 224 | uint8_t sat = gps_get_sate_in_veiw(); |
KillingJacky | 0:5a372b5a35bb | 225 | dbg_serial.printf("ATTR_GPS_SATELLITES: %d\r\n", sat); |
KillingJacky | 0:5a372b5a35bb | 226 | memcpy(s_pebble_buffer, &sat, sizeof(sat)); |
KillingJacky | 0:5a372b5a35bb | 227 | mbedPebbleSerial::write(true, s_pebble_buffer, sizeof(sat)); |
KillingJacky | 0:5a372b5a35bb | 228 | }else |
KillingJacky | 0:5a372b5a35bb | 229 | { |
KillingJacky | 0:5a372b5a35bb | 230 | mbedPebbleSerial::write(false, NULL, 0); |
KillingJacky | 0:5a372b5a35bb | 231 | } |
KillingJacky | 0:5a372b5a35bb | 232 | } |
KillingJacky | 2:281fa9ce92c0 | 233 | else if (service_id == SERVICE_NFC && nfc_online) |
KillingJacky | 0:5a372b5a35bb | 234 | { |
KillingJacky | 0:5a372b5a35bb | 235 | if (attribute_id == ATTR_NFC_GET_UID && type == RequestTypeRead) |
KillingJacky | 0:5a372b5a35bb | 236 | { |
KillingJacky | 0:5a372b5a35bb | 237 | /*uint8_t *uid = nfc_adapter_get_uid(); |
KillingJacky | 0:5a372b5a35bb | 238 | uint8_t len = uid[1]; |
KillingJacky | 0:5a372b5a35bb | 239 | dbg_serial.printf("GET_NFC_TAGID: "); |
KillingJacky | 0:5a372b5a35bb | 240 | for(int i=2; i<2+len; i++) |
KillingJacky | 0:5a372b5a35bb | 241 | { |
KillingJacky | 0:5a372b5a35bb | 242 | dbg_serial.printf("%02X ", uid[i]); |
KillingJacky | 0:5a372b5a35bb | 243 | } |
KillingJacky | 0:5a372b5a35bb | 244 | dbg_serial.printf("\r\n"); |
KillingJacky | 0:5a372b5a35bb | 245 | memcpy((char *)s_pebble_buffer, (char *)(uid+2), len); |
KillingJacky | 0:5a372b5a35bb | 246 | mbedPebbleSerial::write(true, s_pebble_buffer, len);*/ |
KillingJacky | 0:5a372b5a35bb | 247 | dbg_serial.printf("GET_NFC_TAGID: "); |
KillingJacky | 0:5a372b5a35bb | 248 | for(int i=0; i<last_tagid_len; i++) |
KillingJacky | 0:5a372b5a35bb | 249 | { |
KillingJacky | 0:5a372b5a35bb | 250 | dbg_serial.printf("%02X ", last_tagid[i]); |
KillingJacky | 0:5a372b5a35bb | 251 | } |
KillingJacky | 0:5a372b5a35bb | 252 | dbg_serial.printf("\r\n"); |
KillingJacky | 0:5a372b5a35bb | 253 | memcpy((char *)s_pebble_buffer, (char *)last_tagid, last_tagid_len); |
KillingJacky | 0:5a372b5a35bb | 254 | mbedPebbleSerial::write(true, s_pebble_buffer, last_tagid_len); |
KillingJacky | 3:40e13433d193 | 255 | |
KillingJacky | 3:40e13433d193 | 256 | need_notify = false; |
KillingJacky | 0:5a372b5a35bb | 257 | } |
KillingJacky | 0:5a372b5a35bb | 258 | else if (attribute_id == ATTR_NFC_READ_NDEF && type == RequestTypeRead) |
KillingJacky | 0:5a372b5a35bb | 259 | { |
KillingJacky | 0:5a372b5a35bb | 260 | memset(s_pebble_buffer, 0, sizeof(s_pebble_buffer)); |
KillingJacky | 0:5a372b5a35bb | 261 | uint8_t *ndef = nfc_adapter_read(); |
KillingJacky | 0:5a372b5a35bb | 262 | uint8_t len = ndef[1]; |
KillingJacky | 0:5a372b5a35bb | 263 | len = min(len, BUFFER_SIZE); |
KillingJacky | 0:5a372b5a35bb | 264 | dbg_serial.printf("GET_NFC_NDEF: "); |
KillingJacky | 0:5a372b5a35bb | 265 | for(int i=2; i<2+len; i++) |
KillingJacky | 0:5a372b5a35bb | 266 | { |
KillingJacky | 0:5a372b5a35bb | 267 | dbg_serial.printf("%02X ", ndef[i]); |
KillingJacky | 0:5a372b5a35bb | 268 | } |
KillingJacky | 0:5a372b5a35bb | 269 | dbg_serial.printf("\r\n"); |
KillingJacky | 0:5a372b5a35bb | 270 | memcpy((char *)s_pebble_buffer, (char *)(ndef+2), len); |
KillingJacky | 0:5a372b5a35bb | 271 | mbedPebbleSerial::write(true, s_pebble_buffer, len); |
KillingJacky | 0:5a372b5a35bb | 272 | } |
KillingJacky | 0:5a372b5a35bb | 273 | else if((attribute_id == ATTR_NFC_WRITE_NDEF) && (type == RequestTypeWrite)) |
KillingJacky | 0:5a372b5a35bb | 274 | { |
KillingJacky | 0:5a372b5a35bb | 275 | if (*(s_pebble_buffer + length) != '\0' && length < BUFFER_SIZE) |
KillingJacky | 0:5a372b5a35bb | 276 | *(s_pebble_buffer + length) = '\0'; |
KillingJacky | 0:5a372b5a35bb | 277 | dbg_serial.printf("ATTR_NFC_WRITE_NDEF: "); |
KillingJacky | 0:5a372b5a35bb | 278 | for(int i=0; i<length; i++) |
KillingJacky | 0:5a372b5a35bb | 279 | { |
KillingJacky | 0:5a372b5a35bb | 280 | dbg_serial.printf("%02X ", s_pebble_buffer[i]); |
KillingJacky | 0:5a372b5a35bb | 281 | } |
KillingJacky | 0:5a372b5a35bb | 282 | dbg_serial.printf("\r\n"); |
KillingJacky | 0:5a372b5a35bb | 283 | nfc_adapter_write(s_pebble_buffer, length); |
KillingJacky | 0:5a372b5a35bb | 284 | mbedPebbleSerial::write(true, NULL, 0); |
KillingJacky | 0:5a372b5a35bb | 285 | } |
KillingJacky | 0:5a372b5a35bb | 286 | else if((attribute_id == ATTR_NFC_ERASE_NDEF) && (type == RequestTypeWrite)) |
KillingJacky | 0:5a372b5a35bb | 287 | { |
KillingJacky | 0:5a372b5a35bb | 288 | dbg_serial.printf("ATTR_NFC_ERASE_NDEF\r\n"); |
KillingJacky | 0:5a372b5a35bb | 289 | nfc_adapter_erase(); |
KillingJacky | 0:5a372b5a35bb | 290 | mbedPebbleSerial::write(true, NULL, 0); |
KillingJacky | 0:5a372b5a35bb | 291 | } else |
KillingJacky | 0:5a372b5a35bb | 292 | { |
KillingJacky | 0:5a372b5a35bb | 293 | mbedPebbleSerial::write(false, NULL, 0); |
KillingJacky | 0:5a372b5a35bb | 294 | } |
KillingJacky | 2:281fa9ce92c0 | 295 | }else |
KillingJacky | 2:281fa9ce92c0 | 296 | { |
KillingJacky | 2:281fa9ce92c0 | 297 | mbedPebbleSerial::write(false, NULL, 0); |
KillingJacky | 0:5a372b5a35bb | 298 | } |
KillingJacky | 0:5a372b5a35bb | 299 | } |
KillingJacky | 0:5a372b5a35bb | 300 | |
KillingJacky | 0:5a372b5a35bb | 301 | //check if nfc tagid changed |
KillingJacky | 2:281fa9ce92c0 | 302 | if (timer_notify.read_ms() > 1000 && nfc_online) |
KillingJacky | 0:5a372b5a35bb | 303 | { |
KillingJacky | 2:281fa9ce92c0 | 304 | timer_notify.reset(); |
KillingJacky | 0:5a372b5a35bb | 305 | |
KillingJacky | 3:40e13433d193 | 306 | if (need_notify) |
KillingJacky | 3:40e13433d193 | 307 | { |
KillingJacky | 3:40e13433d193 | 308 | mbedPebbleSerial::notify(SERVICE_NFC, ATTR_NFC_GET_UID); |
KillingJacky | 3:40e13433d193 | 309 | }else |
KillingJacky | 0:5a372b5a35bb | 310 | { |
KillingJacky | 3:40e13433d193 | 311 | uint8_t *uid = nfc_adapter_get_uid(); |
KillingJacky | 3:40e13433d193 | 312 | uint8_t len = uid[1]; |
KillingJacky | 3:40e13433d193 | 313 | dbg_serial.printf("Check NFC: "); |
KillingJacky | 3:40e13433d193 | 314 | if (len > 0) |
KillingJacky | 0:5a372b5a35bb | 315 | { |
KillingJacky | 3:40e13433d193 | 316 | for(int i=2; i<2+len; i++) |
KillingJacky | 3:40e13433d193 | 317 | { |
KillingJacky | 3:40e13433d193 | 318 | dbg_serial.printf("%02X ", uid[i]); |
KillingJacky | 3:40e13433d193 | 319 | } |
KillingJacky | 3:40e13433d193 | 320 | } |
KillingJacky | 3:40e13433d193 | 321 | dbg_serial.printf("\r\n"); |
KillingJacky | 3:40e13433d193 | 322 | len = min(len, 10); |
KillingJacky | 3:40e13433d193 | 323 | if (memcmp(last_tagid, uid+2, len) != 0 || len != last_tagid_len) |
KillingJacky | 3:40e13433d193 | 324 | { |
KillingJacky | 3:40e13433d193 | 325 | need_notify = true; |
KillingJacky | 3:40e13433d193 | 326 | mbedPebbleSerial::notify(SERVICE_NFC, ATTR_NFC_GET_UID); |
KillingJacky | 3:40e13433d193 | 327 | if (len == 0) |
KillingJacky | 3:40e13433d193 | 328 | { |
KillingJacky | 3:40e13433d193 | 329 | memset(last_tagid, 0, sizeof(last_tagid)); |
KillingJacky | 3:40e13433d193 | 330 | }else |
KillingJacky | 3:40e13433d193 | 331 | { |
KillingJacky | 3:40e13433d193 | 332 | memcpy(last_tagid, uid+2, len); |
KillingJacky | 3:40e13433d193 | 333 | } |
KillingJacky | 3:40e13433d193 | 334 | last_tagid_len = len; |
KillingJacky | 3:40e13433d193 | 335 | //changed, notify |
KillingJacky | 0:5a372b5a35bb | 336 | } |
KillingJacky | 0:5a372b5a35bb | 337 | } |
KillingJacky | 0:5a372b5a35bb | 338 | } |
KillingJacky | 0:5a372b5a35bb | 339 | |
KillingJacky | 3:40e13433d193 | 340 | |
KillingJacky | 3:40e13433d193 | 341 | |
KillingJacky | 2:281fa9ce92c0 | 342 | //check services' availability |
KillingJacky | 2:281fa9ce92c0 | 343 | if (timer_service.read() > 5) |
KillingJacky | 2:281fa9ce92c0 | 344 | { |
KillingJacky | 2:281fa9ce92c0 | 345 | timer_service.reset(); |
KillingJacky | 2:281fa9ce92c0 | 346 | |
KillingJacky | 2:281fa9ce92c0 | 347 | uint8_t state_gps = gps_check_online(); |
KillingJacky | 2:281fa9ce92c0 | 348 | uint8_t state_nfc = nfc_check_online(); |
KillingJacky | 2:281fa9ce92c0 | 349 | uint8_t mark = 0; |
KillingJacky | 2:281fa9ce92c0 | 350 | |
KillingJacky | 2:281fa9ce92c0 | 351 | if (state_gps != gps_online) |
KillingJacky | 2:281fa9ce92c0 | 352 | { |
KillingJacky | 2:281fa9ce92c0 | 353 | gps_online = state_gps; |
KillingJacky | 2:281fa9ce92c0 | 354 | mark = 1; |
KillingJacky | 2:281fa9ce92c0 | 355 | dbg_serial.printf("gps state: %d \r\n", gps_online); |
KillingJacky | 2:281fa9ce92c0 | 356 | } |
KillingJacky | 2:281fa9ce92c0 | 357 | if (state_nfc != nfc_online) |
KillingJacky | 2:281fa9ce92c0 | 358 | { |
KillingJacky | 2:281fa9ce92c0 | 359 | nfc_online = state_nfc; |
KillingJacky | 2:281fa9ce92c0 | 360 | mark = 1; |
KillingJacky | 2:281fa9ce92c0 | 361 | dbg_serial.printf("nfc state: %d \r\n", nfc_online); |
KillingJacky | 2:281fa9ce92c0 | 362 | } |
KillingJacky | 2:281fa9ce92c0 | 363 | if (mark) |
KillingJacky | 2:281fa9ce92c0 | 364 | { |
KillingJacky | 2:281fa9ce92c0 | 365 | add_services(); |
KillingJacky | 2:281fa9ce92c0 | 366 | } |
KillingJacky | 2:281fa9ce92c0 | 367 | |
KillingJacky | 2:281fa9ce92c0 | 368 | dbg_serial.printf("check services --- %d, %d \r\n", gps_online, nfc_online); |
KillingJacky | 2:281fa9ce92c0 | 369 | } |
KillingJacky | 2:281fa9ce92c0 | 370 | |
KillingJacky | 0:5a372b5a35bb | 371 | } //while 1 |
KillingJacky | 0:5a372b5a35bb | 372 | } |