diff --git a/conf/modules/can_fuelcell.xml b/conf/modules/can_fuelcell.xml index 99c2d561c8..5eaa61ec52 100644 --- a/conf/modules/can_fuelcell.xml +++ b/conf/modules/can_fuelcell.xml @@ -12,5 +12,9 @@ + + + + diff --git a/sw/airborne/modules/energy/can_fuelcell.c b/sw/airborne/modules/energy/can_fuelcell.c index 96e6605ae7..981e94ead5 100644 --- a/sw/airborne/modules/energy/can_fuelcell.c +++ b/sw/airborne/modules/energy/can_fuelcell.c @@ -27,13 +27,7 @@ #include "modules/energy/can_fuelcell.h" #include "modules/datalink/telemetry.h" #include "uavcan/uavcan.h" - - -/* uavcan EQUIPMENT_ESC_STATUS message definition */ -#define UAVCAN_EQUIPMENT_FUELCELL_STATUS_MAX_SIZE 11 -#define UAVCAN_EQUIPMENT_FUELCELL_STATUS_SIGNATURE (0x475459FF3AA36FE5ULL) -#define UAVCAN_EQUIPMENT_FUELCELL_STATUS_ID 1141 - +#include "pprz.equipment.fuelcell.Status.h" /* Fuel-Cell */ struct uavcan_equipment_fuelcell { @@ -59,35 +53,20 @@ static uavcan_event fuelcell_uavcan_ev; static void fuelcell_uavcan_cb(struct uavcan_iface_t *iface __attribute__((unused)), CanardRxTransfer *transfer) { - uint32_t bit_ofs = 0; - canardDecodeScalar(transfer, bit_ofs, 7, false, &can_fuelcell_data.pressure); - bit_ofs += 7; - uint16_t temp = 0; - canardDecodeScalar(transfer, bit_ofs, 8, false, &temp); - can_fuelcell_data.press_reg = ((float) temp) / 100.0f; - bit_ofs += 8; - temp = 0; - canardDecodeScalar(transfer, bit_ofs, 10, false, &temp); - can_fuelcell_data.volt_bat = ((float) temp) / 10.0f; - bit_ofs += 10; - temp = 0; - canardDecodeScalar(transfer, bit_ofs, 14, false, &temp); - can_fuelcell_data.power_out = ((float) temp); - bit_ofs += 14; - temp = 0; - canardDecodeScalar(transfer, bit_ofs, 13, false, &temp); - can_fuelcell_data.power_cell = ((float) temp); - bit_ofs += 13; - int16_t temp2 = 0; - canardDecodeScalar(transfer, bit_ofs, 16, true, &temp2); - can_fuelcell_data.power_batt = ((float) temp2); - bit_ofs += 16; - canardDecodeScalar(transfer, bit_ofs, 4, false, &can_fuelcell_data.state); - bit_ofs += 4; - canardDecodeScalar(transfer, bit_ofs, 8, false, &can_fuelcell_data.error); - bit_ofs += 8; - canardDecodeScalar(transfer, bit_ofs, 8, false, &can_fuelcell_data.suberror); - bit_ofs += 8; + struct pprz_equipment_fuelcell_Status msg; + if(pprz_equipment_fuelcell_Status_decode(transfer, &msg)) { + return; // decode error + } + + can_fuelcell_data.pressure = msg.tank_pressure; + can_fuelcell_data.press_reg = msg.regulated_pressure / 100.0f; + can_fuelcell_data.volt_bat = msg.battery_voltage / 10.0f; + can_fuelcell_data.power_out = msg.output_power; + can_fuelcell_data.power_cell = msg.spm_power; + can_fuelcell_data.power_batt = msg.battery_power; + can_fuelcell_data.state = msg.psu_state; + can_fuelcell_data.error = msg.error_code; + can_fuelcell_data.suberror = msg.sub_code; can_fuelcell_data.timeout = 10; @@ -129,7 +108,7 @@ void can_fuelcell_init(void) #if !(USE_NPS) // Bind uavcan BATTERYINFO message from EQUIPMENT.POWER - uavcan_bind(UAVCAN_EQUIPMENT_FUELCELL_STATUS_ID, UAVCAN_EQUIPMENT_FUELCELL_STATUS_SIGNATURE, &fuelcell_uavcan_ev, + uavcan_bind(PPRZ_EQUIPMENT_FUELCELL_STATUS_ID, PPRZ_EQUIPMENT_FUELCELL_STATUS_SIGNATURE, &fuelcell_uavcan_ev, &fuelcell_uavcan_cb); #endif diff --git a/sw/ext/dronecan/Makefile b/sw/ext/dronecan/Makefile index d4b7d15624..ac4fa2b52d 100644 --- a/sw/ext/dronecan/Makefile +++ b/sw/ext/dronecan/Makefile @@ -27,6 +27,7 @@ Q=@ PAPARAZZI_SRC=../../.. DRONECAN_DIR=$(PAPARAZZI_SRC)/sw/ext/dronecan DSDL_DIR := $(DRONECAN_DIR)/DSDL +CUSTOM_DSDL=$(DRONECAN_DIR)/custom_DSDL/pprz all: libcanard DSDL pydronecan dronecan_dsdlc @@ -43,6 +44,7 @@ pydronecan : pydronecan.sync pydronecan.update dronecan_dsdlc.build: $(eval DSDL_ROOTS_PART := $(sort $(dir $(wildcard $(DSDL_DIR)/*/)))) $(eval DSDL_ROOTS := $(filter-out $(DRONECAN_DIR)/DSDL/tests/ $(DRONECAN_DIR)/DSDL/,$(DSDL_ROOTS_PART))) + $(eval DSDL_ROOTS := $(DSDL_ROOTS) $(CUSTOM_DSDL)) @echo Generating dsdl code from $(DSDL_ROOTS) to $(PAPARAZZI_SRC)/var/include/DSDLcode $(Q) python $(DRONECAN_DIR)/dronecan_dsdlc/dronecan_dsdlc.py -O $(PAPARAZZI_SRC)/var/include/DSDLcode $(DSDL_ROOTS) @echo Done diff --git a/sw/ext/dronecan/custom_DSDL/pprz/equipment/fuelcell/20141.Status.uavcan b/sw/ext/dronecan/custom_DSDL/pprz/equipment/fuelcell/20141.Status.uavcan new file mode 100644 index 0000000000..dea56fd960 --- /dev/null +++ b/sw/ext/dronecan/custom_DSDL/pprz/equipment/fuelcell/20141.Status.uavcan @@ -0,0 +1,15 @@ +# +# Fuelcell Status +# + +uint7 tank_pressure # percentage +uint8 regulated_pressure # *100 + +uint10 battery_voltage # decivolt *10 +uint14 output_power +uint13 spm_power +int16 battery_power +uint4 psu_state +uint8 error_code +uint8 sub_code +