- added Delay to Serial flush method

Dependents:   WeeESP8266

Fork of ArduinoAPI by ITEAD STUDIO

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?

UserRevisionLine numberNew 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 }