added MSP_UID patch from cGiessen
added sending cell voltages (faked) via frsky telemetry by fiendie two additional cli commands (aux and dump) from jef79m - aux allows setting switches from command line, dump creates a copy-pasteable config which can be sent to a new board. git-svn-id: https://afrodevices.googlecode.com/svn/trunk/baseflight@283 7c89a4a9-59b9-e629-4cfe-3a2d53b20e61
This commit is contained in:
parent
c88614046b
commit
600f50ecac
|
@ -166,7 +166,7 @@
|
|||
<DriverSelection>4096</DriverSelection>
|
||||
</Flash1>
|
||||
<Flash2>BIN\UL2CM3.DLL</Flash2>
|
||||
<Flash3></Flash3>
|
||||
<Flash3>"" ()</Flash3>
|
||||
<Flash4></Flash4>
|
||||
</Utilities>
|
||||
<TargetArmAds>
|
||||
|
|
6363
obj/baseflight.hex
6363
obj/baseflight.hex
File diff suppressed because it is too large
Load Diff
|
@ -21,6 +21,11 @@
|
|||
|
||||
#define RADX10 (M_PI / 1800.0f) // 0.001745329252f
|
||||
|
||||
// Chip Unique ID on F103
|
||||
#define U_ID_0 (*(uint32_t*)0x1FFFF7E8)
|
||||
#define U_ID_1 (*(uint32_t*)0x1FFFF7EC)
|
||||
#define U_ID_2 (*(uint32_t*)0x1FFFF7F0)
|
||||
|
||||
typedef enum {
|
||||
SENSOR_ACC = 1 << 0,
|
||||
SENSOR_BARO = 1 << 1,
|
||||
|
|
100
src/cli.c
100
src/cli.c
|
@ -3,8 +3,10 @@
|
|||
|
||||
// we unset this on 'exit'
|
||||
extern uint8_t cliMode;
|
||||
static void cliAux(char *cmdline);
|
||||
static void cliCMix(char *cmdline);
|
||||
static void cliDefaults(char *cmdline);
|
||||
static void cliDump(char *cmdLine);
|
||||
static void cliExit(char *cmdline);
|
||||
static void cliFeature(char *cmdline);
|
||||
static void cliHelp(char *cmdline);
|
||||
|
@ -63,8 +65,10 @@ typedef struct {
|
|||
|
||||
// should be sorted a..z for bsearch()
|
||||
const clicmd_t cmdTable[] = {
|
||||
{ "aux", "feature_name auxflag or blank for list", cliAux },
|
||||
{ "cmix", "design custom mixer", cliCMix },
|
||||
{ "defaults", "reset to defaults and reboot", cliDefaults },
|
||||
{ "dump", "print configurable settings in a pastable form", cliDump },
|
||||
{ "exit", "", cliExit },
|
||||
{ "feature", "list or -val or val", cliFeature },
|
||||
{ "help", "", cliHelp },
|
||||
|
@ -387,6 +391,30 @@ static int cliCompare(const void *a, const void *b)
|
|||
return strncasecmp(ca->name, cb->name, strlen(cb->name));
|
||||
}
|
||||
|
||||
static void cliAux(char *cmdline)
|
||||
{
|
||||
int i, val = 0;
|
||||
uint8_t len;
|
||||
char *ptr;
|
||||
|
||||
len = strlen(cmdline);
|
||||
if (len == 0) {
|
||||
// print out aux channel settings
|
||||
for (i = 0; i < CHECKBOXITEMS; i++)
|
||||
printf("aux %u %u\r\n", i, cfg.activate[i]);
|
||||
} else {
|
||||
ptr = cmdline;
|
||||
i = atoi(ptr);
|
||||
if (i < CHECKBOXITEMS) {
|
||||
ptr = strchr(cmdline, ' ');
|
||||
val = atoi(ptr);
|
||||
cfg.activate[i] = val;
|
||||
} else {
|
||||
printf("Invalid Feature index: must be < %u\r\n", CHECKBOXITEMS);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void cliCMix(char *cmdline)
|
||||
{
|
||||
int i, check = 0;
|
||||
|
@ -482,6 +510,78 @@ static void cliDefaults(char *cmdline)
|
|||
systemReset(false);
|
||||
}
|
||||
|
||||
static void cliDump(char *cmdline)
|
||||
{
|
||||
|
||||
int i, val = 0;
|
||||
char buf[16];
|
||||
float thr, roll, pitch, yaw;
|
||||
uint32_t mask;
|
||||
const clivalue_t *setval;
|
||||
|
||||
printf("Current Config: Copy everything below here...\r\n");
|
||||
|
||||
// print out aux switches
|
||||
cliAux("");
|
||||
|
||||
// print out current motor mix
|
||||
printf("mixer %s\r\n", mixerNames[cfg.mixerConfiguration - 1]);
|
||||
|
||||
// print custom mix if exists
|
||||
if (cfg.customMixer[0].throttle != 0.0f) {
|
||||
for (i = 0; i < MAX_MOTORS; i++) {
|
||||
if (cfg.customMixer[i].throttle == 0.0f)
|
||||
break;
|
||||
thr = cfg.customMixer[i].throttle;
|
||||
roll = cfg.customMixer[i].roll;
|
||||
pitch = cfg.customMixer[i].pitch;
|
||||
yaw = cfg.customMixer[i].yaw;
|
||||
printf("cmix %d", i + 1);
|
||||
if (thr < 0)
|
||||
printf(" ");
|
||||
printf("%s", ftoa(thr, buf));
|
||||
if (roll < 0)
|
||||
printf(" ");
|
||||
printf("%s", ftoa(roll, buf));
|
||||
if (pitch < 0)
|
||||
printf(" ");
|
||||
printf("%s", ftoa(pitch, buf));
|
||||
if (yaw < 0)
|
||||
printf(" ");
|
||||
printf("%s\r\n", ftoa(yaw, buf));
|
||||
}
|
||||
printf("cmix %d 0 0 0 0\r\n", i + 1);
|
||||
}
|
||||
|
||||
// print enabled features
|
||||
mask = featureMask();
|
||||
for (i = 0; ; i++) { // disable all feature first
|
||||
if (featureNames[i] == NULL)
|
||||
break;
|
||||
printf("feature -%s\r\n", featureNames[i]);
|
||||
}
|
||||
for (i = 0; ; i++) { // reenable what we want.
|
||||
if (featureNames[i] == NULL)
|
||||
break;
|
||||
if (mask & (1 << i))
|
||||
printf("feature %s\r\n", featureNames[i]);
|
||||
}
|
||||
|
||||
// print RC MAPPING
|
||||
for (i = 0; i < 8; i++)
|
||||
buf[cfg.rcmap[i]] = rcChannelLetters[i];
|
||||
buf[i] = '\0';
|
||||
printf("map %s\r\n", buf);
|
||||
|
||||
// print settings
|
||||
for (i = 0; i < VALUE_COUNT; i++) {
|
||||
setval = &valueTable[i];
|
||||
printf("set %s = ", valueTable[i].name);
|
||||
cliPrintVar(setval, 0);
|
||||
uartPrint("\r\n");
|
||||
}
|
||||
}
|
||||
|
||||
static void cliExit(char *cmdline)
|
||||
{
|
||||
uartPrint("\r\nLeaving CLI mode...\r\n");
|
||||
|
|
10
src/serial.c
10
src/serial.c
|
@ -44,6 +44,9 @@
|
|||
#define MSP_ACC_TRIM 240 //out message get acc angle trim values
|
||||
#define MSP_SET_ACC_TRIM 239 //in message set acc angle trim values
|
||||
|
||||
// Additional commands that are not compatible with MultiWii
|
||||
#define MSP_UID 160 //out message Unique device ID
|
||||
|
||||
#define INBUF_SIZE 64
|
||||
|
||||
static const char boxnames[] =
|
||||
|
@ -378,6 +381,13 @@ static void evaluateCommand(void)
|
|||
for (i = 0; i < 4; i++)
|
||||
serialize16(debug[i]); // 4 variables are here for general monitoring purpose
|
||||
break;
|
||||
// Additional commands that are not compatible with MultiWii
|
||||
case MSP_UID:
|
||||
headSerialReply(12);
|
||||
serialize32(U_ID_0);
|
||||
serialize32(U_ID_1);
|
||||
serialize32(U_ID_2);
|
||||
break;
|
||||
default: // we do not know how to handle the (valid) message, indicate error MSP $M!
|
||||
headSerialError(0);
|
||||
break;
|
||||
|
|
|
@ -45,6 +45,10 @@
|
|||
#define ID_GYRO_Y 0x41
|
||||
#define ID_GYRO_Z 0x42
|
||||
|
||||
// from sensors.c
|
||||
extern uint8_t batteryCellCount;
|
||||
|
||||
|
||||
static void sendDataHead(uint8_t id)
|
||||
{
|
||||
uartWrite(PROTOCOL_HEADER);
|
||||
|
@ -132,11 +136,56 @@ static void sendGPS(void)
|
|||
serialize16(GPS_coord[LON] < 0 ? 'W' : 'E');
|
||||
}
|
||||
|
||||
/*
|
||||
* Send voltage via ID_VOLT
|
||||
*
|
||||
* NOTE: This sends voltage divided by batteryCellCount. To get the real
|
||||
* battery voltage, you need to multiply the value by batteryCellCount.
|
||||
*/
|
||||
static void sendVoltage(void)
|
||||
{
|
||||
uint16_t voltage;
|
||||
static uint16_t currentCell = 0;
|
||||
uint16_t cellNumber;
|
||||
uint32_t cellVoltage;
|
||||
uint16_t payload;
|
||||
|
||||
voltage = (vbat * 110) / 21;
|
||||
/*
|
||||
* Note: Fuck the pdf. Format for Voltage Data for single cells is like this:
|
||||
*
|
||||
* llll llll cccc hhhh
|
||||
* l: Low voltage bits
|
||||
* h: High voltage bits
|
||||
* c: Cell number (starting at 0)
|
||||
*/
|
||||
cellVoltage = vbat / batteryCellCount;
|
||||
|
||||
// Map to 12 bit range
|
||||
cellVoltage = (cellVoltage * 2100) / 42;
|
||||
|
||||
cellNumber = currentCell % batteryCellCount;
|
||||
|
||||
// Cell number is at bit 9-12
|
||||
payload = (cellNumber << 4);
|
||||
|
||||
// Lower voltage bits are at bit 0-8
|
||||
payload |= ((cellVoltage & 0x0ff) << 8);
|
||||
|
||||
// Higher voltage bits are at bits 13-15
|
||||
payload |= ((cellVoltage & 0xf00) >> 8);
|
||||
|
||||
sendDataHead(ID_VOLT);
|
||||
serialize16(payload);
|
||||
|
||||
currentCell++;
|
||||
currentCell %= batteryCellCount;
|
||||
}
|
||||
|
||||
/*
|
||||
* Send voltage with ID_VOLTAGE_AMP
|
||||
*/
|
||||
static void sendVoltageAmp()
|
||||
{
|
||||
uint16_t voltage = (vbat * 110) / 21;
|
||||
|
||||
sendDataHead(ID_VOLTAGE_AMP_BP);
|
||||
serialize16(voltage / 100);
|
||||
|
@ -186,10 +235,15 @@ void sendTelemetry(void)
|
|||
|
||||
if ((cycleNum % 8) == 0) { // Sent every 1s
|
||||
sendTemperature1();
|
||||
if (feature(FEATURE_VBAT))
|
||||
|
||||
if (feature(FEATURE_VBAT)) {
|
||||
sendVoltage();
|
||||
sendVoltageAmp();
|
||||
}
|
||||
|
||||
if (sensors(SENSOR_GPS))
|
||||
sendGPS();
|
||||
|
||||
sendTelemetryTail();
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue