Skip to content

Commit

Permalink
Merge pull request cleanflight#991 from blckmn/vcp_fix
Browse files Browse the repository at this point in the history
VCP improvements to remove need for delay in serial_cli for F4 targets.
  • Loading branch information
borisbstyle committed Aug 13, 2016
2 parents 138c302 + 17f1429 commit 74e7d8d
Show file tree
Hide file tree
Showing 14 changed files with 138 additions and 108 deletions.
2 changes: 1 addition & 1 deletion src/main/drivers/serial.c
Expand Up @@ -61,7 +61,7 @@ uint32_t serialRxBytesWaiting(serialPort_t *instance)
return instance->vTable->serialTotalRxWaiting(instance);
}

uint8_t serialTxBytesFree(serialPort_t *instance)
uint32_t serialTxBytesFree(serialPort_t *instance)
{
return instance->vTable->serialTotalTxFree(instance);
}
Expand Down
4 changes: 2 additions & 2 deletions src/main/drivers/serial.h
Expand Up @@ -63,7 +63,7 @@ struct serialPortVTable {
void (*serialWrite)(serialPort_t *instance, uint8_t ch);

uint32_t (*serialTotalRxWaiting)(serialPort_t *instance);
uint8_t (*serialTotalTxFree)(serialPort_t *instance);
uint32_t (*serialTotalTxFree)(serialPort_t *instance);

uint8_t (*serialRead)(serialPort_t *instance);

Expand All @@ -82,7 +82,7 @@ struct serialPortVTable {

void serialWrite(serialPort_t *instance, uint8_t ch);
uint32_t serialRxBytesWaiting(serialPort_t *instance);
uint8_t serialTxBytesFree(serialPort_t *instance);
uint32_t serialTxBytesFree(serialPort_t *instance);
void serialWriteBuf(serialPort_t *instance, uint8_t *data, int count);
uint8_t serialRead(serialPort_t *instance);
void serialSetBaudRate(serialPort_t *instance, uint32_t baudRate);
Expand Down
2 changes: 1 addition & 1 deletion src/main/drivers/serial_softserial.c
Expand Up @@ -412,7 +412,7 @@ uint32_t softSerialRxBytesWaiting(serialPort_t *instance)
return (s->port.rxBufferHead - s->port.rxBufferTail) & (s->port.rxBufferSize - 1);
}

uint8_t softSerialTxBytesFree(serialPort_t *instance)
uint32_t softSerialTxBytesFree(serialPort_t *instance)
{
if ((instance->mode & MODE_TX) == 0) {
return 0;
Expand Down
2 changes: 1 addition & 1 deletion src/main/drivers/serial_softserial.h
Expand Up @@ -29,7 +29,7 @@ serialPort_t *openSoftSerial(softSerialPortIndex_e portIndex, serialReceiveCallb
// serialPort API
void softSerialWriteByte(serialPort_t *instance, uint8_t ch);
uint32_t softSerialRxBytesWaiting(serialPort_t *instance);
uint8_t softSerialTxBytesFree(serialPort_t *instance);
uint32_t softSerialTxBytesFree(serialPort_t *instance);
uint8_t softSerialReadByte(serialPort_t *instance);
void softSerialSetBaudRate(serialPort_t *s, uint32_t baudRate);
bool isSoftSerialTransmitBufferEmpty(serialPort_t *s);
Expand Down
2 changes: 1 addition & 1 deletion src/main/drivers/serial_uart.c
Expand Up @@ -315,7 +315,7 @@ uint32_t uartTotalRxBytesWaiting(serialPort_t *instance)
}
}

uint8_t uartTotalTxBytesFree(serialPort_t *instance)
uint32_t uartTotalTxBytesFree(serialPort_t *instance)
{
uartPort_t *s = (uartPort_t*)instance;

Expand Down
2 changes: 1 addition & 1 deletion src/main/drivers/serial_uart.h
Expand Up @@ -66,7 +66,7 @@ serialPort_t *uartOpen(USART_TypeDef *USARTx, serialReceiveCallbackPtr callback,
// serialPort API
void uartWrite(serialPort_t *instance, uint8_t ch);
uint32_t uartTotalRxBytesWaiting(serialPort_t *instance);
uint8_t uartTotalTxBytesFree(serialPort_t *instance);
uint32_t uartTotalTxBytesFree(serialPort_t *instance);
uint8_t uartRead(serialPort_t *instance);
void uartSetBaudRate(serialPort_t *s, uint32_t baudRate);
bool isUartTransmitBufferEmpty(serialPort_t *s);
7 changes: 3 additions & 4 deletions src/main/drivers/serial_usb_vcp.c
Expand Up @@ -69,7 +69,7 @@ static uint32_t usbVcpAvailable(serialPort_t *instance)
{
UNUSED(instance);

return receiveLength;
return CDC_Receive_BytesAvailable();
}

static uint8_t usbVcpRead(serialPort_t *instance)
Expand Down Expand Up @@ -150,10 +150,9 @@ static void usbVcpBeginWrite(serialPort_t *instance)
port->buffering = true;
}

uint8_t usbTxBytesFree()
uint32_t usbTxBytesFree()
{
// Because we block upon transmit and don't buffer bytes, our "buffer" capacity is effectively unlimited.
return 255;
return CDC_Send_FreeBytes();
}

static void usbVcpEndWrite(serialPort_t *instance)
Expand Down
108 changes: 52 additions & 56 deletions src/main/io/serial_cli.c
Expand Up @@ -1000,8 +1000,8 @@ static void printRxFail(uint8_t dumpMask, master_t *defaultConfig)
for (uint8_t channel = 0; channel < MAX_SUPPORTED_RC_CHANNEL_COUNT; channel++) {
channelFailsafeConfiguration = &masterConfig.rxConfig.failsafe_channel_configurations[channel];
channelFailsafeConfigurationDefault = &defaultConfig->rxConfig.failsafe_channel_configurations[channel];
equalsDefault = channelFailsafeConfiguration->mode == channelFailsafeConfigurationDefault->mode
&& channelFailsafeConfiguration->step == channelFailsafeConfigurationDefault->step;
equalsDefault = channelFailsafeConfiguration->mode == channelFailsafeConfigurationDefault->mode
&& channelFailsafeConfiguration->step == channelFailsafeConfigurationDefault->step;
requireValue = channelFailsafeConfiguration->mode == RX_FAILSAFE_MODE_SET;
modeCharacter = rxFailsafeModeCharacters[channelFailsafeConfiguration->mode];
if (requireValue) {
Expand Down Expand Up @@ -1113,9 +1113,9 @@ static void printAux(uint8_t dumpMask, master_t *defaultConfig)
mac = &masterConfig.modeActivationConditions[i];
macDefault = &defaultConfig->modeActivationConditions[i];
equalsDefault = mac->modeId == macDefault->modeId
&& mac->auxChannelIndex == macDefault->auxChannelIndex
&& mac->range.startStep == macDefault->range.startStep
&& mac->range.endStep == macDefault->range.endStep;
&& mac->auxChannelIndex == macDefault->auxChannelIndex
&& mac->range.startStep == macDefault->range.startStep
&& mac->range.endStep == macDefault->range.endStep;
cliDumpPrintf(dumpMask, equalsDefault, "aux %u %u %u %u %u\r\n",
i,
mac->modeId,
Expand Down Expand Up @@ -1172,25 +1172,25 @@ static void printSerial(uint8_t dumpMask, master_t *defaultConfig)
serialConfig_t *serialConfigDefault;
bool equalsDefault;
for (int i = 0; i < SERIAL_PORT_COUNT; i++) {
serialConfig = &masterConfig.serialConfig;
serialConfig = &masterConfig.serialConfig;
if (!serialIsPortAvailable(serialConfig->portConfigs[i].identifier)) {
continue;
};
serialConfigDefault = &defaultConfig->serialConfig;
equalsDefault = serialConfig->portConfigs[i].identifier == serialConfigDefault->portConfigs[i].identifier
&& serialConfig->portConfigs[i].functionMask == serialConfigDefault->portConfigs[i].functionMask
&& serialConfig->portConfigs[i].msp_baudrateIndex == serialConfigDefault->portConfigs[i].msp_baudrateIndex
&& serialConfig->portConfigs[i].gps_baudrateIndex == serialConfigDefault->portConfigs[i].gps_baudrateIndex
&& serialConfig->portConfigs[i].telemetry_baudrateIndex == serialConfigDefault->portConfigs[i].telemetry_baudrateIndex
&& serialConfig->portConfigs[i].blackbox_baudrateIndex == serialConfigDefault->portConfigs[i].blackbox_baudrateIndex;
serialConfigDefault = &defaultConfig->serialConfig;
equalsDefault = serialConfig->portConfigs[i].identifier == serialConfigDefault->portConfigs[i].identifier
&& serialConfig->portConfigs[i].functionMask == serialConfigDefault->portConfigs[i].functionMask
&& serialConfig->portConfigs[i].msp_baudrateIndex == serialConfigDefault->portConfigs[i].msp_baudrateIndex
&& serialConfig->portConfigs[i].gps_baudrateIndex == serialConfigDefault->portConfigs[i].gps_baudrateIndex
&& serialConfig->portConfigs[i].telemetry_baudrateIndex == serialConfigDefault->portConfigs[i].telemetry_baudrateIndex
&& serialConfig->portConfigs[i].blackbox_baudrateIndex == serialConfigDefault->portConfigs[i].blackbox_baudrateIndex;
cliDumpPrintf(dumpMask, equalsDefault, "serial %d %d %ld %ld %ld %ld\r\n" ,
serialConfig->portConfigs[i].identifier,
serialConfig->portConfigs[i].functionMask,
baudRates[serialConfig->portConfigs[i].msp_baudrateIndex],
baudRates[serialConfig->portConfigs[i].gps_baudrateIndex],
baudRates[serialConfig->portConfigs[i].telemetry_baudrateIndex],
baudRates[serialConfig->portConfigs[i].blackbox_baudrateIndex]
);
);
}
}

Expand All @@ -1202,7 +1202,7 @@ static void cliSerial(char *cmdline)
if (isEmpty(cmdline)) {
printSerial(DUMP_MASTER, &masterConfig);

return;
return;
}
serialPortConfig_t portConfig;
memset(&portConfig, 0 , sizeof(portConfig));
Expand Down Expand Up @@ -1358,11 +1358,11 @@ static void printAdjustmentRange(uint8_t dumpMask, master_t *defaultConfig)
for (int i = 0; i < MAX_ADJUSTMENT_RANGE_COUNT; i++) {
ar = &masterConfig.adjustmentRanges[i];
arDefault = &defaultConfig->adjustmentRanges[i];
equalsDefault = ar->auxChannelIndex == arDefault->auxChannelIndex
&& ar->range.startStep == arDefault->range.startStep
&& ar->range.endStep == arDefault->range.endStep
&& ar->adjustmentFunction == arDefault->adjustmentFunction
&& ar->auxSwitchChannelIndex == arDefault->auxSwitchChannelIndex
equalsDefault = ar->auxChannelIndex == arDefault->auxChannelIndex
&& ar->range.startStep == arDefault->range.startStep
&& ar->range.endStep == arDefault->range.endStep
&& ar->adjustmentFunction == arDefault->adjustmentFunction
&& ar->auxSwitchChannelIndex == arDefault->auxSwitchChannelIndex
&& ar->adjustmentIndex == arDefault->adjustmentIndex;
cliDumpPrintf(dumpMask, equalsDefault, "adjrange %u %u %u %u %u %u %u\r\n",
i,
Expand Down Expand Up @@ -1525,8 +1525,8 @@ static void printRxRange(uint8_t dumpMask, master_t *defaultConfig)
for (int i = 0; i < NON_AUX_CHANNEL_COUNT; i++) {
channelRangeConfiguration = &masterConfig.rxConfig.channelRanges[i];
channelRangeConfigurationDefault = &defaultConfig->rxConfig.channelRanges[i];
equalsDefault = channelRangeConfiguration->min == channelRangeConfigurationDefault->min
&& channelRangeConfiguration->max == channelRangeConfigurationDefault->max;
equalsDefault = channelRangeConfiguration->min == channelRangeConfigurationDefault->min
&& channelRangeConfiguration->max == channelRangeConfigurationDefault->max;
cliDumpPrintf(dumpMask, equalsDefault, "rxrange %u %u %u\r\n", i, channelRangeConfiguration->min, channelRangeConfiguration->max);
}
}
Expand Down Expand Up @@ -1619,8 +1619,8 @@ static void printColor(uint8_t dumpMask, master_t *defaultConfig)
color = &masterConfig.colors[i];
colorDefault = &defaultConfig->colors[i];
equalsDefault = color->h == colorDefault->h
&& color->s == colorDefault->s
&& color->v == colorDefault->v;
&& color->s == colorDefault->s
&& color->v == colorDefault->v;
cliDumpPrintf(dumpMask, equalsDefault, "color %u %d,%u,%u\r\n",
i,
color->h,
Expand Down Expand Up @@ -2121,11 +2121,11 @@ static void printVtx(uint8_t dumpMask, master_t *defaultConfig)
for (int i = 0; i < MAX_CHANNEL_ACTIVATION_CONDITION_COUNT; i++) {
cac = &masterConfig.vtxChannelActivationConditions[i];
cacDefault = &defaultConfig->vtxChannelActivationConditions[i];
equalsDefault = cac->auxChannelIndex == cacDefault->auxChannelIndex
equalsDefault = cac->auxChannelIndex == cacDefault->auxChannelIndex
&& cac->band == cacDefault->band
&& cac->channel == cacDefault->channel
&& cac->range.startStep == cacDefault->range.startStep
&& cac->range.endStep == cacDefault->range.endStep;
&& cac->channel == cacDefault->channel
&& cac->range.startStep == cacDefault->range.startStep
&& cac->range.endStep == cacDefault->range.endStep;
cliDumpPrintf(dumpMask, equalsDefault, "vtx %u %u %u %u %u %u\r\n",
i,
cac->auxChannelIndex,
Expand Down Expand Up @@ -2246,7 +2246,7 @@ static bool valueEqualsDefault(const clivalue_t *value, master_t *defaultConfig)

case VAR_FLOAT:
result = *(float *)ptr == *(float *)ptrDefault;
break;
break;
}
return result;
}
Expand Down Expand Up @@ -2378,11 +2378,11 @@ static void printConfig(char *cmdline, bool doDiff)

equalsDefault = masterConfig.customServoMixer[i].targetChannel == defaultConfig.customServoMixer[i].targetChannel
&& masterConfig.customServoMixer[i].inputSource == defaultConfig.customServoMixer[i].inputSource
&& masterConfig.customServoMixer[i].rate == defaultConfig.customServoMixer[i].rate
&& masterConfig.customServoMixer[i].speed == defaultConfig.customServoMixer[i].speed
&& masterConfig.customServoMixer[i].min == defaultConfig.customServoMixer[i].min
&& masterConfig.customServoMixer[i].max == defaultConfig.customServoMixer[i].max
&& masterConfig.customServoMixer[i].box == masterConfig.customServoMixer[i].box;
&& masterConfig.customServoMixer[i].rate == defaultConfig.customServoMixer[i].rate
&& masterConfig.customServoMixer[i].speed == defaultConfig.customServoMixer[i].speed
&& masterConfig.customServoMixer[i].min == defaultConfig.customServoMixer[i].min
&& masterConfig.customServoMixer[i].max == defaultConfig.customServoMixer[i].max
&& masterConfig.customServoMixer[i].box == masterConfig.customServoMixer[i].box;

cliDumpPrintf(dumpMask, equalsDefault,"smix %d %d %d %d %d %d %d %d\r\n",
i,
Expand Down Expand Up @@ -2431,7 +2431,7 @@ static void printConfig(char *cmdline, bool doDiff)
equalsDefault = true;
for (i = 0; i < MAX_MAPPABLE_RX_INPUTS; i++) {
buf[masterConfig.rxConfig.rcmap[i]] = rcChannelLetters[i];
equalsDefault = equalsDefault && (masterConfig.rxConfig.rcmap[i] == defaultConfig.rxConfig.rcmap[i]);
equalsDefault = equalsDefault && (masterConfig.rxConfig.rcmap[i] == defaultConfig.rxConfig.rcmap[i]);
}
buf[i] = '\0';
cliDumpPrintf(dumpMask, equalsDefault, "map %s\r\n", buf);
Expand Down Expand Up @@ -2483,8 +2483,9 @@ static void printConfig(char *cmdline, bool doDiff)

uint8_t currentRateIndex = currentProfile->activeRateProfile;
uint8_t rateCount;
for (rateCount=0; rateCount<MAX_RATEPROFILES; rateCount++)
for (rateCount = 0; rateCount < MAX_RATEPROFILES; rateCount++) {
cliDumpRateProfile(rateCount, dumpMask, &defaultConfig);
}

cliPrint("\r\n# restore original rateprofile selection\r\n");
changeControlRateProfile(currentRateIndex);
Expand Down Expand Up @@ -2513,8 +2514,10 @@ static void printConfig(char *cmdline, bool doDiff)

static void cliDumpProfile(uint8_t profileIndex, uint8_t dumpMask, master_t *defaultConfig)
{
if (profileIndex >= MAX_PROFILE_COUNT) // Faulty values
if (profileIndex >= MAX_PROFILE_COUNT) {
// Faulty values
return;
}
changeProfile(profileIndex);
cliPrint("\r\n# profile\r\n");
cliProfile("");
Expand All @@ -2523,8 +2526,10 @@ static void cliDumpProfile(uint8_t profileIndex, uint8_t dumpMask, master_t *def

static void cliDumpRateProfile(uint8_t rateProfileIndex, uint8_t dumpMask, master_t *defaultConfig)
{
if (rateProfileIndex >= MAX_RATEPROFILES) // Faulty values
if (rateProfileIndex >= MAX_RATEPROFILES) {
// Faulty values
return;
}
changeControlRateProfile(rateProfileIndex);
cliPrint("\r\n# rateprofile\r\n");
cliRateProfile("");
Expand Down Expand Up @@ -2744,8 +2749,9 @@ static void cliMap(char *cmdline)

if (len == 8) {
// uppercase it
for (i = 0; i < 8; i++)
for (i = 0; i < 8; i++) {
cmdline[i] = toupper((unsigned char)cmdline[i]);
}
for (i = 0; i < 8; i++) {
if (strchr(rcChannelLetters, cmdline[i]) && !strchr(cmdline + i + 1, cmdline[i]))
continue;
Expand All @@ -2755,8 +2761,9 @@ static void cliMap(char *cmdline)
parseRcChannels(cmdline, &masterConfig.rxConfig);
}
cliPrint("Map: ");
for (i = 0; i < 8; i++)
for (i = 0; i < 8; i++) {
out[masterConfig.rxConfig.rcmap[i]] = rcChannelLetters[i];
}
out[i] = '\0';
cliPrintf("%s\r\n", out);
}
Expand Down Expand Up @@ -2952,12 +2959,9 @@ static void cliDefaults(char *cmdline)

static void cliPrint(const char *str)
{
while (*str)
while (*str) {
bufWriterAppend(cliWriter, *str++);

#ifdef USE_SLOW_SERIAL_CLI
delay(1);
#endif
}
}

static void cliPutp(void *p, char ch)
Expand All @@ -2979,11 +2983,7 @@ static bool cliDumpPrintf(uint8_t dumpMask, bool equalsDefault, const char *form
tfp_format(cliWriter, cliPutp, format, va);
va_end(va);

#ifdef USE_SLOW_SERIAL_CLI
delay(1);
#endif

return true;
return true;
}

return false;
Expand All @@ -2995,10 +2995,6 @@ static void cliPrintf(const char *fmt, ...)
va_start(va, fmt);
tfp_format(cliWriter, cliPutp, fmt, va);
va_end(va);

#ifdef USE_SLOW_SERIAL_CLI
delay(1);
#endif
}

static void cliWrite(uint8_t ch)
Expand Down Expand Up @@ -3415,11 +3411,11 @@ void cliProcess(void)
cliBuffer[bufferIndex] = 0; // null terminate

const clicmd_t *cmd;
char *options;
char *options;
for (cmd = cmdTable; cmd < cmdTable + CMD_COUNT; cmd++) {
if ((options = checkCommand(cliBuffer, cmd->name))) {
break;
}
}
}
if(cmd < cmdTable + CMD_COUNT)
cmd->func(options);
Expand Down
15 changes: 7 additions & 8 deletions src/main/target/common.h
Expand Up @@ -24,17 +24,16 @@
/* STM32F4 specific settings that apply to all F4 targets */
#ifdef STM32F4

#define MAX_AUX_CHANNELS 99
#define TASK_GYROPID_DESIRED_PERIOD 125
#define SCHEDULER_DELAY_LIMIT 10
#define USE_SLOW_SERIAL_CLI
#define I2C3_OVERCLOCK true
#define MAX_AUX_CHANNELS 99
#define TASK_GYROPID_DESIRED_PERIOD 125
#define SCHEDULER_DELAY_LIMIT 10
#define I2C3_OVERCLOCK true

#else /* when not an F4 */

#define MAX_AUX_CHANNELS 6
#define TASK_GYROPID_DESIRED_PERIOD 1000
#define SCHEDULER_DELAY_LIMIT 100
#define MAX_AUX_CHANNELS 6
#define TASK_GYROPID_DESIRED_PERIOD 1000
#define SCHEDULER_DELAY_LIMIT 100

#endif

Expand Down

0 comments on commit 74e7d8d

Please sign in to comment.