summaryrefslogtreecommitdiff
path: root/dali_ctl.c
diff options
context:
space:
mode:
Diffstat (limited to 'dali_ctl.c')
-rw-r--r--dali_ctl.c97
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");
+}
+