Add MSPs for Blackbox and SD card status/configuration

This commit is contained in:
Nicholas Sherlock 2015-11-30 16:20:17 +13:00 committed by borisbstyle
parent 28c8a918db
commit e9b6867d40
3 changed files with 108 additions and 3 deletions

View File

@ -367,6 +367,14 @@ static blackboxMainState_t* blackboxHistory[3];
static bool blackboxModeActivationConditionPresent = false;
/**
* Return true if it is safe to edit the Blackbox configuration in the emasterConfig.
*/
bool blackboxMayEditConfig()
{
return blackboxState <= BLACKBOX_STATE_STOPPED;
}
static bool blackboxIsOnlyLoggingIntraframes() {
return masterConfig.blackbox_rate_num == 1 && masterConfig.blackbox_rate_denom == 32;
}

View File

@ -25,3 +25,5 @@ void initBlackbox(void);
void handleBlackbox(void);
void startBlackbox(void);
void finishBlackbox(void);
bool blackboxMayEditConfig();

View File

@ -42,7 +42,7 @@
#include "drivers/timer.h"
#include "drivers/pwm_rx.h"
#include "drivers/gyro_sync.h"
#include "drivers/sdcard.h"
#include "drivers/buf_writer.h"
#include "rx/rx.h"
#include "rx/msp.h"
@ -55,6 +55,7 @@
#include "io/serial.h"
#include "io/ledstrip.h"
#include "io/flashfs.h"
#include "io/asyncfatfs/asyncfatfs.h"
#include "telemetry/telemetry.h"
@ -74,6 +75,8 @@
#include "flight/navigation.h"
#include "flight/altitudehold.h"
#include "blackbox/blackbox.h"
#include "mw.h"
#include "config/runtime_config.h"
@ -238,6 +241,11 @@ static const char * const boardIdentifier = TARGET_BOARD_IDENTIFIER;
#define MSP_RXFAIL_CONFIG 77 //out message Returns RXFAIL settings
#define MSP_SET_RXFAIL_CONFIG 78 //in message Sets RXFAIL settings
#define MSP_SDCARD_SUMMARY 79 //out message Get the state of the SD card
#define MSP_BLACKBOX_CONFIG 80 //out message Get blackbox settings
#define MSP_SET_BLACKBOX_CONFIG 81 //in message Set blackbox settings
//
// Baseflight MSP commands (if enabled they exist in Cleanflight)
//
@ -393,6 +401,14 @@ typedef enum {
COMMAND_RECEIVED
} mspState_e;
typedef enum {
MSP_SDCARD_STATE_NOT_PRESENT = 0,
MSP_SDCARD_STATE_FATAL = 1,
MSP_SDCARD_STATE_CARD_INIT = 2,
MSP_SDCARD_STATE_FS_INIT = 3,
MSP_SDCARD_STATE_READY = 4
} mspSDCardState_e;
typedef enum {
UNUSED_PORT = 0,
FOR_GENERAL_MSP,
@ -553,17 +569,65 @@ reset:
}
}
static void serializeSDCardSummaryReply(void)
{
headSerialReply(3 + 4 + 4);
#ifdef USE_SDCARD
uint8_t flags = 1 /* SD card supported */ ;
uint8_t state;
serialize8(flags);
// Merge the card and filesystem states together
if (!sdcard_isInserted()) {
state = MSP_SDCARD_STATE_NOT_PRESENT;
} else {
switch (afatfs_getFilesystemState()) {
case AFATFS_FILESYSTEM_STATE_READY:
state = MSP_SDCARD_STATE_READY;
break;
case AFATFS_FILESYSTEM_STATE_INITIALIZATION:
if (sdcard_isInitialized()) {
state = MSP_SDCARD_STATE_FS_INIT;
} else {
state = MSP_SDCARD_STATE_CARD_INIT;
}
break;
case AFATFS_FILESYSTEM_STATE_FATAL:
case AFATFS_FILESYSTEM_STATE_UNKNOWN:
state = MSP_SDCARD_STATE_FATAL;
break;
}
}
serialize8(state);
serialize8(afatfs_getLastError());
// Write free space and total space in kilobytes
serialize32(afatfs_getContiguousFreeSpace() / 1024);
serialize32(sdcard_getMetadata()->numBlocks / 2); // Block size is half a kilobyte
#else
serialize8(0);
serialize8(0);
serialize8(0);
serialize32(0);
serialize32(0);
#endif
}
static void serializeDataflashSummaryReply(void)
{
headSerialReply(1 + 3 * 4);
#ifdef USE_FLASHFS
const flashGeometry_t *geometry = flashfsGetGeometry();
serialize8(flashfsIsReady() ? 1 : 0);
uint8_t flags = (flashfsIsReady() ? 1 : 0) | 2 /* FlashFS is supported */;
serialize8(flags);
serialize32(geometry->sectors);
serialize32(geometry->totalSize);
serialize32(flashfsGetOffset()); // Effectively the current number of bytes stored on the volume
#else
serialize8(0);
serialize8(0); // FlashFS is neither ready nor supported
serialize32(0);
serialize32(0);
serialize32(0);
@ -1304,6 +1368,26 @@ static bool processOutCommand(uint8_t cmdMSP)
break;
#endif
case MSP_BLACKBOX_CONFIG:
headSerialReply(4);
#ifdef BLACKBOX
serialize8(1); //Blackbox supported
serialize8(masterConfig.blackbox_device);
serialize8(masterConfig.blackbox_rate_num);
serialize8(masterConfig.blackbox_rate_denom);
#else
serialize8(0); // Blackbox not supported
serialize8(0);
serialize8(0);
serialize8(0);
#endif
break;
case MSP_SDCARD_SUMMARY:
serializeSDCardSummaryReply();
break;
case MSP_BF_BUILD_INFO:
headSerialReply(11 + 4 + 4);
for (i = 0; i < 11; i++)
@ -1575,6 +1659,17 @@ static bool processInCommand(void)
readEEPROM();
break;
#ifdef BLACKBOX
case MSP_SET_BLACKBOX_CONFIG:
// Don't allow config to be updated while Blackbox is logging
if (blackboxMayEditConfig()) {
masterConfig.blackbox_device = read8();
masterConfig.blackbox_rate_num = read8();
masterConfig.blackbox_rate_denom = read8();
}
break;
#endif
#ifdef USE_FLASHFS
case MSP_DATAFLASH_ERASE:
flashfsEraseCompletely();