From 9d87c925a9eaa4fc256be3173c14a20d1469472d Mon Sep 17 00:00:00 2001 From: fishsoupisgood Date: Wed, 9 Sep 2020 11:53:37 +0100 Subject: everything, mostly, working --- boiler-monster/stm32/app/ot_phy_tx.c | 121 +++++++++++++++++++++++++++++++++++ 1 file changed, 121 insertions(+) create mode 100644 boiler-monster/stm32/app/ot_phy_tx.c (limited to 'boiler-monster/stm32/app/ot_phy_tx.c') diff --git a/boiler-monster/stm32/app/ot_phy_tx.c b/boiler-monster/stm32/app/ot_phy_tx.c new file mode 100644 index 0000000..36fbcc5 --- /dev/null +++ b/boiler-monster/stm32/app/ot_phy_tx.c @@ -0,0 +1,121 @@ +#include "project.h" + +#define OT_THM_OUT GPIO9 +#define OT_THM_OUT_PORT GPIOB + +#define OT_BLR_OUT GPIO8 +#define OT_BLR_OUT_PORT GPIOB + + +typedef struct tx_phy { + int busy; + unsigned half_bit; + uint8_t data[4]; +} TX_Phy; + + +static TX_Phy p_thm, p_blr; + + + +#if 0 +static uint32_t +cycle_diff (uint32_t a, uint32_t b) +{ + return b - a; +} +#endif + + +static int ot_phy_tx_worker (TX_Phy *p) +{ + int ret = p->half_bit & 1; + unsigned bit; + + + if (p->half_bit < 2) + ret ^= 1; + + else if (p->half_bit < 66) { + bit = (p->half_bit >> 1) - 1; + + if (p->data[bit >> 3] & (0x80 >> (bit & 7))) + ret ^= 1; + } else if (p->half_bit < 68) + + ret ^= 1; + + p->half_bit++; + + if (p->half_bit == 68) { + p->half_bit = 0; + p->busy = 0; + } + + return ret; +} + + +void ot_phy_tx_tick (void) +{ + int v; + + if (p_thm.busy) { + v = ot_phy_tx_worker (&p_thm); + + if (v) + CLEAR (OT_THM_OUT); + else + SET (OT_THM_OUT); + } + + + if (p_blr.busy) { + v = ot_phy_tx_worker (&p_blr); + + if (v) + CLEAR (OT_BLR_OUT); + else + SET (OT_BLR_OUT); + + } +} + + +int ot_tx_thm (uint8_t *data) +{ + if (p_thm.busy) return -1; + + if (!data) return 0; + + led_blink(); + + memcpy (p_thm.data, data, sizeof (p_thm.data)); + p_thm.busy = 1; + + return 0; +} + + +int ot_tx_blr (uint8_t *data) +{ + + if (p_blr.busy) return -1; + + if (!data) return 0; + + led_blink(); + + memcpy (p_blr.data, data, sizeof (p_blr.data)); + p_blr.busy = 1; + + return 0; +} + + + +void ot_phy_tx_init (void) +{ + MAP_OUTPUT_PP (OT_THM_OUT); + MAP_OUTPUT_PP (OT_BLR_OUT); +} -- cgit v1.2.3