/** * this method should invoked on the main thread only */ void printWithLength(char *line) { /** * this is my way to detect serial port transmission errors * following code is functionally identical to * print("line:%d:%s\r\n", len, line); * but it is faster because it outputs the whole buffer, not single characters * We need this optimization because when we output larger chunks of data like the wave_chart: * When we work with actual hardware, it is faster to invoke 'chSequentialStreamWrite' for the * whole buffer then to invoke 'chSequentialStreamPut' once per character. */ int len = efiStrlen(line); strcpy(header, "line:"); char *p = header + efiStrlen(header); p = itoa10(p, len); *p++ = ':'; *p++ = '\0'; p = line; p += len; *p++ = '\r'; *p++ = '\n'; if (!isConsoleReady()) return; consoleOutputBuffer((const uint8_t *) header, strlen(header)); consoleOutputBuffer((const uint8_t *) line, p - line); }
/** * this thread has a lower-then-usual stack size so we cannot afford *print* methods here */ static void blinkingThread(void *arg) { (void) arg; chRegSetThreadName("communication blinking"); initialLedsBlink(); while (true) { int delayMs = isConsoleReady() ? 3 * blinkingPeriod : blinkingPeriod; #if EFI_INTERNAL_FLASH || defined(__DOXYGEN__) if (getNeedToWriteConfiguration()) { delayMs = 2 * delayMs; } #endif communicationPin.setValue(0); warningPin.setValue(0); chThdSleepMilliseconds(delayMs); communicationPin.setValue(1); #if EFI_ENGINE_CONTROL || defined(__DOXYGEN__) if (isTriggerErrorNow() || isIgnitionTimingError()) warningPin.setValue(1); #endif chThdSleepMilliseconds(delayMs); } }
/** * This methods prints the message to whatever is configured as our primary console */ void print(const char *format, ...) { #if !EFI_UART_ECHO_TEST_MODE if (!isConsoleReady()) { return; } va_list ap; va_start(ap, format); chvprintf((BaseSequentialStream*) getConsoleChannel(), format, ap); va_end(ap); #endif /* EFI_UART_ECHO_TEST_MODE */ }
/** * @brief Sends all pending data to dev console */ void updateDevConsoleState(Engine *engine) { if (!isConsoleReady()) { return; } // looks like this is not needed anymore // checkIfShouldHalt(); printPending(); /** * this should go before the firmware error so that console can detect connection */ printSensors(&logger, false); #if EFI_PROD_CODE || defined(__DOXYGEN__) // todo: unify with simulator! if (hasFirmwareError()) { scheduleMsg(&logger, "FATAL error: %s", errorMessageBuffer); warningEnabled = false; scheduleLogging(&logger); return; } #endif #if (EFI_PROD_CODE && HAL_USE_ADC) || defined(__DOXYGEN__) pokeAdcInputs(); #endif if (!fullLog) { return; } systime_t nowSeconds = getTimeNowSeconds(); printInfo(nowSeconds); #if EFI_ENGINE_CONTROL || defined(__DOXYGEN__) int currentCkpEventCounter = getCrankEventCounter(); if (prevCkpEventCounter == currentCkpEventCounter && timeOfPreviousReport == nowSeconds) { return; } timeOfPreviousReport = nowSeconds; prevCkpEventCounter = currentCkpEventCounter; #else chThdSleepMilliseconds(200); #endif printState(); #if EFI_WAVE_ANALYZER printWave(&logger); #endif scheduleLogging(&logger); }
/** * @brief Reads a whole line from the input channel. * * @param[in] chp pointer to a @p BaseChannel object * @param[in] line pointer to the line buffer * @param[in] size buffer maximum length * @return The operation status. * @retval TRUE the channel was reset or CTRL-D pressed. * @retval FALSE operation successful. */ static bool getConsoleLine(BaseSequentialStream *chp, char *line, unsigned size) { char *p = line; while (true) { if (!isConsoleReady()) { // we better do not read from USB serial before it is ready chThdSleepMilliseconds(10); continue; } short c = (short) chSequentialStreamGet(chp); if (isSerialOverUart()) { uint32_t flags; chSysLock() ; flags = chEvtGetAndClearFlagsI(&consoleEventListener); chSysUnlock() ; if (flags & SD_OVERRUN_ERROR) { // firmwareError("serial overrun"); } } #if EFI_UART_ECHO_TEST_MODE /** * That's test code - let's test connectivity */ consolePutChar((uint8_t) c); continue; #endif if (c < 0 || c == 4) { return true; } if (c == 8) { if (p != line) { // backspace consolePutChar((uint8_t) c); consolePutChar(0x20); consolePutChar((uint8_t) c); p--; } continue; } if (c == '\r') { consolePutChar('\r'); consolePutChar('\n'); *p = 0; return false; } if (c == '\n') { consolePutChar('\n'); *p = 0; return false; } if (c < 0x20) { continue; } if (p < line + size - 1) { consolePutChar((uint8_t) c); *p++ = (char) c; } } }