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

Dependents:   TestVirtualisation Bf_SoftSerial_IR

Committer:
kenjiArai
Date:
Fri May 15 04:11:01 2020 +0000
Revision:
15:8d343be3382d
Parent:
14:dc766032cdd6
Updated several functions based on SoftSerial library.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kenjiArai 15:8d343be3382d 1 // Modified by K.Arai / JH1PJL May 15th, 2020
kenjiArai 13:2b5649a1278a 2
kenjiArai 12:79d63607bbb1 3 #include "SoftSerial_IR.h"
Sissors 0:8edaa7abe724 4
kenjiArai 15:8d343be3382d 5 // please make a constructor in main.cpp if you use below pc & led
kenjiArai 15:8d343be3382d 6 #if DEBUG_TIMING == 1
kenjiArai 15:8d343be3382d 7 extern Serial pc;
kenjiArai 15:8d343be3382d 8 extern DigitalOut test_point;
kenjiArai 15:8d343be3382d 9 # define TP_ON {test_point = 1;}
kenjiArai 15:8d343be3382d 10 # define TP_OFF {test_point = 0;}
kenjiArai 15:8d343be3382d 11 # define DBG_PRINTF(...) pc.printf(__VA_ARGS__)
kenjiArai 15:8d343be3382d 12 #else
kenjiArai 15:8d343be3382d 13 # define TP_ON {;}
kenjiArai 15:8d343be3382d 14 # define TP_OFF {;}
kenjiArai 15:8d343be3382d 15 # define DBG_PRINTF(...) {;}
kenjiArai 15:8d343be3382d 16 #endif
kenjiArai 15:8d343be3382d 17
kenjiArai 12:79d63607bbb1 18 int SoftSerial_IR::_putc(int c)
Sissors 2:9e01a38606b4 19 {
kenjiArai 15:8d343be3382d 20 while(!writeable()) {
kenjiArai 15:8d343be3382d 21 YIELD;
kenjiArai 15:8d343be3382d 22 }
Sissors 2:9e01a38606b4 23 prepare_tx(c);
Sissors 0:8edaa7abe724 24 tx_bit = 0;
kenjiArai 15:8d343be3382d 25 //tx->write(1);
kenjiArai 15:8d343be3382d 26 tx->write(0.0f); // output 1
kenjiArai 15:8d343be3382d 27 txticker.prime();
Sissors 0:8edaa7abe724 28 tx_handler();
Sissors 0:8edaa7abe724 29 return 0;
Sissors 2:9e01a38606b4 30 }
Sissors 0:8edaa7abe724 31
kenjiArai 12:79d63607bbb1 32 void SoftSerial_IR::send_break(void) {
kenjiArai 15:8d343be3382d 33 while(!writeable()) {
kenjiArai 15:8d343be3382d 34 YIELD;
kenjiArai 15:8d343be3382d 35 }
kenjiArai 13:2b5649a1278a 36 //Just to make sure it appears as non-writable to other threads/IRQs
kenjiArai 15:8d343be3382d 37 tx_bit = 0;
kenjiArai 15:8d343be3382d 38 //tx->write(0);
kenjiArai 13:2b5649a1278a 39 tx->write(0.5f); // output 0
Sissors 8:332b66de89d3 40 wait_us((bit_period * _total_bits * 3) / 2);
kenjiArai 15:8d343be3382d 41 //tx->write(1);
kenjiArai 13:2b5649a1278a 42 tx->write(0.0f); // output 1
Sissors 7:7de3e1019e23 43 tx_bit = -1;
Sissors 7:7de3e1019e23 44 }
Sissors 7:7de3e1019e23 45
kenjiArai 12:79d63607bbb1 46 int SoftSerial_IR::writeable(void)
Sissors 2:9e01a38606b4 47 {
kenjiArai 15:8d343be3382d 48 if (!tx_en) {
Sissors 0:8edaa7abe724 49 return false;
kenjiArai 15:8d343be3382d 50 }
kenjiArai 15:8d343be3382d 51 if (tx_bit == -1) {
Sissors 0:8edaa7abe724 52 return true;
kenjiArai 15:8d343be3382d 53 }
Sissors 0:8edaa7abe724 54 return false;
Sissors 0:8edaa7abe724 55 }
Sissors 0:8edaa7abe724 56
kenjiArai 12:79d63607bbb1 57 void SoftSerial_IR::tx_handler(void)
Sissors 2:9e01a38606b4 58 {
kenjiArai 15:8d343be3382d 59 TP_ON;
Sissors 2:9e01a38606b4 60 if (tx_bit == _total_bits) {
Sissors 0:8edaa7abe724 61 tx_bit = -1;
kenjiArai 15:8d343be3382d 62 //tx->write(1);
kenjiArai 15:8d343be3382d 63 tx->write(0.0f); // output 1
Sissors 4:c010265ed202 64 fpointer[TxIrq].call();
kenjiArai 15:8d343be3382d 65 TP_OFF;
Sissors 0:8edaa7abe724 66 return;
Sissors 0:8edaa7abe724 67 }
kenjiArai 15:8d343be3382d 68 if (tx_bit == 0){
kenjiArai 15:8d343be3382d 69 //tx->write(1);
kenjiArai 15:8d343be3382d 70 tx->write(0.0f); // output 1
kenjiArai 15:8d343be3382d 71 txticker.setNext(10);
kenjiArai 12:79d63607bbb1 72 } else {
kenjiArai 15:8d343be3382d 73 int bitchk = _char >> tx_bit;
kenjiArai 15:8d343be3382d 74 if (bitchk & 1) {
kenjiArai 15:8d343be3382d 75 //tx->write(1);
kenjiArai 15:8d343be3382d 76 tx->write(0.0f); // output 1
kenjiArai 15:8d343be3382d 77 } else {
kenjiArai 15:8d343be3382d 78 //tx->write(0);
kenjiArai 15:8d343be3382d 79 tx->write(0.5f); // output 0
kenjiArai 15:8d343be3382d 80 }
kenjiArai 15:8d343be3382d 81 txticker.setNext(bit_period);
kenjiArai 12:79d63607bbb1 82 }
Sissors 0:8edaa7abe724 83 tx_bit++;
kenjiArai 15:8d343be3382d 84 TP_OFF;
Sissors 0:8edaa7abe724 85 }
Sissors 0:8edaa7abe724 86
kenjiArai 12:79d63607bbb1 87 void SoftSerial_IR::prepare_tx(int c)
Sissors 2:9e01a38606b4 88 {
kenjiArai 15:8d343be3382d 89 _char = c << 2; // set start bit as bit1 and dummy as bit0
Sissors 2:9e01a38606b4 90
Sissors 2:9e01a38606b4 91 bool parity;
Sissors 2:9e01a38606b4 92 switch (_parity) {
Sissors 2:9e01a38606b4 93 case Forced1:
Sissors 2:9e01a38606b4 94 _char |= 1 << (_bits + 1);
kenjiArai 15:8d343be3382d 95 break;
Sissors 2:9e01a38606b4 96 case Even:
Sissors 2:9e01a38606b4 97 parity = false;
Sissors 2:9e01a38606b4 98 for (int i = 0; i<_bits; i++) {
kenjiArai 15:8d343be3382d 99 if (((_char >> i) & 0x01) == 1) {
Sissors 2:9e01a38606b4 100 parity = !parity;
kenjiArai 15:8d343be3382d 101 }
Sissors 2:9e01a38606b4 102 }
Sissors 2:9e01a38606b4 103 _char |= parity << (_bits + 1);
kenjiArai 15:8d343be3382d 104 break;
Sissors 2:9e01a38606b4 105 case Odd:
Sissors 2:9e01a38606b4 106 parity = true;
Sissors 2:9e01a38606b4 107 for (int i = 0; i<_bits; i++) {
kenjiArai 15:8d343be3382d 108 if (((_char >> i) & 0x01) == 1) {
Sissors 2:9e01a38606b4 109 parity = !parity;
kenjiArai 15:8d343be3382d 110 }
Sissors 2:9e01a38606b4 111 }
Sissors 2:9e01a38606b4 112 _char |= parity << (_bits + 1);
kenjiArai 15:8d343be3382d 113 break;
kenjiArai 15:8d343be3382d 114 case Forced0:
kenjiArai 15:8d343be3382d 115 case None:
kenjiArai 15:8d343be3382d 116 default:
kenjiArai 15:8d343be3382d 117 ;
Sissors 0:8edaa7abe724 118 }
kenjiArai 15:8d343be3382d 119 // added one dummy at LSB bit
kenjiArai 15:8d343be3382d 120 int num = 1 + _bits + (bool)_parity + 1;
kenjiArai 15:8d343be3382d 121 _char |= 0xffffffff << num;
kenjiArai 15:8d343be3382d 122 _char |= 1UL;
kenjiArai 15:8d343be3382d 123 _char &= ~(1 << _total_bits);
Sissors 2:9e01a38606b4 124 }