Add blackbox storage and device selection to CMS

This commit is contained in:
Dan Nixon 2017-01-27 16:24:31 +00:00 committed by borisbstyle
parent 1330c8998e
commit 8fb5ea5156
3 changed files with 109 additions and 7 deletions

View File

@ -755,7 +755,7 @@ static int gcd(int num, int denom)
return gcd(denom, num % denom);
}
static void validateBlackboxConfig()
void validateBlackboxConfig()
{
int div;

View File

@ -32,6 +32,7 @@ void blackboxLogEvent(FlightLogEvent event, flightLogEventData_t *data);
void initBlackbox(void);
void handleBlackbox(timeUs_t currentTimeUs);
void validateBlackboxConfig();
void startBlackbox(void);
void finishBlackbox(void);

View File

@ -21,6 +21,7 @@
#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
@ -42,8 +43,11 @@
#include "config/config_master.h"
#include "config/feature.h"
#include "io/asyncfatfs/asyncfatfs.h"
#include "io/flashfs.h"
#include "blackbox/blackbox_io.h"
#ifdef USE_FLASHFS
static long cmsx_EraseFlash(displayPort_t *pDisplay, const void *ptr)
{
@ -65,11 +69,92 @@ static long cmsx_EraseFlash(displayPort_t *pDisplay, const void *ptr)
}
#endif // USE_FLASHFS
static const char * const cmsx_BlackboxDeviceNames[] = {
"SERIAL",
"FLASH ",
"SDCARD"
};
static bool featureRead = false;
static uint8_t cmsx_FeatureBlackbox;
static long cmsx_Blackbox_FeatureRead(void)
static uint8_t cmsx_BlackboxDevice;
static OSD_TAB_t cmsx_BlackboxDeviceTable = { &cmsx_BlackboxDevice, 2, cmsx_BlackboxDeviceNames };
#define CMS_BLACKBOX_STATUS_LENGTH 8
static char cmsx_BlackboxStatus[CMS_BLACKBOX_STATUS_LENGTH];
static uint16_t cmsx_BlackboxDeviceStorageTotal;
static uint16_t cmsx_BlackboxDeviceStorageUsed;
static uint16_t cmsx_BlackboxDeviceStorageFree;
static void cmsx_Blackbox_GetDeviceStatus()
{
/* Reset storage counters */
cmsx_BlackboxDeviceStorageTotal = 0;
cmsx_BlackboxDeviceStorageFree = 0;
cmsx_BlackboxDeviceStorageUsed = 0;
switch (blackboxConfig()->device)
{
#ifdef USE_SDCARD
case BLACKBOX_DEVICE_SDCARD:
if (!sdcard_isInserted()) {
snprintf(cmsx_BlackboxStatus, CMS_BLACKBOX_STATUS_LENGTH, "NO CARD");
} else if (!sdcard_isFunctional()) {
snprintf(cmsx_BlackboxStatus, CMS_BLACKBOX_STATUS_LENGTH, "FAULT");
} else {
switch (afatfs_getFilesystemState()) {
case AFATFS_FILESYSTEM_STATE_READY:
snprintf(cmsx_BlackboxStatus, CMS_BLACKBOX_STATUS_LENGTH, "READY");
break;
case AFATFS_FILESYSTEM_STATE_INITIALIZATION:
snprintf(cmsx_BlackboxStatus, CMS_BLACKBOX_STATUS_LENGTH, "INIT");
break;
case AFATFS_FILESYSTEM_STATE_FATAL:
case AFATFS_FILESYSTEM_STATE_UNKNOWN:
default:
snprintf(cmsx_BlackboxStatus, CMS_BLACKBOX_STATUS_LENGTH, "FAULT");
break;
}
}
/* Size in MB for SD card */
cmsx_BlackboxDeviceStorageTotal = sdcard_getMetadata()->numBlocks / 2000;
cmsx_BlackboxDeviceStorageFree = afatfs_getContiguousFreeSpace() / 1024000;
cmsx_BlackboxDeviceStorageUsed = cmsx_BlackboxDeviceStorageTotal - cmsx_BlackboxDeviceStorageFree;
break;
#endif
#ifdef USE_FLASHFS
case BLACKBOX_DEVICE_FLASH:
const flashGeometry_t *geometry = flashfsGetGeometry();
if (flashfsIsReady()) {
snprintf(cmsx_BlackboxStatus, CMS_BLACKBOX_STATUS_LENGTH, "READY");
/* Size in KB for flash */
cmsx_BlackboxDeviceStorageTotal = geometry->totalSize;
cmsx_BlackboxDeviceStorageUsed = flashfsGetOffset();
cmsx_BlackboxDeviceStorageFree = cmsx_BlackboxDeviceStorageTotal - cmsx_BlackboxDeviceStorageUsed;
} else {
snprintf(cmsx_BlackboxStatus, CMS_BLACKBOX_STATUS_LENGTH, "FAULT");
}
break;
#endif
default:
snprintf(cmsx_BlackboxStatus, CMS_BLACKBOX_STATUS_LENGTH, "---");
}
}
static long cmsx_Blackbox_onEnter(void)
{
cmsx_Blackbox_GetDeviceStatus();
cmsx_BlackboxDevice = blackboxConfig()->device;
if (!featureRead) {
cmsx_FeatureBlackbox = feature(FEATURE_BLACKBOX) ? 1 : 0;
featureRead = true;
@ -78,6 +163,16 @@ static long cmsx_Blackbox_FeatureRead(void)
return 0;
}
static long cmsx_Blackbox_onExit(const OSD_Entry *self)
{
UNUSED(self);
blackboxConfig()->device = cmsx_BlackboxDevice;
validateBlackboxConfig();
return 0;
}
static long cmsx_Blackbox_FeatureWriteback(void)
{
if (featureRead) {
@ -93,11 +188,16 @@ static long cmsx_Blackbox_FeatureWriteback(void)
static OSD_Entry cmsx_menuBlackboxEntries[] =
{
{ "-- BLACKBOX --", OME_Label, NULL, NULL, 0},
{ "ENABLED", OME_Bool, NULL, &cmsx_FeatureBlackbox, 0 },
{ "RATE DENOM", OME_UINT8, NULL, &(OSD_UINT8_t){ &blackboxConfig()->rate_denom,1,32,1 }, 0 },
{ "ENABLED", OME_Bool, NULL, &cmsx_FeatureBlackbox, 0 },
{ "DEVICE", OME_TAB, NULL, &cmsx_BlackboxDeviceTable, 0 },
{ "(STATUS)", OME_String, NULL, &cmsx_BlackboxStatus, 0 },
{ "(USED)", OME_UINT16, NULL, &(OSD_UINT16_t){ &cmsx_BlackboxDeviceStorageUsed, 0, 0, 0 }, DYNAMIC },
{ "(FREE)", OME_UINT16, NULL, &(OSD_UINT16_t){ &cmsx_BlackboxDeviceStorageFree, 0, 0, 0 }, DYNAMIC },
/* { "(TOTAL)", OME_UINT16, NULL, &(OSD_UINT16_t){ &cmsx_BlackboxDeviceStorageTotal, 0, 0, 0 }, DYNAMIC }, */
{ "RATE DENOM", OME_UINT8, NULL, &(OSD_UINT8_t){ &blackboxConfig()->rate_denom, 1, 32, 1 }, 0 },
#ifdef USE_FLASHFS
{ "ERASE FLASH", OME_Funcall, cmsx_EraseFlash, NULL, 0 },
{ "ERASE FLASH", OME_Funcall, cmsx_EraseFlash, NULL, 0 },
#endif // USE_FLASHFS
{ "BACK", OME_Back, NULL, NULL, 0 },
@ -107,9 +207,10 @@ static OSD_Entry cmsx_menuBlackboxEntries[] =
CMS_Menu cmsx_menuBlackbox = {
.GUARD_text = "MENUBB",
.GUARD_type = OME_MENU,
.onEnter = cmsx_Blackbox_FeatureRead,
.onExit = NULL,
.onEnter = cmsx_Blackbox_onEnter,
.onExit = cmsx_Blackbox_onExit,
.onGlobalExit = cmsx_Blackbox_FeatureWriteback,
.entries = cmsx_menuBlackboxEntries
};
#endif