#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; while (bit) { dali_twice(cmd | (dali_s_byte & ~bit)); if (dali_compare()) { dali_s_byte &= ~bit; } else if (dali_compare()) { 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); dali_send(DALI_C_QURYSHORT); if (dali_rx_avail) { uart_puts(" short: "); uart_puthex(dali_rx); uart_puts("\n"); } else uart_puts(" noshort\n"); dali_send(DALI_C_WITHDRAW); } } while (!dali_s_notfound); dali_twice(DALI_C_TERMINATE); uart_puts("dali scan end\n"); }