summaryrefslogtreecommitdiff
path: root/dali_ctl.c
blob: 50dc77c806f9e3eba60f9a9d6764002b431b94de (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
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");
}