1
0
Fork 0
mirror of https://github.com/betaflight/betaflight.git synced 2025-07-17 13:25:30 +03:00
This commit is contained in:
jflyper 2016-11-02 09:12:37 +09:00
parent 042096fbb7
commit f58f7f65b1
12 changed files with 94 additions and 91 deletions

View file

@ -1778,17 +1778,3 @@ void mspFcInit(void)
{ {
initActiveBoxIds(); 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;
}

View file

@ -21,5 +21,3 @@
void mspFcInit(void); void mspFcInit(void);
mspResult_e mspFcProcessCommand(mspPacket_t *cmd, mspPacket_t *reply, mspPostProcessFnPtr *mspPostProcessFn); mspResult_e mspFcProcessCommand(mspPacket_t *cmd, mspPacket_t *reply, mspPostProcessFnPtr *mspPostProcessFn);
mspPushCommandFnPtr mspFcPushInit(void);

BIN
src/main/io/.canvas.c.swo Normal file

Binary file not shown.

View file

@ -9,6 +9,8 @@
#ifdef CANVAS #ifdef CANVAS
#include "common/utils.h"
#include "drivers/system.h" #include "drivers/system.h"
#include "io/cms.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); 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, canvasBegin,
canvasEnd, canvasEnd,
canvasClear, canvasClear,
canvasWrite, canvasWrite,
canvasHeartBeat, canvasHeartBeat,
NULL, canvasResync,
canvasTxRoom, canvasTxRoom,
}; };
void canvasCmsInit(displayPort_t *pPort) void canvasCmsInit(displayPort_t *pPort)
{ {
pPort->rows = 13; pPort->rows = 13; // XXX Will reflect NTSC/PAL in the future
pPort->cols = 30; pPort->cols = 30;
pPort->vTable = &canvasVTable; pPort->vTable = &canvasVTable;
} }
void canvasInit() void canvasInit()
{ {
mspSerialPushInit(mspFcPushInit()); // Called once at startup to initialize push function in msp
cmsDeviceRegister(canvasCmsInit); cmsDeviceRegister(canvasCmsInit);
} }
#endif #endif

View file

