DisplayAppEsp32 library for GR-LYCHEE

Files at this revision

API Documentation at this revision

Comitter:
YuuichiAkagawa
Date:
Tue Jul 04 10:11:43 2017 +0000
Commit message:
First release

Changed in this revision

DisplayAppEsp32.cpp Show annotated file Show diff for this revision Revisions of this file
DisplayAppEsp32.h Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DisplayAppEsp32.cpp	Tue Jul 04 10:11:43 2017 +0000
@@ -0,0 +1,75 @@
+#include "DisplayAppEsp32.h"
+
+void DisplayAppEsp32::display_app_process() {
+    while(1){
+        osEvent evt = esp32Q.get();
+        if (evt.status == osEventMessage) {
+            esp32Msg_t *m = (esp32Msg_t*)evt.value.p;
+            SendHeader(m->size);
+            SendData(sendbuf[m->side], m->size);
+            esp32Pool.free(m);
+            bufmgr[m->side] = false;
+        }
+    }
+}
+
+DisplayAppEsp32::DisplayAppEsp32(osPriority tsk_pri, uint32_t stack_size) : 
+  esp32(P3_15, P0_2), esp32Thread(tsk_pri, stack_size) {
+    esp32_en = new DigitalOut(P5_3);
+    esp32_io0 = new DigitalOut(P3_14);
+
+    bufside = 0;
+    bufmgr[0]= false;
+    bufmgr[1]= false;
+
+    esp32.set_flow_control(SerialBase::Disabled);
+    *esp32_io0 = 1;
+    *esp32_en = 0;
+    Thread::wait(100);
+    *esp32_en = 1;
+    Thread::wait(2000);
+    esp32.baud(1000000);
+    esp32Thread.start(callback(this, &DisplayAppEsp32::display_app_process));
+}
+
+void DisplayAppEsp32::SendHeader(uint32_t size) {
+    uint8_t headder_data[12] = {0xFF,0xFF,0xAA,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
+ 
+    headder_data[8]  = (uint8_t)((uint32_t)size >> 0);
+    headder_data[9]  = (uint8_t)((uint32_t)size >> 8);
+    headder_data[10] = (uint8_t)((uint32_t)size >> 16);
+    headder_data[11] = (uint8_t)((uint32_t)size >> 24);
+    for (size_t i = 0; i < sizeof(headder_data); i++)
+    {
+        esp32.putc(headder_data[i]);
+    }
+}
+ 
+void DisplayAppEsp32::SendData(uint8_t * buf, uint32_t size) {
+    while (size > 0)
+    {
+        esp32.putc(*buf++);
+        size--;
+    }
+}
+int DisplayAppEsp32::SendJpeg(uint8_t *buf, uint32_t size) {
+    if( bufmgr[bufside] == true || size > BufferSize)
+    {
+        //size over or buffer full.
+        return 0;
+    }
+    memcpy(sendbuf[bufside], buf, size);
+    bufmgr[bufside] = true;
+
+    esp32Msg_t *m = esp32Pool.alloc();
+    if( m == NULL ){
+        //mpool alloc failed.
+        return 0;
+    }
+    m->size = size;
+    m->side = bufside;
+    esp32Q.put(m);
+
+    bufside ^= 1;//flip
+    return size;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DisplayAppEsp32.h	Tue Jul 04 10:11:43 2017 +0000
@@ -0,0 +1,55 @@
+/**************************************************************************//**
+* @file          DisplayAppEsp32.h
+* @brief         DisplayApp API
+******************************************************************************/
+
+#ifndef DISPLAY_APP_ESP32_H
+#define DISPLAY_APP_ESP32_H
+
+#include "mbed.h"
+
+/** A class to communicate a DisplayAppEsp32
+ *
+ */
+class DisplayAppEsp32 {
+public:
+    /** Constructor: Initializes DisplayAppEsp32.
+     *
+     * @param   tsk_pri        Priority of the thread function. (default: osPriorityNormal).
+     * @param   init_pri       Priority of before the USB is connected. (default: osPriorityLow).
+     * @param   stack_size     stack size (in bytes) requirements for the thread function. (default: DEFAULT_STACK_SIZE).
+     */
+    DisplayAppEsp32(osPriority tsk_pri = osPriorityNormal, uint32_t stack_size = DEFAULT_STACK_SIZE);
+ 
+    /** Send JPEG data
+     *
+     * @param buf data buffer address
+     * @param size data size
+     * @return send data size
+     */
+    int SendJpeg(uint8_t * buf, uint32_t size);
+
+private:
+    const static size_t BufferSize = 15360;
+
+    bool bufmgr[2];
+    uint8_t bufside;
+    uint8_t sendbuf[2][BufferSize];
+
+    typedef struct {
+        size_t size;
+        uint8_t side;
+    } esp32Msg_t;
+
+    RawSerial esp32;
+    DigitalOut *esp32_en;
+    DigitalOut *esp32_io0;
+    MemoryPool<esp32Msg_t, 2> esp32Pool;
+    Queue<esp32Msg_t, 2> esp32Q;
+    Thread esp32Thread;
+
+    void display_app_process();
+    void SendHeader(uint32_t size);
+    void SendData(uint8_t * buf, uint32_t size);
+};
+#endif