Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of DMX by
DMX.cpp
- Committer:
- okini3939
- Date:
- 2012-09-26
- Revision:
- 2:d7677060f8eb
- Parent:
- 1:f0d988e15810
- Child:
- 3:2eb66b4d99bd
File content as of revision 2:d7677060f8eb:
/*
* DMX512 send/recv library
* Copyright (c) 2011 Hiroshi Suga
* Released under the MIT License: http://mbed.org/license/mit
*/
/** @file DMX.cpp
* @brief DMX512 send/recv
*/
#include "mbed.h"
#include "DMX.h"
DMX::DMX (PinName p_tx, PinName p_rx) : dmx(p_tx, p_rx) {
int i;
for (i = 0; i < DMX_SIZE; i ++) {
data_tx[i] = 0;
data_rx[i] = 0;
}
mode_tx = DMX_MODE_BEGIN;
mode_rx = DMX_MODE_BEGIN;
is_recived = 0;
is_sent = 0;
if (p_tx == p9) {
uart_lcr = &LPC_UART3->LCR;
uart_thr = &LPC_UART3->THR;
} else
if (p_tx == p13) {
uart_lcr = &LPC_UART1->LCR;
uart_thr = &LPC_UART1->THR;
} else
if (p_tx == p28) {
uart_lcr = &LPC_UART2->LCR;
uart_thr = &LPC_UART2->THR;
}
if (p_rx == p10) {
uart_lsr = &LPC_UART3->LSR;
uart_rbr = &LPC_UART3->RBR;
NVIC_SetPriority(UART3_IRQn, 1);
} else
if (p_rx == p14) {
uart_lsr = &LPC_UART1->LSR;
uart_rbr = &LPC_UART1->RBR;
NVIC_SetPriority(UART1_IRQn, 1);
} else
if (p_rx == p27) {
uart_lsr = &LPC_UART2->LSR;
uart_rbr = &LPC_UART2->RBR;
NVIC_SetPriority(UART2_IRQn, 1);
}
dmx.baud(250000);
dmx.format(8, Serial::None, 2);
dmx.attach(this, &DMX::int_rx, Serial::RxIrq);
timeout01.attach_us(this, &DMX::int_timer, DMX_TIME_BETWEEN);
}
void DMX::put (int ch, int data) {
data_tx[ch] = data;
}
int DMX::get (int ch) {
return data_rx[ch];
}
void DMX::int_timer () {
switch (mode_tx) {
case DMX_MODE_BEGIN:
// Break Time
timeout01.detach();
*uart_lcr |= (1 << 6);
mode_tx = DMX_MODE_BREAK;
timeout01.attach_us(this, &DMX::int_timer, DMX_TIME_BREAK);
break;
case DMX_MODE_BREAK:
// Mark After Break
timeout01.detach();
*uart_lcr &= ~(1 << 6);
mode_tx = DMX_MODE_MAB;
timeout01.attach_us(this, &DMX::int_timer, DMX_TIME_MAB);
break;
case DMX_MODE_MAB:
// Start code
timeout01.detach();
addr_tx = 0;
mode_tx = DMX_MODE_DATA;
dmx.attach(this, &DMX::int_tx, Serial::TxIrq);
#ifdef DMX_UART_DIRECT
*uart_thr = 0;
#else
dmx.putc(0);
#endif
break;
}
}
void DMX::int_tx () {
// Data
if (mode_tx == DMX_MODE_DATA) {
if (addr_tx < DMX_SIZE) {
#ifdef DMX_UART_DIRECT
*uart_thr = (uint8_t)data_tx[addr_tx];
#else
dmx.putc(data_tx[addr_tx]);
#endif
addr_tx ++;
} else {
dmx.attach(0, Serial::TxIrq);
mode_tx = DMX_MODE_BEGIN;
is_sent = 1;
timeout01.attach_us(this, &DMX::int_timer, DMX_TIME_BETWEEN);
}
}
}
void DMX::int_rx () {
int flg, dat;
flg = *uart_lsr;
#ifdef DMX_UART_DIRECT
dat = *uart_rbr;
#else
dat = dmx.getc();
#endif
if (flg & ((1 << 7)|(1 << 3)|(1 << 4))) {
// Break Time
if (addr_rx > 0) {
is_recived = 1;
}
mode_rx = DMX_MODE_BREAK;
return;
}
if (mode_rx == DMX_MODE_BREAK) {
// Start Code
if (dat == 0) {
addr_rx = 0;
mode_rx = DMX_MODE_DATA;
} else {
mode_rx = DMX_MODE_ERROR;
}
} else
if (mode_rx == DMX_MODE_DATA) {
// Data
data_rx[addr_rx] = dat;
addr_rx ++;
if (addr_rx >= DMX_SIZE) {
is_recived = 1;
mode_rx = DMX_MODE_BEGIN;
}
}
}
