- added Delay to Serial flush method
Fork of ArduinoAPI by
ArduinoSerial.cpp@7:c62910a9e405, 2017-04-24 (annotated)
- Committer:
- JojoS
- Date:
- Mon Apr 24 16:23:14 2017 +0000
- Revision:
- 7:c62910a9e405
- Parent:
- 6:926a4df8c0fb
support routiines for ESP;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
itead | 0:5ebc917ebd09 | 1 | #include "ArduinoSerial.h" |
itead | 0:5ebc917ebd09 | 2 | |
JojoS | 5:8072d40c7f3c | 3 | DigitalOut _testPin(P1_20); |
JojoS | 5:8072d40c7f3c | 4 | class testPin { |
JojoS | 5:8072d40c7f3c | 5 | public: |
JojoS | 5:8072d40c7f3c | 6 | testPin() {_testPin=1;}; |
JojoS | 5:8072d40c7f3c | 7 | ~testPin() {_testPin=0;}; |
JojoS | 5:8072d40c7f3c | 8 | }; |
JojoS | 5:8072d40c7f3c | 9 | |
JojoS | 5:8072d40c7f3c | 10 | |
itead | 0:5ebc917ebd09 | 11 | ArduinoSerialLinkedNode ArduinoSerial::ms_list_head = {NULL, NULL}; |
itead | 0:5ebc917ebd09 | 12 | unsigned int ArduinoSerial::ms_instance_counter = 0; |
itead | 0:5ebc917ebd09 | 13 | |
itead | 0:5ebc917ebd09 | 14 | void ArduinoSerial::uartIrqCallback(void) { |
JojoS | 5:8072d40c7f3c | 15 | testPin(); |
JojoS | 5:8072d40c7f3c | 16 | |
itead | 0:5ebc917ebd09 | 17 | ArduinoSerialLinkedNode *p; |
itead | 0:5ebc917ebd09 | 18 | for (p = ms_list_head.next; p != &ms_list_head; p = p->next) { |
itead | 0:5ebc917ebd09 | 19 | if (p->data != NULL) { |
itead | 0:5ebc917ebd09 | 20 | while(p->data->readable()) { |
itead | 0:5ebc917ebd09 | 21 | p->data->writeChr(p->data->getc()); |
itead | 0:5ebc917ebd09 | 22 | } |
itead | 0:5ebc917ebd09 | 23 | } |
itead | 0:5ebc917ebd09 | 24 | } |
itead | 0:5ebc917ebd09 | 25 | } |
itead | 0:5ebc917ebd09 | 26 | |
itead | 0:5ebc917ebd09 | 27 | ArduinoSerial::ArduinoSerial(PinName tx, PinName rx):Serial(tx, rx) { |
itead | 0:5ebc917ebd09 | 28 | ms_instance_counter++; |
itead | 0:5ebc917ebd09 | 29 | if (ms_instance_counter == 1) { |
itead | 0:5ebc917ebd09 | 30 | initHeadNode(&ms_list_head); |
itead | 0:5ebc917ebd09 | 31 | } |
itead | 0:5ebc917ebd09 | 32 | |
itead | 0:5ebc917ebd09 | 33 | if (addNode(&ms_list_head, this) != NULL) { |
itead | 0:5ebc917ebd09 | 34 | this->attach(&uartIrqCallback); |
itead | 0:5ebc917ebd09 | 35 | } else { |
itead | 0:5ebc917ebd09 | 36 | } |
itead | 0:5ebc917ebd09 | 37 | } |
itead | 0:5ebc917ebd09 | 38 | |
itead | 0:5ebc917ebd09 | 39 | ArduinoSerial::~ArduinoSerial(void) { |
itead | 0:5ebc917ebd09 | 40 | ms_instance_counter--; |
itead | 0:5ebc917ebd09 | 41 | if (delNode(&ms_list_head, this) != NULL) { |
itead | 0:5ebc917ebd09 | 42 | this->attach(NULL); |
itead | 0:5ebc917ebd09 | 43 | } else { |
itead | 0:5ebc917ebd09 | 44 | } |
itead | 0:5ebc917ebd09 | 45 | } |
itead | 0:5ebc917ebd09 | 46 | |
itead | 0:5ebc917ebd09 | 47 | void ArduinoSerial::begin(int baud_rate) { |
itead | 0:5ebc917ebd09 | 48 | baud(baud_rate); |
itead | 0:5ebc917ebd09 | 49 | flush(); |
itead | 0:5ebc917ebd09 | 50 | } |
itead | 0:5ebc917ebd09 | 51 | |
itead | 0:5ebc917ebd09 | 52 | int ArduinoSerial::available(void) { |
itead | 0:5ebc917ebd09 | 53 | return (unsigned int)(ARDUINOSERIAL_BUFFER_SIZE + m_rx_buffer.head - m_rx_buffer.tail) % ARDUINOSERIAL_BUFFER_SIZE; |
itead | 0:5ebc917ebd09 | 54 | } |
itead | 0:5ebc917ebd09 | 55 | |
itead | 0:5ebc917ebd09 | 56 | void ArduinoSerial::flush(void) |
itead | 0:5ebc917ebd09 | 57 | { |
JojoS | 6:926a4df8c0fb | 58 | wait_ms(5); |
itead | 0:5ebc917ebd09 | 59 | memset(&m_rx_buffer, 0, sizeof(m_rx_buffer)); |
itead | 0:5ebc917ebd09 | 60 | } |
itead | 0:5ebc917ebd09 | 61 | |
itead | 0:5ebc917ebd09 | 62 | char ArduinoSerial::readChr(void) { |
itead | 0:5ebc917ebd09 | 63 | // if the head isn't ahead of the tail, we don't have any characters |
itead | 0:5ebc917ebd09 | 64 | if (m_rx_buffer.head == m_rx_buffer.tail) { |
itead | 0:5ebc917ebd09 | 65 | return (char)-1; |
itead | 0:5ebc917ebd09 | 66 | } else { |
itead | 0:5ebc917ebd09 | 67 | unsigned char c = m_rx_buffer.buffer[m_rx_buffer.tail]; |
itead | 0:5ebc917ebd09 | 68 | m_rx_buffer.tail = (unsigned int)(m_rx_buffer.tail + 1) % ARDUINOSERIAL_BUFFER_SIZE; |
itead | 0:5ebc917ebd09 | 69 | return c; |
itead | 0:5ebc917ebd09 | 70 | } |
itead | 0:5ebc917ebd09 | 71 | } |
itead | 0:5ebc917ebd09 | 72 | |
itead | 0:5ebc917ebd09 | 73 | void ArduinoSerial::setTimeout(unsigned long millisecond) { |
itead | 0:5ebc917ebd09 | 74 | m_find_timeout = millisecond; |
itead | 0:5ebc917ebd09 | 75 | } |
itead | 0:5ebc917ebd09 | 76 | |
itead | 0:5ebc917ebd09 | 77 | bool ArduinoSerial::find(const char *str) { |
itead | 0:5ebc917ebd09 | 78 | bool ret = false; |
itead | 0:5ebc917ebd09 | 79 | String data; |
itead | 0:5ebc917ebd09 | 80 | char c; |
itead | 0:5ebc917ebd09 | 81 | unsigned long i; |
itead | 0:5ebc917ebd09 | 82 | for (i = 0; i < m_find_timeout; i++) { |
itead | 0:5ebc917ebd09 | 83 | while(available() > 0) { |
itead | 0:5ebc917ebd09 | 84 | c = readChr(); |
itead | 0:5ebc917ebd09 | 85 | data += c; |
itead | 0:5ebc917ebd09 | 86 | } |
itead | 0:5ebc917ebd09 | 87 | if (data.indexOf(String(str)) != -1) { |
itead | 0:5ebc917ebd09 | 88 | ret = true; |
itead | 0:5ebc917ebd09 | 89 | break; |
itead | 0:5ebc917ebd09 | 90 | } |
itead | 0:5ebc917ebd09 | 91 | wait_ms(1); |
itead | 0:5ebc917ebd09 | 92 | } |
itead | 0:5ebc917ebd09 | 93 | return ret; |
itead | 0:5ebc917ebd09 | 94 | } |
itead | 0:5ebc917ebd09 | 95 | |
itead | 0:5ebc917ebd09 | 96 | size_t ArduinoSerial::write(uint8_t data) { |
JojoS | 5:8072d40c7f3c | 97 | while (!writeable()) {}; |
itead | 0:5ebc917ebd09 | 98 | putc(data); |
itead | 0:5ebc917ebd09 | 99 | return 1; |
itead | 0:5ebc917ebd09 | 100 | } |
itead | 0:5ebc917ebd09 | 101 | |
itead | 0:5ebc917ebd09 | 102 | void ArduinoSerial::writeChr(unsigned char c) { |
itead | 0:5ebc917ebd09 | 103 | int i = (unsigned int)(m_rx_buffer.head + 1) % ARDUINOSERIAL_BUFFER_SIZE; |
itead | 0:5ebc917ebd09 | 104 | |
itead | 0:5ebc917ebd09 | 105 | // if we should be storing the received character into the location |
itead | 0:5ebc917ebd09 | 106 | // just before the tail (meaning that the head would advance to the |
itead | 0:5ebc917ebd09 | 107 | // current location of the tail), we're about to overflow the buffer |
itead | 0:5ebc917ebd09 | 108 | // and so we don't write the character or advance the head. |
itead | 0:5ebc917ebd09 | 109 | if (i != m_rx_buffer.tail) { |
itead | 0:5ebc917ebd09 | 110 | m_rx_buffer.buffer[m_rx_buffer.head] = c; |
itead | 0:5ebc917ebd09 | 111 | m_rx_buffer.head = i; |
itead | 0:5ebc917ebd09 | 112 | } |
itead | 0:5ebc917ebd09 | 113 | } |
itead | 0:5ebc917ebd09 | 114 | |
itead | 0:5ebc917ebd09 | 115 | ArduinoSerialLinkedNode *ArduinoSerial::initHeadNode(ArduinoSerialLinkedNode *head) { |
itead | 0:5ebc917ebd09 | 116 | if (head == NULL) { |
itead | 0:5ebc917ebd09 | 117 | return NULL; |
itead | 0:5ebc917ebd09 | 118 | } |
itead | 0:5ebc917ebd09 | 119 | head->data = NULL; |
itead | 0:5ebc917ebd09 | 120 | head->next = head; |
itead | 0:5ebc917ebd09 | 121 | return head; |
itead | 0:5ebc917ebd09 | 122 | } |
itead | 0:5ebc917ebd09 | 123 | |
itead | 0:5ebc917ebd09 | 124 | ArduinoSerialLinkedNode *ArduinoSerial::addNode(ArduinoSerialLinkedNode *head, ArduinoSerial* data) { |
itead | 0:5ebc917ebd09 | 125 | ArduinoSerialLinkedNode *p; |
itead | 0:5ebc917ebd09 | 126 | ArduinoSerialLinkedNode *node = (ArduinoSerialLinkedNode *)malloc(sizeof(ArduinoSerialLinkedNode)); |
itead | 0:5ebc917ebd09 | 127 | if (node == NULL) { |
itead | 0:5ebc917ebd09 | 128 | return NULL; |
itead | 0:5ebc917ebd09 | 129 | } |
itead | 0:5ebc917ebd09 | 130 | /* Setting node */ |
itead | 0:5ebc917ebd09 | 131 | node->data = data; |
itead | 0:5ebc917ebd09 | 132 | node->next = head; |
itead | 0:5ebc917ebd09 | 133 | |
itead | 0:5ebc917ebd09 | 134 | /* Add node to tail */ |
itead | 0:5ebc917ebd09 | 135 | for(p = head; p->next != head; p = p->next); |
itead | 0:5ebc917ebd09 | 136 | p->next = node; |
itead | 0:5ebc917ebd09 | 137 | |
itead | 0:5ebc917ebd09 | 138 | return head; |
itead | 0:5ebc917ebd09 | 139 | } |
itead | 0:5ebc917ebd09 | 140 | ArduinoSerialLinkedNode *ArduinoSerial::delNode(ArduinoSerialLinkedNode *head, ArduinoSerial* data) { |
itead | 0:5ebc917ebd09 | 141 | ArduinoSerialLinkedNode *p; |
itead | 0:5ebc917ebd09 | 142 | ArduinoSerialLinkedNode *prev; |
itead | 0:5ebc917ebd09 | 143 | |
itead | 0:5ebc917ebd09 | 144 | if (head == NULL) { |
itead | 0:5ebc917ebd09 | 145 | return NULL; |
itead | 0:5ebc917ebd09 | 146 | } |
itead | 0:5ebc917ebd09 | 147 | |
itead | 0:5ebc917ebd09 | 148 | prev = head, p = head->next; |
itead | 0:5ebc917ebd09 | 149 | while(p != head) { |
itead | 0:5ebc917ebd09 | 150 | if (p->data == data) { |
itead | 0:5ebc917ebd09 | 151 | prev->next = p->next; |
itead | 0:5ebc917ebd09 | 152 | free(p); |
itead | 0:5ebc917ebd09 | 153 | p = prev->next; |
itead | 0:5ebc917ebd09 | 154 | } else { |
itead | 0:5ebc917ebd09 | 155 | prev = p; |
itead | 0:5ebc917ebd09 | 156 | p = p->next; |
itead | 0:5ebc917ebd09 | 157 | } |
itead | 0:5ebc917ebd09 | 158 | } |
itead | 0:5ebc917ebd09 | 159 | return head; |
itead | 0:5ebc917ebd09 | 160 | } |
itead | 0:5ebc917ebd09 | 161 | ArduinoSerialLinkedNode *ArduinoSerial::findNode(ArduinoSerialLinkedNode *head, ArduinoSerial* data) { |
itead | 0:5ebc917ebd09 | 162 | ArduinoSerialLinkedNode *p; |
itead | 0:5ebc917ebd09 | 163 | if (head == NULL) { |
itead | 0:5ebc917ebd09 | 164 | return NULL; |
itead | 0:5ebc917ebd09 | 165 | } |
itead | 0:5ebc917ebd09 | 166 | |
itead | 0:5ebc917ebd09 | 167 | for (p = head->next; p != head; p = p->next) { |
itead | 0:5ebc917ebd09 | 168 | if (p->data == data) { |
itead | 0:5ebc917ebd09 | 169 | return p; |
itead | 0:5ebc917ebd09 | 170 | } |
itead | 0:5ebc917ebd09 | 171 | } |
itead | 0:5ebc917ebd09 | 172 | return NULL; |
itead | 0:5ebc917ebd09 | 173 | } |