//****************************************************************************** /// \brief Read and deal with incoming command /// \return #mxt_rc static int handle_cmd(struct mxt_device *mxt, int sockfd) { int ret; uint16_t address; uint16_t count; struct mxt_buffer linebuf; char *line; int offset; ret = mxt_buf_init(&linebuf); if (ret) return ret; ret = readline(mxt, sockfd, &linebuf); if (ret) { mxt_dbg(mxt->ctx, "Error reading or peer closed socket"); goto free; } line = (char *)linebuf.data; if (strlen(line) == 0) { ret = MXT_SUCCESS; goto free; } mxt_verb(mxt->ctx, "%s", line); if (!strcmp(line, "SAT")) { mxt_info(mxt->ctx, "Server attached"); ret = MXT_SUCCESS; } else if (!strcmp(line, "SDT")) { mxt_info(mxt->ctx, "Server detached"); ret = MXT_SUCCESS; } else if (sscanf(line, "REA %" SCNu16 " %" SCNu16, &address, &count) == 2) { ret = bridge_rea_cmd(mxt, sockfd, address, count); } else if (sscanf(line, "WRI %" SCNu16 "%n", &address, &offset) == 1) { /* skip space */ offset += 1; ret = bridge_wri_cmd(mxt, sockfd, address, line + offset, strlen(line) - offset); } else { mxt_info(mxt->ctx, "Unrecognised cmd \"%s\"", line); ret = MXT_SUCCESS; } free: mxt_buf_free(&linebuf); return ret; }
//****************************************************************************** /// \brief Read and deal with incoming command /// \return #mxt_rc static int handle_cmd(struct mxt_device *mxt, struct bridge_context *bridge_ctx) { int ret; uint16_t address; uint16_t count; struct mxt_buffer linebuf; char *line; int offset; ret = mxt_buf_init(&linebuf); if (ret) return ret; ret = readline(mxt, bridge_ctx->sockfd, &linebuf); if (ret) { mxt_dbg(mxt->ctx, "Error reading or peer closed socket"); goto free; } line = (char *)linebuf.data; if (strlen(line) == 0) { ret = MXT_SUCCESS; goto free; } mxt_verb(mxt->ctx, "%s", line); if (!strcmp(line, "SAT")) { mxt_info(mxt->ctx, "Server attached"); ret = MXT_SUCCESS; } else if (!strcmp(line, "SDT")) { mxt_info(mxt->ctx, "Server detached"); ret = MXT_SUCCESS; } else if (sscanf(line, "REA %" SCNu16 " %" SCNu16, &address, &count) == 2) { ret = bridge_rea_cmd(mxt, bridge_ctx, address, count); } else if (sscanf(line, "WRI %" SCNu16 "%n", &address, &offset) == 1) { /* skip space */ offset += 1; ret = bridge_wri_cmd(mxt, bridge_ctx, address, line + offset, strlen(line) - offset); } else if (sscanf(line, "RST %" SCNu16 "%n", &address, &offset) == 1) { ret = bridge_handle_reset(mxt, bridge_ctx, address); ret = MXT_SUCCESS; } else if (sscanf(line, "MSGCFG %" SCNu16 "%n", &address, &offset) == 1) { mxt_info(mxt->ctx, "Configuring Messages"); bridge_ctx->msgs_enabled = true; const char * const msg = "MSGCFG OK\n"; ret = write(bridge_ctx->sockfd, msg, strlen(msg)); if (ret < 0) { mxt_err(mxt->ctx, "Socket write error: %s (%d)", strerror(errno), errno); ret = mxt_errno_to_rc(errno); } ret = MXT_SUCCESS; } else { mxt_info(mxt->ctx, "Unrecognised cmd \"%s\"", line); ret = MXT_SUCCESS; } free: mxt_buf_free(&linebuf); return ret; }
//****************************************************************************** /// \brief Read hex encoded data from file /// \return #mxt_rc static int mxt_t68_load_file(struct t68_ctx *ctx) { int ret; uint8_t value = 0; FILE *fp; bool file_read = false; char buf[256]; uint16_t hexcount; int c; /* open file */ fp = fopen(ctx->filename, "r"); if (fp == NULL) { mxt_err(ctx->lc, "Error opening %s", ctx->filename); return mxt_errno_to_rc(errno); } ret = mxt_buf_init(&ctx->buf); if (ret) { mxt_err(ctx->lc, "Error initialising buffer"); goto close; } while (!file_read) { /* Read next value from file */ c = getc(fp); if (c == EOF) { break; } /* skip spaces, newlines, commas*/ else if (c == 0x20 || c == '\r' || c == '\n' || c == ',') { continue; } /* Ignore comment lines */ else if (c == '[') { // Grab comment key if (fscanf(fp, "%255[^]]", buf) != 1) { ret = MXT_ERROR_FILE_FORMAT; goto fail; } mxt_verb(ctx->lc, "[%s]", buf); if (!strncasecmp(buf, "datatype=", 9)) { if (sscanf(buf + 9, "%d", &c) != 1) { mxt_warn(ctx->lc, "Unable to parse datatype"); } else { ctx->t68_datatype = c; mxt_info(ctx->lc, "DATATYPE set to %u by file", ctx->t68_datatype); } } // Read until end of line while (c != '\n') { c = getc(fp); } continue; } /* A value looks like "0xABu," */ else if (c == '0') { if (fscanf(fp, "x%2su", (char *)&buf) != 1) { mxt_err(ctx->lc, "Parse error"); ret = MXT_ERROR_FILE_FORMAT; goto fail; } ret = mxt_convert_hex(buf, &value, &hexcount, 3); if (ret) goto fail; ret = mxt_buf_add(&ctx->buf, value); if (ret) goto fail; } else { mxt_err(ctx->lc, "Unexpected character \"%c\"", c); ret = MXT_ERROR_FILE_FORMAT; goto fail; } } mxt_info(ctx->lc, "Loaded file %s, %zu bytes", ctx->filename, ctx->buf.size); return MXT_SUCCESS; fail: mxt_buf_free(&ctx->buf); close: fclose(fp); return ret; }