From 6c43657194bd78a4c99744e3341d4772e6d612a3 Mon Sep 17 00:00:00 2001 From: atc1441 Date: Wed, 9 Feb 2022 22:43:44 +0100 Subject: [PATCH] Deep sleep update and MTU increase --- Firmware/ATC_Paper.bin | Bin 107812 -> 107776 bytes Firmware/src/app.c | 13 ++- Firmware/src/app_config.h | 2 +- Firmware/src/ble.c | 186 +++++++++++++++++++-------------- Firmware/src/ble.h | 3 +- Firmware/src/epd.c | 123 ++++++++-------------- Firmware/src/epd_ble_service.c | 70 +++++++------ Firmware/src/led.c | 31 ++---- Firmware/src/led.h | 1 - Firmware/src/main.c | 3 - Firmware/src/nfc.c | 39 ++----- Firmware/src/nfc.h | 1 - 12 files changed, 214 insertions(+), 258 deletions(-) diff --git a/Firmware/ATC_Paper.bin b/Firmware/ATC_Paper.bin index 978684017c288c5db89841142d471ef3462a42a0..8597566ec7a0ab306bbc8679dccb151783bc904a 100644 GIT binary patch delta 9855 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

-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 DdkR2Z diff --git a/Firmware/src/app.c b/Firmware/src/app.c index 4fd18c8..cfdb637 100644 --- a/Firmware/src/app.c +++ b/Firmware/src/app.c @@ -34,9 +34,12 @@ void user_init_normal(void) random_generator_init(); // must init_ble(); init_flash(); + init_nfc(); + init_led(); battery_mv = get_battery_mv(); battery_level = get_battery_level(battery_mv); epd_display_tiff((uint8_t *)bart_tif, sizeof(bart_tif)); + //epd_display(3334533); } _attribute_ram_code_ void user_init_deepRetn(void) @@ -71,13 +74,15 @@ _attribute_ram_code_ void main_loop() // Uncomment this line to periodically have the display refreshed with the current time. // epd_display(current_unix_time); } + if (epd_state_handler()) // if epd_update is ongoing enable gpio wakeup to put the display to sleep as fast as possible { cpu_set_gpio_wakeup(EPD_BUSY, 1, 1); bls_pm_setWakeupSource(PM_WAKEUP_PAD); + bls_pm_setSuspendMask(SUSPEND_DISABLE); + } + else + { + blt_pm_proc(); } - deinit_nfc(); - deinit_led(); - gpio_shutdown(GPIO_ALL); - blt_pm_proc(); } diff --git a/Firmware/src/app_config.h b/Firmware/src/app_config.h index d46be67..eba11ea 100644 --- a/Firmware/src/app_config.h +++ b/Firmware/src/app_config.h @@ -6,7 +6,7 @@ extern "C" { #define CLOCK_SYS_CLOCK_HZ 24000000 -#define ADVERTISING_INTERVAL 300 +#define ADVERTISING_INTERVAL 2000 #define RAM _attribute_data_retention_ // short version, this is needed to keep the values in ram after sleep diff --git a/Firmware/src/ble.c b/Firmware/src/ble.c index dee00a1..cb44c98 100644 --- a/Firmware/src/ble.c +++ b/Firmware/src/ble.c @@ -13,61 +13,85 @@ #include "cmd_parser.h" #include "flash.h" -RAM uint8_t ble_connected = 0; +RAM uint8_t ble_connected = 0; +RAM uint8_t ota_started = 0; extern uint8_t my_tempVal[2]; extern uint8_t my_batVal[1]; -RAM uint8_t blt_rxfifo_b[64 * 8] = {0}; -RAM my_fifo_t blt_rxfifo = { 64, 8, 0, 0, blt_rxfifo_b,}; - -RAM uint8_t blt_txfifo_b[40 * 16] = {0}; -RAM my_fifo_t blt_txfifo = { 40, 16, 0, 0, blt_txfifo_b,}; - -RAM uint8_t ble_name[] = {11, 0x09, 'E', 'S', 'L', '_', '0', '0', '0', '0', '0', '0'}; - -RAM uint8_t advertising_data[] = { - /*Description*/16, 0x16, 0x1a, 0x18, - /*MAC*/0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - /*Temp*/0xaa, 0xaa, - /*Humi*/0xbb, - /*BatL*/0xcc, - /*BatM*/0xdd, 0xdd, - /*Counter*/0x00 +RAM uint8_t blt_rxfifo_b[64 * 8] = {0}; +RAM my_fifo_t blt_rxfifo = { + 64, + 8, + 0, + 0, + blt_rxfifo_b, }; +RAM uint8_t blt_txfifo_b[40 * 16] = {0}; +RAM my_fifo_t blt_txfifo = { + 40, + 16, + 0, + 0, + blt_txfifo_b, +}; + +RAM uint8_t ble_name[] = {11, 0x09, 'E', 'S', 'L', '_', '0', '0', '0', '0', '0', '0'}; + +RAM uint8_t advertising_data[] = { + /*Description*/ 16, 0x16, 0x1a, 0x18, + /*MAC*/ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + /*Temp*/ 0xaa, 0xaa, + /*Humi*/ 0xbb, + /*BatL*/ 0xcc, + /*BatM*/ 0xdd, 0xdd, + /*Counter*/ 0x00}; + uint8_t mac_public[6]; void app_switch_to_indirect_adv(uint8_t e, uint8_t *p, int n) { - bls_ll_setAdvParam( ADVERTISING_INTERVAL, ADVERTISING_INTERVAL+50, ADV_TYPE_CONNECTABLE_UNDIRECTED, OWN_ADDRESS_PUBLIC, 0, NULL, BLT_ENABLE_ADV_ALL, ADV_FP_NONE); + bls_ll_setAdvParam(ADVERTISING_INTERVAL, ADVERTISING_INTERVAL + 50, ADV_TYPE_CONNECTABLE_UNDIRECTED, OWN_ADDRESS_PUBLIC, 0, NULL, BLT_ENABLE_ADV_ALL, ADV_FP_NONE); bls_ll_setAdvEnable(1); } -void ble_disconnect_callback(uint8_t e,uint8_t *p, int n) +void ble_disconnect_callback(uint8_t e, uint8_t *p, int n) { ble_connected = 0; + ota_started = 0; printf("BLE disconnected\r\n"); } -_attribute_ram_code_ void user_set_rf_power (uint8_t e, uint8_t *p, int n) +_attribute_ram_code_ void user_set_rf_power(uint8_t e, uint8_t *p, int n) { - rf_set_power_level_index (RF_POWER_P3p01dBm); + rf_set_power_level_index(RF_POWER_P3p01dBm); } void ble_connect_callback(uint8_t e, uint8_t *p, int n) { ble_connected = 1; - bls_l2cap_requestConnParamUpdate(15, 15, 0, 1000); //1S + ota_started = 0; + ble_set_connection_speed(200); printf("BLE connected\r\n"); } -int otaWritePre(void * p) -{ +void ble_set_connection_speed(uint16_t speed) +{ + bls_l2cap_requestConnParamUpdate(speed, speed + 2, 0, 2000); +} + +int otaWritePre(void *p) +{ + if (ota_started == 0) + { + ota_started = 1; + ble_set_connection_speed(6); + } return custom_otaWrite(p); } -int RxTxWrite(void * p) +int RxTxWrite(void *p) { cmd_parser(p); return 0; @@ -75,89 +99,95 @@ int RxTxWrite(void * p) _attribute_ram_code_ void blt_pm_proc(void) { - bls_pm_setSuspendMask (SUSPEND_ADV | DEEPSLEEP_RETENTION_ADV | SUSPEND_CONN | DEEPSLEEP_RETENTION_CONN); + bls_pm_setSuspendMask(SUSPEND_ADV | DEEPSLEEP_RETENTION_ADV | SUSPEND_CONN | DEEPSLEEP_RETENTION_CONN); } -void init_ble(){ -////////////////// BLE stack initialization //////////////////////////////////// - uint8_t mac_random_static[6]; +void init_ble() +{ + ////////////////// BLE stack initialization //////////////////////////////////// + uint8_t mac_random_static[6]; blc_initMacAddress(CFG_ADR_MAC, mac_public, mac_random_static); - - //Set the BLE Name to the last three MACs the first ones are always the same - const char* hex_ascii = {"0123456789ABCDEF"}; - ble_name[6] = hex_ascii[mac_public[2]>>4]; - ble_name[7] = hex_ascii[mac_public[2] &0x0f]; - ble_name[8] = hex_ascii[mac_public[1]>>4]; - ble_name[9] = hex_ascii[mac_public[1] &0x0f]; - ble_name[10] = hex_ascii[mac_public[0]>>4]; - ble_name[11] = hex_ascii[mac_public[0] &0x0f]; - + + // Set the BLE Name to the last three MACs the first ones are always the same + const char *hex_ascii = {"0123456789ABCDEF"}; + ble_name[6] = hex_ascii[mac_public[2] >> 4]; + ble_name[7] = hex_ascii[mac_public[2] & 0x0f]; + ble_name[8] = hex_ascii[mac_public[1] >> 4]; + ble_name[9] = hex_ascii[mac_public[1] & 0x0f]; + ble_name[10] = hex_ascii[mac_public[0] >> 4]; + ble_name[11] = hex_ascii[mac_public[0] & 0x0f]; + advertising_data[4] = mac_public[5]; advertising_data[5] = mac_public[4]; advertising_data[6] = mac_public[3]; advertising_data[7] = mac_public[2]; advertising_data[8] = mac_public[1]; advertising_data[9] = mac_public[0]; - -////// Controller Initialization ////////// - blc_ll_initBasicMCU(); //must - blc_ll_initStandby_module(mac_public); //must - blc_ll_initAdvertising_module(mac_public); //adv module: must for BLE slave, - blc_ll_initConnection_module(); //connection module must for BLE slave/master - blc_ll_initSlaveRole_module(); //slave module: must for BLE slave, - blc_ll_initPowerManagement_module(); //pm module: optional - -////// Host Initialization ////////// + + ////// Controller Initialization ////////// + blc_ll_initBasicMCU(); // must + blc_ll_initStandby_module(mac_public); // must + blc_ll_initAdvertising_module(mac_public); // adv module: must for BLE slave, + blc_ll_initConnection_module(); // connection module must for BLE slave/master + blc_ll_initSlaveRole_module(); // slave module: must for BLE slave, + blc_ll_initPowerManagement_module(); // pm module: optional + + ////// Host Initialization ////////// blc_gap_peripheral_init(); extern void my_att_init(); - my_att_init (); //gatt initialization - blc_l2cap_register_handler (blc_l2cap_packet_receive); + my_att_init(); // gatt initialization + blc_l2cap_register_handler(blc_l2cap_packet_receive); blc_smp_setSecurityLevel(No_Security); - -///////////////////// USER application initialization /////////////////// - bls_ll_setScanRspData( (uint8_t *)ble_name, sizeof(ble_name)); - bls_ll_setAdvParam( ADVERTISING_INTERVAL, ADVERTISING_INTERVAL+50, ADV_TYPE_CONNECTABLE_UNDIRECTED, OWN_ADDRESS_PUBLIC, 0, NULL, BLT_ENABLE_ADV_ALL, ADV_FP_NONE); + + ///////////////////// USER application initialization /////////////////// + bls_ll_setScanRspData((uint8_t *)ble_name, sizeof(ble_name)); + bls_ll_setAdvParam(ADVERTISING_INTERVAL, ADVERTISING_INTERVAL + 50, ADV_TYPE_CONNECTABLE_UNDIRECTED, OWN_ADDRESS_PUBLIC, 0, NULL, BLT_ENABLE_ADV_ALL, ADV_FP_NONE); bls_ll_setAdvEnable(1); user_set_rf_power(0, 0, 0); - bls_app_registerEventCallback (BLT_EV_FLAG_SUSPEND_EXIT, &user_set_rf_power); - bls_app_registerEventCallback (BLT_EV_FLAG_CONNECT, &ble_connect_callback); - bls_app_registerEventCallback (BLT_EV_FLAG_TERMINATE, &ble_disconnect_callback); - -///////////////////// Power Management initialization/////////////////// + bls_app_registerEventCallback(BLT_EV_FLAG_SUSPEND_EXIT, &user_set_rf_power); + bls_app_registerEventCallback(BLT_EV_FLAG_CONNECT, &ble_connect_callback); + bls_app_registerEventCallback(BLT_EV_FLAG_TERMINATE, &ble_disconnect_callback); + + ///////////////////// Power Management initialization/////////////////// blc_ll_initPowerManagement_module(); - bls_pm_setSuspendMask (SUSPEND_ADV | DEEPSLEEP_RETENTION_ADV | SUSPEND_CONN | DEEPSLEEP_RETENTION_CONN); + bls_pm_setSuspendMask(SUSPEND_ADV | DEEPSLEEP_RETENTION_ADV | SUSPEND_CONN | DEEPSLEEP_RETENTION_CONN); blc_pm_setDeepsleepRetentionThreshold(95, 95); blc_pm_setDeepsleepRetentionEarlyWakeupTiming(240); blc_pm_setDeepsleepRetentionType(DEEPSLEEP_MODE_RET_SRAM_LOW32K); + blc_att_setRxMtuSize(250); } -bool ble_get_connected(){ +bool ble_get_connected() +{ return ble_connected; } -void set_adv_data(int16_t temp, uint16_t humi, uint8_t battery_level, uint16_t battery_mv){ - advertising_data[10] = temp>>8; - advertising_data[11] = temp&0xff; - - advertising_data[12] = humi&0xff; - - advertising_data[13] = battery_level; - - advertising_data[14] = battery_mv>>8; - advertising_data[15] = battery_mv&0xff; - - advertising_data[16]++; - - bls_ll_setAdvData( (uint8_t *)advertising_data, sizeof(advertising_data)); +void set_adv_data(int16_t temp, uint16_t humi, uint8_t battery_level, uint16_t battery_mv) +{ + advertising_data[10] = temp >> 8; + advertising_data[11] = temp & 0xff; + + advertising_data[12] = humi & 0xff; + + advertising_data[13] = battery_level; + + advertising_data[14] = battery_mv >> 8; + advertising_data[15] = battery_mv & 0xff; + + advertising_data[16]++; + + bls_ll_setAdvData((uint8_t *)advertising_data, sizeof(advertising_data)); } -void ble_send_temp(uint16_t temp){ +void ble_send_temp(uint16_t temp) +{ my_tempVal[0] = temp & 0xFF; my_tempVal[1] = temp >> 8; bls_att_pushNotifyData(TEMP_LEVEL_INPUT_DP_H, my_tempVal, 2); } -void ble_send_battery(uint8_t value){ +void ble_send_battery(uint8_t value) +{ my_batVal[0] = value; bls_att_pushNotifyData(BATT_LEVEL_INPUT_DP_H, (uint8_t *)my_batVal, 1); } diff --git a/Firmware/src/ble.h b/Firmware/src/ble.h index f2f327e..ff0ad0b 100644 --- a/Firmware/src/ble.h +++ b/Firmware/src/ble.h @@ -11,4 +11,5 @@ void ble_send_battery(uint8_t value); void blt_pm_proc(void); int RxTxWrite(void * p); -int otaWritePre(void * p); \ No newline at end of file +int otaWritePre(void * p); +void ble_set_connection_speed(uint16_t speed); diff --git a/Firmware/src/epd.c b/Firmware/src/epd.c index 449de18..33470b8 100755 --- a/Firmware/src/epd.c +++ b/Firmware/src/epd.c @@ -92,82 +92,46 @@ _attribute_ram_code_ void EPD_LoadImage(unsigned char *image, int size) _attribute_ram_code_ void init_epd() { - // reset pin configuration gpio_set_func(EPD_RESET, AS_GPIO); gpio_set_output_en(EPD_RESET, 1); - gpio_set_input_en(EPD_RESET, 0); - gpio_write(EPD_RESET, 0); - // BS1 pin configuration - // EPD power supply control pin configuration - gpio_set_func(EPD_ENABLE, AS_GPIO); - gpio_set_output_en(EPD_ENABLE, 1); - gpio_set_input_en(EPD_ENABLE, 0); - gpio_write(EPD_ENABLE, 1); - // EPD Data/Command control pin configuration + gpio_setup_up_down_resistor(EPD_RESET, PM_PIN_PULLUP_1M); + gpio_set_func(EPD_DC, AS_GPIO); gpio_set_output_en(EPD_DC, 1); - gpio_set_input_en(EPD_DC, 0); - gpio_write(EPD_DC, 0); - // EPD Busy Status pin configuratioin + gpio_setup_up_down_resistor(EPD_DC, PM_PIN_PULLUP_1M); + gpio_set_func(EPD_BUSY, AS_GPIO); gpio_set_output_en(EPD_BUSY, 0); gpio_set_input_en(EPD_BUSY, 1); gpio_setup_up_down_resistor(EPD_BUSY, PM_PIN_PULLUP_1M); - // cs pin configuration gpio_set_func(EPD_CS, AS_GPIO); gpio_set_output_en(EPD_CS, 1); - gpio_set_input_en(EPD_CS, 0); - gpio_write(EPD_CS, 1); - // clk pin configuration + gpio_setup_up_down_resistor(EPD_CS, PM_PIN_PULLUP_1M); + gpio_set_func(EPD_CLK, AS_GPIO); gpio_set_output_en(EPD_CLK, 1); - gpio_set_input_en(EPD_CLK, 0); - gpio_write(EPD_CLK, 0); - // DO pin configuration + gpio_setup_up_down_resistor(EPD_CLK, PM_PIN_PULLUP_1M); + gpio_set_func(EPD_MOSI, AS_GPIO); gpio_set_output_en(EPD_MOSI, 1); - gpio_set_input_en(EPD_MOSI, 0); - gpio_write(EPD_MOSI, 1); + gpio_setup_up_down_resistor(EPD_MOSI, PM_PIN_PULLUP_1M); + + // gpio_set_func(EPD_ENABLE, AS_GPIO); + gpio_set_output_en(EPD_ENABLE, 0); + gpio_set_input_en(EPD_ENABLE, 1); + // gpio_shutdown(EPD_ENABLE); + gpio_setup_up_down_resistor(EPD_ENABLE, PM_PIN_PULLUP_1M); } _attribute_ram_code_ void deinit_epd(void) { - // GPIO_AllTurnOff(); - gpio_set_func(EPD_RESET, AS_GPIO); - gpio_setup_up_down_resistor(EPD_RESET, PM_PIN_PULLUP_10K); - gpio_set_output_en(EPD_RESET, 0); - gpio_set_input_en(EPD_RESET, 1); - gpio_setup_up_down_resistor(EPD_RESET, PM_PIN_PULLUP_10K); - // EPD power supply control pin configuration - gpio_set_func(EPD_ENABLE, AS_GPIO); - gpio_setup_up_down_resistor(EPD_ENABLE, PM_PIN_PULLDOWN_100K); - gpio_set_output_en(EPD_ENABLE, 0); - gpio_set_input_en(EPD_ENABLE, 1); - gpio_setup_up_down_resistor(EPD_ENABLE, PM_PIN_PULLDOWN_100K); - // EPD Data/Command control pin configuration - gpio_set_func(EPD_DC, AS_GPIO); - gpio_set_output_en(EPD_DC, 0); - gpio_set_input_en(EPD_DC, 1); - gpio_setup_up_down_resistor(EPD_DC, PM_PIN_PULLUP_1M); - // EPD Busy Status pin configuratioin - gpio_set_func(EPD_BUSY, AS_GPIO); - gpio_set_output_en(EPD_BUSY, 0); - gpio_set_input_en(EPD_BUSY, 1); - gpio_setup_up_down_resistor(EPD_BUSY, PM_PIN_PULLDOWN_100K); // turn off pull-up resistor - // Turn off all SPI IOs - gpio_set_func(EPD_CS, AS_GPIO); - gpio_set_output_en(EPD_CS, 0); - gpio_set_input_en(EPD_CS, 1); - gpio_setup_up_down_resistor(EPD_CS, PM_PIN_PULLUP_1M); - gpio_set_func(EPD_CLK, AS_GPIO); - gpio_set_output_en(EPD_CLK, 0); - gpio_set_input_en(EPD_CLK, 1); - gpio_setup_up_down_resistor(EPD_CLK, PM_PIN_PULLDOWN_100K); - gpio_set_func(EPD_MOSI, AS_GPIO); - gpio_set_output_en(EPD_MOSI, 0); - gpio_set_input_en(EPD_MOSI, 1); - gpio_setup_up_down_resistor(EPD_MOSI, PM_PIN_PULLDOWN_100K); + gpio_shutdown(EPD_RESET); + gpio_shutdown(EPD_DC); + gpio_shutdown(EPD_CS); + gpio_shutdown(EPD_CLK); + gpio_shutdown(EPD_MOSI); + gpio_shutdown(EPD_BUSY); } _attribute_ram_code_ void EPD_Display(unsigned char *image, int size) @@ -212,13 +176,11 @@ _attribute_ram_code_ void EPD_Display(unsigned char *image, int size) // trigger display refresh EPD_WriteCmd(0x12); - deinit_epd(); epd_update_state = 1; } _attribute_ram_code_ void epd_set_sleep() { - init_epd(); // Vcom and data interval setting EPD_WriteCmd(0x50); EPD_WriteData(0xf7); @@ -267,26 +229,29 @@ _attribute_ram_code_ void FixBuffer(uint8_t *pSrc, uint8_t *pDst) _attribute_ram_code_ void TIFFDraw(TIFFDRAW *pDraw) { -uint8_t uc=0, ucSrcMask, ucDstMask, *s, *d; -int x, y; + uint8_t uc = 0, ucSrcMask, ucDstMask, *s, *d; + int x, y; - s = pDraw->pPixels; - y = pDraw->y; // current line - d = &epd_buffer[(249*16)+(y/8)]; // rotated 90 deg clockwise - ucDstMask = 0x80 >> (y & 7); // destination mask - ucSrcMask = 0; // src mask - for (x=0; xiWidth; x++) { - // Slower to draw this way, but it allows us to use a single buffer - // instead of drawing and then converting the pixels to be the EPD format - if (ucSrcMask == 0) { // load next source byte - ucSrcMask = 0x80; - uc = *s++; - } - if (!(uc & ucSrcMask)) { // black pixel - d[-(x*16)] &= ~ucDstMask; - } - ucSrcMask >>= 1; - } + s = pDraw->pPixels; + y = pDraw->y; // current line + d = &epd_buffer[(249 * 16) + (y / 8)]; // rotated 90 deg clockwise + ucDstMask = 0x80 >> (y & 7); // destination mask + ucSrcMask = 0; // src mask + for (x = 0; x < pDraw->iWidth; x++) + { + // Slower to draw this way, but it allows us to use a single buffer + // instead of drawing and then converting the pixels to be the EPD format + if (ucSrcMask == 0) + { // load next source byte + ucSrcMask = 0x80; + uc = *s++; + } + if (!(uc & ucSrcMask)) + { // black pixel + d[-(x * 16)] &= ~ucDstMask; + } + ucSrcMask >>= 1; + } } /* TIFFDraw() */ _attribute_ram_code_ void epd_display_tiff(uint8_t *pData, int iSize) @@ -308,7 +273,7 @@ _attribute_ram_code_ void epd_display(uint32_t time_is) obdFill(&obd, 0, 0); // fill with white char buff[25]; - sprintf(buff,"%02d:%02d:%02d",((time_is/60)/60)%24,(time_is/60)%60,time_is%60); + sprintf(buff, "%02d:%02d:%02d", ((time_is / 60) / 60) % 24, (time_is / 60) % 60, time_is % 60); obdWriteStringCustom(&obd, (GFXfont *)&DSEG14_Classic_Mini_Regular_40, 10, 45, (char *)buff, 1); obdWriteStringCustom(&obd, (GFXfont *)&Roboto_Black_80, 0, 120, (char *)"Time", 1); FixBuffer(epd_temp, epd_buffer); diff --git a/Firmware/src/epd_ble_service.c b/Firmware/src/epd_ble_service.c index 4c8f818..1cd944d 100644 --- a/Firmware/src/epd_ble_service.c +++ b/Firmware/src/epd_ble_service.c @@ -8,49 +8,55 @@ extern uint8_t *epd_temp; -#define ASSERT_MIN_LEN(val, min_len) \ - if (val < min_len) { \ - return 0; \ +#define ASSERT_MIN_LEN(val, min_len) \ + if (val < min_len) \ + { \ + return 0; \ } unsigned char image[epd_buffer_size]; unsigned int byte_pos = 0; -int epd_ble_handle_write(void * p) { - rf_packet_att_write_t *req = (rf_packet_att_write_t*) p; +int epd_ble_handle_write(void *p) +{ + rf_packet_att_write_t *req = (rf_packet_att_write_t *)p; uint8_t *payload = &req->value; unsigned int payload_len = req->l2capLen - 3; ASSERT_MIN_LEN(payload_len, 1); - switch (payload[0]) { - // Clear EPD display. - case 0x00: - ASSERT_MIN_LEN(payload_len, 2); - memset(image, payload[1], sizeof(image)); - return 0; - // Push buffer to display. - case 0x01: - EPD_Display(image, epd_buffer_size); - return 0; - // Set byte_pos. - case 0x02: - ASSERT_MIN_LEN(payload_len, 3); - byte_pos = payload[1] << 8 | payload[2]; - return 0; - // Write data to image buffer. - case 0x03: - if (byte_pos + payload_len - 1 >= sizeof(image)+1) { - return 0; - } - memcpy(image + byte_pos, payload + 1, payload_len - 1); - byte_pos += payload_len - 1; - return 0; - case 0x04: // decode & display a TIFF image - epd_display_tiff(image, byte_pos); - return 0; - default: + switch (payload[0]) + { + // Clear EPD display. + case 0x00: + ASSERT_MIN_LEN(payload_len, 2); + memset(image, payload[1], sizeof(image)); + ble_set_connection_speed(40); + return 0; + // Push buffer to display. + case 0x01: + ble_set_connection_speed(200); + EPD_Display(image, epd_buffer_size); + return 0; + // Set byte_pos. + case 0x02: + ASSERT_MIN_LEN(payload_len, 3); + byte_pos = payload[1] << 8 | payload[2]; + return 0; + // Write data to image buffer. + case 0x03: + if (byte_pos + payload_len - 1 >= sizeof(image) + 1) + { return 0; + } + memcpy(image + byte_pos, payload + 1, payload_len - 1); + byte_pos += payload_len - 1; + return 0; + case 0x04: // decode & display a TIFF image + epd_display_tiff(image, byte_pos); + return 0; + default: + return 0; } return 0; diff --git a/Firmware/src/led.c b/Firmware/src/led.c index 61e9fa9..c3d7ff7 100644 --- a/Firmware/src/led.c +++ b/Firmware/src/led.c @@ -10,17 +10,20 @@ void init_led() { gpio_set_func(LED_BLUE, AS_GPIO); gpio_set_output_en(LED_BLUE, 1); - gpio_write(LED_BLUE, 1); + gpio_setup_up_down_resistor(LED_BLUE, PM_PIN_PULLUP_10K); + gpio_set_func(LED_RED, AS_GPIO); gpio_set_output_en(LED_RED, 1); - gpio_write(LED_RED, 1); + gpio_setup_up_down_resistor(LED_RED, PM_PIN_PULLUP_10K); + gpio_set_func(LED_GREEN, AS_GPIO); gpio_set_output_en(LED_GREEN, 1); - gpio_write(LED_GREEN, 1); + gpio_setup_up_down_resistor(LED_GREEN, PM_PIN_PULLUP_10K); } void set_led_color(uint8_t color) { + init_led(); switch (color) { case 1: @@ -45,25 +48,3 @@ void set_led_color(uint8_t color) break; } } - -void deinit_led() -{ - // LED_BLUE(); - gpio_set_func(LED_BLUE, AS_GPIO); - gpio_setup_up_down_resistor(LED_BLUE, PM_PIN_PULLUP_1M); - gpio_set_output_en(LED_BLUE, 0); - gpio_set_input_en(LED_BLUE, 1); - gpio_setup_up_down_resistor(LED_BLUE, PM_PIN_PULLUP_1M); - // LED_RED(); - gpio_set_func(LED_RED, AS_GPIO); - gpio_setup_up_down_resistor(LED_RED, PM_PIN_PULLUP_1M); - gpio_set_output_en(LED_RED, 0); - gpio_set_input_en(LED_RED, 1); - gpio_setup_up_down_resistor(LED_RED, PM_PIN_PULLUP_1M); - // LED_GREEN(); - gpio_set_func(LED_GREEN, AS_GPIO); - gpio_setup_up_down_resistor(LED_GREEN, PM_PIN_PULLUP_1M); - gpio_set_output_en(LED_GREEN, 0); - gpio_set_input_en(LED_GREEN, 1); - gpio_setup_up_down_resistor(LED_GREEN, PM_PIN_PULLUP_1M); -} \ No newline at end of file diff --git a/Firmware/src/led.h b/Firmware/src/led.h index 33e604f..94a638b 100644 --- a/Firmware/src/led.h +++ b/Firmware/src/led.h @@ -2,4 +2,3 @@ void init_led(); void set_led_color(uint8_t color); -void deinit_led(); \ No newline at end of file diff --git a/Firmware/src/main.c b/Firmware/src/main.c index b640669..5f937db 100644 --- a/Firmware/src/main.c +++ b/Firmware/src/main.c @@ -39,9 +39,6 @@ _attribute_ram_code_ int main (void) //must run in ramcode init_uart(); init_i2c(); - init_nfc(); - init_led(); - deinit_epd();// DeInit EPD GPIOs for low power if( deepRetWakeUp ){ user_init_deepRetn (); diff --git a/Firmware/src/nfc.c b/Firmware/src/nfc.c index 619a60a..250ac70 100644 --- a/Firmware/src/nfc.c +++ b/Firmware/src/nfc.c @@ -8,40 +8,13 @@ _attribute_ram_code_ void init_nfc() { - gpio_set_func(NFC_SDA, AS_GPIO); - gpio_set_output_en(NFC_SDA, 1); - gpio_write(NFC_SDA, 1); - gpio_set_func(NFC_SCL, AS_GPIO); - gpio_set_output_en(NFC_SCL, 1); - gpio_write(NFC_SCL, 1); gpio_set_func(NFC_CS, AS_GPIO); gpio_set_output_en(NFC_CS, 1); - gpio_write(NFC_CS, 1); - gpio_set_func(NFC_IRQ, AS_GPIO); - gpio_set_input_en(NFC_IRQ, 1); - gpio_set_output_en(NFC_IRQ, 0); -} + gpio_set_input_en(NFC_CS, 0); + gpio_setup_up_down_resistor(NFC_CS, PM_PIN_PULLUP_10K); -_attribute_ram_code_ void deinit_nfc() -{ - // NFC_SDA - gpio_set_func(NFC_SDA, AS_GPIO); - gpio_set_output_en(NFC_SDA, 0); - gpio_set_input_en(NFC_SDA, 1); - gpio_setup_up_down_resistor(NFC_SDA, PM_PIN_PULLDOWN_100K); - // NFC_SCL - gpio_set_func(NFC_SCL, AS_GPIO); - gpio_set_output_en(NFC_SCL, 0); - gpio_set_input_en(NFC_SCL, 1); - gpio_setup_up_down_resistor(NFC_SCL, PM_PIN_PULLDOWN_100K); - // NFC_CS - gpio_set_func(NFC_CS, AS_GPIO); - gpio_set_output_en(NFC_CS, 0); - gpio_set_input_en(NFC_CS, 1); - gpio_setup_up_down_resistor(NFC_CS, PM_PIN_PULLUP_1M); - // NFC_IRQ gpio_set_func(NFC_IRQ, AS_GPIO); - gpio_set_output_en(NFC_IRQ, 0); - gpio_set_input_en(NFC_IRQ, 1); - gpio_setup_up_down_resistor(NFC_IRQ, PM_PIN_PULLDOWN_100K); // turn off pull-up resistor -} \ No newline at end of file + gpio_set_output_en(NFC_IRQ, 1); + gpio_set_input_en(NFC_IRQ, 0); + gpio_setup_up_down_resistor(NFC_IRQ, PM_PIN_PULLUP_10K); +} diff --git a/Firmware/src/nfc.h b/Firmware/src/nfc.h index d39fcdf..3266986 100644 --- a/Firmware/src/nfc.h +++ b/Firmware/src/nfc.h @@ -3,4 +3,3 @@ #include "main.h" void init_nfc(); -void deinit_nfc(); \ No newline at end of file