From 4ced1453cee7a3131459040efd57f73bfc77aece Mon Sep 17 00:00:00 2001 From: fishsoupisgood Date: Mon, 15 Jun 2020 14:02:42 +0100 Subject: guage code --- app/gauge.c | 145 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 145 insertions(+) create mode 100644 app/gauge.c (limited to 'app/gauge.c') diff --git a/app/gauge.c b/app/gauge.c new file mode 100644 index 0000000..c71d8d9 --- /dev/null +++ b/app/gauge.c @@ -0,0 +1,145 @@ +#include "project.h" + +#define P1_N GPIO12 +#define P1_N_PORT GPIOB +#define P1_P GPIO13 +#define P1_P_PORT GPIOB +#define P2_N GPIO14 +#define P2_N_PORT GPIOB +#define P2_P GPIO15 +#define P2_P_PORT GPIOB + + +unsigned gauge_target; +static unsigned gauge_current; + +#define GUAGE_N_STATE 6 +static unsigned gauge_state; + + +static inline unsigned +ccw (unsigned v) +{ + v += GUAGE_N_STATE - 1; + + if (v >= GUAGE_N_STATE) + v -= GUAGE_N_STATE; + + return v; +} + + +static inline unsigned +cw (unsigned v) +{ + v += 1; + + if (v >= GUAGE_N_STATE) + v -= GUAGE_N_STATE; + + return v; +} + +static inline void +p1 (int i) +{ + if (i < 0) { + SET (P1_N); + CLEAR (P1_P); + } else if (i > 0) { + CLEAR (P1_N); + SET (P1_P); + } else { + CLEAR (P1_N); + CLEAR (P1_P); + } +} + +static inline void +p2 (int i) +{ + if (i < 0) { + SET (P2_N); + CLEAR (P2_P); + } else if (i > 0) { + CLEAR (P2_N); + SET (P2_P); + } else { + CLEAR (P2_N); + CLEAR (P2_P); + } +} + + + +void +gauge_ticker (void) +{ + + if (gauge_current < gauge_target) { + gauge_state = cw (gauge_state); + gauge_current++; + } else if (gauge_current > gauge_target) { + gauge_state = ccw (gauge_state); + gauge_current--; + } + + switch (gauge_state) { + case 0: + p1 (1); + p2 (1); + break; + + case 1: + p1 (1); + p2 (0); + break; + + case 2: + p1 (0); + p2 (-1); + break; + + case 3: + p1 (-1); + p2 (-1); + break; + + case 4: + p1 (-1); + p2 (0); + break; + + case 5: + p1 (0); + p2 (1); + } + +} + +void +gauge_test (void) +{ + char buf[8]; + uint32_t now = dwt_read_cycle_counter(); /*This wraps every 59.9 seconds or so */ + + now &= 0x3fffffff; /* now wraps every 15s */ + now = now / (0x3fffffff / 810); + + gauge_target = now; + + sprintf (buf, "%3d", gauge_target); + font8x8_put_str (vram_1, buf, 90, 24); +} + + + + +void +gauge_init (void) +{ + MAP_OUTPUT_PP (P1_N); + MAP_OUTPUT_PP (P1_P); + MAP_OUTPUT_PP (P2_N); + MAP_OUTPUT_PP (P2_P); +} -- cgit v1.2.3