diff --git a/src/main/fc/fc_msp.c b/src/main/fc/fc_msp.c index 3119e27bc9..b92507b1af 100755 --- a/src/main/fc/fc_msp.c +++ b/src/main/fc/fc_msp.c @@ -1778,17 +1778,3 @@ void mspFcInit(void) { initActiveBoxIds(); } - -void mspServerPush(mspPacket_t *push, uint8_t *data, int len) -{ - sbuf_t *dst = &push->buf; - - while (len--) { - sbufWriteU8(dst, *data++); - } -} - -mspPushCommandFnPtr mspFcPushInit(void) -{ - return mspServerPush; -} diff --git a/src/main/fc/fc_msp.h b/src/main/fc/fc_msp.h index df317ab3a1..53edbd8ed1 100644 --- a/src/main/fc/fc_msp.h +++ b/src/main/fc/fc_msp.h @@ -21,5 +21,3 @@ void mspFcInit(void); mspResult_e mspFcProcessCommand(mspPacket_t *cmd, mspPacket_t *reply, mspPostProcessFnPtr *mspPostProcessFn); - -mspPushCommandFnPtr mspFcPushInit(void); diff --git a/src/main/io/.canvas.c.swo b/src/main/io/.canvas.c.swo new file mode 100644 index 0000000000..0a4fbf8066 Binary files /dev/null and b/src/main/io/.canvas.c.swo differ diff --git a/src/main/io/canvas.c b/src/main/io/canvas.c index 5b0973ed90..e57e641eb9 100644 --- a/src/main/io/canvas.c +++ b/src/main/io/canvas.c @@ -9,6 +9,8 @@ #ifdef CANVAS +#include "common/utils.h" + #include "drivers/system.h" #include "io/cms.h" @@ -67,32 +69,36 @@ int canvasWrite(uint8_t col, uint8_t row, char *string) return canvasOutput(MSP_CANVAS, (uint8_t *)buf, len + 4); } -uint16_t canvasTxRoom() +void canvasResync(displayPort_t *pPort) { - return mspSerialPushTxRoom(); + pPort->rows = 13; // XXX Will reflect NTSC/PAL in the future + pPort->rows = 30; } -screenFnVTable_t canvasVTable = { +uint32_t canvasTxRoom(void) +{ + return mspSerialTxBytesFree(); +} + +displayPortVTable_t canvasVTable = { canvasBegin, canvasEnd, canvasClear, canvasWrite, canvasHeartBeat, - NULL, + canvasResync, canvasTxRoom, }; void canvasCmsInit(displayPort_t *pPort) { - pPort->rows = 13; + pPort->rows = 13; // XXX Will reflect NTSC/PAL in the future pPort->cols = 30; pPort->vTable = &canvasVTable; } void canvasInit() { - mspSerialPushInit(mspFcPushInit()); // Called once at startup to initialize push function in msp - cmsDeviceRegister(canvasCmsInit); } #endif diff --git a/src/main/io/cms.c b/src/main/io/cms.c index be7e5186e8..706b1ccec6 100644 --- a/src/main/io/cms.c +++ b/src/main/io/cms.c @@ -37,9 +37,7 @@ #include "io/cms.h" #include "io/cms_types.h" -#ifdef CANVAS #include "io/canvas.h" -#endif #include "io/flashfs.h" #include "io/osd.h" @@ -130,22 +128,17 @@ int cmsScreenWrite(displayPort_t *instance, uint8_t x, uint8_t y, char *s) void cmsScreenHeartBeat(displayPort_t *instance) { - if (instance->vTable->heartbeat) - instance->vTable->heartbeat(); + instance->vTable->heartbeat(); } void cmsScreenResync(displayPort_t *instance) { - if (instance->vTable->resync) - instance->vTable->resync(); + instance->vTable->resync(instance); } uint16_t cmsScreenTxRoom(displayPort_t *instance) { - if (instance->vTable->txroom) - return instance->vTable->txroom(); - else - return 10000; + return instance->vTable->txroom(); } void cmsScreenInit(displayPort_t *pDisp, cmsDeviceInitFuncPtr cmsDeviceInitFunc) @@ -372,10 +365,8 @@ int cmsDrawMenuEntry(displayPort_t *pDisplay, OSD_Entry *p, uint8_t row, bool dr return cnt; } -void cmsDrawMenu(displayPort_t *pDisplay, uint32_t currentTime) +void cmsDrawMenu(displayPort_t *pDisplay) { - UNUSED(currentTime); - uint8_t i; OSD_Entry *p; uint8_t top = (pDisplay->rows - currentMenuIdx) / 2 - 1; @@ -385,7 +376,7 @@ void cmsDrawMenu(displayPort_t *pDisplay, uint32_t currentTime) static uint8_t pollDenom = 0; bool drawPolled = (++pollDenom % 8 == 0); - int room = cmsScreenTxRoom(pDisplay); + uint32_t room = cmsScreenTxRoom(pDisplay); if (!currentMenu) return; @@ -799,7 +790,7 @@ void cmsUpdate(displayPort_t *pDisplay, uint32_t currentTime) return; } - cmsDrawMenu(pDisplay, currentTime); + cmsDrawMenu(pDisplay); if (currentTime > lastCmsHeartBeat + 500) { // Heart beat for external CMS display device @ 500msec @@ -811,15 +802,13 @@ void cmsUpdate(displayPort_t *pDisplay, uint32_t currentTime) lastCalled = currentTime; } -void cmsHandler(uint32_t unusedTime) +void cmsHandler(uint32_t currentTime) { - UNUSED(unusedTime); - if (cmsDeviceCount < 0) return; static uint32_t lastCalled = 0; - uint32_t now = millis(); + const uint32_t now = currentTime / 1000; if (now - lastCalled >= CMS_UPDATE_INTERVAL) { cmsUpdate(¤tDisplay, now); @@ -1243,8 +1232,7 @@ OSD_Entry menuInfo[] = { void cmsx_InfoInit(void) { - int i; - for (i = 0 ; i < GIT_SHORT_REVISION_LENGTH ; i++) { + for (int i = 0 ; i < GIT_SHORT_REVISION_LENGTH ; i++) { if (shortGitRevision[i] >= 'a' && shortGitRevision[i] <= 'f') infoGitRev[i] = shortGitRevision[i] - 'a' + 'A'; else diff --git a/src/main/io/cms.h b/src/main/io/cms.h index 76d711a03d..e90f228278 100644 --- a/src/main/io/cms.h +++ b/src/main/io/cms.h @@ -1,40 +1,41 @@ #pragma once -typedef struct screenFnVTable_s { +struct displayPort_s; + +typedef struct displayPortVTable_s { int (*begin)(void); int (*end)(void); int (*clear)(void); - int (*write)(uint8_t, uint8_t, char *); + int (*write)(uint8_t col, uint8_t row, char *text); int (*heartbeat)(void); - void (*resync)(void); - uint16_t (*txroom)(void); -} screenFnVTable_t; + void (*resync)(struct displayPort_s *pPort); + uint32_t (*txroom)(void); +} displayPortVTable_t; typedef struct displayPort_s { + displayPortVTable_t *vTable; uint8_t rows; uint8_t cols; uint16_t buftime; uint16_t bufsize; - screenFnVTable_t *vTable; // CMS state bool cleared; } displayPort_t; // Device management -typedef void (*cmsDeviceInitFuncPtr)(displayPort_t *); +typedef void (*cmsDeviceInitFuncPtr)(displayPort_t *pPort); bool cmsDeviceRegister(cmsDeviceInitFuncPtr); // For main.c and scheduler void cmsInit(void); -void cmsHandler(uint32_t); +void cmsHandler(uint32_t currentTime); // Required for external CMS tables -long cmsChangeScreen(displayPort_t *, void *); -long cmsExitMenu(displayPort_t *, void *); - -#define STARTUP_HELP_TEXT1 "MENU: THR MID" -#define STARTUP_HELP_TEXT2 "+ YAW LEFT" -#define STARTUP_HELP_TEXT3 "+ PITCH UP" +long cmsChangeScreen(displayPort_t *pPort, void *ptr); +long cmsExitMenu(displayPort_t *pPort, void *ptr); +#define CMS_STARTUP_HELP_TEXT1 "MENU: THR MID" +#define CMS_STARTUP_HELP_TEXT2 "+ YAW LEFT" +#define CMS_STARTUP_HELP_TEXT3 "+ PITCH UP" diff --git a/src/main/io/display.c b/src/main/io/display.c index a9fb5c2d3f..d9b651b69d 100644 --- a/src/main/io/display.c +++ b/src/main/io/display.c @@ -23,6 +23,8 @@ #ifdef DISPLAY +#include "common/utils.h" + #include "build/version.h" #include "build/debug.h" @@ -776,22 +778,35 @@ int displayCmsWrite(uint8_t x, uint8_t y, char *s) return 0; } -screenFnVTable_t displayCmsVTable = { +int displayCmsHeartbeat(void) +{ + return 0; +} + +void displayCmsResync(displayPort_t *pPort) +{ + UNUSED(pPort); +} + +uint32_t displayCmsTxroom(void) +{ + return UINT32_MAX; +} + +displayPortVTable_t displayCmsVTable = { displayCmsBegin, displayCmsEnd, displayCmsClear, displayCmsWrite, - NULL, - NULL, - NULL, + displayCmsHeartbeat, + displayCmsResync, + displayCmsTxroom, }; void displayCmsInit(displayPort_t *pPort) { - pPort->rows = 8; - pPort->cols = 21; - pPort->buftime = 1; - pPort->bufsize = 50000; + pPort->rows = SCREEN_CHARACTER_ROW_COUNT; + pPort->cols = SCREEN_CHARACTER_COLUMN_COUNT; pPort->vTable = &displayCmsVTable; } #endif // OLEDCMS diff --git a/src/main/io/display.h b/src/main/io/display.h index e2c6c2b967..f2cf782bd1 100644 --- a/src/main/io/display.h +++ b/src/main/io/display.h @@ -47,5 +47,5 @@ void displayResetPageCycling(void); void displaySetNextPageChangeAt(uint32_t futureMicros); #ifdef CMS -void displayCmsInit(displayPort_t *); +void displayCmsInit(displayPort_t *pPort); #endif diff --git a/src/main/io/osd.c b/src/main/io/osd.c index 7c37b43db8..472dacd428 100755 --- a/src/main/io/osd.c +++ b/src/main/io/osd.c @@ -392,9 +392,11 @@ void osdInit(void) sprintf(string_buffer, "BF VERSION: %s", FC_VERSION_STRING); max7456Write(5, 6, string_buffer); - max7456Write(7, 7, STARTUP_HELP_TEXT1); - max7456Write(11, 8, STARTUP_HELP_TEXT2); - max7456Write(11, 9, STARTUP_HELP_TEXT3); +#ifdef CMS + max7456Write(7, 7, CMS_STARTUP_HELP_TEXT1); + max7456Write(11, 8, CMS_STARTUP_HELP_TEXT2); + max7456Write(11, 9, CMS_STARTUP_HELP_TEXT3); +#endif max7456RefreshAll(); @@ -669,6 +671,23 @@ int osdWrite(uint8_t x, uint8_t y, char *s) return 0; } +void osdResync(displayPort_t *pPort) +{ + max7456RefreshAll(); + pPort->rows = max7456GetRowsCount() - masterConfig.osdProfile.row_shiftdown; + pPort->cols = 30; +} + +int osdHeartbeat(void) +{ + return 0; +} + +uint32_t osdTxroom(void) +{ + return UINT32_MAX; +} + #ifdef EDIT_ELEMENT_SUPPORT void osdEditElement(void *ptr) { @@ -695,21 +714,19 @@ void osdDrawElementPositioningHelp(void) } #endif -screenFnVTable_t osdVTable = { +displayPortVTable_t osdVTable = { osdMenuBegin, osdMenuEnd, osdClearScreen, osdWrite, - NULL, - max7456RefreshAll, - NULL, + osdHeartbeat, + osdResync, + osdTxroom, }; void osdCmsInit(displayPort_t *pPort) { - shiftdown = masterConfig.osdProfile.row_shiftdown; - pPort->rows = max7456GetRowsCount() - shiftdown; - pPort->cols = 30; + osdResync(pPort); pPort->vTable = &osdVTable; } #endif // OSD diff --git a/src/main/msp/.msp_serial.h.swo b/src/main/msp/.msp_serial.h.swo new file mode 100644 index 0000000000..fd05903527 Binary files /dev/null and b/src/main/msp/.msp_serial.h.swo differ diff --git a/src/main/msp/msp_serial.c b/src/main/msp/msp_serial.c index c8d79ecbc9..409e60afc8 100644 --- a/src/main/msp/msp_serial.c +++ b/src/main/msp/msp_serial.c @@ -211,8 +211,6 @@ void mspSerialInit(void) mspSerialAllocatePorts(); } -mspPushCommandFnPtr mspPushCommandFn; - void mspSerialPush(uint8_t cmd, uint8_t *data, int datalen) { static uint8_t pushBuf[30]; @@ -234,7 +232,7 @@ void mspSerialPush(uint8_t cmd, uint8_t *data, int datalen) continue; } - mspPushCommandFn(&push, data, datalen); + sbufWriteData(&push.buf, data, datalen); sbufSwitchToReader(&push.buf, pushBuf); @@ -242,14 +240,9 @@ void mspSerialPush(uint8_t cmd, uint8_t *data, int datalen) } } -void mspSerialPushInit(mspPushCommandFnPtr mspPushCommandFnToUse) +uint32_t mspSerialTxBytesFree() { - mspPushCommandFn = mspPushCommandFnToUse; -} - -uint16_t mspSerialPushTxRoom() -{ - uint16_t minroom = 50000; + uint32_t minroom = UINT16_MAX; for (uint8_t portIndex = 0; portIndex < MAX_MSP_PORT_COUNT; portIndex++) { mspPort_t * const mspPort = &mspPorts[portIndex]; @@ -262,7 +255,7 @@ uint16_t mspSerialPushTxRoom() continue; } - uint32_t room = mspPort->port->vTable->serialTotalTxFree(mspPort->port); + uint32_t room = serialTxBytesFree(mspPort->port); if (room < minroom) { minroom = room; diff --git a/src/main/msp/msp_serial.h b/src/main/msp/msp_serial.h index 11f0d721cf..0f1c8a2fff 100644 --- a/src/main/msp/msp_serial.h +++ b/src/main/msp/msp_serial.h @@ -66,6 +66,5 @@ void mspSerialInit(void); void mspSerialProcess(mspEvaluateNonMspData_e evaluateNonMspData, mspProcessCommandFnPtr mspProcessCommandFn); void mspSerialAllocatePorts(void); void mspSerialReleasePortIfAllocated(struct serialPort_s *serialPort); -void mspSerialPushInit(mspPushCommandFnPtr mspPushCommandFn); -void mspSerialPush(uint8_t, uint8_t *, int); -uint16_t mspSerialPushTxRoom(); +void mspSerialPush(uint8_t cmd, uint8_t *data, int datalen); +uint32_t mspSerialTxBytesFree(void);