diff options
Diffstat (limited to 'center_fw/8seg_protocol.c')
-rw-r--r-- | center_fw/8seg_protocol.c | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/center_fw/8seg_protocol.c b/center_fw/8seg_protocol.c new file mode 100644 index 0000000..0d0a2eb --- /dev/null +++ b/center_fw/8seg_protocol.c @@ -0,0 +1,61 @@ + +#include "global.h" +#include "adc.h" +#include "transmit.h" +#include "8seg_protocol.h" + +struct cmd_if_struct { + struct command_if_def cmd_if; + int payload_len[PKT_TYPE_MAX]; +}; + +const struct cmd_if_struct cmd_if = {{.packet_type_max=PKT_TYPE_MAX}, { + [PKT_TYPE_RESERVED] = 0, + [PKT_TYPE_SET_OUTPUTS_BINARY] = 1, + [PKT_TYPE_SET_GLOBAL_BRIGHTNESS] = 1, + [PKT_TYPE_SET_OUTPUTS] = 8, + [PKT_TYPE_GET_STATUS] = 0 } +}; + +volatile union { + struct status_tx status_tx; + uint8_t p[0]; +} tx_buf; + +void protocol_init() { + adc_configure_monitor_mode(&cmd_if.cmd_if, 20 /*us*/); + tx_init((uint8_t *)&tx_buf); +} + + +void handle_command(int command, uint8_t *args) { + static int global_brightness = 0xff; + switch (command) { + case PKT_TYPE_SET_OUTPUTS_BINARY: + set_outputs_binary(args[0], global_brightness); + break; + + case PKT_TYPE_SET_GLOBAL_BRIGHTNESS: + global_brightness = args[0]; + break; + + case PKT_TYPE_SET_OUTPUTS: + set_outputs(args); + break; + + case PKT_TYPE_GET_STATUS: + tx_buf.status_tx.temp_tenths_C = adc_data.temp_celsius_tenths; + tx_buf.status_tx.uptime_s = sys_time_seconds; + tx_buf.status_tx.decoding_error_cnt = decoding_error_cnt; + tx_buf.status_tx.protocol_error_cnt = protocol_error_cnt; + tx_buf.status_tx.vcc_mv = adc_data.vcc_mv; + tx_buf.status_tx.vin_mv = adc_data.mean_a_mv; + tx_buf.status_tx.vskew_mv = adc_data.mean_diff_mv; + tx_buf.status_tx.jitter_meas_avg_ns = jitter_meas_avg_ns; + + /* Initialize transmission here, *after* all data has been copied to the buffer */ + tx_transmit(sizeof(tx_buf.status_tx)); + break; + } +} + |