Software UART program using Infra-Red LED and IR-Detector
Dependents: TestVirtualisation Bf_SoftSerial_IR
SoftSerial_tx_IR.cpp
- Committer:
- kenjiArai
- Date:
- 2018-12-17
- Revision:
- 12:79d63607bbb1
- Parent:
- SoftSerial_tx.cpp@ 8:332b66de89d3
- Child:
- 13:2b5649a1278a
File content as of revision 12:79d63607bbb1:
#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); }