diff options
author | David Lamparter <equinox@diac24.net> | 2012-06-20 22:45:10 +0200 |
---|---|---|
committer | David Lamparter <equinox@diac24.net> | 2012-06-20 22:45:10 +0200 |
commit | cc32704b228e943b49c2aed17fb60508404d5359 (patch) | |
tree | 131977dd9a87851c2f4adff656b614d60e048f46 | |
parent | 4e2e5d88bce6a9e81ca2d3424a97b1de5d19281b (diff) |
dali: track bus addrs in use
-rw-r--r-- | dali_ctl.c | 13 | ||||
-rw-r--r-- | lightctrl.c | 35 |
2 files changed, 40 insertions, 8 deletions
@@ -16,6 +16,9 @@ static uint8_t dali_s_byte, dali_sh, dali_sm, dali_sl; static bool dali_s_notfound; +/* [0] bit 0 => addr 0, [0] bit 1 => addr 1, etc. */ +static uint8_t dali_map[8]; + EEMEM uint8_t dali_nextaddr = 0x02; static uint8_t dali_assign; @@ -90,9 +93,13 @@ static void dali_search(void) uart_puthex(dali_sl); dali_send(DALI_C_QURYSHORT); if (dali_rx_avail) { + uint8_t addr = 0xff; + if ((dali_rx & 0x81) == 0x01) { + addr = dali_rx >> 1; + uart_puts(" short: "); - uart_puthex(dali_rx >> 1); + uart_puthex(addr); uart_puts("\n"); } else { uart_puts(" noshort "); @@ -106,8 +113,12 @@ static void dali_search(void) } else uart_puts("progfail\n"); + addr = dali_assign; dali_assign++; } + + if (addr < 64) + dali_map[addr >> 3] |= 1 << (addr & 0x7); } else uart_puts(" error\n"); dali_send(DALI_C_WITHDRAW); diff --git a/lightctrl.c b/lightctrl.c index 79fdeee..cc9a686 100644 --- a/lightctrl.c +++ b/lightctrl.c @@ -89,14 +89,35 @@ int main(void) ctr = 0; break; case 512: - dali_send(0xffa0); - if (dali_rx_avail) { - uart_puts("ll "); - uart_puthex(dali_rx); + case 516: + case 520: + case 524: + case 528: + case 532: + case 536: + case 540: + if (dali_map[(ctr >> 2) & 7]) { + uint8_t buffer[8] = {0, 0, 0, 0, 0, 0, 0, 0}; + uint8_t base = (ctr << 1) & 070, map = dali_map[(ctr >> 2) & 7]; + + uart_puts("ll"); + uart_puthex(base); + uart_puts("> "); + + for (int i = 0; i < 8; i++) + if (map & (1 << i)) { + dali_send(0x1a0 | ((base + i) << 9)); + if (dali_rx_avail) { + buffer[i] = dali_rx; + uart_puthex(dali_rx); + uart_puts(" "); + } else + uart_puts("EE "); + } else + uart_puts("-- "); uart_puts("\n"); - can_send(0xe608047f, 1, (uint8_t *)&dali_rx); - } else - uart_puts("ll noans\n"); + can_send(0xe6080400 + base, 8, buffer); + } break; case 1024: can_send(0xe7000000, 8, (uint8_t *)&dalistat); |