1
0
mirror of https://github.com/halleysfifthinc/Toyota-AVC-LAN synced 2025-06-06 15:36:47 +00:00

Reorder avclan functions and rename AVCLAN_SendAnswer to AVCLAN_respond

This commit is contained in:
Allen Hill 2023-10-26 13:01:36 -04:00
parent c656281275
commit 218b4320dd
3 changed files with 157 additions and 171 deletions

View File

@ -385,7 +385,7 @@ void AVCLAN_muteDevice(uint8_t mute) {
}
// Returns true if device TX is muted on AVCLAN bus
uint8_t AVCLAN_ismuted() {
static inline uint8_t AVCLAN_ismuted() {
return (((VPORTA_DIR & PIN4_bm) | (VPORTA_DIR & PIN0_bm)) == 0);
}
@ -407,12 +407,12 @@ void AVCLAN_sendbit_start() {
set_AVC_logic_for(1, AVCLAN_STARTBIT_LOGIC_1);
}
void AVCLAN_sendbit_1() {
static inline void AVCLAN_sendbit_1() {
set_AVC_logic_for(0, AVCLAN_BIT1_LOGIC_0);
set_AVC_logic_for(1, AVCLAN_BIT1_LOGIC_1);
}
void AVCLAN_sendbit_0() {
static inline void AVCLAN_sendbit_0() {
set_AVC_logic_for(0, AVCLAN_BIT0_LOGIC_0);
set_AVC_logic_for(1, AVCLAN_BIT0_LOGIC_1);
}
@ -823,43 +823,6 @@ uint8_t AVCLAN_readframe() {
return 1;
}
AVCLAN_frame_t *AVCLAN_parseframe(const uint8_t *bytes, uint8_t len) {
if (len < sizeof(AVCLAN_frame_t))
return NULL;
AVCLAN_frame_t *frame = malloc(sizeof(AVCLAN_frame_t) + 1);
if (!frame)
return NULL;
frame->broadcast = *bytes++;
frame->controller_addr = *(uint16_t *)bytes++;
bytes++;
frame->peripheral_addr = *(uint16_t *)bytes++;
bytes++;
frame->control = *bytes++;
frame->length = *bytes++;
if (frame->length <= (len - 8)) {
free(frame);
return NULL;
} else {
AVCLAN_frame_t *framedata =
realloc(frame, sizeof(AVCLAN_frame_t) + frame->length);
if (!framedata) {
free(frame);
return NULL;
}
frame = framedata;
frame->data = (uint8_t *)frame + sizeof(AVCLAN_frame_t);
for (uint8_t i = 0; i < frame->length; i++) {
frame->data[i] = *bytes++;
}
}
return frame;
}
uint8_t AVCLAN_sendframe(const AVCLAN_frame_t *frame) {
if (AVCLAN_ismuted())
return 1;
@ -958,6 +921,118 @@ uint8_t AVCLAN_sendframe(const AVCLAN_frame_t *frame) {
uint8_t AVCLAN_responseNeeded() { return (answerReq != 0); }
uint8_t AVCLAN_respond() {
uint8_t r = 0;
AVCLAN_frame_t frame = {.broadcast = UNICAST,
.controller_addr = CD_ID,
.peripheral_addr = HU_ID,
.control = 0xF,
.length = 0};
switch (answerReq) {
case cm_Status1:
frame.broadcast = CMD_STATUS1.broadcast;
frame.length = CMD_STATUS1.length;
frame.data = (uint8_t *)&CMD_STATUS1.data[0];
r = AVCLAN_sendframe(&frame);
break;
case cm_Status2:
frame.broadcast = CMD_STATUS2.broadcast;
frame.length = CMD_STATUS2.length;
frame.data = (uint8_t *)&CMD_STATUS2.data[0];
r = AVCLAN_sendframe(&frame);
break;
case cm_Status3:
frame.broadcast = CMD_STATUS3.broadcast;
frame.length = CMD_STATUS3.length;
frame.data = (uint8_t *)&CMD_STATUS3.data[0];
r = AVCLAN_sendframe(&frame);
break;
case cm_Status4:
frame.broadcast = CMD_STATUS4.broadcast;
frame.length = CMD_STATUS4.length;
frame.data = (uint8_t *)&CMD_STATUS4.data[0];
r = AVCLAN_sendframe(&frame);
break;
case cm_Register:
frame.broadcast = CMD_REGISTER.broadcast;
frame.length = CMD_REGISTER.length;
frame.data = (uint8_t *)&CMD_REGISTER.data[0];
r = AVCLAN_sendframe(&frame);
break;
// case cm_Init: // RS232_Print("INIT\n");
// r = AVCLan_SendInitCommands();
// break;
case cm_Check:
frame.broadcast = CMD_CHECK.broadcast;
frame.length = CMD_CHECK.length;
frame.data = CMD_CHECK.data;
r = AVCLAN_sendframe(&frame);
CMD_CHECK.data[6]++;
RS232_Print("AVCCHK\n");
break;
case cm_PlayReq1:
frame.broadcast = CMD_PLAY_OK1.broadcast;
frame.length = CMD_PLAY_OK1.length;
frame.data = (uint8_t *)&CMD_PLAY_OK1.data;
r = AVCLAN_sendframe(&frame);
break;
case cm_PlayReq2:
case cm_PlayReq3:
frame.broadcast = CMD_PLAY_OK2.broadcast;
frame.length = CMD_PLAY_OK2.length;
frame.data = (uint8_t *)&CMD_PLAY_OK2.data;
r = AVCLAN_sendframe(&frame);
if (!r) {
frame.broadcast = CMD_PLAY_OK3.broadcast;
frame.length = CMD_PLAY_OK3.length;
frame.data = (uint8_t *)&CMD_PLAY_OK3.data;
r = AVCLAN_sendframe(&frame);
}
CD_Mode = stPlay;
break;
case cm_PlayIt:
RS232_Print("PLAY\n");
frame.broadcast = CMD_PLAY_OK4.broadcast;
frame.length = CMD_PLAY_OK4.length;
frame.data = (uint8_t *)&CMD_PLAY_OK4.data;
CMD_PLAY_OK4.data[8] = *cd_Track;
CMD_PLAY_OK4.data[9] = *cd_Time_Min;
CMD_PLAY_OK4.data[10] = *cd_Time_Sec;
r = AVCLAN_sendframe(&frame);
CD_Mode = stPlay;
case cm_CDStatus:
if (!r)
AVCLan_Send_Status();
break;
case cm_StopReq:
case cm_StopReq2:
CD_Mode = stStop;
frame.broadcast = CMD_STOP1.broadcast;
frame.length = CMD_STOP1.length;
frame.data = (uint8_t *)&CMD_STOP1.data;
r = AVCLAN_sendframe(&frame);
CMD_STOP2.data[8] = *cd_Track;
CMD_STOP2.data[9] = *cd_Time_Min;
CMD_STOP2.data[10] = *cd_Time_Sec;
frame.broadcast = CMD_STOP2.broadcast;
frame.length = CMD_STOP2.length;
frame.data = (uint8_t *)&CMD_STOP2.data;
r = AVCLAN_sendframe(&frame);
break;
case cm_Beep:
frame.broadcast = CMD_BEEP.broadcast;
frame.length = CMD_BEEP.length;
frame.data = (uint8_t *)&CMD_BEEP.data;
r = AVCLAN_sendframe(&frame);
break;
}
answerReq = cm_Null;
return r;
}
void AVCLAN_printframe(const AVCLAN_frame_t *frame, uint8_t binary) {
if (binary) {
RS232_SendByte(0x10); // Data Link Escape, signaling binary data forthcoming
@ -996,6 +1071,43 @@ void AVCLAN_printframe(const AVCLAN_frame_t *frame, uint8_t binary) {
}
}
AVCLAN_frame_t *AVCLAN_parseframe(const uint8_t *bytes, uint8_t len) {
if (len < sizeof(AVCLAN_frame_t))
return NULL;
AVCLAN_frame_t *frame = malloc(sizeof(AVCLAN_frame_t) + 1);
if (!frame)
return NULL;
frame->broadcast = *bytes++;
frame->controller_addr = *(uint16_t *)bytes++;
bytes++;
frame->peripheral_addr = *(uint16_t *)bytes++;
bytes++;
frame->control = *bytes++;
frame->length = *bytes++;
if (frame->length <= (len - 8)) {
free(frame);
return NULL;
} else {
AVCLAN_frame_t *framedata =
realloc(frame, sizeof(AVCLAN_frame_t) + frame->length);
if (!framedata) {
free(frame);
return NULL;
}
frame = framedata;
frame->data = (uint8_t *)frame + sizeof(AVCLAN_frame_t);
for (uint8_t i = 0; i < frame->length; i++) {
frame->data[i] = *bytes++;
}
}
return frame;
}
uint8_t CheckCmd(const AVCLAN_frame_t *frame, const uint8_t *cmd, uint8_t l) {
for (uint8_t i = 0; i < l; i++) {
if (frame->data[i] != *cmd++)
@ -1083,118 +1195,6 @@ void AVCLan_Send_Status() {
AVCLAN_sendframe(&status);
}
uint8_t AVCLan_SendAnswer() {
uint8_t r = 0;
AVCLAN_frame_t frame = {.broadcast = UNICAST,
.controller_addr = CD_ID,
.peripheral_addr = HU_ID,
.control = 0xF,
.length = 0};
switch (answerReq) {
case cm_Status1:
frame.broadcast = CMD_STATUS1.broadcast;
frame.length = CMD_STATUS1.length;
frame.data = (uint8_t *)&CMD_STATUS1.data[0];
r = AVCLAN_sendframe(&frame);
break;
case cm_Status2:
frame.broadcast = CMD_STATUS2.broadcast;
frame.length = CMD_STATUS2.length;
frame.data = (uint8_t *)&CMD_STATUS2.data[0];
r = AVCLAN_sendframe(&frame);
break;
case cm_Status3:
frame.broadcast = CMD_STATUS3.broadcast;
frame.length = CMD_STATUS3.length;
frame.data = (uint8_t *)&CMD_STATUS3.data[0];
r = AVCLAN_sendframe(&frame);
break;
case cm_Status4:
frame.broadcast = CMD_STATUS4.broadcast;
frame.length = CMD_STATUS4.length;
frame.data = (uint8_t *)&CMD_STATUS4.data[0];
r = AVCLAN_sendframe(&frame);
break;
case cm_Register:
frame.broadcast = CMD_REGISTER.broadcast;
frame.length = CMD_REGISTER.length;
frame.data = (uint8_t *)&CMD_REGISTER.data[0];
r = AVCLAN_sendframe(&frame);
break;
case cm_Init: // RS232_Print("INIT\n");
r = AVCLan_SendInitCommands();
break;
case cm_Check:
frame.broadcast = CMD_CHECK.broadcast;
frame.length = CMD_CHECK.length;
frame.data = CMD_CHECK.data;
r = AVCLAN_sendframe(&frame);
CMD_CHECK.data[6]++;
RS232_Print("AVCCHK\n");
break;
case cm_PlayReq1:
frame.broadcast = CMD_PLAY_OK1.broadcast;
frame.length = CMD_PLAY_OK1.length;
frame.data = (uint8_t *)&CMD_PLAY_OK1.data[0];
r = AVCLAN_sendframe(&frame);
break;
case cm_PlayReq2:
case cm_PlayReq3:
frame.broadcast = CMD_PLAY_OK2.broadcast;
frame.length = CMD_PLAY_OK2.length;
frame.data = (uint8_t *)&CMD_PLAY_OK2.data[0];
r = AVCLAN_sendframe(&frame);
if (!r) {
frame.broadcast = CMD_PLAY_OK3.broadcast;
frame.length = CMD_PLAY_OK3.length;
frame.data = (uint8_t *)&CMD_PLAY_OK3.data[0];
r = AVCLAN_sendframe(&frame);
}
CD_Mode = stPlay;
break;
case cm_PlayIt:
RS232_Print("PLAY\n");
frame.broadcast = CMD_PLAY_OK4.broadcast;
frame.length = CMD_PLAY_OK4.length;
frame.data = (uint8_t *)&CMD_PLAY_OK4.data[0];
CMD_PLAY_OK4.data[8] = *cd_Track;
CMD_PLAY_OK4.data[9] = *cd_Time_Min;
CMD_PLAY_OK4.data[10] = *cd_Time_Sec;
r = AVCLAN_sendframe(&frame);
CD_Mode = stPlay;
case cm_CDStatus:
if (!r)
AVCLan_Send_Status();
break;
case cm_StopReq:
case cm_StopReq2:
CD_Mode = stStop;
frame.broadcast = CMD_STOP1.broadcast;
frame.length = CMD_STOP1.length;
frame.data = (uint8_t *)&CMD_STOP1.data[0];
r = AVCLAN_sendframe(&frame);
CMD_STOP2.data[8] = *cd_Track;
CMD_STOP2.data[9] = *cd_Time_Min;
CMD_STOP2.data[10] = *cd_Time_Sec;
frame.broadcast = CMD_STOP2.broadcast;
frame.length = CMD_STOP2.length;
frame.data = (uint8_t *)&CMD_STOP2.data[0];
r = AVCLAN_sendframe(&frame);
break;
case cm_Beep:
frame.broadcast = CMD_BEEP.broadcast;
frame.length = CMD_BEEP.length;
frame.data = (uint8_t *)&CMD_BEEP.data[0];
r = AVCLAN_sendframe(&frame);
break;
}
answerReq = cm_Null;
return r;
}
void AVCLan_Register() {
AVCLAN_frame_t register_frame = {.broadcast = CMD_REGISTER.broadcast,
.controller_addr = CD_ID,
@ -1207,7 +1207,7 @@ void AVCLan_Register() {
RS232_Print("REG_END\n");
// AVCLan_Command( cm_Register );
answerReq = cm_Init;
AVCLan_SendAnswer();
AVCLAN_respond();
}
#ifdef SOFTWARE_DEBUG

View File

@ -135,14 +135,11 @@ uint8_t AVCLAN_readframe();
uint8_t AVCLAN_sendframe(const AVCLAN_frame_t *frame);
uint8_t AVCLAN_responseNeeded();
uint8_t AVCLAN_respond();
void AVCLAN_printframe(const AVCLAN_frame_t *frame, uint8_t binary);
AVCLAN_frame_t *AVCLAN_parseframe(const uint8_t *bytes, uint8_t len);
void AVCLan_Send_Status();
void AVCLan_Register();
uint8_t AVCLan_SendAnswer();
#ifdef SOFTWARE_DEBUG
void AVCLan_Measure();
#endif

View File

@ -65,7 +65,7 @@ int main() {
} else {
// check command from HU
if (AVCLAN_responseNeeded())
AVCLan_SendAnswer();
AVCLAN_respond();
}
// Key handler
@ -122,16 +122,6 @@ int main() {
AVCLAN_sendframe(&msg);
msg.peripheral_addr = HU_ID;
break;
case 'R': // Register and wait for a response
RS232_Print("REGIST:\n");
AVCLan_Register();
TCB1.CNT = 0;
while (TCB1.CNT < 540) {}
CHECK_AVC_LINE;
break;
case 'r': // Register into the abyss
AVCLan_Register();
break;
case 'l': // Print received messages
printAllFrames ^= 1;
RS232_Print("Logging: ");
@ -154,9 +144,9 @@ int main() {
case 'b':
case 'B': // Beep
// answerReq = cm_Beep;
AVCLan_SendAnswer();
AVCLAN_respond();
break;
case 'e': // Beep
case 'e':
data_tmp[0] = 0x00;
data_tmp[1] = 0x01;
data_tmp[2] = 0x11;
@ -288,7 +278,6 @@ void print_help() {
"m - Toggle mute for mockingboard bus activity\n"
"l - Toggle message logging\n"
"k - Toggle character echo\n"
"R/r - register device\n"
"X/x - Turn binary ON or OFF, respectively\n"
"B - Beep\n"
"v - Toggle verbose logging\n"