@ -37,9 +37,7 @@
#include "io/cms.h" #include "io/cms.h"
#include "io/cms_types.h" #include "io/cms_types.h"
#ifdef CANVAS
#include "io/canvas.h" #include "io/canvas.h"
#endif
#include "io/flashfs.h" #include "io/flashfs.h"
#include "io/osd.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) void cmsScreenHeartBeat(displayPort_t *instance)
{ {
if (instance->vTable->heartbeat) instance->vTable->heartbeat();
instance->vTable->heartbeat();
} }
void cmsScreenResync(displayPort_t *instance) void cmsScreenResync(displayPort_t *instance)
{ {
if (instance->vTable->resync) instance->vTable->resync(instance);
instance->vTable->resync();
} }
uint16_t cmsScreenTxRoom(displayPort_t *instance) uint16_t cmsScreenTxRoom(displayPort_t *instance)
{ {
if (instance->vTable->txroom) return instance->vTable->txroom();
return instance->vTable->txroom();
else
return 10000;
} }
void cmsScreenInit(displayPort_t *pDisp, cmsDeviceInitFuncPtr cmsDeviceInitFunc) 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; return cnt;
} }
void cmsDrawMenu(displayPort_t *pDisplay, uint32_t currentTime) void cmsDrawMenu(displayPort_t *pDisplay)
{ {
UNUSED(currentTime);
uint8_t i; uint8_t i;
OSD_Entry *p; OSD_Entry *p;
uint8_t top = (pDisplay->rows - currentMenuIdx) / 2 - 1; 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; static uint8_t pollDenom = 0;
bool drawPolled = (++pollDenom % 8 == 0); bool drawPolled = (++pollDenom % 8 == 0);
int room = cmsScreenTxRoom(pDisplay); uint32_t room = cmsScreenTxRoom(pDisplay);
if (!currentMenu) if (!currentMenu)
return; return;
@ -799,7 +790,7 @@ void cmsUpdate(displayPort_t *pDisplay, uint32_t currentTime)
return; return;
} }
cmsDrawMenu(pDisplay, currentTime); cmsDrawMenu(pDisplay);
if (currentTime > lastCmsHeartBeat + 500) { if (currentTime > lastCmsHeartBeat + 500) {
// Heart beat for external CMS display device @ 500msec // Heart beat for external CMS display device @ 500msec
@ -811,15 +802,13 @@ void cmsUpdate(displayPort_t *pDisplay, uint32_t currentTime)
lastCalled = currentTime; lastCalled = currentTime;
} }
void cmsHandler(uint32_t unusedTime) void cmsHandler(uint32_t currentTime)
{ {
UNUSED(unusedTime);
if (cmsDeviceCount < 0) if (cmsDeviceCount < 0)
return; return;
static uint32_t lastCalled = 0; static uint32_t lastCalled = 0;
uint32_t now = millis(); const uint32_t now = currentTime / 1000;
if (now - lastCalled >= CMS_UPDATE_INTERVAL) { if (now - lastCalled >= CMS_UPDATE_INTERVAL) {
cmsUpdate(&currentDisplay, now); cmsUpdate(&currentDisplay, now);
@ -1243,8 +1232,7 @@ OSD_Entry menuInfo[] = {
void cmsx_InfoInit(void) void cmsx_InfoInit(void)
{ {
int i; for (int i = 0 ; i < GIT_SHORT_REVISION_LENGTH ; i++) {
for (i = 0 ; i < GIT_SHORT_REVISION_LENGTH ; i++) {
if (shortGitRevision[i] >= 'a' && shortGitRevision[i] <= 'f') if (shortGitRevision[i] >= 'a' && shortGitRevision[i] <= 'f')
infoGitRev[i] = shortGitRevision[i] - 'a' + 'A'; infoGitRev[i] = shortGitRevision[i] - 'a' + 'A';
else else

View file

@ -1,40 +1,41 @@
#pragma once #pragma once
typedef struct screenFnVTable_s { struct displayPort_s;
typedef struct displayPortVTable_s {
int (*begin)(void); int (*begin)(void);
int (*end)(void); int (*end)(void);
int (*clear)(void); int (*clear)(void);
int (*write)(uint8_t, uint8_t, char *); int (*write)(uint8_t col, uint8_t row, char *text);
int (*heartbeat)(void); int (*heartbeat)(void);
void (*resync)(void); void (*resync)(struct displayPort_s *pPort);
uint16_t (*txroom)(void); uint32_t (*txroom)(void);
} screenFnVTable_t; } displayPortVTable_t;
typedef struct displayPort_s { typedef struct displayPort_s {
displayPortVTable_t *vTable;
uint8_t rows; uint8_t rows;
uint8_t cols; uint8_t cols;
uint16_t buftime; uint16_t buftime;
uint16_t bufsize; uint16_t bufsize;
screenFnVTable_t *vTable;
// CMS state // CMS state
bool cleared; bool cleared;
} displayPort_t; } displayPort_t;
// Device management // Device management
typedef void (*cmsDeviceInitFuncPtr)(displayPort_t *); typedef void (*cmsDeviceInitFuncPtr)(displayPort_t *pPort);
bool cmsDeviceRegister(cmsDeviceInitFuncPtr); bool cmsDeviceRegister(cmsDeviceInitFuncPtr);
// For main.c and scheduler // For main.c and scheduler
void cmsInit(void); void cmsInit(void);
void cmsHandler(uint32_t); void cmsHandler(uint32_t currentTime);
// Required for external CMS tables // Required for external CMS tables
long cmsChangeScreen(displayPort_t *, void *); long cmsChangeScreen(displayPort_t *pPort, void *ptr);
long cmsExitMenu(displayPort_t *, void *); long cmsExitMenu(displayPort_t *pPort, void *ptr);
#define STARTUP_HELP_TEXT1 "MENU: THR MID"
#define STARTUP_HELP_TEXT2 "+ YAW LEFT"
#define STARTUP_HELP_TEXT3 "+ PITCH UP"
#define CMS_STARTUP_HELP_TEXT1 "MENU: THR MID"
#define CMS_STARTUP_HELP_TEXT2 "+ YAW LEFT"
#define CMS_STARTUP_HELP_TEXT3 "+ PITCH UP"

View file

@ -23,6 +23,8 @@
#ifdef DISPLAY #ifdef DISPLAY
#include "common/utils.h"
#include "build/version.h" #include "build/version.h"
#include "build/debug.h" #include "build/debug.h"
@ -776,22 +778,35 @@ int displayCmsWrite(uint8_t x, uint8_t y, char *s)
return 0; 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, displayCmsBegin,
displayCmsEnd, displayCmsEnd,
displayCmsClear, displayCmsClear,
displayCmsWrite, displayCmsWrite,
NULL, displayCmsHeartbeat,
NULL, displayCmsResync,
NULL, displayCmsTxroom,
}; };
void displayCmsInit(displayPort_t *pPort) void displayCmsInit(displayPort_t *pPort)
{ {
pPort->rows = 8; pPort->rows = SCREEN_CHARACTER_ROW_COUNT;
pPort->cols = 21; pPort->cols = SCREEN_CHARACTER_COLUMN_COUNT;
pPort->buftime = 1;
pPort->bufsize = 50000;
pPort->vTable = &displayCmsVTable; pPort->vTable = &displayCmsVTable;
} }
#endif // OLEDCMS #endif // OLEDCMS

View file

@ -47,5 +47,5 @@ void displayResetPageCycling(void);
void displaySetNextPageChangeAt(uint32_t futureMicros); void displaySetNextPageChangeAt(uint32_t futureMicros);
#ifdef CMS #ifdef CMS
void displayCmsInit(displayPort_t *); void displayCmsInit(displayPort_t *pPort);
#endif #endif

View file

@ -392,9 +392,11 @@ void osdInit(void)
sprintf(string_buffer, "BF VERSION: %s", FC_VERSION_STRING); sprintf(string_buffer, "BF VERSION: %s", FC_VERSION_STRING);
max7456Write(5, 6, string_buffer); max7456Write(5, 6, string_buffer);
max7456Write(7, 7, STARTUP_HELP_TEXT1); #ifdef CMS
max7456Write(11, 8, STARTUP_HELP_TEXT2); max7456Write(7, 7, CMS_STARTUP_HELP_TEXT1);
max7456Write(11, 9, STARTUP_HELP_TEXT3); max7456Write(11, 8, CMS_STARTUP_HELP_TEXT2);
max7456Write(11, 9, CMS_STARTUP_HELP_TEXT3);
#endif
max7456RefreshAll(); max7456RefreshAll();
@ -669,6 +671,23 @@ int osdWrite(uint8_t x, uint8_t y, char *s)
return 0; 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 #ifdef EDIT_ELEMENT_SUPPORT
void osdEditElement(void *ptr) void osdEditElement(void *ptr)
{ {
@ -695,21 +714,19 @@ void osdDrawElementPositioningHelp(void)
} }
#endif #endif
screenFnVTable_t osdVTable = { displayPortVTable_t osdVTable = {
osdMenuBegin, osdMenuBegin,
osdMenuEnd, osdMenuEnd,
osdClearScreen, osdClearScreen,
osdWrite, osdWrite,
NULL, osdHeartbeat,
max7456RefreshAll, osdResync,
NULL, osdTxroom,
}; };
void osdCmsInit(displayPort_t *pPort) void osdCmsInit(displayPort_t *pPort)
{ {
shiftdown = masterConfig.osdProfile.row_shiftdown; osdResync(pPort);
pPort->rows = max7456GetRowsCount() - shiftdown;
pPort->cols = 30;
pPort->vTable = &osdVTable; pPort->vTable = &osdVTable;
} }
#endif // OSD #endif // OSD

Binary file not shown.

View file

@ -211,8 +211,6 @@ void mspSerialInit(void)
mspSerialAllocatePorts(); mspSerialAllocatePorts();
} }
mspPushCommandFnPtr mspPushCommandFn;
void mspSerialPush(uint8_t cmd, uint8_t *data, int datalen) void mspSerialPush(uint8_t cmd, uint8_t *data, int datalen)
{ {
static uint8_t pushBuf[30]; static uint8_t pushBuf[30];
@ -234,7 +232,7 @@ void mspSerialPush(uint8_t cmd, uint8_t *data, int datalen)
continue; continue;
} }
mspPushCommandFn(&push, data, datalen); sbufWriteData(&push.buf, data, datalen);
sbufSwitchToReader(&push.buf, pushBuf); 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; uint32_t minroom = UINT16_MAX;
}
uint16_t mspSerialPushTxRoom()
{
uint16_t minroom = 50000;
for (uint8_t portIndex = 0; portIndex < MAX_MSP_PORT_COUNT; portIndex++) { for (uint8_t portIndex = 0; portIndex < MAX_MSP_PORT_COUNT; portIndex++) {
mspPort_t * const mspPort = &mspPorts[portIndex]; mspPort_t * const mspPort = &mspPorts[portIndex];
@ -262,7 +255,7 @@ uint16_t mspSerialPushTxRoom()
continue; continue;
} }
uint32_t room = mspPort->port->vTable->serialTotalTxFree(mspPort->port); uint32_t room = serialTxBytesFree(mspPort->port);
if (room < minroom) { if (room < minroom) {
minroom = room; minroom = room;

View file

@ -66,6 +66,5 @@ void mspSerialInit(void);
void mspSerialProcess(mspEvaluateNonMspData_e evaluateNonMspData, mspProcessCommandFnPtr mspProcessCommandFn); void mspSerialProcess(mspEvaluateNonMspData_e evaluateNonMspData, mspProcessCommandFnPtr mspProcessCommandFn);
void mspSerialAllocatePorts(void); void mspSerialAllocatePorts(void);
void mspSerialReleasePortIfAllocated(struct serialPort_s *serialPort); void mspSerialReleasePortIfAllocated(struct serialPort_s *serialPort);
void mspSerialPushInit(mspPushCommandFnPtr mspPushCommandFn); void mspSerialPush(uint8_t cmd, uint8_t *data, int datalen);
void mspSerialPush(uint8_t, uint8_t *, int); uint32_t mspSerialTxBytesFree(void);
uint16_t mspSerialPushTxRoom();