Software UART program using Infra-Red LED and IR-Detector
Dependents: TestVirtualisation Bf_SoftSerial_IR
Diff: SoftSerial_tx_IR.cpp
- Revision:
- 12:79d63607bbb1
- Parent:
- 8:332b66de89d3
- Child:
- 13:2b5649a1278a
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/SoftSerial_tx_IR.cpp Mon Dec 17 03:38:12 2018 +0000 @@ -0,0 +1,89 @@ +#include "SoftSerial_IR.h" + +int SoftSerial_IR::_putc(int c) +{ + while(!writeable()); + prepare_tx(c); + tx_bit = 0; + send_tx_bit = 0; + txticker.prime(); + tx_handler(); + return 0; +} + +void SoftSerial_IR::send_break(void) { + while(!writeable()); + tx_bit = 0; //Just to make sure it appears as non-writable to other threads/IRQs + tx->write(0.5f); + wait_us((bit_period * _total_bits * 3) / 2); + tx->write(0.0f); + send_tx_bit = 0; + tx_bit = -1; +} + +int SoftSerial_IR::writeable(void) +{ + if (!tx_en) + return false; + if (tx_bit == -1) + return true; + return false; +} + +void SoftSerial_IR::tx_handler(void) +{ + if (tx_bit == _total_bits) { + tx_bit = -1; + send_tx_bit = 0; + tx->write(0.0f); + fpointer[TxIrq].call(); + return; + } + + //Flip output + if (send_tx_bit == 0){ + send_tx_bit = 1; + tx->write(0.5f); + } else { + send_tx_bit = 0; + tx->write(0.0f); + } + + //Calculate when to do it again + int count = bit_period; + tx_bit++; + while(((_char >> tx_bit) & 0x01) == send_tx_bit) { + count+=bit_period; + tx_bit++; + } + + txticker.setNext(count); +} + +void SoftSerial_IR::prepare_tx(int c) +{ + _char = c << 1; + + bool parity; + switch (_parity) { + case Forced1: + _char |= 1 << (_bits + 1); + case Even: + parity = false; + for (int i = 0; i<_bits; i++) { + if (((_char >> i) & 0x01) == 1) + parity = !parity; + } + _char |= parity << (_bits + 1); + case Odd: + parity = true; + for (int i = 0; i<_bits; i++) { + if (((_char >> i) & 0x01) == 1) + parity = !parity; + } + _char |= parity << (_bits + 1); + } + + _char |= 0xFFFF << (1 + _bits + (bool)_parity); + _char &= ~(1<<_total_bits); +}