diff options
author | jaseg <git@jaseg.net> | 2019-04-17 16:32:43 +0900 |
---|---|---|
committer | jaseg <git@jaseg.net> | 2019-04-17 16:32:43 +0900 |
commit | 9eef62547efdf8e18009b6d6d6b3f7c80bf64e13 (patch) | |
tree | 8594db8c91ddc47614859e4eabbc9e7cf36d0d09 /center_fw/8seg_protocol.c | |
parent | f6b959086671fb1bf8b2003d5c5384c7311a7735 (diff) | |
download | 8seg-9eef62547efdf8e18009b6d6d6b3f7c80bf64e13.tar.gz 8seg-9eef62547efdf8e18009b6d6d6b3f7c80bf64e13.tar.bz2 8seg-9eef62547efdf8e18009b6d6d6b3f7c80bf64e13.zip |
center/fw: Add backchannel infrastructure
Untested!
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; + } +} + |