Arduino Core API Library besed on mbed platform.

Dependents:   WeeESP8266 ESP8266_moj

Committer:
itead
Date:
Tue Feb 10 10:39:42 2015 +0000
Revision:
4:1fec2e4c60e5
Parent:
0:5ebc917ebd09
Change buffer size

Who changed what in which revision?

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