Skip to content
This repository has been archived by the owner on Jul 4, 2024. It is now read-only.

Commit

Permalink
Attempt to read more than 480 DMX channels #1
Browse files Browse the repository at this point in the history
  • Loading branch information
luksal authored Dec 20, 2019
1 parent 5687b53 commit 5ab53f8
Showing 1 changed file with 48 additions and 36 deletions.
84 changes: 48 additions & 36 deletions src/dmx.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -105,52 +105,64 @@ void DMX::uart_event_task(void *pvParameters)
switch(event.type)
{
case UART_DATA:
// read the received data
uart_read_bytes(DMX_UART_NUM, dtmp, event.size, portMAX_DELAY);
// check if break detected
if(dmx_state == DMX_BREAK)
{
// if not 0, then RDM or custom protocol
if(dtmp[0] == 0)
// read the received data
uart_read_bytes(DMX_UART_NUM, dtmp, event.size, portMAX_DELAY);
// check if break detected
if(dmx_state == DMX_BREAK)
{
dmx_state = DMX_DATA;
// reset dmx adress to 0
current_rx_addr = 0;
xSemaphoreTake(sync_dmx, portMAX_DELAY);
// store received timestamp
last_dmx_packet = millis();
xSemaphoreGive(sync_dmx);
// if not 0, then RDM or custom protocol
if(dtmp[0] == 0)
{
dmx_state = DMX_DATA;
// reset dmx adress to 0
current_rx_addr = 0;
xSemaphoreTake(sync_dmx, portMAX_DELAY);
// store received timestamp
last_dmx_packet = millis();
xSemaphoreGive(sync_dmx);
}
}
}
// check if in data receive mode
if(dmx_state == DMX_DATA)
{
xSemaphoreTake(sync_dmx, portMAX_DELAY);
// copy received bytes to dmx data array
for(int i = 0; i < event.size; i++)
// check if in data receive mode
if(dmx_state == DMX_DATA)
{
dmx_data[current_rx_addr++] = dtmp[i];
xSemaphoreTake(sync_dmx, portMAX_DELAY);
// copy received bytes to dmx data array
for(int i = 0; i < event.size; i++)
{
dmx_data[current_rx_addr++] = dtmp[i];
}
xSemaphoreGive(sync_dmx);
}
xSemaphoreGive(sync_dmx);
}
break;
break;
case UART_BREAK:
// break detected, clear queue und flush received bytes
// results in missing the last few bytes... needs fix
uart_flush_input(DMX_UART_NUM);
xQueueReset(dmx_rx_queue);
dmx_state = DMX_BREAK;
break;
// break detected
// check if there are bytes left in the queue
if(dmx_state == DMX_DATA && event.size > 0 && current_rx_addr > 0)
{
uart_read_bytes(DMX_UART_NUM, dtmp, event.size, portMAX_DELAY);
xSemaphoreTake(sync_dmx, portMAX_DELAY);
// copy received bytes to dmx data array
for(int i = 0; i < event.size; i++)
{
dmx_data[current_rx_addr++] = dtmp[i];
}
xSemaphoreGive(sync_dmx);
}
// clear queue und flush received bytes
uart_flush_input(DMX_UART_NUM);
xQueueReset(dmx_rx_queue);
dmx_state = DMX_BREAK;
break;
case UART_FRAME_ERR:
case UART_PARITY_ERR:
case UART_BUFFER_FULL:
case UART_FIFO_OVF:
default:
// error recevied, going to idle mode
uart_flush_input(DMX_UART_NUM);
xQueueReset(dmx_rx_queue);
dmx_state = DMX_IDLE;
break;
// error recevied, going to idle mode
uart_flush_input(DMX_UART_NUM);
xQueueReset(dmx_rx_queue);
dmx_state = DMX_IDLE;
break;
}
}
}
Expand Down

0 comments on commit 5ab53f8

Please sign in to comment.