DisplayAppEsp32 library for GR-LYCHEE
Revision 0:97710102abcb, committed 2017-07-04
- 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