Update debug info

Change pin configs
Clean up some code
This commit is contained in:
Ben V. Brown
2018-05-06 18:01:34 +10:00
parent 1ae8b2f216
commit bf1fa74d72
12 changed files with 242 additions and 269 deletions

View File

@@ -7,7 +7,10 @@ endif
# Discover the source files to build
SOURCE := $(shell find . -type f -name '*.c')
SOURCE_CPP := $(shell find . -type f -name '*.cpp')
SOURCES := $(shell find . -type f -name '*.c*')
S_SRCS := $(shell find . -type f -name '*.s')
CPPCHECK := cppcheck
CHECKFLAGS := -q --error-exitcode=1
APP_INC_DIR = ./inc
CMSIS_DEVICE_INC_DIR = ./CMSIS/device
@@ -172,8 +175,8 @@ OUT_OBJS_CPP=$(addprefix $(OUTPUT_DIR)/,$(OBJS_CPP))
OUT_OBJS_S=$(addprefix $(OUTPUT_DIR)/,$(OBJS_S))
OUT_HEXFILE=$(addprefix $(HEXFILE_DIR)/,$(OUTPUT_EXE))
all: $(OUT_HEXFILE).hex
all: cppcheck.out.xml $(OUT_HEXFILE).hex
#
# The rule to create the target directory
#
@@ -209,6 +212,8 @@ $(OUT_OBJS_S): $(OUTPUT_DIR)/%.o: %.s Makefile
@echo 'Finished building: $<'
@echo ' '
cppcheck.out.xml: $(SOURCES)
$(CPPCHECK) $(CHECKFLAGS) $^ -xml >$@
clean :
rm -Rf $(OUTPUT_DIR)

View File

@@ -101,12 +101,14 @@
#define configTICK_RATE_HZ ((TickType_t)100)
#define configMAX_PRIORITIES ( 4 )
#define configMINIMAL_STACK_SIZE ((uint16_t)256)
#define configTOTAL_HEAP_SIZE ((size_t)10240)
#define configMAX_TASK_NAME_LEN ( 16 )
#define configTOTAL_HEAP_SIZE ((size_t)10240) /*Currently use about 9000*/
#define configMAX_TASK_NAME_LEN ( 48 )
#define configUSE_16_BIT_TICKS 0
#define configUSE_MUTEXES 1
#define configQUEUE_REGISTRY_SIZE 8
#define configUSE_PORT_OPTIMISED_TASK_SELECTION 1
#define configCHECK_FOR_STACK_OVERFLOW 2
/* Co-routine definitions. */
#define configUSE_CO_ROUTINES 0
@@ -122,6 +124,7 @@ to exclude the API function. */
#define INCLUDE_vTaskDelayUntil 0
#define INCLUDE_vTaskDelay 1
#define INCLUDE_xTaskGetSchedulerState 1
#define INCLUDE_uxTaskGetStackHighWaterMark 1
/* Cortex-M specific definitions. */
#ifdef __NVIC_PRIO_BITS

View File

@@ -35,7 +35,7 @@ void HAL_I2C_MasterTxCpltCallback(I2C_HandleTypeDef *hi2c);
void HAL_I2C_MasterRxCpltCallback(I2C_HandleTypeDef *hi2c);
void HAL_I2C_MemTxCpltCallback(I2C_HandleTypeDef *hi2c);
void HAL_I2C_MemRxCpltCallback(I2C_HandleTypeDef *hi2c);
void vApplicationStackOverflowHook( xTaskHandle *pxTask, signed portCHAR *pcTaskName );
#ifdef __cplusplus
}
#endif

View File

