Shift state machine from main loop to driver file

This commit is contained in:
Allen Hill
2026-06-13 19:27:55 +00:00
parent 819058c8a0
commit 3d0f92c824
3 changed files with 41 additions and 35 deletions
+24
View File
@@ -1045,6 +1045,30 @@ response_t AVCLAN_handleframe(const AVCLAN_frame_t *in, AVCLAN_frame_t *out) {
#undef PACK3
RFrame_t *AVCLAN_statemachine(RFrame_t *resp) {
AVCLAN_frame_t *out = resp->frame;
switch (resp->r) {
case r_TrackChange: AVCLAN_setTime(0x00, 0x00); [[fallthrough]];
case r_NormalizeState:
AVCLAN_normalizeState();
AVCLAN_generateStatus(out);
resp->r = r_Handled;
break;
case r_StartPlaying:
AVCLAN_generateStatus(out);
resp->r = r_NormalizeState;
break;
case r_StatusReport:
AVCLAN_generateStatus(out);
resp->r = r_Handled;
break;
case r_Handled: [[fallthrough]];
case r_Nothing: [[fallthrough]];
default: resp->r = r_Nothing;
}
return resp;
}
uint8_t AVCLAN_tryrespond(const AVCLAN_frame_t *resp) {
uint8_t r = 0;
for (uint8_t i = 0; i < MAX_SEND_ATTEMPTS; i++) {
+3 -2
View File
@@ -200,8 +200,9 @@ void AVCLAN_muteDevice(bool mute);
uint8_t AVCLAN_readframe(AVCLAN_frame_t *frame, log_t print);
response_t AVCLAN_handleframe(const AVCLAN_frame_t *in, AVCLAN_frame_t *out);
uint8_t AVCLAN_sendframe(const AVCLAN_frame_t *frame, log_t print);
uint8_t AVCLAN_tryrespond(const AVCLAN_frame_t *frame);
void AVCLAN_printframe(const AVCLAN_frame_t *frame, uint8_t binary);
RFrame_t *AVCLAN_statemachine(RFrame_t *resp);
// uint8_t AVCLAN_tryrespond(const AVCLAN_frame_t *frame);
void AVCLAN_printframe(const AVCLAN_frame_t *frame, bool binary);
uint8_t AVCLAN_parseframe(const uint8_t *bytes, uint8_t len,
AVCLAN_frame_t *frame);
AVCLAN_frame_t *AVCLAN_getStatusFrame();
+13 -32
View File
@@ -67,12 +67,12 @@ static uint8_t return_resp(RFrame_t *resp) {
return err;
}
static uint8_t push_or_return_resp(RFrame_t *resp) {
uint8_t err = pushQueue(&outgoing, resp);
if (err)
return return_resp(resp);
else
return err;
static void push_or_return_resp(RFrame_t *resp) {
// r_Nothing == don't respond/send; should never be added to outgoing
if (resp->r != r_Nothing && !pushQueue(&outgoing, resp))
return;
return_resp(resp);
}
static void toggle_flag(bool *flag, const char *msg) {
@@ -146,9 +146,10 @@ int main() {
if (AVCLAN_frame_t *in = peekQueue(&incoming)) {
if (AVCLAN_frame_t *out = popQueue(&cache)) {
incrementRead(&incoming); // successful out = pop cache; claim the
// peeked incoming
response_t respond = AVCLAN_handleframe(in, out);
incrementRead(&incoming);
pushQueue(&cache, in);
pushQueue(&cache, in); // return in after use
if (respond) {
if (RFrame_t *resp = popQueue(&rcache)) {
@@ -167,31 +168,11 @@ int main() {
AVCLAN_frame_t *out = resp->frame;
err = AVCLAN_sendframe(
out, (log_t){.print = printAllFrames, .binary = printBinary});
if (err) {
if (err || resp->r == r_Handled) {
return_resp(resp);
} else {
// Re-use successful resp for sequence
switch (resp->r) {
case r_TrackChange: AVCLAN_setTime(0x00, 0x00); // fallthrough
case r_NormalizeState:
AVCLAN_normalizeState();
AVCLAN_generateStatus(out);
resp->r = r_Handled;
resp = AVCLAN_statemachine(resp);
push_or_return_resp(resp);
break;
case r_StartPlaying:
AVCLAN_generateStatus(out);
resp->r = r_NormalizeState;
push_or_return_resp(resp);
break;
case r_StatusReport:
AVCLAN_generateStatus(out);
resp->r = r_Handled;
push_or_return_resp(resp);
break;
case r_Nothing: __builtin_unreachable();
case r_Handled: return_resp(resp); break;
}
}
} else if (enqueueStatus) {
AVCLAN_frame_t *status = AVCLAN_getStatusFrame();
@@ -386,8 +367,8 @@ void general_GPIO_init() {
PIN4_bm | // Unused, but connected to WOC (PC0)
PIN5_bm); // Unused, but connected to WOD (PC1)
// Enable pull-up resistor and disable input buffer (reduces any EM caused pin
// toggling and saves power) for unused and unconnected pins
// Enable pull-up resistor and disable input buffer (reduces any EM caused
// pin toggling and saves power) for unused and unconnected pins
PORTC.PIN2CTRL = PORT_PULLUPEN_bm | PORT_ISC_INPUT_DISABLE_gc;
PORTB.PIN0CTRL = PORT_PULLUPEN_bm | PORT_ISC_INPUT_DISABLE_gc;