Arduino Core API Library besed on mbed platform.

Dependents:   WeeESP8266 ESP8266_moj

Revision:
0:5ebc917ebd09
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ArduinoSerial.cpp	Thu Feb 05 07:24:30 2015 +0000
@@ -0,0 +1,161 @@
+#include "ArduinoSerial.h"
+
+ArduinoSerialLinkedNode ArduinoSerial::ms_list_head = {NULL, NULL};
+unsigned int ArduinoSerial::ms_instance_counter = 0;
+
+void ArduinoSerial::uartIrqCallback(void) {
+    ArduinoSerialLinkedNode *p;
+    for (p = ms_list_head.next; p != &ms_list_head; p = p->next) {
+        if (p->data != NULL) {
+            while(p->data->readable()) {
+                p->data->writeChr(p->data->getc());
+            }
+        }
+    }
+}
+
+ArduinoSerial::ArduinoSerial(PinName tx, PinName rx):Serial(tx, rx) {
+    ms_instance_counter++;
+    if (ms_instance_counter == 1) {
+        initHeadNode(&ms_list_head);
+    }
+    
+    if (addNode(&ms_list_head, this) != NULL) {
+        this->attach(&uartIrqCallback);   
+    } else {
+    }
+}
+
+ArduinoSerial::~ArduinoSerial(void) {
+    ms_instance_counter--;
+    if (delNode(&ms_list_head, this) != NULL) {
+        this->attach(NULL); 
+    } else {
+    }
+}
+    
+void ArduinoSerial::begin(int baud_rate) {
+    baud(baud_rate);
+    flush();
+}
+    
+int ArduinoSerial::available(void) {
+    return (unsigned int)(ARDUINOSERIAL_BUFFER_SIZE + m_rx_buffer.head - m_rx_buffer.tail) % ARDUINOSERIAL_BUFFER_SIZE;
+}
+
+void ArduinoSerial::flush(void)
+{
+    memset(&m_rx_buffer, 0, sizeof(m_rx_buffer));
+}
+
+char ArduinoSerial::readChr(void) {
+    // if the head isn't ahead of the tail, we don't have any characters
+    if (m_rx_buffer.head == m_rx_buffer.tail) {
+        return (char)-1;
+    } else {
+        unsigned char c = m_rx_buffer.buffer[m_rx_buffer.tail];
+        m_rx_buffer.tail = (unsigned int)(m_rx_buffer.tail + 1) % ARDUINOSERIAL_BUFFER_SIZE;
+        return c;
+    }
+}
+
+void ArduinoSerial::setTimeout(unsigned long millisecond) {
+    m_find_timeout = millisecond;
+}
+
+bool ArduinoSerial::find(const char *str) {
+    bool ret = false;
+    String data;
+    char c;
+    unsigned long i;
+    for (i = 0; i < m_find_timeout; i++) {
+        while(available() > 0) {
+            c = readChr();
+            data += c;
+        }
+        if (data.indexOf(String(str)) != -1) {
+            ret = true;
+            break;
+        }
+        wait_ms(1);
+    }
+    return ret;
+}
+
+size_t ArduinoSerial::write(uint8_t data) {
+    putc(data);
+    return 1;
+}
+
+void ArduinoSerial::writeChr(unsigned char c) {
+    int i = (unsigned int)(m_rx_buffer.head + 1) % ARDUINOSERIAL_BUFFER_SIZE;
+
+    // if we should be storing the received character into the location
+    // just before the tail (meaning that the head would advance to the
+    // current location of the tail), we're about to overflow the buffer
+    // and so we don't write the character or advance the head.
+    if (i != m_rx_buffer.tail) {
+        m_rx_buffer.buffer[m_rx_buffer.head] = c;
+        m_rx_buffer.head = i;
+    }
+}
+
+ArduinoSerialLinkedNode *ArduinoSerial::initHeadNode(ArduinoSerialLinkedNode *head) {
+    if (head == NULL) {
+        return NULL;
+    }
+    head->data = NULL;
+    head->next = head;
+    return head;
+}
+
+ArduinoSerialLinkedNode *ArduinoSerial::addNode(ArduinoSerialLinkedNode *head, ArduinoSerial* data) {
+    ArduinoSerialLinkedNode *p;
+    ArduinoSerialLinkedNode *node = (ArduinoSerialLinkedNode *)malloc(sizeof(ArduinoSerialLinkedNode));
+    if (node == NULL) {
+        return NULL;
+    }
+    /* Setting node */
+    node->data = data;
+    node->next = head;
+    
+    /* Add node to tail */
+    for(p = head; p->next != head; p = p->next);
+    p->next = node;
+    
+    return head;
+}
+ArduinoSerialLinkedNode *ArduinoSerial::delNode(ArduinoSerialLinkedNode *head, ArduinoSerial* data) {
+    ArduinoSerialLinkedNode *p;
+    ArduinoSerialLinkedNode *prev;
+    
+    if (head == NULL) {
+        return NULL;
+    }
+    
+    prev = head, p = head->next; 
+    while(p != head) {
+        if (p->data == data) {
+            prev->next = p->next;
+            free(p);
+            p = prev->next;
+        } else {
+            prev = p;
+            p = p->next;    
+        }
+    }
+    return head;
+}
+ArduinoSerialLinkedNode *ArduinoSerial::findNode(ArduinoSerialLinkedNode *head, ArduinoSerial* data) {
+    ArduinoSerialLinkedNode *p;
+    if (head == NULL) {
+        return NULL;
+    }
+    
+    for (p = head->next; p != head; p = p->next) {
+        if (p->data == data) {
+            return p;
+        }
+    }
+    return NULL;
+}
\ No newline at end of file