auto-sync

This commit is contained in:
rusEfi 2015-01-13 20:06:35 -06:00
parent 7ff2c7ead6
commit eb4f7c5962
27 changed files with 306 additions and 431 deletions

View File

@ -1,6 +1,5 @@
CONSOLESRC = $(PROJECT_DIR)/console/eficonsole.c \
$(PROJECT_DIR)/console/console_io.c
CONSOLESRC = $(PROJECT_DIR)/console/console_io.c
CONSOLE_SRC_CPP = $(PROJECT_DIR)/console/status_loop.cpp
CONSOLE_SRC_CPP = $(PROJECT_DIR)/console/status_loop.cpp \
$(PROJECT_DIR)/controllers/error_handling.cpp

View File

@ -3,61 +3,6 @@
#include "main.h"
#include "io_pins.h"
const char *getIo_pin_e(io_pin_e value){
switch(value) {
case INJECTOR_10_OUTPUT:
return "INJECTOR_10_OUTPUT";
case INJECTOR_11_OUTPUT:
return "INJECTOR_11_OUTPUT";
case INJECTOR_12_OUTPUT:
return "INJECTOR_12_OUTPUT";
case INJECTOR_1_OUTPUT:
return "INJECTOR_1_OUTPUT";
case INJECTOR_2_OUTPUT:
return "INJECTOR_2_OUTPUT";
case INJECTOR_3_OUTPUT:
return "INJECTOR_3_OUTPUT";
case INJECTOR_4_OUTPUT:
return "INJECTOR_4_OUTPUT";
case INJECTOR_5_OUTPUT:
return "INJECTOR_5_OUTPUT";
case INJECTOR_6_OUTPUT:
return "INJECTOR_6_OUTPUT";
case INJECTOR_7_OUTPUT:
return "INJECTOR_7_OUTPUT";
case INJECTOR_8_OUTPUT:
return "INJECTOR_8_OUTPUT";
case INJECTOR_9_OUTPUT:
return "INJECTOR_9_OUTPUT";
case IO_INVALID:
return "IO_INVALID";
case SPARKOUT_10_OUTPUT:
return "SPARKOUT_10_OUTPUT";
case SPARKOUT_11_OUTPUT:
return "SPARKOUT_11_OUTPUT";
case SPARKOUT_12_OUTPUT:
return "SPARKOUT_12_OUTPUT";
case SPARKOUT_1_OUTPUT:
return "SPARKOUT_1_OUTPUT";
case SPARKOUT_2_OUTPUT:
return "SPARKOUT_2_OUTPUT";
case SPARKOUT_3_OUTPUT:
return "SPARKOUT_3_OUTPUT";
case SPARKOUT_4_OUTPUT:
return "SPARKOUT_4_OUTPUT";
case SPARKOUT_5_OUTPUT:
return "SPARKOUT_5_OUTPUT";
case SPARKOUT_6_OUTPUT:
return "SPARKOUT_6_OUTPUT";
case SPARKOUT_7_OUTPUT:
return "SPARKOUT_7_OUTPUT";
case SPARKOUT_8_OUTPUT:
return "SPARKOUT_8_OUTPUT";
case SPARKOUT_9_OUTPUT:
return "SPARKOUT_9_OUTPUT";
}
return NULL;
}
// auto-generated from../../firmware/\controllers/algo/rusefi_enums.h
// by enum2string.jar tool

View File

@ -4,7 +4,6 @@
#include "io_pins.h"
const char *getIo_pin_e(io_pin_e value);
// auto-generated from../../firmware/controllers/algo/rusefi_enums.h

View File

@ -134,18 +134,6 @@ public:
uint32_t beforeIgnitionSch;
uint32_t ignitionSchTime;
uint32_t time2;
uint32_t time3;
uint32_t time4;
uint32_t time5;
uint32_t time6;
uint32_t before2;
uint32_t before3;
uint32_t before4;
uint32_t before5;
uint32_t before6;
float sparkAtable[DWELL_CURVE_SIZE];
float sparkBtable[DWELL_CURVE_SIZE];

View File

