diff --git a/shared/f3hw.h b/shared/f3hw.h
index 2dfde85c..94592415 100644
--- a/shared/f3hw.h
+++ b/shared/f3hw.h
@@ -26,7 +26,7 @@
#define ABS_MAX_CURRENT 30.0
enum hv_fault_t{
- HV_NO_FAULT,
+ HV_NO_FAULT = 0,
HV_OVERTEMP,
HV_OVERVOLT,
HV_OVERCURRENT_RMS,
@@ -34,6 +34,7 @@ enum hv_fault_t{
HV_HV_FAULT,
HV_CURRENT_OFFSET_FAULT,
HV_COMM_FAULT,
+ HV_HAL_FAULT,
};
//io board
diff --git a/shared/hal.c b/shared/hal.c
index 4339f453..5459bf31 100644
--- a/shared/hal.c
+++ b/shared/hal.c
@@ -268,20 +268,28 @@ COMMAND("hal", hal_term_print_info, "print HAL stats");
uint32_t load_comp(hal_comp_t *comp) {
if(!comp) {
- printf("load_comp: not found\n");
+ if(hal.debug_level < 2){
+ printf("load_comp: not found\n");
+ }
return (0);
}
if(hal.comp_inst_count >= HAL_MAX_COMPS - 1) {
- printf("load_comp: not enough space to load comp: %s\n", comp->name);
+ if(hal.debug_level < 2){
+ printf("load_comp: not enough space to load comp: %s\n", comp->name);
+ }
return (0);
}
if(hal.pin_inst_count + comp->pin_count >= HAL_MAX_PINS - 1) {
- printf("load_comp: not enough space to load comp pins: %s\n", comp->name);
+ if(hal.debug_level < 2){
+ printf("load_comp: not enough space to load comp pins: %s\n", comp->name);
+ }
return (0);
}
uint32_t ctx_size = ((uint32_t)ceil((comp->ctx_size / 4.0))) * 4;
if(hal.ctx_count + ctx_size >= HAL_MAX_CTX - 1) {
- printf("load_comp: not enough space to load comp ctx: %s\n", comp->name);
+ if(hal.debug_level < 2){
+ printf("load_comp: not enough space to load comp ctx: %s\n", comp->name);
+ }
return (0);
}
@@ -503,7 +511,6 @@ void hal_init_hw() {
void load(char *ptr) {
- printf("load :%s:\n", ptr);
load_comp(comp_by_name(ptr));
}
@@ -795,12 +802,16 @@ uint32_t hal_parse_(char *cmd) {
case 1: // search comps
for(int i = 0; i < hal.comp_inst_count; i++) {
if(!strncmp(hal.comp_insts[i].comp->name, sinkc, strlen(sinkc))) {
- printf("%s%lu\n", hal.comp_insts[i].comp->name, hal.comp_insts[i].instance);
+ if(hal.debug_level < 1){
+ printf("%s%lu\n", hal.comp_insts[i].comp->name, hal.comp_insts[i].instance);
+ }
found = 1;
}
}
if(!found) {
- printf("not found: %s\n", cmd);
+ if(hal.debug_level < 2){
+ printf("not found: %s\n", cmd);
+ }
}
break;
case 2: // search comps + instance
@@ -815,7 +826,9 @@ uint32_t hal_parse_(char *cmd) {
}
}
if(!found) {
- printf("not found: %s\n", cmd);
+ if(hal.debug_level < 2){
+ printf("not found: %s\n", cmd);
+ }
}
break;
case 3:
@@ -825,12 +838,17 @@ uint32_t hal_parse_(char *cmd) {
source = pin_inst_by_name(sourcec, sourcei, sourcep);
if(sink && source) {
sink->source = source;
- printf("OK %s%lu.%s <= %s%lu.%s = %f\n", sinkc, sinki, sinkp, sourcec, sourcei, sourcep, source->source->value);
-
+ if(hal.debug_level < 1){
+ printf("OK %s%lu.%s <= %s%lu.%s = %f\n", sinkc, sinki, sinkp, sourcec, sourcei, sourcep, source->source->value);
+ }
} else if(sink) {
- printf("not found: %s%lu.%s\n", sourcec, sourcei, sourcep);
+ if(hal.debug_level < 2){
+ printf("not found: %s%lu.%s\n", sourcec, sourcei, sourcep);
+ }
} else {
- printf("not found: %s%lu.%s\n", sinkc, sinki, sinkp);
+ if(hal.debug_level < 2){
+ printf("not found: %s%lu.%s\n", sinkc, sinki, sinkp);
+ }
}
} else { // search comps + instance + pin
for(int i = 0; i < hal.comp_inst_count; i++) {
@@ -846,7 +864,9 @@ uint32_t hal_parse_(char *cmd) {
}
}
if(!found) {
- printf("not found: %s\n", cmd);
+ if(hal.debug_level < 2){
+ printf("not found: %s\n", cmd);
+ }
}
}
break;
@@ -855,13 +875,19 @@ uint32_t hal_parse_(char *cmd) {
if(sink) {
sink->value = value;
sink->source = sink;
- printf("OK %s%lu.%s = %f\n", sinkc, sinki, sinkp, value);
+ if(hal.debug_level < 1){
+ printf("OK %s%lu.%s = %f\n", sinkc, sinki, sinkp, value);
+ }
} else {
- printf("not found: %s%lu.%s\n", sinkc, sinki, sinkp);
+ if(hal.debug_level < 2){
+ printf("not found: %s%lu.%s\n", sinkc, sinki, sinkp);
+ }
}
break;
default:
- printf("not found: %s\n", cmd);
+ if(hal.debug_level < 2){
+ printf("not found: %s\n", cmd);
+ }
}
return (0);
}
@@ -875,15 +901,15 @@ void hal_error(uint32_t error_handler) {
hal.hal_state = MISC_ERROR;
}
-void fault() {
+void fault(char *ptr) {
printf("trigger fault handler\n");
- volatile uint32_t *ptr = (uint32_t *)0x08010000;
- ptr[0] = 1;
+ volatile uint32_t *p = (uint32_t *)0x08010000;
+ p[0] = 1;
}
COMMAND("fault", fault, "trigger fault");
-void about() {
+void about(char *ptr) {
printf("######## software info ########\n");
printf(
"%s v%i.%i.%i %s\n",
@@ -919,3 +945,19 @@ void about() {
}
COMMAND("about", about, "show system infos");
+
+void hal_set_debug_level(uint32_t debug_level){
+ hal.debug_level = debug_level;
+}
+
+void debug_level(char *ptr){
+ int debug_level = 0;
+ if(ptr){
+ sscanf(ptr, "%i", &debug_level);
+ }
+
+ hal_set_debug_level(CLAMP(debug_level, 0, 2));
+}
+
+COMMAND("debug_level", debug_level, "set hal debug level, 0 = print all, 1 = print errors, 2 = no output");
+
diff --git a/shared/hal.h b/shared/hal.h
index ef42d29a..9dd96dda 100644
--- a/shared/hal.h
+++ b/shared/hal.h
@@ -160,6 +160,12 @@ typedef struct {
volatile float frt_period;
hal_error_t error_info;
+
+ volatile enum {
+ PRINT_ALL,
+ PRINT_ERRORS,
+ NO_PRINT,
+ } debug_level;
} hal_t;
extern hal_t hal;
@@ -183,5 +189,6 @@ void hal_run_frt();
void hal_run_nrt();
uint32_t hal_parse(char *cmd);
void hal_error(uint32_t error_handler);
+void hal_set_debug_level(uint32_t debug_level);
#include "hal_tbl.h"
diff --git a/stm32f303/src/comps/io.c b/stm32f303/src/comps/io.c
index efca8f0f..4b845e5e 100644
--- a/stm32f303/src/comps/io.c
+++ b/stm32f303/src/comps/io.c
@@ -47,6 +47,8 @@ struct io_ctx_t {
float overvoltage_error;
float overcurrent_error;
float fault_pin_error;
+ uint32_t hv_temp;
+ uint32_t mot_temp;
};
#define ARES 4096.0 // analog resolution, 12 bit
@@ -127,6 +129,9 @@ static void nrt_init(volatile void *ctx_ptr, volatile hal_pin_inst_t *pin_ptr) {
ctx->overvoltage_error = 0;
ctx->overcurrent_error = 0;
ctx->fault_pin_error = 0;
+ ctx->hv_temp = 0;
+ ctx->mot_temp = 0;
+
#ifdef HV_EN_PIN
GPIO_InitStruct.Pin = HV_EN_PIN;
@@ -186,13 +191,9 @@ static void rt_func(float period, volatile void *ctx_ptr, volatile hal_pin_inst_
PIN(u) = VOLT(adc_34_buf[5] & 0xFFFF) * 0.05 + PIN(u) * 0.95;
PIN(udc) = VOLT(adc_34_buf[5] >> 16) * 0.05 + PIN(udc) * 0.95;
PIN(iabs) = MAX3(ABS(PIN(iu)), PIN(iv), PIN(iw));
- PIN(hv_temp) = r2temp(HV_R(ADC(adc_34_buf[0] >> 16))) * 0.01 + PIN(hv_temp) * 0.99; // 5.5u
- PIN(mot_temp) = MOT_R(MOT_REF(ADC(adc_34_buf[3] >> 16))); // 1.4u
- HAL_GPIO_WritePin(LED_PORT, LED_PIN, BLINK(PIN(led)) > 0 ? GPIO_PIN_SET : GPIO_PIN_RESET); // 0.1u
-
- // mot temp fault
- // f4 hv fault = max(f4 fault, f3 fault)
-
+ ctx->hv_temp = adc_34_buf[0];
+ ctx->mot_temp = adc_34_buf[3];
+
if(err_filter(&(ctx->overtemp_error), 5.0, 0.001, PIN(hv_temp) > ABS_MAX_TEMP)) {
ctx->fault = HV_OVERTEMP;
}
@@ -238,9 +239,25 @@ static void rt_func(float period, volatile void *ctx_ptr, volatile hal_pin_inst_
}
}
+void nrt_func(volatile void *ctx_ptr, volatile hal_pin_inst_t *pin_ptr) {
+ struct io_ctx_t *ctx = (struct io_ctx_t *)ctx_ptr;
+ struct io_pin_ctx_t *pins = (struct io_pin_ctx_t *)pin_ptr;
+
+ uint32_t led = PIN(led);
+
+ if(hal.hal_state != HAL_OK2){
+ led = HV_HAL_FAULT;
+ }
+
+ HAL_GPIO_WritePin(LED_PORT, LED_PIN, BLINK(led) > 0 ? GPIO_PIN_SET : GPIO_PIN_RESET);
+
+ PIN(hv_temp) = r2temp(HV_R(ADC(ctx->hv_temp >> 16))) * 0.01 + PIN(hv_temp) * 0.99;
+ PIN(mot_temp) = MOT_R(MOT_REF(ADC(ctx->mot_temp >> 16)));
+}
+
hal_comp_t io_comp_struct = {
.name = "io",
- .nrt = 0,
+ .nrt = nrt_func,
.rt = rt_func,
.frt = 0,
.nrt_init = nrt_init,
diff --git a/stm32f303/src/comps/ls.c b/stm32f303/src/comps/ls.c
index 8fe283af..b938d360 100644
--- a/stm32f303/src/comps/ls.c
+++ b/stm32f303/src/comps/ls.c
@@ -157,7 +157,7 @@ static void rt_start(volatile void *ctx_ptr, volatile hal_pin_inst_t *pin_ptr) {
PIN(timeout) = 0.0;
PIN(idle) = 0.0;
PIN(dma_pos_cmd) = 4;
- PIN(inc) = 10;
+ PIN(inc) = 5;
PIN(window) = 1;
}
diff --git a/stm32f303/src/main.c b/stm32f303/src/main.c
index 93e6d7c9..471d9497 100644
--- a/stm32f303/src/main.c
+++ b/stm32f303/src/main.c
@@ -237,15 +237,16 @@ int main(void) {
hal_init(1.0 / 15000.0, 0.0);
// hal load comps
- load_comp(comp_by_name("term"));
+ hal_parse("debug_level 1");
+ hal_parse("load term");
// load_comp(comp_by_name("sim"));
- load_comp(comp_by_name("io"));
- load_comp(comp_by_name("ls"));
- load_comp(comp_by_name("dq"));
- load_comp(comp_by_name("idq"));
- load_comp(comp_by_name("svm"));
- load_comp(comp_by_name("hv"));
- load_comp(comp_by_name("curpid"));
+ hal_parse("load io");
+ hal_parse("load ls");
+ hal_parse("load dq");
+ hal_parse("load idq");
+ hal_parse("load svm");
+ hal_parse("load hv");
+ hal_parse("load curpid");
hal_parse("term0.rt_prio = 0.1");
hal_parse("ls0.rt_prio = 0.6");
@@ -323,6 +324,7 @@ int main(void) {
hal_parse("curpid0.en = ls0.en");
hal_parse("curpid0.cmd_mode = ls0.cmd_mode");
hal_parse("hv0.arr = ls0.arr");
+ hal_parse("debug_level 0");
// hal parse config
// hal_init_nrt();