fixed bulk write and added some comments

master
Ondřej Hruška 6 years ago
parent 6efe32654a
commit dfea46decb
Signed by: MightyPork
GPG Key ID: 2C5FD5035250423D
  1. 42
      gex/gex_bulk.c
  2. 1
      gex/gex_message_types.h
  3. 5
      gex/gex_settings.c
  4. 25
      gex/gex_settings.h

@ -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;
}

@ -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

@ -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);
}

@ -14,8 +14,33 @@
#include <stdint.h>
#include <stdbool.h>
/**
* 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

Loading…
Cancel
Save