@@ -14,7 +14,6 @@ FRToSI2C::FRToSI2C(I2C_HandleTypeDef* i2chandle) {
void FRToSI2C::CpltCallback() {
BaseType_t xHigherPriorityTaskWoken = pdFALSE;
if (I2CSemaphore) {
xSemaphoreGiveFromISR(I2CSemaphore, &xHigherPriorityTaskWoken);
portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
@@ -34,10 +33,13 @@ void FRToSI2C::Mem_Read(uint16_t DevAddress, uint16_t MemAddress,
//Get the mutex so we can use the I2C port
//Wait up to 1 second for the mutex
if ( xSemaphoreTake( I2CSemaphore, ( TickType_t ) 1000 ) == pdTRUE) {
HAL_I2C_Mem_Read(i2c, DevAddress, MemAddress, MemAddSize, pData,
Size, 5000);
if (HAL_I2C_Mem_Read(i2c, DevAddress, MemAddress, MemAddSize, pData,
Size, 5000) != HAL_OK) {
NVIC_SystemReset();
}
xSemaphoreGive(I2CSemaphore);
} else {
NVIC_SystemReset();
}
}
@@ -56,10 +58,14 @@ void FRToSI2C::Mem_Write(uint16_t DevAddress, uint16_t MemAddress,
//Get the mutex so we can use the I2C port
//Wait up to 1 second for the mutex
if ( xSemaphoreTake( I2CSemaphore, ( TickType_t ) 1000 ) == pdTRUE) {
HAL_I2C_Mem_Write(i2c, DevAddress, MemAddress, MemAddSize, pData,
Size, 5000);
if (HAL_I2C_Mem_Write(i2c, DevAddress, MemAddress, MemAddSize,
pData, Size, 5000) != HAL_OK) {
NVIC_SystemReset();
}
xSemaphoreGive(I2CSemaphore);
} else {
NVIC_SystemReset();
}
}
@@ -81,8 +87,13 @@ void FRToSI2C::Transmit(uint16_t DevAddress, uint8_t* pData, uint16_t Size) {
//Get the mutex so we can use the I2C port
//Wait up to 1 second for the mutex
if ( xSemaphoreTake( I2CSemaphore, ( TickType_t ) 1000 ) == pdTRUE) {
HAL_I2C_Master_Transmit(i2c, DevAddress, pData, Size, 5000);
if (HAL_I2C_Master_Transmit(i2c, DevAddress, pData, Size, 5000)
!= HAL_OK) {
NVIC_SystemReset();
}
xSemaphoreGive(I2CSemaphore);
} else {
NVIC_SystemReset();
}
}

View File

@@ -34,7 +34,7 @@ void MMA8652FC::initalize() {
I2C_RegisterWrite(PL_COUNT_REG, 200); //200 count debounce
I2C_RegisterWrite(PL_BF_ZCOMP_REG, 0b01000111); //Set the threshold to 42 degrees
I2C_RegisterWrite(P_L_THS_REG, 0b10011100); //Up the trip angles
I2C_RegisterWrite( CTRL_REG4, 0x01 | (1 << 4)); // Enable dataready interrupt & orientation interrupt
I2C_RegisterWrite( CTRL_REG4, 0); // Disable IRQ's
I2C_RegisterWrite( CTRL_REG5, 0x01); // Route data ready interrupts to INT1 ->PB5 ->EXTI5, leaving orientation routed to INT2
I2C_RegisterWrite( CTRL_REG2, 0x12); //Set maximum resolution oversampling
I2C_RegisterWrite( XYZ_DATA_CFG_REG, (1 << 4)); //select high pass filtered data

View File

@@ -60,13 +60,11 @@ OLED::OLED(FRToSI2C* i2cHandle) {
void OLED::initialize() {
HAL_Delay(5);
HAL_GPIO_WritePin(OLED_RESET_GPIO_Port, OLED_RESET_Pin, GPIO_PIN_SET);
HAL_Delay(5);
HAL_Delay(10);
//Send the setup settings
i2c->Transmit( DEVICEADDR_OLED, (uint8_t*) OLED_Setup_Array, configLength);
//displayOnOff(true);
displayOnOff(true);
}
//Write out the buffer to the OLEd & call any rendering objects
@@ -174,7 +172,7 @@ void OLED::setRotation(bool leftHanded) {
OLED_Setup_Array[11] = 0xC0;
OLED_Setup_Array[19] = 0xA0;
}
i2c->Transmit( DEVICEADDR_OLED, (uint8_t*) OLED_Setup_Array, 50);
i2c->Transmit( DEVICEADDR_OLED, (uint8_t*) OLED_Setup_Array, configLength);
inLeftHandedMode = leftHanded;
}
}

View File

@@ -38,7 +38,7 @@ void Setup_HAL() {
MX_TIM2_Init();
MX_IWDG_Init();
HAL_ADC_Start_DMA(&hadc1, (uint32_t*) ADCReadings, 64);//start DMA of normal readings
HAL_ADC_Start_DMA(&hadc1, (uint32_t*) ADCReadings, 64); //start DMA of normal readings
HAL_ADCEx_InjectedStart(&hadc1); //enable injected readings
}
@@ -131,7 +131,9 @@ static void MX_ADC1_Init(void) {
//F in = 10.66 MHz
/*
* Injected time is 1 delay clock + (12 adc cycles*4)+4*sampletime =~217 clocks = 0.2ms
*
* Charge time is 0.016 uS ideally
* So Sampling time must be >= 0.016uS
* 1/10.66MHz is 0.09uS, so 1 CLK is *should* be enough
* */
sConfigInjected.InjectedChannel = ADC_CHANNEL_8;
sConfigInjected.InjectedRank = 1;
@@ -143,13 +145,16 @@ static void MX_ADC1_Init(void) {
sConfigInjected.InjectedOffset = 0;
HAL_ADCEx_InjectedConfigChannel(&hadc1, &sConfigInjected);
sConfigInjected.InjectedSamplingTime = ADC_SAMPLETIME_1CYCLE_5;
sConfigInjected.InjectedRank = 2;
HAL_ADCEx_InjectedConfigChannel(&hadc1, &sConfigInjected);
sConfigInjected.InjectedRank = 3;
HAL_ADCEx_InjectedConfigChannel(&hadc1, &sConfigInjected);
sConfigInjected.InjectedRank = 4;
HAL_ADCEx_InjectedConfigChannel(&hadc1, &sConfigInjected);
SET_BIT(hadc1.Instance->CR1, ( ADC_CR1_JEOCIE ));//Enable end of injected conv irq
SET_BIT(hadc1.Instance->CR1, ( ADC_CR1_JEOCIE )); //Enable end of injected conv irq
while(HAL_ADCEx_Calibration_Start(&hadc1) != HAL_OK);
}
/* I2C1 init function */
@@ -288,13 +293,13 @@ static void MX_DMA_Init(void) {
/* DMA interrupt init */
/* DMA1_Channel1_IRQn interrupt configuration */
HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 5, 0);
HAL_NVIC_SetPriority(DMA1_Channel1_IRQn, 15, 0);
HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn);
/* DMA1_Channel6_IRQn interrupt configuration */
HAL_NVIC_SetPriority(DMA1_Channel6_IRQn, 5, 0);
HAL_NVIC_SetPriority(DMA1_Channel6_IRQn, 15, 0);
HAL_NVIC_EnableIRQ(DMA1_Channel6_IRQn);
/* DMA1_Channel7_IRQn interrupt configuration */
HAL_NVIC_SetPriority(DMA1_Channel7_IRQn, 5, 0);
HAL_NVIC_SetPriority(DMA1_Channel7_IRQn, 15, 0);
HAL_NVIC_EnableIRQ(DMA1_Channel7_IRQn);
}
@@ -336,13 +341,16 @@ static void MX_GPIO_Init(void) {
| GPIO_PIN_15;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
//Set PA 11 and PA 12 to GND to stop usb detection, 14 re-rused for debug
//Set PA 11 and PA 12 to GND to stop usb detection, 13/14 re-rused for debug
GPIO_InitStruct.Pin = GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_14 | GPIO_PIN_13;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_12, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_13, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_14, GPIO_PIN_RESET);
/*Configure GPIO pins : KEY_B_Pin KEY_A_Pin */
GPIO_InitStruct.Pin = KEY_B_Pin | KEY_A_Pin;
@@ -361,10 +369,11 @@ static void MX_GPIO_Init(void) {
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(OLED_RESET_GPIO_Port, &GPIO_InitStruct);
/*Configure GPIO pins : INT_Orientation_Pin INT_Movement_Pin */
/* Configure GPIO pins : INT_Orientation_Pin INT_Movement_Pin */
/* Not used anymore*/
GPIO_InitStruct.Pin = INT_Orientation_Pin | INT_Movement_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
GPIO_InitStruct.Pull = GPIO_PULLUP; //Technically the IMU is P-P but safer to pullup (very tiny current cost)
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
/*Configure peripheral I/O remapping */

View File

@@ -231,33 +231,33 @@ const char* SettingsDescriptions[17] = {
/* Shutdown timeout */ "Время до отключения <Доступно отключение>.",
/* Motion sensitivity level */ "Акселерометр <0 - Выкл., 1 - Мин. чувствительность, 9 - Макс. чувствительность>.",
/* Temperature in F and C */ "Единица измерения температуры. < C - Цельсий, F - Фаренгейт >",
/* Advanced idle display mode enabled */ "Показывать детальную информацию в режиме настроек <Вместо картинки>.",
/* Advanced idle display mode enabled */ "Показывать детальную в режиме настроек <Вместо картинки>.",
/* Display rotation mode */ "Ориентация дисплея. <A - Автоповорот, L - Левша, R - Правша>",
/* Boost enabled */ "Повышение температуры при удержании кнопки А в режиме пайки.",
/* Boost enabled */ "Турбо-режим при удержании кнопки А в режиме пайки.",
/* Boost temperature */ "Температура в Турбо-режиме.",
/* Automatic start mode */ "Автоматический переход в режим пайки при включении питания.",
/* Cooldown blink */ "Показывать изменение температуры на мигающем экране в процессе охлаждения.",
/* Cooldown blink */ "Показывать изменение температуры в процессе охлаждения, мигая экраном.",
/* Temperature calibration enter menu */ "Калибровка температурного датчика.",
/* Settings reset command */ "Сброс всех настроек к исходным значениям.",
/* Calibrate input voltage */ "Калибровка напряжения. Настройка кнопками, длительное нажатие для завершения.",
/* Settings reset command */ "Сброс всех настроек к исходным значения.",
/* Calibrate input voltage */ "Калибровка напряжения входа. Настройка кнопками, нажать и удержать чтобы завершить.",
/* Advanced soldering screen enabled */ "Показывать детальную информацию при пайке.",
/* Description Scroll Speed */ "Скорость прокрутки текста.",
};
const char* SettingsCalibrationWarning = "Убедитесь, что жало остыло до комнатной температуры, прежде чем продолжать!";
const char* SettingsResetWarning = "Вы действительно хотите сбросить настройки до значений по умолчанию?";
const char* UVLOWarningString = "АККУМ--!"; // <=8 chars
const char* UndervoltageString = "Низ. напряжение!"; // <=16 chars
const char* UVLOWarningString = "АККУМ--"; // <=8 chars
const char* UndervoltageString = "Под питанием"; // <=16 chars
const char* InputVoltageString = "Питание(B):"; // <=11 chars, preferably end with a space
const char* WarningTipTempString = "Жало t°: "; // <=12 chars, preferably end with a space
const char* BadTipString = "ПлохЖало"; // <=8 chars
const char* SleepingSimpleString = "Сон "; // Must be <= 4 chars
const char* BadTipString = "Жало--"; // <=8 chars
const char* SleepingSimpleString = "Сон "; // Must be <= 4 chars
const char* SleepingAdvancedString = "Ожидание..."; // <=16 chars
const char* WarningSimpleString = " АЙ!"; // Must be <= 4 chars
const char* WarningAdvancedString = "ВНИМАНИЕ ГОРЯЧО!"; // <=16 chars
const char* WarningAdvancedString = "ВНИМАНИЕ ГОРЯЧО!"; // <=16 chars
const char* SleepingTipAdvancedString = "Жало:"; // <=6 chars
const char* IdleTipString = "Жало:"; // IdleTipString+IdleSetString <= 10
const char* IdleSetString = " ->"; // preferably start with a space; IdleTipString+IdleSetString <= 10
const char* IdleSetString = " ->"; // preferably start with a space; IdleTipString+IdleSetString <= 10
const char* TipDisconnectedString = "Жало отключено!"; // <=16 chars
const char* SolderingAdvancedPowerPrompt = "Питание: "; // <=12 chars
const char* OffString ="Off"; // 3 chars max
@@ -296,17 +296,16 @@ const char* SettingsShortNames[17][2] = {
/* (<= 11) Message Scroll Speed */ {"Скорость","текста"}, //8,6
};
// SettingsMenuEntries lengths <= 13 per line (\n starts second line)
const char* SettingsMenuEntries[4] = {
/* Soldering Menu */ "Настройки\nрежима пайки",
/* Power Saving Menu */ "Сон и энерго-\nсбережение",
/* UI Menu */ "Настройки\nинтерфейса",
/* Advanced Menu */ "Расширенные\nнастройки", };
const char* SettingsMenuEntriesDescriptions[4] = {
"Режим пайки. Настройки действуют при включенном жале.",
"Поведение при простое для экономии энергии и безопасности использования.",
"Настройки отображения данных на экране.",
"Расширенные настройки, вывод дополнительной информации."
/*Soldering Menu*/"Пайка",
/* Power Saving Menu*/"Сон",
/* UI Menu*/"Интерфейс",
/* Advanced Menu*/"Другие", };
const char* SettingsMenuEntriesDescriptions[4] ={
"Настройки для режима пайки. Действуют при включенном жале.",
"Настройки при бездействии. Полезно чтобы не обжечься и случайно не сжечь жилище.",
"Пользовательский интерфейс.",
"Расширенные настройки. Дополнительные удобства."
};
#endif

View File

@@ -164,23 +164,23 @@ const menuitem advancedMenu[] = {
/*
* Detailed IDLE
* Detailed Soldering
* Logo Time
* Calibrate Temperature
* Calibrate Input V
* Reset Settings
* Detailed Soldering
* Logo Time
* Calibrate Temperature
* Calibrate Input V
* Reset Settings
*/
{ (const char*) SettingsDescriptions[6], { settings_setAdvancedIDLEScreens }, {
settings_displayAdvancedIDLEScreens } }, /* Advanced idle screen*/
{ (const char*) SettingsDescriptions[15],
{ settings_setAdvancedSolderingScreens }, {
settings_displayAdvancedSolderingScreens } }, /* Advanced soldering screen*/
{ (const char*) SettingsDescriptions[13], { settings_setResetSettings }, {
settings_displayResetSettings } }, /*Resets settings*/
{ (const char*) SettingsDescriptions[12], { settings_setCalibrate }, {
settings_displayCalibrate } }, /*Calibrate tip*/
{ (const char*) SettingsDescriptions[14], { settings_setCalibrateVIN }, {
settings_displayCalibrateVIN } }, /*Voltage input cal*/
{ (const char*) SettingsDescriptions[13], { settings_setResetSettings }, {
settings_displayResetSettings } }, /*Resets settings - KEEP LAST*/
{ NULL, { NULL }, { NULL } } // end of menu marker. DO NOT REMOVE
};

View File

@@ -27,7 +27,6 @@ uint32_t lastButtonTime = 0;
// FreeRTOS variables
osThreadId GUITaskHandle;
osThreadId PIDTaskHandle;
osThreadId ROTTaskHandle;
osThreadId MOVTaskHandle;
static TaskHandle_t pidTaskNotification = NULL;
@@ -35,7 +34,6 @@ static TaskHandle_t pidTaskNotification = NULL;
void startGUITask(void const *argument);
void startPIDTask(void const *argument);
void startMOVTask(void const *argument);
void startRotationTask(void const *argument);
// End FreeRTOS
// Main sets up the hardware then hands over to the FreeRTOS kernel
@@ -81,9 +79,6 @@ int main(void) {
osThreadDef(PIDTask, startPIDTask, osPriorityRealtime, 0, 512); //2k
PIDTaskHandle = osThreadCreate(osThread(PIDTask), NULL);
if (PCBVersion != 3) {
/* definition and creation of ROTTask */
osThreadDef(ROTTask, startRotationTask, osPriorityLow, 0, 256); //1k
ROTTaskHandle = osThreadCreate(osThread(ROTTask), NULL);
/* definition and creation of MOVTask */
osThreadDef(MOVTask, startMOVTask, osPriorityNormal, 0, 512); //2k
MOVTaskHandle = osThreadCreate(osThread(MOVTask), NULL);
@@ -96,6 +91,11 @@ int main(void) {
while (1) {
}
}
void printVoltage() {
lcd.printNumber(getInputVoltageX10(systemSettings.voltageDiv) / 10, 2);
lcd.drawChar('.');
lcd.printNumber(getInputVoltageX10(systemSettings.voltageDiv) % 10, 1);
}
void GUIDelay() {
osDelay(66); // 15Hz
}
@@ -221,11 +221,7 @@ static bool checkVoltageForExit() {
lcd.print(UndervoltageString);
lcd.setCursor(0, 8);
lcd.print(InputVoltageString);
lcd.printNumber(getInputVoltageX10(systemSettings.voltageDiv) / 10,
2);
lcd.drawChar('.');
lcd.printNumber(getInputVoltageX10(systemSettings.voltageDiv) % 10,
1);
printVoltage();
lcd.print("V");
} else {
@@ -332,56 +328,6 @@ static void gui_solderingTempAdjust() {
}
}
static int gui_showTipTempWarning() {
for (;;) {
uint16_t tipTemp = tipMeasurementToC(getTipRawTemp(0));
lcd.clearScreen();
lcd.setCursor(0, 0);
if (systemSettings.detailedSoldering) {
lcd.setFont(1);
lcd.print(WarningAdvancedString);
lcd.setCursor(0, 8);
lcd.print(WarningTipTempString);
if (systemSettings.temperatureInF) {
lcd.printNumber(tipMeasurementToF(getTipRawTemp(0)), 3);
lcd.print("F");
} else {
lcd.printNumber(tipMeasurementToC(getTipRawTemp(0)), 3);
lcd.print("C");
}
} else {
lcd.setFont(0);
lcd.drawArea(0, 0, 24, 16, WarningBlock24);
lcd.setCursor(24, 0);
// lcd.print(WarningSimpleString);
lcd.print(" ");
if (systemSettings.temperatureInF) {
lcd.printNumber(tipMeasurementToF(getTipRawTemp(0)), 3);
lcd.drawSymbol(0);
} else {
lcd.printNumber(tipMeasurementToC(getTipRawTemp(0)), 3);
lcd.drawSymbol(1);
}
}
if (systemSettings.coolingTempBlink && tipTemp > 70) {
if (xTaskGetTickCount() % 50 < 25)
lcd.clearScreen();
}
lcd.refresh();
ButtonState buttons = getButtonState();
if (buttons == BUTTON_F_SHORT)
return 1;
else if (buttons == BUTTON_B_SHORT || buttons == BUTTON_BOTH)
return 0;
if (tipTemp < 50)
return 0; //Exit the warning screen
GUIDelay();
}
return 0;
}
static uint16_t min(uint16_t a, uint16_t b) {
if (a > b)
return b;
@@ -401,14 +347,15 @@ static int gui_SolderingSleepingMode() {
if (checkVoltageForExit())
return 1; // return non-zero on error
if (systemSettings.temperatureInF)
if (systemSettings.temperatureInF) {
currentlyActiveTemperatureTarget = ftoTipMeasurement(
min(systemSettings.SleepTemp,
systemSettings.SolderingTemp));
else
} else {
currentlyActiveTemperatureTarget = ctoTipMeasurement(
min(systemSettings.SleepTemp,
systemSettings.SolderingTemp));
}
// draw the lcd
uint16_t tipTemp;
if (systemSettings.temperatureInF)
@@ -430,11 +377,7 @@ static int gui_SolderingSleepingMode() {
lcd.print("C");
lcd.print(" ");
lcd.printNumber(getInputVoltageX10(systemSettings.voltageDiv) / 10,
2);
lcd.drawChar('.');
lcd.printNumber(getInputVoltageX10(systemSettings.voltageDiv) % 10,
1);
printVoltage();
lcd.drawChar('V');
} else {
lcd.setFont(0);
@@ -543,11 +486,7 @@ static void gui_solderingMode() {
lcd.print("C");
lcd.print(" ");
lcd.printNumber(
getInputVoltageX10(systemSettings.voltageDiv) / 10, 2);
lcd.drawChar('.');
lcd.printNumber(
getInputVoltageX10(systemSettings.voltageDiv) % 10, 1);
printVoltage();
lcd.drawChar('V');
} else {
// We switch the layout direction depending on the orientation of the lcd.
@@ -632,6 +571,55 @@ static void gui_solderingMode() {
}
}
void showVersion(void) {
uint8_t screen = 0;
ButtonState b;
for (;;) {
lcd.clearScreen(); // Ensure the buffer starts clean
lcd.setCursor(0, 0); // Position the cursor at the 0,0 (top left)
lcd.setFont(1); // small font
lcd.print((char *) "V2.05 PCB"); // Print version number
lcd.printNumber(PCBVersion, 1); //Print PCB ID number
lcd.setCursor(0, 8); // second line
switch (screen) {
case 0:
lcd.print(__DATE__); // print the compile date
break;
case 1:
lcd.print("Heap: ");
lcd.printNumber(xPortGetFreeHeapSize(), 5);
break;
case 2:
lcd.print("HWMG: ");
lcd.printNumber(uxTaskGetStackHighWaterMark(GUITaskHandle), 5);
break;
case 3:
lcd.print("HWMP: ");
lcd.printNumber(uxTaskGetStackHighWaterMark(PIDTaskHandle), 5);
break;
case 4:
lcd.print("HWMM: ");
lcd.printNumber(uxTaskGetStackHighWaterMark(MOVTaskHandle), 5);
break;
case 5:
lcd.print("Time: ");
lcd.printNumber(xTaskGetTickCount() / 100, 5);
break;
}
lcd.refresh();
b = getButtonState();
if (b == BUTTON_B_SHORT)
return;
else if (b == BUTTON_F_SHORT) {
screen++;
screen = screen % 6;
}
}
}
/* StartGUITask function */
void startGUITask(void const *argument) {
i2cDev.FRToSInit();
@@ -661,7 +649,6 @@ void startGUITask(void const *argument) {
uint8_t tempWarningState = 0;
bool buttonLockout = false;
HAL_IWDG_Refresh(&hiwdg);
switch (systemSettings.OrientationMode) {
case 0:
lcd.setRotation(false);
@@ -685,8 +672,6 @@ void startGUITask(void const *argument) {
ticks = xTaskGetTickCount(); //make timeout now so we will exit
GUIDelay();
}
HAL_IWDG_Refresh(&hiwdg);
if (systemSettings.autoStartMode) {
// jump directly to the autostart mode
if (systemSettings.autoStartMode == 1)
@@ -723,18 +708,7 @@ void startGUITask(void const *argument) {
case BUTTON_B_LONG:
// Show the version information
{
lcd.clearScreen(); // Ensure the buffer starts clean
lcd.setCursor(0, 0); // Position the cursor at the 0,0 (top left)
lcd.setFont(1); // small font
lcd.print((char *) "V2.04 PCB"); // Print version number
lcd.printNumber(PCBVersion, 1); //Print PCB ID number
lcd.setCursor(0, 8); // second line
lcd.print(__DATE__); // print the compile date
lcd.refresh();
waitForButtonPress();
lcd.setFont(0); // reset font
}
showVersion();
break;
case BUTTON_F_LONG:
gui_solderingTempAdjust();
@@ -771,6 +745,7 @@ void startGUITask(void const *argument) {
lcd.displayOnOff(false); // turn lcd off when no movement
} else
lcd.displayOnOff(true); // turn lcd on
} else
lcd.displayOnOff(true); // turn lcd on - disabled motion sleep
} else
@@ -797,11 +772,7 @@ void startGUITask(void const *argument) {
}
lcd.setCursor(0, 8);
lcd.print(InputVoltageString);
lcd.printNumber(getInputVoltageX10(systemSettings.voltageDiv) / 10,
2);
lcd.drawChar('.');
lcd.printNumber(getInputVoltageX10(systemSettings.voltageDiv) % 10,
1);
printVoltage();
lcd.print("V");
} else {
@@ -858,9 +829,9 @@ void startPIDTask(void const *argument) {
int32_t kp, ki, kd;
ki = 50;
kd = 15;
// REMEBER ^^^^ These constants are backwards
// They act as dividers, so to 'increase' a P term, you make the number
// smaller.
// REMEBER ^^^^ These constants are backwards
// They act as dividers, so to 'increase' a P term, you make the number
// smaller.
if (getInputVoltageX10(systemSettings.voltageDiv) < 150) {
//Boot P term if < 15 Volts
kp = 30;
@@ -869,62 +840,77 @@ void startPIDTask(void const *argument) {
const int32_t itermMax = 100;
pidTaskNotification = xTaskGetCurrentTaskHandle();
for (;;) {
ulTaskNotifyTake( pdTRUE, 50); //Wait a max of 50ms
//This is a call to block this thread until the ADC does its samples
uint16_t rawTemp = getTipRawTemp(1); // get instantaneous reading
if (currentlyActiveTemperatureTarget) {
// Compute the PID loop in here
// Because our values here are quite large for all measurements (0-16k ~=
// 33 counts per C)
// P I & D are divisors, so inverse logic applies (beware)
if (ulTaskNotifyTake( pdTRUE, 50)) {
//Wait a max of 50ms
//This is a call to block this thread until the ADC does its samples
uint16_t rawTemp = getTipRawTemp(1); // get instantaneous reading
if (currentlyActiveTemperatureTarget) {
// Compute the PID loop in here
// Because our values here are quite large for all measurements (0-16k ~=
// 33 counts per C)
// P I & D are divisors, so inverse logic applies (beware)
// Cap the max set point to 450C
if (currentlyActiveTemperatureTarget > ctoTipMeasurement(450)) {
currentlyActiveTemperatureTarget = ctoTipMeasurement(450);
// Cap the max set point to 450C
if (currentlyActiveTemperatureTarget > ctoTipMeasurement(450)) {
currentlyActiveTemperatureTarget = ctoTipMeasurement(450);
}
int32_t rawTempError = currentlyActiveTemperatureTarget
- rawTemp;
int32_t ierror = (rawTempError / ki);
integralCount += ierror;
if (integralCount > (itermMax / 2))
integralCount = itermMax / 2; // prevent too much lead
else if (integralCount < -itermMax)
integralCount = itermMax;
int32_t dInput = (rawTemp - derivativeLastValue);
/*Compute PID Output*/
int32_t output = (rawTempError / kp);
if (ki)
output += integralCount;
if (kd)
output -= (dInput / kd);
if (output > 100) {
output = 100; // saturate
} else if (output < 0) {
output = 0;
}
/*if (currentlyActiveTemperatureTarget < rawTemp) {
output = 0;
}*/
setTipPWM(output);
derivativeLastValue = rawTemp; // store for next loop
} else {
setTipPWM(0); // disable the output driver if the output is set to be off
integralCount = 0;
derivativeLastValue = 0;
}
int32_t rawTempError = currentlyActiveTemperatureTarget - rawTemp;
int32_t ierror = (rawTempError / ki);
integralCount += ierror;
if (integralCount > (itermMax / 2))
integralCount = itermMax / 2; // prevent too much lead
else if (integralCount < -itermMax)
integralCount = itermMax;
int32_t dInput = (rawTemp - derivativeLastValue);
/*Compute PID Output*/
int32_t output = (rawTempError / kp);
if (ki)
output += integralCount;
if (kd)
output -= (dInput / kd);
if (output > 100) {
output = 100; // saturate
} else if (output < 0) {
output = 0;
}
/*if (currentlyActiveTemperatureTarget < rawTemp) {
output = 0;
}*/
setTipPWM(output);
derivativeLastValue = rawTemp; // store for next loop
} else {
setTipPWM(0); // disable the output driver if the output is set to be off
integralCount = 0;
derivativeLastValue = 0;
osDelay(100); //sleep for a bit longer
HAL_IWDG_Refresh(&hiwdg);
}
HAL_IWDG_Refresh(&hiwdg);
}
}
#define MOVFilter 8
void startMOVTask(void const *argument) {
osDelay(250); // wait for accelerometer to stabilize
switch (systemSettings.OrientationMode) {
case 0:
lcd.setRotation(false);
break;
case 1:
lcd.setRotation(true);
break;
case 2:
lcd.setRotation(false);
break;
default:
break;
}
lastMovementTime = 0;
int16_t datax[MOVFilter];
int16_t datay[MOVFilter];
@@ -940,20 +926,29 @@ void startMOVTask(void const *argument) {
#if ACCELDEBUG
uint32_t max = 0;
#endif
uint8_t rotation = 0;
for (;;) {
int32_t threshold = 1500 + (9 * 200);
threshold -= systemSettings.sensitivity * 200; // 200 is the step size
if (PCBVersion == 2)
accel2.getAxisReadings(&tx, &ty, &tz);
else if (PCBVersion == 1)
accel.getAxisReadings(&tx, &ty, &tz);
if (PCBVersion == 2) {
accel2.getAxisReadings(&tx, &ty, &tz);
rotation = accel2.getOrientation();
} else if (PCBVersion == 1) {
accel.getAxisReadings(&tx, &ty, &tz);
rotation = accel.getOrientation();
}
if (systemSettings.OrientationMode == 2) {
if (rotation != 0) {
lcd.setRotation(rotation == 2); // link the data through
}
}
datax[currentPointer] = (int32_t) tx;
datay[currentPointer] = (int32_t) ty;
dataz[currentPointer] = (int32_t) tz;
currentPointer = (currentPointer + 1) % MOVFilter;
#if ACCELDEBUG
// Debug for Accel
avgx = avgy = avgz = 0;
@@ -995,6 +990,7 @@ void startMOVTask(void const *argument) {
// So now we have averages, we want to look if these are different by more
// than the threshold
//Sum the deltas
int32_t error = (abs(avgx - tx) + abs(avgy - ty) + abs(avgz - tz));
// If error has occurred then we update the tick timer
if (error > threshold) {
@@ -1004,52 +1000,13 @@ void startMOVTask(void const *argument) {
osDelay(100); // Slow down update rate
}
}
/* StartRotationTask function */
void startRotationTask(void const *argument) {
/*
* This task is used to manage rotation of the LCD screen & button re-mapping
*
*/
switch (systemSettings.OrientationMode) {
case 0:
lcd.setRotation(false);
break;
case 1:
lcd.setRotation(true);
break;
case 2:
lcd.setRotation(false);
break;
default:
break;
}
osDelay(250); // wait for accel to stabilize
for (;;) {
// a rotation event has occurred
uint8_t rotation = 0;
if (PCBVersion == 2) {
rotation = accel2.getOrientation();
} else if (PCBVersion == 1) {
rotation = accel.getOrientation();
}
if (systemSettings.OrientationMode == 2) {
if (rotation != 0) {
lcd.setRotation(rotation == 2); // link the data through
}
}
osDelay(500);
}
}
#define FLASH_LOGOADDR \
(0x8000000 | 0xF800) /*second last page of flash set aside for logo image*/
bool showBootLogoIfavailable() {
// check if the header is there (0xAA,0x55,0xF0,0x0D)
// If so display logo
// check if the header is there (0xAA,0x55,0xF0,0x0D)
// If so display logo
uint16_t temp[98];
for (uint8_t i = 0; i < (98); i++) {
@@ -1109,3 +1066,9 @@ void HAL_I2C_AbortCpltCallback(I2C_HandleTypeDef *hi2c) {
void HAL_I2C_MemRxCpltCallback(I2C_HandleTypeDef *hi2c) {
i2cDev.CpltCallback();
}
void vApplicationStackOverflowHook( xTaskHandle *pxTask,
signed portCHAR *pcTaskName) {
//We dont have a good way to handle a stack overflow at this point in time
NVIC_SystemReset();
}

View File

@@ -28,9 +28,9 @@ void HAL_MspInit(void) {
/**NOJTAG: JTAG-DP Disabled and SW-DP Enabled
*/
__HAL_AFIO_REMAP_SWJ_NOJTAG()
;
// __HAL_AFIO_REMAP_SWJ_DISABLE(); /*Disable swd for debug io use*/
//__HAL_AFIO_REMAP_SWJ_NOJTAG()
//;
__HAL_AFIO_REMAP_SWJ_DISABLE(); /*Disable swd for debug io use*/
}
@@ -68,7 +68,7 @@ void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc) {
__HAL_LINKDMA(hadc, DMA_Handle, hdma_adc1);
/* ADC1 interrupt Init */
HAL_NVIC_SetPriority(ADC1_2_IRQn, 5, 0);
HAL_NVIC_SetPriority(ADC1_2_IRQn, 15, 0);
HAL_NVIC_EnableIRQ(ADC1_2_IRQn);
}
@@ -118,9 +118,9 @@ void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c) {
__HAL_LINKDMA(hi2c, hdmatx, hdma_i2c1_tx);
/* I2C1 interrupt Init */
HAL_NVIC_SetPriority(I2C1_EV_IRQn, 5, 0);
HAL_NVIC_SetPriority(I2C1_EV_IRQn, 15, 0);
HAL_NVIC_EnableIRQ(I2C1_EV_IRQn);
HAL_NVIC_SetPriority(I2C1_ER_IRQn, 5, 0);
HAL_NVIC_SetPriority(I2C1_ER_IRQn, 15, 0);
HAL_NVIC_EnableIRQ(I2C1_ER_IRQn);
}

View File

@@ -7,7 +7,6 @@
extern TIM_HandleTypeDef htim1; //used for the systick
/******************************************************************************/
/* Cortex-M3 Processor Interruption and Exception Handlers */
/******************************************************************************/
@@ -55,8 +54,6 @@ void SysTick_Handler(void) {
void DMA1_Channel1_IRQHandler(void) {
HAL_DMA_IRQHandler(&hdma_adc1);
}
//ADC interrupt used for DMA
void ADC1_2_IRQHandler(void) {
HAL_ADC_IRQHandler(&hadc1);
@@ -65,7 +62,6 @@ void ADC1_2_IRQHandler(void) {
//Timer 1 has overflowed, used for HAL ticks
void TIM1_UP_IRQHandler(void) {
HAL_TIM_IRQHandler(&htim1);
}
//Timer 3 is used for the PWM output to the tip
void TIM3_IRQHandler(void) {
@@ -76,15 +72,6 @@ void TIM3_IRQHandler(void) {
void TIM2_IRQHandler(void) {
HAL_TIM_IRQHandler(&htim2);
}
//EXTI 3 is triggered via the accelerometer on orientation change
void EXTI3_IRQHandler(void) {
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_3);
}
//EXTI 5 is triggered via the accelerometer on movement
void EXTI9_5_IRQHandler(void) {
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_5);
}
void I2C1_EV_IRQHandler(void) {
HAL_I2C_EV_IRQHandler(&hi2c1);
@@ -93,12 +80,10 @@ void I2C1_ER_IRQHandler(void) {
HAL_I2C_ER_IRQHandler(&hi2c1);
}
void DMA1_Channel6_IRQHandler(void)
{
HAL_DMA_IRQHandler(&hdma_i2c1_tx);
void DMA1_Channel6_IRQHandler(void) {
HAL_DMA_IRQHandler(&hdma_i2c1_tx);
}
void DMA1_Channel7_IRQHandler(void)
{
HAL_DMA_IRQHandler(&hdma_i2c1_rx);
void DMA1_Channel7_IRQHandler(void) {
HAL_DMA_IRQHandler(&hdma_i2c1_rx);
}