From fa9856a79f67fe677340f5d21dd29da30647c1f5 Mon Sep 17 00:00:00 2001 From: root Date: Tue, 1 Sep 2015 12:26:56 +0100 Subject: works_quickly --- dfu.c | 111 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 109 insertions(+), 2 deletions(-) (limited to 'dfu.c') diff --git a/dfu.c b/dfu.c index 6dd835e..3d22133 100644 --- a/dfu.c +++ b/dfu.c @@ -1,6 +1,97 @@ #include "project.h" #include "dfu.h" +static int +send_data_quickly (BLE * b, uint8_t * d, size_t sz, int pkts) +{ + char bs[64]; + size_t mtu = 16; + size_t off = 0; + size_t tx, rx; + int sent; + + ble_notify_pkts_start (b); + + memset (bs, '\b', sizeof (bs)); + + while (off != sz) + { + fwrite (bs, 1, sizeof (bs), stdout); + printf ("%6u/%6u bytes", (unsigned) off, (unsigned) sz); + fflush (stdout); + + tx = (sz - off); + if (tx > mtu) + tx = mtu; + + if (ble_send_data_noresp (b, d + off, tx)) + { + printf ("\nFailed\n"); + ble_notify_pkts_stop (b); + return EXIT_FAILURE; + } + + off += tx; + sent++; + + if (sent == pkts) + { + rx = ble_notify_get_pkts (b); + + if (rx != off) + { + printf ("\nFailed -Lost a packet\n"); + ble_notify_pkts_stop (b); + return EXIT_FAILURE; + } + sent = 0; + } + + } + + ble_notify_pkts_stop (b); + + printf ("\nDone\n"); + return EXIT_SUCCESS; + +} + + +static int +send_data_slowly (BLE * b, uint8_t * d, size_t sz) +{ + char bs[64]; + size_t mtu = 16; + size_t off = 0; + size_t tx; + + memset (bs, '\b', sizeof (bs)); + + while (off != sz) + { + fwrite (bs, 1, sizeof (bs), stdout); + printf ("%6u/%6u bytes", (unsigned) off, (unsigned) sz); + fflush (stdout); + + tx = (sz - off); + if (tx > mtu) + tx = mtu; + + if (ble_send_data (b, d + off, tx)) + { + printf ("\nFailed\n"); + return EXIT_FAILURE; + } + + off += tx; + } + + + printf ("\nDone\n"); + return EXIT_SUCCESS; + +} + void dfu (const char *bdaddr, const char *type, const char *version, uint8_t * dat, size_t dat_sz, uint8_t * bin, size_t bin_sz) @@ -69,9 +160,11 @@ dfu (const char *bdaddr, const char *type, const char *version, uint8_t * dat, break; +#if 1 // ble_wait_setup(b,OP_CODE_PKT_RCPT_NOTIF_REQ); +// buf[0] = OP_CODE_PKT_RCPT_NOTIF_REQ; - u16 = 0x10; + u16 = 0x40; memcpy (&buf[1], &u16, 2); if (ble_send_cp (b, buf, 3)) @@ -80,19 +173,33 @@ dfu (const char *bdaddr, const char *type, const char *version, uint8_t * dat, // if (ble_wait_run(b)!=BLE_DFU_RESP_VAL_SUCCESS) // break; + ble_wait_setup (b, OP_CODE_RECEIVE_FW); + + buf[0] = OP_CODE_RECEIVE_FW; + if (ble_send_cp (b, buf, 1)) + break; + + if (send_data_quickly (b, bin, bin_sz, u16) != EXIT_SUCCESS) + break; + if (ble_wait_run (b) != BLE_DFU_RESP_VAL_SUCCESS) + break; +#else + ble_wait_setup (b, OP_CODE_RECEIVE_FW); buf[0] = OP_CODE_RECEIVE_FW; if (ble_send_cp (b, buf, 1)) break; - if (ble_send_data (b, bin, bin_sz)) + if (send_data_slowly (b, bin, bin_sz) != EXIT_SUCCESS) break; + if (ble_wait_run (b) != BLE_DFU_RESP_VAL_SUCCESS) break; +#endif ble_wait_setup (b, OP_CODE_VALIDATE); buf[0] = OP_CODE_VALIDATE; -- cgit v1.2.3