Software UART program using Infra-Red LED and IR-Detector

Dependents:   TestVirtualisation Bf_SoftSerial_IR

Committer:
kenjiArai
Date:
Mon Dec 17 03:38:12 2018 +0000
Revision:
12:79d63607bbb1
Parent:
SoftSerial_tx.cpp@8:332b66de89d3
Child:
13:2b5649a1278a
change only for Infra-Red LED & IR-Remote

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kenjiArai 12:79d63607bbb1 1 #include "SoftSerial_IR.h"
Sissors 0:8edaa7abe724 2
kenjiArai 12:79d63607bbb1 3 int SoftSerial_IR::_putc(int c)
Sissors 2:9e01a38606b4 4 {
Sissors 0:8edaa7abe724 5 while(!writeable());
Sissors 2:9e01a38606b4 6 prepare_tx(c);
Sissors 0:8edaa7abe724 7 tx_bit = 0;
kenjiArai 12:79d63607bbb1 8 send_tx_bit = 0;
Sissors 6:517082212c00 9 txticker.prime();
Sissors 0:8edaa7abe724 10 tx_handler();
Sissors 0:8edaa7abe724 11 return 0;
Sissors 2:9e01a38606b4 12 }
Sissors 0:8edaa7abe724 13
kenjiArai 12:79d63607bbb1 14 void SoftSerial_IR::send_break(void) {
Sissors 7:7de3e1019e23 15 while(!writeable());
Sissors 7:7de3e1019e23 16 tx_bit = 0; //Just to make sure it appears as non-writable to other threads/IRQs
kenjiArai 12:79d63607bbb1 17 tx->write(0.5f);
Sissors 8:332b66de89d3 18 wait_us((bit_period * _total_bits * 3) / 2);
kenjiArai 12:79d63607bbb1 19 tx->write(0.0f);
kenjiArai 12:79d63607bbb1 20 send_tx_bit = 0;
Sissors 7:7de3e1019e23 21 tx_bit = -1;
Sissors 7:7de3e1019e23 22 }
Sissors 7:7de3e1019e23 23
kenjiArai 12:79d63607bbb1 24 int SoftSerial_IR::writeable(void)
Sissors 2:9e01a38606b4 25 {
Sissors 0:8edaa7abe724 26 if (!tx_en)
Sissors 0:8edaa7abe724 27 return false;
Sissors 0:8edaa7abe724 28 if (tx_bit == -1)
Sissors 0:8edaa7abe724 29 return true;
Sissors 0:8edaa7abe724 30 return false;
Sissors 0:8edaa7abe724 31 }
Sissors 0:8edaa7abe724 32
kenjiArai 12:79d63607bbb1 33 void SoftSerial_IR::tx_handler(void)
Sissors 2:9e01a38606b4 34 {
Sissors 2:9e01a38606b4 35 if (tx_bit == _total_bits) {
Sissors 0:8edaa7abe724 36 tx_bit = -1;
kenjiArai 12:79d63607bbb1 37 send_tx_bit = 0;
kenjiArai 12:79d63607bbb1 38 tx->write(0.0f);
Sissors 4:c010265ed202 39 fpointer[TxIrq].call();
Sissors 0:8edaa7abe724 40 return;
Sissors 0:8edaa7abe724 41 }
Sissors 2:9e01a38606b4 42
Sissors 0:8edaa7abe724 43 //Flip output
kenjiArai 12:79d63607bbb1 44 if (send_tx_bit == 0){
kenjiArai 12:79d63607bbb1 45 send_tx_bit = 1;
kenjiArai 12:79d63607bbb1 46 tx->write(0.5f);
kenjiArai 12:79d63607bbb1 47 } else {
kenjiArai 12:79d63607bbb1 48 send_tx_bit = 0;
kenjiArai 12:79d63607bbb1 49 tx->write(0.0f);
kenjiArai 12:79d63607bbb1 50 }
Sissors 2:9e01a38606b4 51
Sissors 0:8edaa7abe724 52 //Calculate when to do it again
Sissors 0:8edaa7abe724 53 int count = bit_period;
Sissors 0:8edaa7abe724 54 tx_bit++;
kenjiArai 12:79d63607bbb1 55 while(((_char >> tx_bit) & 0x01) == send_tx_bit) {
Sissors 0:8edaa7abe724 56 count+=bit_period;
Sissors 0:8edaa7abe724 57 tx_bit++;
Sissors 0:8edaa7abe724 58 }
Sissors 2:9e01a38606b4 59
Sissors 6:517082212c00 60 txticker.setNext(count);
Sissors 0:8edaa7abe724 61 }
Sissors 0:8edaa7abe724 62
kenjiArai 12:79d63607bbb1 63 void SoftSerial_IR::prepare_tx(int c)
Sissors 2:9e01a38606b4 64 {
Sissors 2:9e01a38606b4 65 _char = c << 1;
Sissors 2:9e01a38606b4 66
Sissors 2:9e01a38606b4 67 bool parity;
Sissors 2:9e01a38606b4 68 switch (_parity) {
Sissors 2:9e01a38606b4 69 case Forced1:
Sissors 2:9e01a38606b4 70 _char |= 1 << (_bits + 1);
Sissors 2:9e01a38606b4 71 case Even:
Sissors 2:9e01a38606b4 72 parity = false;
Sissors 2:9e01a38606b4 73 for (int i = 0; i<_bits; i++) {
Sissors 2:9e01a38606b4 74 if (((_char >> i) & 0x01) == 1)
Sissors 2:9e01a38606b4 75 parity = !parity;
Sissors 2:9e01a38606b4 76 }
Sissors 2:9e01a38606b4 77 _char |= parity << (_bits + 1);
Sissors 2:9e01a38606b4 78 case Odd:
Sissors 2:9e01a38606b4 79 parity = true;
Sissors 2:9e01a38606b4 80 for (int i = 0; i<_bits; i++) {
Sissors 2:9e01a38606b4 81 if (((_char >> i) & 0x01) == 1)
Sissors 2:9e01a38606b4 82 parity = !parity;
Sissors 2:9e01a38606b4 83 }
Sissors 2:9e01a38606b4 84 _char |= parity << (_bits + 1);
Sissors 0:8edaa7abe724 85 }
Sissors 0:8edaa7abe724 86
Sissors 2:9e01a38606b4 87 _char |= 0xFFFF << (1 + _bits + (bool)_parity);
Sissors 2:9e01a38606b4 88 _char &= ~(1<<_total_bits);
Sissors 2:9e01a38606b4 89 }