- added Delay to Serial flush method

Dependents:   WeeESP8266

Fork of ArduinoAPI by ITEAD STUDIO

Committer:
JojoS
Date:
Sat Mar 14 10:15:36 2015 +0000
Revision:
5:8072d40c7f3c
Parent:
0:5ebc917ebd09
Child:
6:926a4df8c0fb
improved write: check writeable before putc();

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 {
itead 0:5ebc917ebd09 58 memset(&m_rx_buffer, 0, sizeof(m_rx_buffer));
itead 0:5ebc917ebd09 59 }
itead 0:5ebc917ebd09 60
itead 0:5ebc917ebd09 61 char ArduinoSerial::readChr(void) {
itead 0:5ebc917ebd09 62 // if the head isn't ahead of the tail, we don't have any characters
itead 0:5ebc917ebd09 63 if (m_rx_buffer.head == m_rx_buffer.tail) {
itead 0:5ebc917ebd09 64 return (char)-1;
itead 0:5ebc917ebd09 65 } else {
itead 0:5ebc917ebd09 66 unsigned char c = m_rx_buffer.buffer[m_rx_buffer.tail];
itead 0:5ebc917ebd09 67 m_rx_buffer.tail = (unsigned int)(m_rx_buffer.tail + 1) % ARDUINOSERIAL_BUFFER_SIZE;
itead 0:5ebc917ebd09 68 return c;
itead 0:5ebc917ebd09 69 }
itead 0:5ebc917ebd09 70 }
itead 0:5ebc917ebd09 71
itead 0:5ebc917ebd09 72 void ArduinoSerial::setTimeout(unsigned long millisecond) {
itead 0:5ebc917ebd09 73 m_find_timeout = millisecond;
itead 0:5ebc917ebd09 74 }
itead 0:5ebc917ebd09 75
itead 0:5ebc917ebd09 76 bool ArduinoSerial::find(const char *str) {
itead 0:5ebc917ebd09 77 bool ret = false;
itead 0:5ebc917ebd09 78 String data;
itead 0:5ebc917ebd09 79 char c;
itead 0:5ebc917ebd09 80 unsigned long i;
itead 0:5ebc917ebd09 81 for (i = 0; i < m_find_timeout; i++) {
itead 0:5ebc917ebd09 82 while(available() > 0) {
itead 0:5ebc917ebd09 83 c = readChr();
itead 0:5ebc917ebd09 84 data += c;
itead 0:5ebc917ebd09 85 }
itead 0:5ebc917ebd09 86 if (data.indexOf(String(str)) != -1) {
itead 0:5ebc917ebd09 87 ret = true;
itead 0:5ebc917ebd09 88 break;
itead 0:5ebc917ebd09 89 }
itead 0:5ebc917ebd09 90 wait_ms(1);
itead 0:5ebc917ebd09 91 }
itead 0:5ebc917ebd09 92 return ret;
itead 0:5ebc917ebd09 93 }
itead 0:5ebc917ebd09 94
itead 0:5ebc917ebd09 95 size_t ArduinoSerial::write(uint8_t data) {
JojoS 5:8072d40c7f3c 96 while (!writeable()) {};
itead 0:5ebc917ebd09 97 putc(data);
itead 0:5ebc917ebd09 98 return 1;
itead 0:5ebc917ebd09 99 }
itead 0:5ebc917ebd09 100
itead 0:5ebc917ebd09 101 void ArduinoSerial::writeChr(unsigned char c) {
itead 0:5ebc917ebd09 102 int i = (unsigned int)(m_rx_buffer.head + 1) % ARDUINOSERIAL_BUFFER_SIZE;
itead 0:5ebc917ebd09 103
itead 0:5ebc917ebd09 104 // if we should be storing the received character into the location
itead 0:5ebc917ebd09 105 // just before the tail (meaning that the head would advance to the
itead 0:5ebc917ebd09 106 // current location of the tail), we're about to overflow the buffer
itead 0:5ebc917ebd09 107 // and so we don't write the character or advance the head.
itead 0:5ebc917ebd09 108 if (i != m_rx_buffer.tail) {
itead 0:5ebc917ebd09 109 m_rx_buffer.buffer[m_rx_buffer.head] = c;
itead 0:5ebc917ebd09 110 m_rx_buffer.head = i;
itead 0:5ebc917ebd09 111 }
itead 0:5ebc917ebd09 112 }
itead 0:5ebc917ebd09 113
itead 0:5ebc917ebd09 114 ArduinoSerialLinkedNode *ArduinoSerial::initHeadNode(ArduinoSerialLinkedNode *head) {
itead 0:5ebc917ebd09 115 if (head == NULL) {
itead 0:5ebc917ebd09 116 return NULL;
itead 0:5ebc917ebd09 117 }
itead 0:5ebc917ebd09 118 head->data = NULL;
itead 0:5ebc917ebd09 119 head->next = head;
itead 0:5ebc917ebd09 120 return head;
itead 0:5ebc917ebd09 121 }
itead 0:5ebc917ebd09 122
itead 0:5ebc917ebd09 123 ArduinoSerialLinkedNode *ArduinoSerial::addNode(ArduinoSerialLinkedNode *head, ArduinoSerial* data) {
itead 0:5ebc917ebd09 124 ArduinoSerialLinkedNode *p;
itead 0:5ebc917ebd09 125 ArduinoSerialLinkedNode *node = (ArduinoSerialLinkedNode *)malloc(sizeof(ArduinoSerialLinkedNode));
itead 0:5ebc917ebd09 126 if (node == NULL) {
itead 0:5ebc917ebd09 127 return NULL;
itead 0:5ebc917ebd09 128 }
itead 0:5ebc917ebd09 129 /* Setting node */
itead 0:5ebc917ebd09 130 node->data = data;
itead 0:5ebc917ebd09 131 node->next = head;
itead 0:5ebc917ebd09 132
itead 0:5ebc917ebd09 133 /* Add node to tail */
itead 0:5ebc917ebd09 134 for(p = head; p->next != head; p = p->next);
itead 0:5ebc917ebd09 135 p->next = node;
itead 0:5ebc917ebd09 136
itead 0:5ebc917ebd09 137 return head;
itead 0:5ebc917ebd09 138 }
itead 0:5ebc917ebd09 139 ArduinoSerialLinkedNode *ArduinoSerial::delNode(ArduinoSerialLinkedNode *head, ArduinoSerial* data) {
itead 0:5ebc917ebd09 140 ArduinoSerialLinkedNode *p;
itead 0:5ebc917ebd09 141 ArduinoSerialLinkedNode *prev;
itead 0:5ebc917ebd09 142
itead 0:5ebc917ebd09 143 if (head == NULL) {
itead 0:5ebc917ebd09 144 return NULL;
itead 0:5ebc917ebd09 145 }
itead 0:5ebc917ebd09 146
itead 0:5ebc917ebd09 147 prev = head, p = head->next;
itead 0:5ebc917ebd09 148 while(p != head) {
itead 0:5ebc917ebd09 149 if (p->data == data) {
itead 0:5ebc917ebd09 150 prev->next = p->next;
itead 0:5ebc917ebd09 151 free(p);
itead 0:5ebc917ebd09 152 p = prev->next;
itead 0:5ebc917ebd09 153 } else {
itead 0:5ebc917ebd09 154 prev = p;
itead 0:5ebc917ebd09 155 p = p->next;
itead 0:5ebc917ebd09 156 }
itead 0:5ebc917ebd09 157 }
itead 0:5ebc917ebd09 158 return head;
itead 0:5ebc917ebd09 159 }
itead 0:5ebc917ebd09 160 ArduinoSerialLinkedNode *ArduinoSerial::findNode(ArduinoSerialLinkedNode *head, ArduinoSerial* data) {
itead 0:5ebc917ebd09 161 ArduinoSerialLinkedNode *p;
itead 0:5ebc917ebd09 162 if (head == NULL) {
itead 0:5ebc917ebd09 163 return NULL;
itead 0:5ebc917ebd09 164 }
itead 0:5ebc917ebd09 165
itead 0:5ebc917ebd09 166 for (p = head->next; p != head; p = p->next) {
itead 0:5ebc917ebd09 167 if (p->data == data) {
itead 0:5ebc917ebd09 168 return p;
itead 0:5ebc917ebd09 169 }
itead 0:5ebc917ebd09 170 }
itead 0:5ebc917ebd09 171 return NULL;
itead 0:5ebc917ebd09 172 }