From dfea46decb764126836650fa8b3b1358416a2abc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Hru=C5=A1ka?= Date: Mon, 25 Dec 2017 23:23:02 +0100 Subject: [PATCH] fixed bulk write and added some comments --- gex/gex_bulk.c | 42 ++++++++++++++++++----------------------- gex/gex_message_types.h | 1 + gex/gex_settings.c | 5 +++++ gex/gex_settings.h | 25 ++++++++++++++++++++++++ 4 files changed, 49 insertions(+), 24 deletions(-) diff --git a/gex/gex_bulk.c b/gex/gex_bulk.c index 06e5e8a..57d599b 100644 --- a/gex/gex_bulk.c +++ b/gex/gex_bulk.c @@ -22,12 +22,12 @@ */ uint32_t GEX_BulkRead(GexUnit *unit, GexBulk *bulk) { -// fprintf(stderr, "Ask to read:\n"); // We ask for the transfer. This is unit specific and can contain information that determines the transferred data - - // if unit callsign is 0, it's the system unit and we'll use raw query without the unit prefix - GexMsg resp0 = GEX_QueryEx(unit, bulk->req_cmd, bulk->req_data, bulk->req_len, 0, false, unit->callsign == 0); - // GEX_Query(unit, bulk->req_cmd, bulk->req_data, bulk->req_len); + // if unit callsign is 0, it's the system unit and we use raw query without the unit prefix + GexMsg resp0 = GEX_QueryEx(unit, bulk->req_cmd, + bulk->req_data, bulk->req_len, + 0, false, // frame_id, response + unit->callsign == 0); if (resp0.type == MSG_ERROR) { fprintf(stderr, "Bulk read rejected! %.*s\n", resp0.len, (char*)resp0.payload); @@ -39,23 +39,19 @@ uint32_t GEX_BulkRead(GexUnit *unit, GexBulk *bulk) return 0; } -// fprintf(stderr, "BR, got offer!\n"); - // Check how much data is available PayloadParser pp = pp_start(resp0.payload, resp0.len, NULL); uint32_t total = pp_u32(&pp); assert(pp.ok); - total = MIN(total, bulk->capacity); // clamp... -// fprintf(stderr, "Total is %d\n", total); + total = MIN(total, bulk->capacity); uint32_t at = 0; - while (at < total+1) { // +1 makes sure we read one past end and trigger the END OF DATA msg + while (at < total) { // +1 makes sure we read one past end and trigger the END OF DATA msg uint8_t buf[10]; PayloadBuilder pb = pb_start(buf, 10, NULL); pb_u32(&pb, TF_MAX_PAYLOAD_RX); // This selects the chunk size. -// fprintf(stderr, "Poll read:\n"); GexMsg resp = GEX_QueryEx(unit, MSG_BULK_READ_POLL, buf, (uint32_t) pb_length(&pb), resp0.session, true, true); @@ -65,7 +61,6 @@ uint32_t GEX_BulkRead(GexUnit *unit, GexBulk *bulk) } if (resp.type == MSG_BULK_DATA || resp.type == MSG_BULK_END) { -// hexDump("Rx chunk", resp.payload, resp.len); memcpy(bulk->buffer+at, resp.payload, resp.len); at += resp.len; @@ -92,10 +87,7 @@ uint32_t GEX_BulkRead(GexUnit *unit, GexBulk *bulk) */ bool GEX_BulkWrite(GexUnit *unit, GexBulk *bulk) { -// fprintf(stderr, "Asking for bulk write...\n"); - // We ask for the transfer. This is unit specific -// GexMsg resp0 = GEX_Query(unit, bulk->req_cmd, bulk->req_data, bulk->req_len); GexMsg resp0 = GEX_QueryEx(unit, bulk->req_cmd, bulk->req_data, bulk->req_len, 0, false, @@ -116,21 +108,26 @@ bool GEX_BulkWrite(GexUnit *unit, GexBulk *bulk) uint32_t max_chunk = pp_u32(&pp); assert(pp.ok); -// fprintf(stderr, "Write allowed, size %d, chunk %d\n", (int)max_size, (int)max_chunk); - if (max_size < bulk->len) { fprintf(stderr, "Write not possible, not enough space.\n"); + // Inform GEX we're not going to do it - GEX_SendEx(unit, MSG_BULK_ABORT, NULL, 0, resp0.session, true, true); + GEX_SendEx(unit, MSG_BULK_ABORT, + NULL, 0, + resp0.session, true, + true); + return false; } uint32_t at = 0; while (at < bulk->len) { uint32_t chunk = MIN(max_chunk, bulk->len - at); -// fprintf(stderr, "Query at %d, len %d\n", (int)at, (int)chunk); - GexMsg resp = GEX_QueryEx(unit, MSG_BULK_DATA, bulk->buffer + at, chunk, - resp0.session, true, true); + + GexMsg resp = GEX_QueryEx(unit, ((at+chunk) >= bulk->len) ? MSG_BULK_END : MSG_BULK_DATA, + bulk->buffer + at, chunk, + resp0.session, true, + true); at += chunk; if (resp.type == MSG_ERROR) { @@ -144,8 +141,5 @@ bool GEX_BulkWrite(GexUnit *unit, GexBulk *bulk) } } - // Conclude the transfer - GEX_SendEx(unit, MSG_BULK_END, NULL, 0, resp0.session, true, true); - return true; } diff --git a/gex/gex_message_types.h b/gex/gex_message_types.h index b99f0f6..2e00562 100644 --- a/gex/gex_message_types.h +++ b/gex/gex_message_types.h @@ -34,6 +34,7 @@ enum TF_Types_ { MSG_LIST_UNITS = 0x20, //!< Get all unit call-signs and names MSG_INI_READ = 0x21, //!< Read the ini file via bulk MSG_INI_WRITE = 0x22, //!< Write the ini file via bulk + MSG_PERSIST_SETTINGS = 0x23, //!< Write current settings to Flash }; #endif //GEX_CLIENT_GEX_MESSAGE_TYPES_H diff --git a/gex/gex_settings.c b/gex/gex_settings.c index e2b5559..bbb879e 100644 --- a/gex/gex_settings.c +++ b/gex/gex_settings.c @@ -31,3 +31,8 @@ bool GEX_SettingsIniWrite(GexClient *gex, const char *buffer) return GEX_BulkWrite(GEX_SysUnit(gex), &bw); } + +bool GEX_SettingsPersist(GexClient *gex) +{ + return TF_SendSimple(gex->tf, MSG_PERSIST_SETTINGS, NULL, 0); +} diff --git a/gex/gex_settings.h b/gex/gex_settings.h index b4ee34b..3c3dd47 100644 --- a/gex/gex_settings.h +++ b/gex/gex_settings.h @@ -14,8 +14,33 @@ #include #include +/** + * Read the settings INI file via TinyFrame + * + * @param gex - client + * @param buffer - target buffer + * @param maxlen - buffer size + * @return number of bytes read, 0 on error + */ uint32_t GEX_SettingsIniRead(GexClient *gex, char *buffer, uint32_t maxlen); +/** + * Write settings INI file via TinyFrame + * + * @param gex - client + * @param buffer - buffer with the settings file + * @return success + */ bool GEX_SettingsIniWrite(GexClient *gex, const char *buffer); +/** + * Persiste the settings loaded via GEX_SettingsIniWrite() to Flash + * This can be used with GEX instances built without the MSC support + * as a substitute for the LOCK jumper. + * + * @param gex - client + * @return send success + */ +bool GEX_SettingsPersist(GexClient *gex); + #endif //GEX_CLIENT_GEX_SETTINGS_H