ワークショップ用のプログラム

Dependencies:   Milkcocoa mbed

Committer:
jksoft
Date:
Thu Sep 22 00:49:42 2016 +0000
Revision:
0:d0b3a5d1ba28
????????

Who changed what in which revision?

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