summaryrefslogtreecommitdiff
path: root/src/app/mqtt-to-dmx/main.cc
blob: 6eb6e0d461141026651ade50c6abe04f1d1715f9 (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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
/*
 * Copyright 2024 Birte Kristina Friesel
 *
 * SPDX-License-Identifier: BSD-2-Clause
 */
#include "arch.h"
#include "driver/gpio.h"
#include "driver/stdout.h"
#include "driver/uptime.h"

#if defined(CONFIG_meta_driver_stdin1)
#include "driver/stdout1.h"
#include "driver/stdin1.h"
#define koutx kout1
#define kin kin1
#elif defined(CONFIG_meta_driver_stdin2)
#include "driver/stdout2.h"
#include "driver/stdin2.h"
#define koutx kout2
#define kin kin2
#elif defined(CONFIG_meta_driver_stdin3)
#include "driver/stdout3.h"
#include "driver/stdin3.h"
#define koutx kout3
#define kin kin3
#else
#error "No stdin driver found"
#endif

#if defined(CONFIG_meta_driver_dmx1)
#include "driver/dmx1.h"
#define dmx dmx1
#elif defined(CONFIG_meta_driver_dmx2)
#include "driver/dmx2.h"
#define dmx dmx2
#elif defined(CONFIG_meta_driver_dmx3)
#include "driver/dmx3.h"
#define dmx dmx3
#else
#error "No DMX driver found"
#endif

#include "driver/timer.h"
volatile unsigned char timer_done = 0;
char buffer[24];
unsigned char buf_pos = 0;

void input_to_dmx(void)
{
	unsigned char num = 0;
	/*
	 * The first DMX frame is always 0.  However, incoming UART messages from
	 * the ESP8266 start with " " after the "RX:" part has been removed. So,
	 * the first actual message will end up in dmx.frames[1] as intended.
	 */
	unsigned char dmx_frame = 0;
	for (unsigned int i = 0; i < buf_pos; i++) {
		if ((buffer[i] >= '0') && (buffer[i] <= '9')) {
			num *= 10;
			num += buffer[i] - '0';
		}
		else {
			dmx.frames[dmx_frame++] = num;
			num = 0;
		}
	}
}

int main(void)
{
	arch.setup();
	gpio.setup();
	kout.setup();
	koutx.setup();
	kin.setup();

	for (unsigned char i = 0; i < dmx.num_frames; i++) {
		dmx.frames[i] = 0;
	}

	dmx.setup();
	timer.setup_hz(15);
	timer.start(1);

	while (1) {
		while (!timer_done) {
			arch.idle();
			while (kin.hasKey() && (buf_pos < sizeof(buffer))) {
				char key = kin.getKey();
				kout << key << flush;

				/*
				 * Whoever decided that it was a good idea to prefix MQTT messages with "RX: " when outputting them on UART?
				 * Oh right, that was yesterday-me.
				 */
				if ((key == 'R') || (key == 'X') || (key == ':')) {
					continue;
				}

				buffer[buf_pos++] = key;

				if ((key == '\n') || (key == '\r')) {
					input_to_dmx();
					kout << endl << "DMX: " << dmx.frames[1] << " " << dmx.frames[2] << " " << dmx.frames[3] << " " << dmx.frames[4] << endl << "> ";
					buf_pos = 0;
				}
			}
		}
		timer.stop();
		timer_done = 0;
		timer.start(1);

		gpio.led_toggle(0);
		dmx.write();
	}

	return 0;
}

ON_TIMER_INTERRUPT_head
	timer_done = 1;
ON_TIMER_INTERRUPT_tail