@ -31,37 +31,6 @@ typedef enum {
INJECTOR_NONE,
} injector_channel_e;
/**
* Logical pins. See brain_pin_e for physical pins.
*/
typedef enum {
SPARKOUT_1_OUTPUT,
SPARKOUT_2_OUTPUT,
SPARKOUT_3_OUTPUT,
SPARKOUT_4_OUTPUT,
SPARKOUT_5_OUTPUT,
SPARKOUT_6_OUTPUT,
SPARKOUT_7_OUTPUT,
SPARKOUT_8_OUTPUT,
SPARKOUT_9_OUTPUT,
SPARKOUT_10_OUTPUT,
SPARKOUT_11_OUTPUT,
SPARKOUT_12_OUTPUT,
INJECTOR_1_OUTPUT,
INJECTOR_2_OUTPUT,
INJECTOR_3_OUTPUT,
INJECTOR_4_OUTPUT,
INJECTOR_5_OUTPUT,
INJECTOR_6_OUTPUT,
INJECTOR_7_OUTPUT,
INJECTOR_8_OUTPUT,
INJECTOR_9_OUTPUT,
INJECTOR_10_OUTPUT,
INJECTOR_11_OUTPUT,
INJECTOR_12_OUTPUT,
IO_INVALID,
/**
* these seven segment display pins are related to unused external tachometer code
@ -94,13 +63,9 @@ typedef enum {
// LED_HUGE_19,
// LED_HUGE_20,
} io_pin_e;
void initPrimaryPins(void);
void initOutputPins(void);
io_pin_e getPinByName(const char *name);
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

View File

@ -141,11 +141,3 @@ void scheduleOutput(OutputSignal *signal, float delayMs, float durationMs) {
scheduleTask("out down", sDown, (int) MS2US(delayMs) + MS2US(durationMs), (schfunc_t) &turnPinLow, signal->output);
#endif
}
io_pin_e getPinByName(const char *name) {
if (startsWith(name, "spa")) {
int index = atoi(name + 3);
return (io_pin_e) ((int) SPARKOUT_1_OUTPUT - 1 + index);
}
return IO_INVALID;
}

View File

@ -1,9 +1,9 @@
CONTROLLERSSRC = \
$(PROJECT_DIR)/controllers/error_handling.c
CONTROLLERSSRC =
CONTROLLERS_SRC_CPP = $(PROJECT_DIR)/controllers/settings.cpp \
controllers/electronic_throttle.cpp \
$(PROJECT_DIR)/controllers/error_handling.cpp \
controllers/map_averaging.cpp \
controllers/flash_main.cpp \
controllers/injector_central.cpp \

View File

@ -239,8 +239,6 @@ void initInjectorCentral(Engine *engine) {
// todo: should we move this code closer to the injection logic?
for (int i = 0; i < engineConfiguration->cylindersCount; i++) {
io_pin_e pin = (io_pin_e) ((int) INJECTOR_1_OUTPUT + i);
NamedOutputPin *output = &enginePins.coils[i];
outputPinRegisterExt2(output->name, output, boardConfiguration->injectionPins[i],

View File

@ -34,12 +34,6 @@ EXTERN_ENGINE
extern engine_pins_s enginePins;
/**
* this cache allows us to find a close-enough (with one degree precision) trigger wheel index by
* given angle with fast constant speed
*/
static int triggerIndexByAngle[720];
/*
* default Volumetric Efficiency
*/
@ -255,7 +249,7 @@ void findTriggerPosition(event_trigger_position_s *position, angle_t angleOffset
angleOffset += CONFIG(globalTriggerAngleOffset);
fixAngle(angleOffset);
int index = triggerIndexByAngle[(int)angleOffset];
int index = TRIGGER_SHAPE(triggerIndexByAngle[(int)angleOffset]);
angle_t eventAngle = TRIGGER_SHAPE(eventAngles[index]);
if (angleOffset < eventAngle) {
firmwareError("angle constraint violation in registerActuatorEventExt(): %f/%f", angleOffset, eventAngle);
@ -333,7 +327,7 @@ void prepareOutputSignals(DECLARE_ENGINE_PARAMETER_F) {
}
for (int angle = 0; angle < CONFIG(engineCycle); angle++) {
triggerIndexByAngle[angle] = findAngleIndex(angle PASS_ENGINE_PARAMETER);
TRIGGER_SHAPE(triggerIndexByAngle[angle]) = findAngleIndex(angle PASS_ENGINE_PARAMETER);
}
injectonSignals.reset();

View File

@ -18,8 +18,6 @@
typedef ArrayList<OutputSignal, OUTPUT_SIGNAL_MAX_SIZE> OutputSignalList;
#define INJECTOR_PIN_BY_INDEX(index) (io_pin_e) ((int) INJECTOR_1_OUTPUT + (index))
void findTriggerPosition(
event_trigger_position_s *position, float angleOffset DECLARE_ENGINE_PARAMETER_S);

View File

@ -38,6 +38,12 @@ public:
float dutyCycle[PWM_PHASE_MAX_WAVE_PER_PWM];
/**
* this cache allows us to find a close-enough (with one degree precision) trigger wheel index by
* given angle with fast constant speed
*/
int triggerIndexByAngle[720];
float syncRatioFrom;
float syncRatioTo;

View File

@ -1,9 +1,9 @@
DEV_SRC = development/hw_layer/poten.c \
development/test/test.c \
DEV_SRC = development/test/test.c \
development/test/testbmk.c
DEV_SRC_CPP = development/trigger_emulator.cpp \
development/hw_layer/poten.cpp \
development/analog_chart.cpp \
development/rfi_perftest.cpp \
development/engine_emulator.cpp \

View File

@ -17,9 +17,7 @@
#include "pin_repository.h"
#include "pwm_generator_logic.h"
extern "C" {
#include "poten.h"
}
#include "trigger_emulator.h"
extern bool hasFirmwareErrorFlag;

View File

@ -5,17 +5,17 @@ HW_LAYER_EGT_CPP = $(PROJECT_DIR)/hw_layer/can_hw.cpp \
$(PROJECT_DIR)/hw_layer/max31855.cpp
HW_LAYER_EMS = $(HW_LAYER_EGT) \
$(PROJECT_DIR)/hw_layer/pin_repository.c \
$(PROJECT_DIR)/hw_layer/mcp3208.c \
$(PROJECT_DIR)/hw_layer/microsecond_timer.c \
$(PROJECT_DIR)/hw_layer/flash.c \
$(PROJECT_DIR)/hw_layer/rtc_helper.c \
$(PROJECT_DIR)/hw_layer/mmc_card.c \
$(PROJECT_DIR)/hw_layer/neo6m.c \
$(PROJECT_DIR)/hw_layer/wave_analyzer_hw.c
HW_LAYER_EMS_CPP = $(HW_LAYER_EGT_CPP) \
$(PROJECT_DIR)/hw_layer/pin_repository.cpp \
$(PROJECT_DIR)/hw_layer/hardware.cpp \
$(PROJECT_DIR)/hw_layer/neo6m.cpp \
$(PROJECT_DIR)/hw_layer/mmc_card.cpp \
$(PROJECT_DIR)/hw_layer/lcd/lcd_HD44780.cpp \
$(PROJECT_DIR)/hw_layer/adc_inputs.cpp \
$(PROJECT_DIR)/hw_layer/board_test.cpp \

View File

@ -1,276 +1,276 @@
/**
* @file mmc_card.c
*
* @date Dec 28, 2013
* @author Kot_dnz
* @author Andrey Belomutskiy, (c) 2012-2015
*
* default pinouts in case of SPI2 connected to MMC: PB13 - SCK, PB14 - MISO, PB15 - MOSI, PD4 - CS, 3.3v
* default pinouts in case of SPI3 connected to MMC: PB3 - SCK, PB4 - MISO, PB5 - MOSI, PD4 - CS, 3.3v
*
*/
#include "main.h"
#if EFI_FILE_LOGGING || defined(__DOXYGEN__)
#include <stdio.h>
#include <string.h>
#include "mmc_card.h"
#include "pin_repository.h"
#include "ff.h"
#include "hardware.h"
#include "engine_configuration.h"
#include "status_loop.h"
extern board_configuration_s *boardConfiguration;
#define PUSHPULLDELAY 500
static THD_WORKING_AREA(mmcThreadStack,UTILITY_THREAD_STACK_SIZE); // MMC monitor thread
/**
* MMC driver instance.
*/
MMCDriver MMCD1;
static SPIConfig hs_spicfg = { NULL, SPI_SD_MODULE_PORT, SPI_SD_MODULE_PIN,
SPI_BaudRatePrescaler_8 };
static SPIConfig ls_spicfg = { NULL, SPI_SD_MODULE_PORT, SPI_SD_MODULE_PIN,
SPI_BaudRatePrescaler_256 };
/* MMC/SD over SPI driver configuration.*/
// don't forget check if STM32_SPI_USE_SPI2 defined and spi has init with correct GPIO in hardware.c
static MMCConfig mmccfg = { &MMC_CARD_SPI, &ls_spicfg, &hs_spicfg };
static bool fs_ready = false;
#define FILE_LOG_DELAY 200
/**
* fatfs MMC/SPI
*/
static FATFS MMC_FS;
static Logging logger;
// print FAT error function
static void printError(char *str, FRESULT f_error) {
scheduleMsg(&logger, "FATfs Error \"%s\" %d", str, f_error);
}
static FIL FDLogFile;
static int totalLoggedBytes = 0;
static void printMmcPinout(void) {
scheduleMsg(&logger, "MMC CS %s:%d", portname(SPI_SD_MODULE_PORT), SPI_SD_MODULE_PIN);
// todo: we need to figure out the right SPI pinout, not just SPI2
// scheduleMsg(&logger, "MMC SCK %s:%d", portname(EFI_SPI2_SCK_PORT), EFI_SPI2_SCK_PIN);
// scheduleMsg(&logger, "MMC MISO %s:%d", portname(EFI_SPI2_MISO_PORT), EFI_SPI2_MISO_PIN);
// scheduleMsg(&logger, "MMC MOSI %s:%d", portname(EFI_SPI2_MOSI_PORT), EFI_SPI2_MOSI_PIN);
}
static void sdStatistics(void) {
printMmcPinout();
scheduleMsg(&logger, "SD enabled: %s", boolToString(boardConfiguration->isSdCardEnabled));
scheduleMsg(&logger, "fs_ready=%d totalLoggedBytes=%d", fs_ready, totalLoggedBytes);
}
/**
* @brief Create a new file with the specified name
*
* This function saves the name of the file in a global variable
* so that we can later append to that file
*/
static void createLogFile(void) {
lockSpi(SPI_NONE);
memset(&FDLogFile, 0, sizeof(FIL)); // clear the memory
FRESULT err = f_open(&FDLogFile, "rusefi.log", FA_OPEN_ALWAYS | FA_WRITE); // Create new file
if (err != FR_OK && err != FR_EXIST) {
unlockSpi();
printError("FS mount failed", err); // else - show error
return;
}
err = f_lseek(&FDLogFile, f_size(&FDLogFile)); // Move to end of the file to append data
if (err) {
unlockSpi();
printError("Seek error", err);
return;
}
f_sync(&FDLogFile);
fs_ready = true; // everything Ok
unlockSpi();
}
static void ff_cmd_dir(const char *pathx) {
char *path = (char *) pathx; // todo: fix this hack!
DIR dir;
FILINFO fno;
char *fn;
if (!fs_ready) {
scheduleMsg(&logger, "Error: No File system is mounted");
return;
}
FRESULT res = f_opendir(&dir, path);
if (res != FR_OK) {
scheduleMsg(&logger, "Error opening directory %s", path);
return;
}
int i = strlen(path);
for (;;) {
res = f_readdir(&dir, &fno);
if (res != FR_OK || fno.fname[0] == 0)
break;
if (fno.lfname[0] == '.')
continue;
fn = fno.lfname;
if (fno.fattrib & AM_DIR) {
// TODO: WHAT? WE ARE APPENDING FILE NAME TO PARAMETER??? WEIRD!!!
path[i++] = '/';
strcpy(&path[i], fn);
// res = ff_cmd_ls(path);
if (res != FR_OK)
break;
path[i] = 0;
} else {
scheduleMsg(&logger, "%c%c%c%c%c %u/%02u/%02u %02u:%02u %9lu %-12s", (fno.fattrib & AM_DIR) ? 'D' : '-',
(fno.fattrib & AM_RDO) ? 'R' : '-', (fno.fattrib & AM_HID) ? 'H' : '-',
(fno.fattrib & AM_SYS) ? 'S' : '-', (fno.fattrib & AM_ARC) ? 'A' : '-', (fno.fdate >> 9) + 1980,
(fno.fdate >> 5) & 15, fno.fdate & 31, (fno.ftime >> 11), (fno.ftime >> 5) & 63, fno.fsize,
fno.fname);
}
}
}
static int errorReported = FALSE; // this is used to report the error only once
/**
* @brief Appends specified line to the current log file
*/
void appendToLog(const char *line) {
UINT bytesWrited;
if (!fs_ready) {
if (!errorReported)
scheduleMsg(&logger, "appendToLog Error: No File system is mounted");
errorReported = TRUE;
return;
}
UINT lineLength = strlen(line);
totalLoggedBytes += lineLength;
lockSpi(SPI_NONE);
FRESULT err = f_write(&FDLogFile, line, lineLength, &bytesWrited);
if (bytesWrited < lineLength) {
printError("write error or disk full", err); // error or disk full
}
f_sync(&FDLogFile);
unlockSpi();
}
/*
* MMC card umount.
*/
static void MMCumount(void) {
if (!fs_ready) {
scheduleMsg(&logger, "Error: No File system is mounted. \"mountsd\" first");
return;
}
f_close(&FDLogFile); // close file
f_sync(&FDLogFile); // sync ALL
mmcDisconnect(&MMCD1); // Brings the driver in a state safe for card removal.
mmcStop(&MMCD1); // Disables the MMC peripheral.
f_mount(0, NULL); // FATFS: Unregister work area prior to discard it
memset(&FDLogFile, 0, sizeof(FIL)); // clear FDLogFile
fs_ready = false; // status = false
scheduleMsg(&logger, "MMC/SD card removed");
}
/*
* MMC card mount.
*/
static void MMCmount(void) {
// printMmcPinout();
if (fs_ready) {
scheduleMsg(&logger, "Error: Already mounted. \"umountsd\" first");
return;
}
// start to initialize MMC/SD
mmcObjectInit(&MMCD1); // Initializes an instance.
mmcStart(&MMCD1, &mmccfg); // Configures and activates the MMC peripheral.
// Performs the initialization procedure on the inserted card.
lockSpi(SPI_NONE);
if (mmcConnect(&MMCD1) != CH_SUCCESS) {
warning(OBD_PCM_Processor_Fault, "Can't connect or mount MMC/SD");
unlockSpi();
return;
}
unlockSpi();
// if Ok - mount FS now
memset(&MMC_FS, 0, sizeof(FATFS));
if (f_mount(0, &MMC_FS) == FR_OK) {
createLogFile();
scheduleMsg(&logger, "MMC/SD mounted!");
}
}
#if defined __GNUC__
__attribute__((noreturn)) static msg_t MMCmonThread(void)
#else
static msg_t MMCmonThread(void)
#endif
{
chRegSetThreadName("MMC_Monitor");
while (true) {
// this returns TRUE if SD module is there, even without an SD card?
if (blkIsInserted(&MMCD1)) {
if (!fs_ready) {
MMCmount();
}
}
if (isSdCardAlive())
writeLogLine();
chThdSleepMilliseconds(FILE_LOG_DELAY);
}
}
bool isSdCardAlive(void) {
return fs_ready;
}
void initMmcCard(void) {
initLogging(&logger, "mmcCard");
addConsoleAction("sdstat", sdStatistics);
if (!boardConfiguration->isSdCardEnabled) {
return;
}
/**
* FYI: SPI does not work with CCM memory, be sure to have main() stack in RAM, not in CCMRAM
*/
// start to initialize MMC/SD
mmcObjectInit(&MMCD1);
mmcStart(&MMCD1, &mmccfg);
chThdCreateStatic(mmcThreadStack, sizeof(mmcThreadStack), LOWPRIO, (tfunc_t) MMCmonThread, NULL);
addConsoleAction("mountsd", MMCmount);
addConsoleActionS("appendToLog", appendToLog);
addConsoleAction("umountsd", MMCumount);
addConsoleActionS("ls", ff_cmd_dir);
}
#endif /* EFI_FILE_LOGGING */
/**
* @file mmc_card.c
*
* @date Dec 28, 2013
* @author Kot_dnz
* @author Andrey Belomutskiy, (c) 2012-2015
*
* default pinouts in case of SPI2 connected to MMC: PB13 - SCK, PB14 - MISO, PB15 - MOSI, PD4 - CS, 3.3v
* default pinouts in case of SPI3 connected to MMC: PB3 - SCK, PB4 - MISO, PB5 - MOSI, PD4 - CS, 3.3v
*
*/
#include "main.h"
#if EFI_FILE_LOGGING || defined(__DOXYGEN__)
#include <stdio.h>
#include <string.h>
#include "mmc_card.h"
#include "pin_repository.h"
#include "ff.h"
#include "hardware.h"
#include "engine_configuration.h"
#include "status_loop.h"
extern board_configuration_s *boardConfiguration;
#define PUSHPULLDELAY 500
static THD_WORKING_AREA(mmcThreadStack,UTILITY_THREAD_STACK_SIZE); // MMC monitor thread
/**
* MMC driver instance.
*/
MMCDriver MMCD1;
static SPIConfig hs_spicfg = { NULL, SPI_SD_MODULE_PORT, SPI_SD_MODULE_PIN,
SPI_BaudRatePrescaler_8 };
static SPIConfig ls_spicfg = { NULL, SPI_SD_MODULE_PORT, SPI_SD_MODULE_PIN,
SPI_BaudRatePrescaler_256 };
/* MMC/SD over SPI driver configuration.*/
// don't forget check if STM32_SPI_USE_SPI2 defined and spi has init with correct GPIO in hardware.c
static MMCConfig mmccfg = { &MMC_CARD_SPI, &ls_spicfg, &hs_spicfg };
static bool fs_ready = false;
#define FILE_LOG_DELAY 200
/**
* fatfs MMC/SPI
*/
static FATFS MMC_FS;
static Logging logger;
// print FAT error function
static void printError(const char *str, FRESULT f_error) {
scheduleMsg(&logger, "FATfs Error \"%s\" %d", str, f_error);
}
static FIL FDLogFile;
static int totalLoggedBytes = 0;
static void printMmcPinout(void) {
scheduleMsg(&logger, "MMC CS %s:%d", portname(SPI_SD_MODULE_PORT), SPI_SD_MODULE_PIN);
// todo: we need to figure out the right SPI pinout, not just SPI2
// scheduleMsg(&logger, "MMC SCK %s:%d", portname(EFI_SPI2_SCK_PORT), EFI_SPI2_SCK_PIN);
// scheduleMsg(&logger, "MMC MISO %s:%d", portname(EFI_SPI2_MISO_PORT), EFI_SPI2_MISO_PIN);
// scheduleMsg(&logger, "MMC MOSI %s:%d", portname(EFI_SPI2_MOSI_PORT), EFI_SPI2_MOSI_PIN);
}
static void sdStatistics(void) {
printMmcPinout();
scheduleMsg(&logger, "SD enabled: %s", boolToString(boardConfiguration->isSdCardEnabled));
scheduleMsg(&logger, "fs_ready=%d totalLoggedBytes=%d", fs_ready, totalLoggedBytes);
}
/**
* @brief Create a new file with the specified name
*
* This function saves the name of the file in a global variable
* so that we can later append to that file
*/
static void createLogFile(void) {
lockSpi(SPI_NONE);
memset(&FDLogFile, 0, sizeof(FIL)); // clear the memory
FRESULT err = f_open(&FDLogFile, "rusefi.log", FA_OPEN_ALWAYS | FA_WRITE); // Create new file
if (err != FR_OK && err != FR_EXIST) {
unlockSpi();
printError("FS mount failed", err); // else - show error
return;
}
err = f_lseek(&FDLogFile, f_size(&FDLogFile)); // Move to end of the file to append data
if (err) {
unlockSpi();
printError("Seek error", err);
return;
}
f_sync(&FDLogFile);
fs_ready = true; // everything Ok
unlockSpi();
}
static void ff_cmd_dir(const char *pathx) {
char *path = (char *) pathx; // todo: fix this hack!
DIR dir;
FILINFO fno;
char *fn;
if (!fs_ready) {
scheduleMsg(&logger, "Error: No File system is mounted");
return;
}
FRESULT res = f_opendir(&dir, path);
if (res != FR_OK) {
scheduleMsg(&logger, "Error opening directory %s", path);
return;
}
int i = strlen(path);
for (;;) {
res = f_readdir(&dir, &fno);
if (res != FR_OK || fno.fname[0] == 0)
break;
if (fno.lfname[0] == '.')
continue;
fn = fno.lfname;
if (fno.fattrib & AM_DIR) {
// TODO: WHAT? WE ARE APPENDING FILE NAME TO PARAMETER??? WEIRD!!!
path[i++] = '/';
strcpy(&path[i], fn);
// res = ff_cmd_ls(path);
if (res != FR_OK)
break;
path[i] = 0;
} else {
scheduleMsg(&logger, "%c%c%c%c%c %u/%02u/%02u %02u:%02u %9lu %-12s", (fno.fattrib & AM_DIR) ? 'D' : '-',
(fno.fattrib & AM_RDO) ? 'R' : '-', (fno.fattrib & AM_HID) ? 'H' : '-',
(fno.fattrib & AM_SYS) ? 'S' : '-', (fno.fattrib & AM_ARC) ? 'A' : '-', (fno.fdate >> 9) + 1980,
(fno.fdate >> 5) & 15, fno.fdate & 31, (fno.ftime >> 11), (fno.ftime >> 5) & 63, fno.fsize,
fno.fname);
}
}
}
static int errorReported = FALSE; // this is used to report the error only once
/**
* @brief Appends specified line to the current log file
*/
void appendToLog(const char *line) {
UINT bytesWrited;
if (!fs_ready) {
if (!errorReported)
scheduleMsg(&logger, "appendToLog Error: No File system is mounted");
errorReported = TRUE;
return;
}
UINT lineLength = strlen(line);
totalLoggedBytes += lineLength;
lockSpi(SPI_NONE);
FRESULT err = f_write(&FDLogFile, line, lineLength, &bytesWrited);
if (bytesWrited < lineLength) {
printError("write error or disk full", err); // error or disk full
}
f_sync(&FDLogFile);
unlockSpi();
}
/*
* MMC card umount.
*/
static void MMCumount(void) {
if (!fs_ready) {
scheduleMsg(&logger, "Error: No File system is mounted. \"mountsd\" first");
return;
}
f_close(&FDLogFile); // close file
f_sync(&FDLogFile); // sync ALL
mmcDisconnect(&MMCD1); // Brings the driver in a state safe for card removal.
mmcStop(&MMCD1); // Disables the MMC peripheral.
f_mount(0, NULL); // FATFS: Unregister work area prior to discard it
memset(&FDLogFile, 0, sizeof(FIL)); // clear FDLogFile
fs_ready = false; // status = false
scheduleMsg(&logger, "MMC/SD card removed");
}
/*
* MMC card mount.
*/
static void MMCmount(void) {
// printMmcPinout();
if (fs_ready) {
scheduleMsg(&logger, "Error: Already mounted. \"umountsd\" first");
return;
}
// start to initialize MMC/SD
mmcObjectInit(&MMCD1); // Initializes an instance.
mmcStart(&MMCD1, &mmccfg); // Configures and activates the MMC peripheral.
// Performs the initialization procedure on the inserted card.
lockSpi(SPI_NONE);
if (mmcConnect(&MMCD1) != CH_SUCCESS) {
warning(OBD_PCM_Processor_Fault, "Can't connect or mount MMC/SD");
unlockSpi();
return;
}
unlockSpi();
// if Ok - mount FS now
memset(&MMC_FS, 0, sizeof(FATFS));
if (f_mount(0, &MMC_FS) == FR_OK) {
createLogFile();
scheduleMsg(&logger, "MMC/SD mounted!");
}
}
#if defined __GNUC__
__attribute__((noreturn)) static msg_t MMCmonThread(void)
#else
static msg_t MMCmonThread(void)
#endif
{
chRegSetThreadName("MMC_Monitor");
while (true) {
// this returns TRUE if SD module is there, even without an SD card?
if (blkIsInserted(&MMCD1)) {
if (!fs_ready) {
MMCmount();
}
}
if (isSdCardAlive())
writeLogLine();
chThdSleepMilliseconds(FILE_LOG_DELAY);
}
}
bool isSdCardAlive(void) {
return fs_ready;
}
void initMmcCard(void) {
initLogging(&logger, "mmcCard");
addConsoleAction("sdstat", sdStatistics);
if (!boardConfiguration->isSdCardEnabled) {
return;
}
/**
* FYI: SPI does not work with CCM memory, be sure to have main() stack in RAM, not in CCMRAM
*/
// start to initialize MMC/SD
mmcObjectInit(&MMCD1);
mmcStart(&MMCD1, &mmccfg);
chThdCreateStatic(mmcThreadStack, sizeof(mmcThreadStack), LOWPRIO, (tfunc_t) MMCmonThread, NULL);
addConsoleAction("mountsd", MMCmount);
addConsoleActionS("appendToLog", appendToLog);
addConsoleAction("umountsd", MMCumount);
addConsoleActionS("ls", ff_cmd_dir);
}
#endif /* EFI_FILE_LOGGING */

View File

@ -26,7 +26,7 @@ static int totalPinsUsed = 0;
/**
* @deprecated - use hwPortname() instead
*/
char *portname(GPIO_TypeDef* GPIOx) {
const char *portname(GPIO_TypeDef* GPIOx) {
if (GPIOx == GPIOA)
return "PA";
if (GPIOx == GPIOB)
@ -103,7 +103,7 @@ brain_pin_e parseBrainPin(const char *str) {
}
const char *pinStr = str + 2;
int pin = atoi(pinStr);
return basePin + pin;
return (brain_pin_e)(basePin + pin);
}
char *hwPortname(brain_pin_e brainPin) {

View File

@ -31,7 +31,7 @@ char *hwPortname(brain_pin_e brainPin);
brain_pin_e parseBrainPin(const char *str);
void mySetPadMode(const char *msg, ioportid_t port, ioportmask_t pin, iomode_t mode);
void mySetPadMode2(const char *msg, brain_pin_e pin, iomode_t mode);
char *portname(GPIO_TypeDef* GPIOx);
const char *portname(GPIO_TypeDef* GPIOx);
iomode_t getInputMode(pin_input_mode_e mode);
ioportmask_t getHwPin(brain_pin_e brainPin);

View File

@ -26,7 +26,10 @@ extern "C"
#include "efitime.h"
#include "rusefi_enums.h"
#ifdef __cplusplus
#include "datalogging.h"
#endif
#include "chprintf.h"
#ifdef __cplusplus

View File

@ -256,7 +256,7 @@ void firmwareError(const char *fmt, ...) {
}
}
static char UNUSED_RAM_SIZE[4000];
static char UNUSED_RAM_SIZE[3000];
static char UNUSED_CCM_SIZE[8000] CCM_OPTIONAL;

View File

@ -39,7 +39,7 @@ void resetConsoleActions(void) {
consoleActionCount = 0;
}
static void doAddAction(const char *token, int type, Void callback, void *param) {
static void doAddAction(const char *token, action_type_e type, Void callback, void *param) {
efiAssertVoid(consoleActionCount < CONSOLE_MAX_ACTIONS, "Too many console actions");
TokenCallback *current = &consoleActions[consoleActionCount++];
current->token = token;

View File

@ -1,14 +1,13 @@
UTIL_TEST_SRC = $(PROJECT_DIR)/util/crc.c \
$(PROJECT_DIR)/util/data_buffer.c \
$(PROJECT_DIR)/util/histogram.c \
$(PROJECT_DIR)/util/cli_registry.c
UTILSRC = $(UTIL_TEST_SRC) \
$(PROJECT_DIR)/console_util/datalogging.c
$(PROJECT_DIR)/util/histogram.c
UTILSRC = $(UTIL_TEST_SRC)
UTILSRC_CPP = $(PROJECT_DIR)/util/cyclic_buffer.cpp \
$(PROJECT_DIR)/console_util/datalogging.cpp \
$(PROJECT_DIR)/util/listener_array.cpp \
$(PROJECT_DIR)/util/cli_registry.cpp \
$(PROJECT_DIR)/util/efilib.cpp \
$(PROJECT_DIR)/util/efilib2.cpp \
$(PROJECT_DIR)/util/LocalVersionHolder.cpp

View File

@ -14,15 +14,6 @@
#include "utlist.h"
#include "event_queue.h"
static io_pin_e testLastToggledPin;
static int testToggleCounter;
void setOutputPinValue(io_pin_e pin, int value) {
// this is a test implementation of the method - we use it to see what's going on
testLastToggledPin = pin;
testToggleCounter++;
}
EventQueue schedulingQueue;
void scheduleTask(const char *msg, scheduling_s *scheduling, int delayUs, schfunc_t callback, void *param) {