int16_t parse_cmd_msr1_get(char *cmd, char *output, uint16_t len) { uint8_t i; MSR1_DEBUG("called msr1 get ecmd"); while(*cmd == ' ') cmd ++; if (*cmd == 0 || *cmd == '0') { for (i = 0; i < 21; i++) { output = output + sprintf(output, "%02x", e8_data.data[i]); } return ECMD_FINAL(21 * 2); } else if (*cmd == '1') { /* trick: use bytes on cmd as "connection specific static variables" */ if (cmd[1] != 23) { /* indicator flag: real invocation: 0 */ cmd[1] = 23; /* continuing call: 23 */ cmd[2] = 0; /* counter for data blocks */ } for (i = 0; i < 20; i++) { sprintf(output, "%02x", c0_data.data[cmd[2] * 20 + i]); output += 2; } cmd[2] ++; if (cmd[2] == 4) { return ECMD_FINAL(15 * 2); } else return ECMD_AGAIN(20 * 2 + 1); } return ECMD_ERR_PARSE_ERROR; }
void msr1_periodic(void) { new_data.chksum = 0; new_data.len = 0; if (state == MSR1_REQUEST_C0) { state = MSR1_REQUEST_E8; usart(UDR) = 0xe8; MSR1_DEBUG("sent e8 command\n"); } else if (state == MSR1_REQUEST_E8) { state = MSR1_REQUEST_48; usart(UDR) = 0x48; MSR1_DEBUG("sent 48 command\n"); } else if (state == MSR1_REQUEST_48) { state = MSR1_REQUEST_50; usart(UDR) = 0x50; MSR1_DEBUG("sent 50 command\n"); } else { state = MSR1_REQUEST_C0; usart(UDR) = 0xc0; MSR1_DEBUG("sent c0 command\n"); } }