mirror of
https://github.com/halleysfifthinc/AVCLAN-Mockingboard.git
synced 2026-08-07 01:13:18 +00:00
Shift state machine from main loop to driver file
This commit is contained in:
@@ -1045,6 +1045,30 @@ response_t AVCLAN_handleframe(const AVCLAN_frame_t *in, AVCLAN_frame_t *out) {
|
|||||||
|
|
||||||
#undef PACK3
|
#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 AVCLAN_tryrespond(const AVCLAN_frame_t *resp) {
|
||||||
uint8_t r = 0;
|
uint8_t r = 0;
|
||||||
for (uint8_t i = 0; i < MAX_SEND_ATTEMPTS; i++) {
|
for (uint8_t i = 0; i < MAX_SEND_ATTEMPTS; i++) {
|
||||||
|
|||||||
+3
-2
@@ -200,8 +200,9 @@ void AVCLAN_muteDevice(bool mute);
|
|||||||
uint8_t AVCLAN_readframe(AVCLAN_frame_t *frame, log_t print);
|
uint8_t AVCLAN_readframe(AVCLAN_frame_t *frame, log_t print);
|
||||||
response_t AVCLAN_handleframe(const AVCLAN_frame_t *in, AVCLAN_frame_t *out);
|
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_sendframe(const AVCLAN_frame_t *frame, log_t print);
|
||||||
uint8_t AVCLAN_tryrespond(const AVCLAN_frame_t *frame);
|
RFrame_t *AVCLAN_statemachine(RFrame_t *resp);
|
||||||
void AVCLAN_printframe(const AVCLAN_frame_t *frame, uint8_t binary);
|
// 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,
|
uint8_t AVCLAN_parseframe(const uint8_t *bytes, uint8_t len,
|
||||||
AVCLAN_frame_t *frame);
|
AVCLAN_frame_t *frame);
|
||||||
AVCLAN_frame_t *AVCLAN_getStatusFrame();
|
AVCLAN_frame_t *AVCLAN_getStatusFrame();
|
||||||
|
|||||||
+13
-32
@@ -67,12 +67,12 @@ static uint8_t return_resp(RFrame_t *resp) {
|
|||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint8_t push_or_return_resp(RFrame_t *resp) {
|
static void push_or_return_resp(RFrame_t *resp) {
|
||||||
uint8_t err = pushQueue(&outgoing, resp);
|
// r_Nothing == don't respond/send; should never be added to outgoing
|
||||||
if (err)
|
if (resp->r != r_Nothing && !pushQueue(&outgoing, resp))
|
||||||
return return_resp(resp);
|
return;
|
||||||
else
|
|
||||||
return err;
|
return_resp(resp);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void toggle_flag(bool *flag, const char *msg) {
|
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 *in = peekQueue(&incoming)) {
|
||||||
if (AVCLAN_frame_t *out = popQueue(&cache)) {
|
if (AVCLAN_frame_t *out = popQueue(&cache)) {
|
||||||
|
incrementRead(&incoming); // successful out = pop cache; claim the
|
||||||
|
// peeked incoming
|
||||||
response_t respond = AVCLAN_handleframe(in, out);
|
response_t respond = AVCLAN_handleframe(in, out);
|
||||||
incrementRead(&incoming);
|
pushQueue(&cache, in); // return in after use
|
||||||
pushQueue(&cache, in);
|
|
||||||
|
|
||||||
if (respond) {
|
if (respond) {
|
||||||
if (RFrame_t *resp = popQueue(&rcache)) {
|
if (RFrame_t *resp = popQueue(&rcache)) {
|
||||||
@@ -167,31 +168,11 @@ int main() {
|
|||||||
AVCLAN_frame_t *out = resp->frame;
|
AVCLAN_frame_t *out = resp->frame;
|
||||||
err = AVCLAN_sendframe(
|
err = AVCLAN_sendframe(
|
||||||
out, (log_t){.print = printAllFrames, .binary = printBinary});
|
out, (log_t){.print = printAllFrames, .binary = printBinary});
|
||||||
if (err) {
|
if (err || resp->r == r_Handled) {
|
||||||
return_resp(resp);
|
return_resp(resp);
|
||||||
} else {
|
} else {
|
||||||
// Re-use successful resp for sequence
|
resp = AVCLAN_statemachine(resp);
|
||||||
switch (resp->r) {
|
|
||||||
case r_TrackChange: AVCLAN_setTime(0x00, 0x00); // fallthrough
|
|
||||||
case r_NormalizeState:
|
|
||||||
AVCLAN_normalizeState();
|
|
||||||
AVCLAN_generateStatus(out);
|
|
||||||
resp->r = r_Handled;
|
|
||||||
push_or_return_resp(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) {
|
} else if (enqueueStatus) {
|
||||||
AVCLAN_frame_t *status = AVCLAN_getStatusFrame();
|
AVCLAN_frame_t *status = AVCLAN_getStatusFrame();
|
||||||
@@ -386,8 +367,8 @@ void general_GPIO_init() {
|
|||||||
PIN4_bm | // Unused, but connected to WOC (PC0)
|
PIN4_bm | // Unused, but connected to WOC (PC0)
|
||||||
PIN5_bm); // Unused, but connected to WOD (PC1)
|
PIN5_bm); // Unused, but connected to WOD (PC1)
|
||||||
|
|
||||||
// Enable pull-up resistor and disable input buffer (reduces any EM caused pin
|
// Enable pull-up resistor and disable input buffer (reduces any EM caused
|
||||||
// toggling and saves power) for unused and unconnected pins
|
// pin toggling and saves power) for unused and unconnected pins
|
||||||
PORTC.PIN2CTRL = PORT_PULLUPEN_bm | PORT_ISC_INPUT_DISABLE_gc;
|
PORTC.PIN2CTRL = PORT_PULLUPEN_bm | PORT_ISC_INPUT_DISABLE_gc;
|
||||||
PORTB.PIN0CTRL = PORT_PULLUPEN_bm | PORT_ISC_INPUT_DISABLE_gc;
|
PORTB.PIN0CTRL = PORT_PULLUPEN_bm | PORT_ISC_INPUT_DISABLE_gc;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user