diff options
Diffstat (limited to 'dali_ctl.c')
-rw-r--r-- | dali_ctl.c | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/dali_ctl.c b/dali_ctl.c new file mode 100644 index 0000000..50dc77c --- /dev/null +++ b/dali_ctl.c @@ -0,0 +1,97 @@ +#define DALI_C_TERMINATE 0xa100 +#define DALI_C_DTR 0xa300 +#define DALI_C_INITIALISE 0xa500 +#define DALI_C_RANDOMISE 0xa700 +#define DALI_C_COMPARE 0xa900 +#define DALI_C_WITHDRAW 0xab00 + +#define DALI_C_SADDR_H 0xb100 +#define DALI_C_SADDR_M 0xb300 +#define DALI_C_SADDR_L 0xb500 + +#define DALI_C_PROGSHORT 0xb701 +#define DALI_C_VRFYSHORT 0xb901 +#define DALI_C_QURYSHORT 0xbb00 + +static uint8_t dali_s_byte, dali_sh, dali_sm, dali_sl; +static bool dali_s_notfound; + +static bool dali_compare(void) +{ + dali_send(DALI_C_COMPARE); + asm volatile ("" ::: "memory"); + return dali_rx_avail && dali_rx == 0xff; +} + +static void dali_search_byte(uint16_t cmd) +{ + dali_s_byte = 0xff; + uint8_t bit = 0x80; + + uart_puthex(cmd >> 8); + uart_puts("dali byte\n"); + while (bit) { + uart_puts("dali sb "); + uart_puthex(dali_s_byte & ~bit); + uart_puts("\n"); + + dali_twice(cmd | (dali_s_byte & ~bit)); + if (dali_compare()) { + uart_puts("cx1\n"); + dali_s_byte &= ~bit; + } else if (dali_compare()) { + uart_puts("cx2\n"); + dali_s_byte &= ~bit; + } + bit >>= 1; + } + dali_twice(cmd | dali_s_byte); +} + +static void dali_search_single(void) +{ + dali_twice(DALI_C_SADDR_H | 0xff); + dali_twice(DALI_C_SADDR_M | 0xff); + dali_twice(DALI_C_SADDR_L | 0xff); + + if (!dali_compare()) { + dali_s_notfound = 1; + return; + } + + dali_search_byte(DALI_C_SADDR_H); + if (dali_s_notfound) + return; + dali_sh = dali_s_byte; + dali_search_byte(DALI_C_SADDR_M); + if (dali_s_notfound) + return; + dali_sm = dali_s_byte; + dali_search_byte(DALI_C_SADDR_L); + if (dali_s_notfound) + return; + dali_sl = dali_s_byte; +} + +static void dali_search(void) +{ + dali_twice(DALI_C_INITIALISE); + dali_twice(DALI_C_RANDOMISE); + + do { + dali_search_single(); + if (!dali_s_notfound) { + uart_puts("dali scan found\t\t"); + uart_puthex(dali_sh); + uart_puthex(dali_sm); + uart_puthex(dali_sl); + uart_puts("\n"); + dali_send(DALI_C_QURYSHORT); + dali_send(DALI_C_WITHDRAW); + } + } while (!dali_s_notfound); + + dali_twice(DALI_C_TERMINATE); + uart_puts("dali scan end\n"); +} + |