//****************************************************************************** /// \brief Read MXT messages and send them to other end /// \return #mxt_rc static int handle_messages(struct mxt_device *mxt, struct bridge_context *bridge_ctx) { int msg_count, length; int ret; int i, j; unsigned char databuf[20]; if (!bridge_ctx->msgs_enabled) return MXT_SUCCESS; ret = mxt_get_msg_count(mxt, &msg_count); if (ret) return ret; for (i = 0; i < msg_count; i++) { int num_bytes; ret = mxt_get_msg_bytes(mxt, databuf, sizeof(databuf), &num_bytes); if (ret == MXT_ERROR_NO_MESSAGE) continue; else if (ret) return ret; length = snprintf(mxt->msg_string, sizeof(mxt->msg_string), MXT_ADB_CLIENT_MSG_PREFIX); for (j = 0; j < num_bytes; j++) { length += snprintf(mxt->msg_string + length, sizeof(mxt->msg_string) - length, "%02X", databuf[j]); } ret = write(bridge_ctx->sockfd, mxt->msg_string, strlen(mxt->msg_string)); if (ret < 0) { mxt_err(mxt->ctx, "Write failure: %s (%d)", strerror(errno), errno); return mxt_errno_to_rc(ret); } ret = write(bridge_ctx->sockfd, "\n", 1); if (ret < 0) { mxt_err(mxt->ctx, "Write failure: %s (%d)", strerror(errno), errno); return mxt_errno_to_rc(ret); } } return MXT_SUCCESS; }
//****************************************************************************** /// \brief Handle messages from the self test object /// \return #mxt_rc static int self_test_handle_messages(struct mxt_device *mxt) { bool done = false; int count, i; time_t now; time_t start_time = time(NULL); static const uint8_t TIMEOUT = 10; // seconds uint8_t buf[10]; int len; unsigned int object_type; int ret; while (!done) { mxt_msg_wait(mxt, 100); now = time(NULL); if ((now - start_time) > TIMEOUT) { mxt_err(mxt->ctx, "Timeout"); return MXT_ERROR_TIMEOUT; } ret = mxt_get_msg_count(mxt, &count); if (ret) return ret; if (count > 0) { for (i = 0; i < count; i++) { ret = mxt_get_msg_bytes(mxt, buf, sizeof(buf), &len); if (ret) return ret; if (len > 0) { object_type = mxt_report_id_to_type(mxt, buf[0]); mxt_verb(mxt->ctx, "Received message from T%u", object_type); if (object_type == SPT_SELFTEST_T25) { switch (buf[1]) { case SELF_TEST_ALL: mxt_info(mxt->ctx, "PASS: All tests passed"); ret = MXT_SUCCESS; break; case SELF_TEST_INVALID: mxt_err(mxt->ctx, "FAIL: Invalid test command"); ret = MXT_ERROR_NOT_SUPPORTED; break; case SELF_TEST_TIMEOUT: mxt_err(mxt->ctx, "FAIL: Test timeout"); ret = MXT_ERROR_TIMEOUT; break; case SELF_TEST_ANALOG: mxt_err(mxt->ctx, "FAIL: AVdd Analog power is not present"); ret = MXT_ERROR_SELF_TEST_ANALOG; break; case SELF_TEST_PIN_FAULT: mxt_err(mxt->ctx, "FAIL: Pin fault"); ret = MXT_ERROR_SELF_TEST_PIN_FAULT; break; case SELF_TEST_PIN_FAULT_2: mxt_err(mxt->ctx, "FAIL: Pin fault 2"); ret = MXT_ERROR_SELF_TEST_PIN_FAULT; break; case SELF_TEST_AND_GATE: mxt_err(mxt->ctx, "FAIL: AND Gate Fault"); ret = MXT_ERROR_SELF_TEST_AND_GATE; break; case SELF_TEST_SIGNAL_LIMIT: mxt_err(mxt->ctx, "FAIL: Signal limit fault"); ret = MXT_ERROR_SELF_TEST_SIGNAL_LIMIT; break; case SELF_TEST_GAIN: mxt_err(mxt->ctx, "FAIL: Gain error"); ret = MXT_ERROR_SELF_TEST_GAIN; break; default: mxt_err(mxt->ctx, "Unrecognised status %02X", buf[1]); ret = MXT_ERROR_UNEXPECTED_DEVICE_STATE; break; } done = true; } } } } } return ret; }