the firmware for xadow smartstrap for pebble

Dependencies:   BufferedSerial USBDevice XadowGPS XadowNFC mbed mbedPebbleSerial IAP

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?

UserRevisionLine numberNew 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 }