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.
XMIT_IR.cpp
- Committer:
- cmulady
- Date:
- 2012-10-06
- Revision:
- 6:281167565d6d
- Parent:
- 5:ad52a062d494
- Child:
- 7:01243fe65940
File content as of revision 6:281167565d6d:
#include "mbed.h"
#include "XMIT_IR.h"
IRTransmitter::IRTransmitter(PinName TX, PinName PWM, PinName RX, int data_buff_len, void (*fptr_isr_rx)(void), void (*fptr_isr_tx)(void))
{
ir_serial = new Serial(TX,RX);
ir_pwm = new PwmOut(PWM);
packet_buffer_out = new char[data_buff_len]();
packet_buffer_in = new char[data_buff_len+3]();
//Initialize modules
(*ir_pwm).period(1.0/38000.0); //38kHz Modulation Freq
(*ir_pwm) = 0.5; //pulse width = 50%
(*ir_serial).baud(2400);
(*ir_serial).attach(fptr_isr_rx,Serial::RxIrq);
(*ir_serial).attach(fptr_isr_tx,Serial::TxIrq);
// uint_32 tmp = LPC_UART1->IER;
// LPC_UART1->IER = tmp;
//Initialize Variables
for(int i=0; i<data_buff_len+3; i++)
packet_buffer_in[i] = 0;
}
IRTransmitter::~IRTransmitter()
{
delete ir_serial;
delete ir_pwm;
delete packet_buffer_out;
delete packet_buffer_in;
}
void IRTransmitter::set_debug_port(Serial* port)
{
debug_port = port;
}
void IRTransmitter::MakePacket(char* data,int len)
{
char check =0x0;
Timer t;
t.reset();
t.start();
//(*ir_serial).putc(ASCII_STX);
mail_tx_packet(ASCII_STX);
for(int i=0; i<len; i++) {
check^=data[i];
//(*ir_serial).putc(data[i]);
mail_tx_packet(data[i]);
}
//(*ir_serial).putc(check);
mail_tx_packet(check);
//(*ir_serial).putc(ASCII_ETX);
mail_tx_packet(ASCII_ETX);
t.stop();
int time = t.read_ms();
(*debug_port).printf("\nms=%d\n",time);
char tmp = isr_tx();
LPC_UART1->THR = (uint32_t)data;
}
void IRTransmitter::mail_tx_packet(char data)
{
char* mail = ir_txdata_mailbox.alloc();
mail[0] = data;
ir_txdata_mailbox.put(mail);
}
char IRTransmitter::ReadPacket(char* data, int len)
{
//Run this every few milliseconds to run through mailbox and check packet data.
//The data array will update with new values once a packet has been validated.
//Returns true if new data, false otherwise
//Inputs:
// -data: a character array to store data variables
// -len: length of character array
char return_state=0;
osEvent evt = ir_rxdata_mailbox.get();
while(evt.status == osEventMail) {
char* mail = (char*)evt.value.p;
(*data) = (*mail);
//check for valid packet - update data if so
update_packet_buffer(*data,len);
/*(*debug_port).printf("\n");
for(int i=0; i<len+3; i++) {
(*debug_port).printf("0x%02X.",packet_buffer_in[i]);
}
(*debug_port).printf(" PKT_VALID=0x%02X.",packet_is_valid(len));*/
if((*data)=='?') {
(*debug_port).putc('*');
}
if(packet_is_valid(len)==0) {
return_state = 1;
for(int i=0; i<len; i++) {
data[i] = packet_buffer_in[i+1];
}
}
ir_rxdata_mailbox.free(mail);
if(return_state) {
return return_state;
}
evt = ir_rxdata_mailbox.get();
}
return return_state;
}
char IRTransmitter::packet_is_valid(int data_len)
{
char check = 0;
//check for valid packet
if(packet_buffer_in[0]!=ASCII_STX)
return 0x1; //bad start byte
if(packet_buffer_in[data_len+2]!=ASCII_ETX)
return 0x2; //bad end byte
for(int i=1; i<data_len+1; i++) {
check^=packet_buffer_in[i];
}
if(check!=packet_buffer_in[data_len+1]) {
return 0x3; //bad checksum
}
return 0;
}
void IRTransmitter::update_packet_buffer(char new_data, int data_len)
{
//Shift All data 1 cell over
for(int i=0; i<data_len+2; i++) {
packet_buffer_in[i] = packet_buffer_in[i+1];
}
packet_buffer_in[data_len+2] = new_data;
}
void IRTransmitter::isr_rx(char data)
{
char* mail = ir_rxdata_mailbox.alloc();
mail[0] = (char)data;
ir_rxdata_mailbox.put(mail);
}
char IRTransmitter::isr_tx(void)
{
//char* mail = ir_rxdata_mailbox.alloc();
//mail[0] = (char)data;
//ir_rxdata_mailbox.put(mail);
char data = 0xF1;
osEvent evt = ir_txdata_mailbox.get();
if(evt.status == osEventMail) {
char* mail = (char*)evt.value.p;
data = (*mail);
//(*ir_serial).putc(data);
ir_rxdata_mailbox.free(mail);
}
//(*debug_port).printf("TX=0x%02X.",data);
return data;
}