uint8_t sync;
uint8_t synced;
struct pt thread;
-#if CONFIG_MASTER_MODE
- struct pt master_thread;
-#endif
/* int line */
timer_t int_timer;
R_PORT &= ~_BV(INTPIN);
#ifdef INIT_ZERO
remote.int_state = INT_IDLE;
-
- PT_INIT(&remote.master_thread);
-#endif
-
-#if CONFIG_MASTER_MODE == 1
- /* check master state: read value of M_PIN1 */
- if (!(M_PIN & _BV(M_PIN1)))
- global_remote.master = true;
-#elif CONFIG_MASTER_MODE == 2
- /* statically configure master mode */
- global_remote.master = true;
#endif
}
uart_putc(addr);
}
-#if CONFIG_MASTER_MODE
-/* parameters for master mode script commands */
-#define MASTER_PROGRAMS 2
-static PROGMEM uint8_t master_parameters[] = {
- /* first: colorwheel forward */
- 0, /* program index */
- 1, /* fade step */
- 2, /* fade delay */
- 0, /* fade sleep */
- 0, 0, /* hue start (little endian) */
- 20, 0, /* hue step (little endian) */
- -1, /* addr add */
- 255, /* saturation */
- 255, /* value */
-
- /* first: colorwheel backward */
- 0, /* program index */
- 1, /* fade step */
- 2, /* fade delay */
- 0, /* fade sleep */
- 0, 0, /* hue start (little endian) */
- 20, 0, /* hue step (little endian) */
- 1, /* addr add */
- 255, /* saturation */
- 255, /* value */
-};
-
-static PT_THREAD(remote_master_thread(struct pt *thread))
-{
- static struct remote_msg_start_program_t msg;
- static timer_t timer;
- static uint16_t sleep;
- static uint8_t *ptr;
- static uint8_t idx;
-
- PT_BEGIN(thread);
-
- /* wait */
- timer_set(&timer, MASTER_WAIT_BEFORE_SYNC);
- while(!timer_expired(&timer))
- PT_YIELD(thread);
-
- /* start program on all devices */
- msg.address = 0xff;
- msg.cmd = REMOTE_CMD_START_PROGRAM;
-
- while (1) {
- ptr = &master_parameters[0];
-
- for (idx = 0; idx < MASTER_PROGRAMS; idx++) {
- /* stop current program and fading */
- script_stop();
- pwm_stop_fading();
-
- /* start program colorwheel on all nodes */
- msg.script = pgm_read_byte(ptr++);
- /* load parameters */
- for (uint8_t i = 0; i < sizeof(msg.params); i++)
- msg.params.raw[i] = pgm_read_byte(ptr++);
-
- /* send */
- send_resync(MASTER_MODE_FIRST_ADDRESS);
- PT_YIELD(thread);
- send_msg((struct remote_msg_t *)&msg);
-
- /* start program locally */
- script_start(0, msg.script, &msg.params);
-
- /* sleep */
- sleep = MASTER_MODE_SLEEP;
- while (sleep--) {
- /* sleep 1s */
- timer_set(&timer, 100);
-
- while (!timer_expired(&timer))
- PT_YIELD(thread);
- }
- }
- }
-
- PT_END(thread);
-}
-#endif
-
void remote_poll(void)
{
if (fifo_fill((fifo_t *)&global_uart.rx) > 0) {
/* enable remote command thread */
remote.synced = 1;
PT_INIT(&remote.thread);
-#if CONFIG_MASTER_MODE
- global_remote.master = false;
-#endif
} else {
/* just pass through data */
uart_putc(data);
if (remote.int_state == INT_PULLED_TIMER && timer_expired(&remote.int_timer)) {
remote_release_int();
}
-
-#if CONFIG_MASTER_MODE
- if (global_remote.master)
- PT_SCHEDULE(remote_master_thread(&remote.master_thread));
-#endif
}
void remote_pull_int(void)
/** output one character */
void uart_putc(uint8_t data)
{
+#if UART_TX_ENABLED
/* store data */
fifo_enqueue((fifo_t *)&global_uart.tx, data);
/* enable interrupt */
_UCSRB_UART0 |= _BV(_UDRIE_UART0);
+#endif
}
/** init the hardware uart */
/* set mode */
_UCSRC_UART0 = UART_UCSRC;
+#if UART_TX_ENABLED
/* enable transmitter, receiver and receiver complete interrupt */
_UCSRB_UART0 = _BV(_TXEN_UART0) | _BV(_RXEN_UART0) | _BV(_RXCIE_UART0);
+ /* init tx fifo */
+ fifo_init((fifo_t *)&global_uart.tx);
+#else
+ /* enable receiver and receiver complete interrupt */
+ _UCSRB_UART0 = _BV(_RXEN_UART0) | _BV(_RXCIE_UART0);
+#endif
- /* init fifos */
+ /* init rx fifo */
fifo_init((fifo_t *)&global_uart.rx);
- fifo_init((fifo_t *)&global_uart.tx);
}
}
+#if UART_TX_ENABLED
/** uart data register empty interrupt */
ISR(_SIG_UART_DATA_UART0)
{
-
/* load next byte to transfer */
_UDR_UART0 = fifo_dequeue((fifo_t *)&global_uart.tx);
/* disable this interrupt */
_UCSRB_UART0 &= ~_BV(_UDRIE_UART0);
}
-
}
+#endif
#endif