![](/media/cache/profiles/5f14615696649541a025d3d0f8e0447f.jpg.50x50_q85.jpg)
ワークショップ用に公開しているものです。
Fork of Arch_Analog_Thermistor_Blinker by
SoftSerialSendOnly/SoftSerialSendOnry_tx.cpp
- Committer:
- jksoft
- Date:
- 2016-02-27
- Revision:
- 9:5a7dca00d87b
File content as of revision 9:5a7dca00d87b:
#include "SoftSerialSendOnry.h" int SoftSerialSendOnry::_putc(int c) { while(!writeable()); prepare_tx(c); tx_bit = 0; txticker.prime(); tx_handler(); return 0; } void SoftSerialSendOnry::send_break(void) { while(!writeable()); tx_bit = 0; //Just to make sure it appears as non-writable to other threads/IRQs tx->write(0); wait_us((bit_period * _total_bits * 3) / 2); tx->write(1); tx_bit = -1; } int SoftSerialSendOnry::writeable(void) { if (!tx_en) return false; if (tx_bit == -1) return true; return false; } void SoftSerialSendOnry::tx_handler(void) { if (tx_bit == _total_bits) { tx_bit = -1; fpointer[TxIrq].call(); return; } //Flip output int cur_out = tx->read(); tx->write(!cur_out); //Calculate when to do it again int count = bit_period; tx_bit++; while(((_char >> tx_bit) & 0x01) == !cur_out) { count+=bit_period; tx_bit++; } txticker.setNext(count); } void SoftSerialSendOnry::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); }