add hacky support for raw bulk, to test ini reading
This commit is contained in:
+1
-1
@@ -3,7 +3,7 @@ project(gex_client)
|
|||||||
|
|
||||||
set(CMAKE_C_STANDARD 99)
|
set(CMAKE_C_STANDARD 99)
|
||||||
|
|
||||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Werror")
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Werror -Wno-unused")
|
||||||
|
|
||||||
set(SOURCE_FILES
|
set(SOURCE_FILES
|
||||||
main.c
|
main.c
|
||||||
|
|||||||
+11
-4
@@ -16,7 +16,7 @@
|
|||||||
/**
|
/**
|
||||||
* Bulk read from a unit, synchronous
|
* Bulk read from a unit, synchronous
|
||||||
*
|
*
|
||||||
* @param unit - the unit to target
|
* @param unit - the unit to target. If system_unit is used, a raw query will be sent (no unit preamble and cmd is TYPE)
|
||||||
* @param bulk - the bulk transport info struct
|
* @param bulk - the bulk transport info struct
|
||||||
* @return actual number of bytes received.
|
* @return actual number of bytes received.
|
||||||
*/
|
*/
|
||||||
@@ -24,7 +24,10 @@ uint32_t GEX_BulkRead(GexUnit *unit, GexBulk *bulk)
|
|||||||
{
|
{
|
||||||
// fprintf(stderr, "Ask to read:\n");
|
// fprintf(stderr, "Ask to read:\n");
|
||||||
// We ask for the transfer. This is unit specific and can contain information that determines the transferred data
|
// We ask for the transfer. This is unit specific and can contain information that determines the transferred data
|
||||||
GexMsg resp0 = GEX_Query(unit, bulk->req_cmd, bulk->req_data, bulk->req_len);
|
|
||||||
|
// 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 (resp0.type == MSG_ERROR) {
|
if (resp0.type == MSG_ERROR) {
|
||||||
fprintf(stderr, "Bulk read rejected! %.*s\n", resp0.len, (char*)resp0.payload);
|
fprintf(stderr, "Bulk read rejected! %.*s\n", resp0.len, (char*)resp0.payload);
|
||||||
@@ -83,7 +86,7 @@ uint32_t GEX_BulkRead(GexUnit *unit, GexBulk *bulk)
|
|||||||
/**
|
/**
|
||||||
* Bulk write to a unit, synchronous
|
* Bulk write to a unit, synchronous
|
||||||
*
|
*
|
||||||
* @param unit - the unit to target
|
* @param unit - the unit to target. If system_unit is used, raw query with cmd as TYPE will be sent.
|
||||||
* @param bulk - the bulk transport info struct
|
* @param bulk - the bulk transport info struct
|
||||||
* @return true on success
|
* @return true on success
|
||||||
*/
|
*/
|
||||||
@@ -92,7 +95,11 @@ bool GEX_BulkWrite(GexUnit *unit, GexBulk *bulk)
|
|||||||
// fprintf(stderr, "Asking for bulk write...\n");
|
// fprintf(stderr, "Asking for bulk write...\n");
|
||||||
|
|
||||||
// We ask for the transfer. This is unit specific
|
// 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_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,
|
||||||
|
unit->callsign == 0);
|
||||||
|
|
||||||
if (resp0.type == MSG_ERROR) {
|
if (resp0.type == MSG_ERROR) {
|
||||||
fprintf(stderr, "Bulk write rejected! %.*s\n", resp0.len, (char*)resp0.payload);
|
fprintf(stderr, "Bulk write rejected! %.*s\n", resp0.len, (char*)resp0.payload);
|
||||||
|
|||||||
+16
-11
@@ -19,6 +19,11 @@
|
|||||||
#include "gex_helpers.h"
|
#include "gex_helpers.h"
|
||||||
#include "utils/payload_parser.h"
|
#include "utils/payload_parser.h"
|
||||||
|
|
||||||
|
GexUnit *GEX_SystemUnit(GexClient *gex)
|
||||||
|
{
|
||||||
|
return &gex->system_unit;
|
||||||
|
}
|
||||||
|
|
||||||
/** Callback for ping */
|
/** Callback for ping */
|
||||||
static TF_Result connectivity_check_lst(TinyFrame *tf, TF_Msg *msg)
|
static TF_Result connectivity_check_lst(TinyFrame *tf, TF_Msg *msg)
|
||||||
{
|
{
|
||||||
@@ -40,21 +45,11 @@ static TF_Result unit_report_lst(TinyFrame *tf, TF_Msg *msg)
|
|||||||
|
|
||||||
struct gex_unit *lu = gex_find_unit_by_callsign(gex, callsign);
|
struct gex_unit *lu = gex_find_unit_by_callsign(gex, callsign);
|
||||||
|
|
||||||
// NULL object pattern - we use a fake unit if no unit matched.
|
|
||||||
GexUnit fbu = {
|
|
||||||
.callsign = 0,
|
|
||||||
.report_handler = NULL,
|
|
||||||
.type = "NONE",
|
|
||||||
.name = "FALLBACK",
|
|
||||||
.gex = gex, // gex must be available here - this is why we can't have this static or const.
|
|
||||||
.next = NULL,
|
|
||||||
};
|
|
||||||
|
|
||||||
GexMsg gexMsg = {
|
GexMsg gexMsg = {
|
||||||
.payload = (uint8_t *) (msg->data + 2),
|
.payload = (uint8_t *) (msg->data + 2),
|
||||||
.len = (uint32_t) (msg->len - 2),
|
.len = (uint32_t) (msg->len - 2),
|
||||||
.type = rpt_type,
|
.type = rpt_type,
|
||||||
.unit = (lu == NULL) ? &fbu : lu,
|
.unit = (lu == NULL) ? &gex->system_unit : lu,
|
||||||
};
|
};
|
||||||
|
|
||||||
if (lu && lu->report_handler) {
|
if (lu && lu->report_handler) {
|
||||||
@@ -139,6 +134,16 @@ GexClient *GEX_Init(const char *device, uint32_t timeout_ms)
|
|||||||
GexClient *gex = calloc(1, sizeof(GexClient));
|
GexClient *gex = calloc(1, sizeof(GexClient));
|
||||||
assert(gex != NULL);
|
assert(gex != NULL);
|
||||||
|
|
||||||
|
// Init the dummy system unit
|
||||||
|
gex->system_unit = (GexUnit){
|
||||||
|
.name = "SYSTEM",
|
||||||
|
.type = "SYSTEM",
|
||||||
|
.callsign = 0,
|
||||||
|
.gex = gex,
|
||||||
|
.next = NULL,
|
||||||
|
.report_handler = NULL
|
||||||
|
};
|
||||||
|
|
||||||
// --- Open the device ---
|
// --- Open the device ---
|
||||||
gex->acm_device = device;
|
gex->acm_device = device;
|
||||||
gex->ser_timeout = timeout_ms;
|
gex->ser_timeout = timeout_ms;
|
||||||
|
|||||||
@@ -28,6 +28,8 @@ void GEX_OnReport(GexClient *gex, GexUnit *unit, GexEventListener lst);
|
|||||||
|
|
||||||
TinyFrame *GEX_GetTF(GexClient *gex);
|
TinyFrame *GEX_GetTF(GexClient *gex);
|
||||||
|
|
||||||
|
GexUnit *GEX_SystemUnit(GexClient *gex);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a unit, or NULL
|
* Get a unit, or NULL
|
||||||
*
|
*
|
||||||
|
|||||||
+3
-1
@@ -30,7 +30,9 @@ struct gex_client {
|
|||||||
|
|
||||||
GexEventListener fallback_report_handler;
|
GexEventListener fallback_report_handler;
|
||||||
|
|
||||||
struct gex_unit *ulu_head; //!< Units look-up linked list
|
GexUnit *ulu_head; //!< Units look-up linked list
|
||||||
|
|
||||||
|
GexUnit system_unit; //!< System unit, used as dummy for raw queries
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif //GEX_CLIENT_GEX_CLIENT_INTERNAL_H
|
#endif //GEX_CLIENT_GEX_CLIENT_INTERNAL_H
|
||||||
|
|||||||
@@ -31,7 +31,9 @@ enum TF_Types_ {
|
|||||||
MSG_UNIT_REPORT = 0x11, //!< Spontaneous report from a unit
|
MSG_UNIT_REPORT = 0x11, //!< Spontaneous report from a unit
|
||||||
|
|
||||||
// System messages
|
// System messages
|
||||||
MSG_LIST_UNITS = 0x20, //!< Get all unit call-signs and names
|
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
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif //GEX_CLIENT_GEX_MESSAGE_TYPES_H
|
#endif //GEX_CLIENT_GEX_MESSAGE_TYPES_H
|
||||||
|
|||||||
+1
-1
@@ -18,7 +18,7 @@
|
|||||||
* Low level query
|
* Low level query
|
||||||
*
|
*
|
||||||
* @param unit - GEX unit to address. The unit is available in userdata1 of the response message, if any
|
* @param unit - GEX unit to address. The unit is available in userdata1 of the response message, if any
|
||||||
* @param cmd - command byte
|
* @param cmd - command byte, or TYPE if raw query is used
|
||||||
* @param payload - payload buffer
|
* @param payload - payload buffer
|
||||||
* @param len - payload length
|
* @param len - payload length
|
||||||
* @param lst - TF listener to handle the response, can be NULL
|
* @param lst - TF listener to handle the response, can be NULL
|
||||||
|
|||||||
@@ -42,7 +42,33 @@ const char *longtext = "A sharper perspective on this matter is particularly imp
|
|||||||
"the system of domination, as if people did not participate in their own\r\n"
|
"the system of domination, as if people did not participate in their own\r\n"
|
||||||
"submission. To reduce domination to a simple relation of doer and done-to\r\n"
|
"submission. To reduce domination to a simple relation of doer and done-to\r\n"
|
||||||
"is to substitute moral outrage for analysis.\r\n"
|
"is to substitute moral outrage for analysis.\r\n"
|
||||||
"\t\t-- Jessica Benjamin, \"The Bonds of Love\"";
|
"\t\t-- Jessica Benjamin, \"The Bonds of Love\""
|
||||||
|
"A sharper perspective on this matter is particularly important to feminist\r\n"
|
||||||
|
"thought today, because a major tendency in feminism has constructed the\r\n"
|
||||||
|
"problem of domination as a drama of female vulnerability victimized by male\r\n"
|
||||||
|
"aggression. Even the more sophisticated feminist thinkers frequently shy\r\n"
|
||||||
|
"away from the analysis of submission, for fear that in admitting woman's\r\n"
|
||||||
|
"participation in the relationship of domination, the onus of responsibility\r\n"
|
||||||
|
"will appear to shift from men to women, and the moral victory from women to\r\n"
|
||||||
|
"men. More generally, this has been a weakness of radical politics: to\r\n"
|
||||||
|
"idealize the oppressed, as if their politics and culture were untouched by\r\n"
|
||||||
|
"the system of domination, as if people did not participate in their own\r\n"
|
||||||
|
"submission. To reduce domination to a simple relation of doer and done-to\r\n"
|
||||||
|
"is to substitute moral outrage for analysis.\r\n"
|
||||||
|
"\t\t-- Jessica Benjamin, \"The Bonds of Love\""
|
||||||
|
"A sharper perspective on this matter is particularly important to feminist\r\n"
|
||||||
|
"thought today, because a major tendency in feminism has constructed the\r\n"
|
||||||
|
"problem of domination as a drama of female vulnerability victimized by male\r\n"
|
||||||
|
"aggression. Even the more sophisticated feminist thinkers frequently shy\r\n"
|
||||||
|
"away from the analysis of submission, for fear that in admitting woman's\r\n"
|
||||||
|
"participation in the relationship of domination, the onus of responsibility\r\n"
|
||||||
|
"will appear to shift from men to women, and the moral victory from women to\r\n"
|
||||||
|
"men. More generally, this has been a weakness of radical politics: to\r\n"
|
||||||
|
"idealize the oppressed, as if their politics and culture were untouched by\r\n"
|
||||||
|
"the system of domination, as if people did not participate in their own\r\n"
|
||||||
|
"submission. To reduce domination to a simple relation of doer and done-to\r\n"
|
||||||
|
"is to substitute moral outrage for analysis.\r\n"
|
||||||
|
"\t\t-- Jessica Benjamin, \"The Bonds of Love\" \r\nEND OF TEXT";
|
||||||
|
|
||||||
int main(void)
|
int main(void)
|
||||||
{
|
{
|
||||||
@@ -72,6 +98,21 @@ int main(void)
|
|||||||
fprintf(stderr, "Cmd \"PING\" OK\n");
|
fprintf(stderr, "Cmd \"PING\" OK\n");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if 1
|
||||||
|
// Read the communist manifesto via bulk transfer
|
||||||
|
uint8_t inifile[10000];
|
||||||
|
br = (GexBulk){
|
||||||
|
.buffer = inifile,
|
||||||
|
.capacity = 10000,
|
||||||
|
.req_cmd = MSG_INI_READ,
|
||||||
|
.req_data = NULL,
|
||||||
|
.req_len = 0,
|
||||||
|
};
|
||||||
|
uint32_t actuallyRead = GEX_BulkRead(GEX_SystemUnit(gex), &br);
|
||||||
|
fprintf(stderr, "Read %d bytes of INI:\n", actuallyRead);
|
||||||
|
fprintf(stderr, "%.*s", actuallyRead, inifile);
|
||||||
|
#endif
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
// Test a echo command that returns back what was sent to it as useful payload
|
// Test a echo command that returns back what was sent to it as useful payload
|
||||||
const char *s = "I am \r\nreturning this otherwise good typing paper to you because someone "
|
const char *s = "I am \r\nreturning this otherwise good typing paper to you because someone "
|
||||||
@@ -85,7 +126,7 @@ int main(void)
|
|||||||
#if 0
|
#if 0
|
||||||
// Read the communist manifesto via bulk transfer
|
// Read the communist manifesto via bulk transfer
|
||||||
uint8_t buffr[10000];
|
uint8_t buffr[10000];
|
||||||
br = {
|
br = (GexBulk){
|
||||||
.buffer = buffr,
|
.buffer = buffr,
|
||||||
.capacity = 10000,
|
.capacity = 10000,
|
||||||
.req_cmd = 2,
|
.req_cmd = 2,
|
||||||
@@ -97,7 +138,7 @@ int main(void)
|
|||||||
fprintf(stderr, "%.*s", actuallyRead, buffr);
|
fprintf(stderr, "%.*s", actuallyRead, buffr);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if 1
|
#if 0
|
||||||
// Read the communist manifesto via bulk transfer
|
// Read the communist manifesto via bulk transfer
|
||||||
br = (GexBulk){
|
br = (GexBulk){
|
||||||
.buffer = (uint8_t *) longtext,
|
.buffer = (uint8_t *) longtext,
|
||||||
|
|||||||
Reference in New Issue
Block a user