FreeCalypso > hg > freecalypso-tools
view rvinterf/tmsh/bsimresp.c @ 936:f4e6f6b6548e
rvinterf TM log: decode ETM_CORE commands
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Wed, 24 May 2023 04:00:18 +0000 |
parents | 9706832b740b |
children |
line wrap: on
line source
/* * Handling of ETM_BSIM responses (FreeCalypso addition to fw) */ #include <sys/types.h> #include <stdio.h> #include "bsim_etm_cmd.h" extern u_char rvi_msg[]; extern int rvi_msg_len; static char *cmd_names[] = { "query", "disch", "start", "ci2cv", "complete", "ichg", "start-enable" }; static void handle_bsim_error() { char *errstr; char msg[80]; if (rvi_msg_len != 6) { print_etm_pkt_raw("ETM_BSIM long error packet"); return; } switch (rvi_msg[3]) { case BSIM_ERR_BAD_CMD: errstr = "bad command opcode"; break; case BSIM_ERR_WRONG_STATE: errstr = "wrong state"; break; case BSIM_ERR_INV_PERCENT: errstr = "invalid percent"; break; case BSIM_ERR_INV_DISCHARGE: errstr = "invalid discharge"; break; default: errstr = "unknown"; } sprintf(msg, "bsim %s error 0x%02X (%s)", cmd_names[rvi_msg[4]], rvi_msg[3], errstr); async_msg_output(msg); } void handle_bsim_response() { char msg[80]; if (rvi_msg_len == 5 && rvi_msg[3] == 0x3C) { async_msg_output("bsim: ETM_NOSYS response"); return; } if (rvi_msg_len < 6) { print_etm_pkt_raw("ETM_BSIM response too short"); return; } if (rvi_msg[4] > BSIM_CMD_START_ENABLE) { print_etm_pkt_raw("ETM_BSIM unknown opcode"); return; } if (rvi_msg[3]) { handle_bsim_error(); return; } if (rvi_msg_len == 6) { sprintf(msg, "bsim %s OK", cmd_names[rvi_msg[4]]); async_msg_output(msg); return; } if (rvi_msg[4] == BSIM_CMD_QUERY && rvi_msg_len == 9) { sprintf(msg, "bsim: state=%u percent=%u start_enable=%u", rvi_msg[5], rvi_msg[6], rvi_msg[7]); async_msg_output(msg); return; } print_etm_pkt_raw("ETM_BSIM response wrong length"); }