37 void *get_full_duplex_serial_driver ();
48 OPEN_DRAIN_SOURCE_TX = BIT_2,
49 IGNORE_TX_ECHO_ON_RX = BIT_3
52 static const size_t BUFFER_SIZE = 16;
67 FullDuplexSerial (
const int rxPinNumber = _cfg_rxpin,
const int txPinNumber = _cfg_txpin,
68 const uint32_t mode = 0,
const int baudrate = _cfg_baudrate)
72 m_receivePinNumber(rxPinNumber),
73 m_transmitPinNumber(txPinNumber),
76 m_bufferPointer((uint32_t) this->m_receiveBuffer) {
83 if (-1 != this->m_cogID)
95 return this->m_cogID =
cognew(get_full_duplex_serial_driver(), (int32_t) (&this->m_receiveHead));
112 return this->m_receiveHead != this->m_receiveTail;
124 c = this->m_receiveBuffer[this->m_receiveTail];
125 this->m_receiveTail = (this->m_receiveTail + 1) & 0xf;
140 const unsigned int startTime =
CNT;
155 while (
lockset(this->m_transmitLock));
156 while (this->m_transmitTail == ((this->m_transmitHead + 1) & 0xf));
157 this->m_transmitBuffer[this->m_transmitHead] = c;
158 this->m_transmitHead = (this->m_transmitHead + 1) & 0xf;
160 if (this->m_mode & IGNORE_TX_ECHO_ON_RX)
164 void puts (
const char string[]) {
165 const unsigned int length = strlen(
string);
166 while (
lockset(this->m_stringLock));
167 for (
unsigned int i = 0; i < length; i++)
173 const uint8_t m_transmitLock;
174 const uint8_t m_stringLock;
176 char m_receiveBuffer[BUFFER_SIZE];
177 char m_transmitBuffer[BUFFER_SIZE];
180 volatile uint32_t m_receiveHead;
181 volatile uint32_t m_receiveTail;
182 volatile uint32_t m_transmitHead;
183 volatile uint32_t m_transmitTail;
184 const int m_receivePinNumber;
185 const int m_transmitPinNumber;
186 const uint32_t m_mode;
187 const uint32_t m_bitTicks;
188 const uint32_t m_bufferPointer;