diff --git a/data/subDisSysCmd.json b/data/msg/subDisSysCmd.json similarity index 100% rename from data/subDisSysCmd.json rename to data/msg/subDisSysCmd.json diff --git a/data/protocol-specs/udp/ccu_set_param_fb.json b/data/protocol-specs/udp/ccu_set_param_fb.json new file mode 100644 index 0000000..3f1c4a2 --- /dev/null +++ b/data/protocol-specs/udp/ccu_set_param_fb.json @@ -0,0 +1,52 @@ +{ + "protocol_name": "CCU参数设置反馈", + "message_id": "0x0040", + "length": 10, + "checksum": { + "start_offset": 0, + "end_offset": 6, + "algorithm": "sum" + }, + "fields": [ + { + "name": "start1", + "offset": 0, + "type": "uint8", + "value": "0x20", + "description": "起始字节1" + }, + { + "name": "start2", + "offset": 1, + "type": "uint8", + "value": "0x20", + "description": "起始字节2" + }, + { + "name": "id", + "offset": 2, + "type": "uint16", + "value": "0x0040", + "description": "消息ID" + }, + { + "name": "length", + "offset": 4, + "type": "uint16", + "value": 10, + "description": "消息长度" + }, + { + "name": "flag", + "offset": 6, + "type": "uint8", + "description": "设置标志位" + }, + { + "name": "failvreCode", + "offset": 7, + "type": "uint8", + "description": "故障代码" + } + ] +} \ No newline at end of file diff --git a/data/protocol-specs/udp/ccu_state_fb.json b/data/protocol-specs/udp/ccu_state_fb.json new file mode 100644 index 0000000..d7a838a --- /dev/null +++ b/data/protocol-specs/udp/ccu_state_fb.json @@ -0,0 +1,637 @@ +{ + "message_name": "CCUStateFbMsg", + "protocol_id": "0x0041", + "endianness": "little", + "fields": [ + { + "name": "start1", + "offset": 0, + "length": 1, + "type": "uint8", + "value": "0x20", + "description": "起始字节1" + }, + { + "name": "start2", + "offset": 1, + "length": 1, + "type": "uint8", + "value": "0x20", + "description": "起始字节2" + }, + { + "name": "id", + "offset": 2, + "length": 2, + "type": "uint16", + "value": "0x0041", + "description": "消息ID" + }, + { + "name": "length", + "offset": 4, + "length": 2, + "type": "uint16", + "dynamic": true, + "description": "数据长度(自动计算)" + }, + { + "name": "currentWorkCondition", + "offset": 6, + "length": 1, + "type": "uint8", + "enum": {"0x00":"待机","0x01":"运行","0x02":"故障"}, + "description": "当前工作状态" + }, + { + "name": "fcuState", + "offset": 7, + "length": 1, + "type": "uint8", + "unit": "%", + "description": "燃料电池状态" + }, + { + "name": "fcuFaultLeve", + "offset": 8, + "length": 1, + "type": "uint8", + "description": "故障等级" + }, + { + "name": "powerLimit", + "offset": 9, + "length": 4, + "type": "float32", + "unit": "kW", + "description": "功率限制值" + }, + { + "name": "totalPowerGeneration", + "offset": 13, + "length": 4, + "type": "float32", + "unit": "kWh", + "description": "总发电量" + }, + { + "name": "ch4o", + "offset": 17, + "length": 4, + "type": "float32", + "unit": "ppm", + "description": "甲醇浓度" + }, + { + "name": "o2", + "offset": 21, + "length": 4, + "type": "float32", + "unit": "%", + "description": "氧气浓度" + }, + { + "name": "fcuVoltage", + "offset": 25, + "length": 4, + "type": "float32", + "unit": "V", + "description": "燃料电池电压" + }, + { + "name": "fcuCurrent", + "offset": 29, + "length": 4, + "type": "float32", + "unit": "A", + "description": "燃料电池电流" + }, + { + "name": "o2Level", + "offset": 33, + "length": 4, + "type": "float32", + "unit": "%", + "description": "氧气含量" + }, + { + "name": "placeholder1", + "offset": 37, + "length": 4, + "type": "float32", + "description": "预留字段1" + }, + { + "name": "exchangerTemperature", + "offset": 41, + "length": 4, + "type": "float32", + "unit": "°C", + "description": "换热器温度" + }, + { + "name": "fcuOutPower", + "offset": 45, + "length": 4, + "type": "float32", + "unit": "kW", + "description": "燃料电池输出功率" + }, + { + "name": "fcuOutIns", + "offset": 49, + "length": 4, + "type": "float32", + "unit": "kΩ", + "description": "绝缘电阻" + }, + { + "name": "fcuVoltageIns", + "offset": 53, + "length": 4, + "type": "float32", + "unit": "V", + "description": "绝缘监测电压" + }, + { + "name": "fcuVoltagePower", + "offset": 57, + "length": 4, + "type": "float32", + "unit": "V", + "description": "功率电压" + }, + { + "name": "fcuCurrentIns", + "offset": 61, + "length": 4, + "type": "float32", + "unit": "A", + "description": "绝缘监测电流" + }, + { + "name": "fcuCurrentPower", + "offset": 65, + "length": 4, + "type": "float32", + "unit": "A", + "description": "功率电流" + }, + { + "name": "h2Concentration1", + "offset": 69, + "length": 4, + "type": "float32", + "unit": "ppm", + "description": "氢气浓度1" + }, + { + "name": "h2Concentration2", + "offset": 73, + "length": 4, + "type": "float32", + "unit": "ppm", + "description": "氢气浓度2" + }, + { + "name": "o2Concentration1", + "offset": 77, + "length": 4, + "type": "float32", + "unit": "%", + "description": "氧气浓度1" + }, + { + "name": "o2Concentration2", + "offset": 81, + "length": 4, + "type": "float32", + "unit": "%", + "description": "氧气浓度2" + }, + { + "name": "ch4oConcentration1", + "offset": 85, + "length": 4, + "type": "float32", + "unit": "ppm", + "description": "甲醇浓度1" + }, + { + "name": "ch4oConcentration2", + "offset": 89, + "length": 4, + "type": "float32", + "unit": "ppm", + "description": "甲醇浓度2" + }, + { + "name": "backpressure1", + "offset": 93, + "length": 4, + "type": "float32", + "unit": "kPa", + "description": "背压1" + }, + { + "name": "backpressure2", + "offset": 97, + "length": 4, + "type": "float32", + "unit": "kPa", + "description": "背压2" + }, + { + "name": "flameDetection", + "offset": 101, + "length": 1, + "type": "uint8", + "description": "火焰检测状态" + }, + { + "name": "fcuGZ_1L", + "offset": 102, + "length": 1, + "type": "uint8", + "description": "故障字1低字节" + }, + { + "name": "fcuGZ_1H", + "offset": 103, + "length": 1, + "type": "uint8", + "description": "故障字1高字节" + }, + { + "name": "fcuGZ_2L", + "offset": 104, + "length": 1, + "type": "uint8", + "description": "故障字2低字节" + }, + { + "name": "fcuGZ_2H", + "offset": 105, + "length": 1, + "type": "uint8", + "description": "故障字2高字节" + }, + { + "name": "fcuGZ_3L", + "offset": 106, + "length": 1, + "type": "uint8", + "description": "故障字3低字节" + }, + { + "name": "fcuGZ_3H", + "offset": 107, + "length": 1, + "type": "uint8", + "description": "故障字3高字节" + }, + { + "name": "insPosRelayState", + "offset": 108, + "length": 1, + "type": "uint8", + "description": "绝缘正极继电器状态" + }, + { + "name": "insNegRelayState", + "offset": 109, + "length": 1, + "type": "uint8", + "description": "绝缘负极继电器状态" + }, + { + "name": "powerPosRelayState", + "offset": 110, + "length": 1, + "type": "uint8", + "description": "功率正极继电器状态" + }, + { + "name": "powerNegRelayState", + "offset": 111, + "length": 1, + "type": "uint8", + "description": "功率负极继电器状态" + }, + { + "name": "insBatLimit", + "offset": 112, + "length": 2, + "type": "uint16", + "unit": "A", + "description": "绝缘电池电流限制" + }, + { + "name": "powerBatLimit", + "offset": 114, + "length": 2, + "type": "uint16", + "unit": "A", + "description": "功率电池电流限制" + }, + { + "name": "insBatSoc", + "offset": 116, + "length": 1, + "type": "uint8", + "unit": "%", + "description": "绝缘电池SOC" + }, + { + "name": "powerBatSoc", + "offset": 117, + "length": 1, + "type": "uint8", + "unit": "%", + "description": "功率电池SOC" + }, + { + "name": "insBatTotalElectricity", + "offset": 118, + "length": 2, + "type": "uint16", + "unit": "kWh", + "description": "绝缘电池总电量" + }, + { + "name": "powerBatTotalElectricity", + "offset": 120, + "length": 2, + "type": "uint16", + "unit": "kWh", + "description": "功率电池总电量" + }, + { + "name": "insBatCurrentElectricity", + "offset": 122, + "length": 2, + "type": "uint16", + "unit": "A", + "description": "绝缘电池当前电流" + }, + { + "name": "powerBatCurrentElectricity", + "offset": 124, + "length": 2, + "type": "uint16", + "unit": "A", + "description": "功率电池当前电流" + }, + { + "name": "insChargeState", + "offset": 126, + "length": 1, + "type": "uint8", + "description": "绝缘电池充电状态" + }, + { + "name": "powerChargeState", + "offset": 127, + "length": 1, + "type": "uint8", + "description": "功率电池充电状态" + }, + { + "name": "insLinkVoltage", + "offset": 128, + "length": 2, + "type": "uint16", + "unit": "V", + "description": "绝缘链路电压" + }, + { + "name": "insPackVoltage", + "offset": 130, + "length": 2, + "type": "uint16", + "unit": "V", + "description": "绝缘电池组电压" + }, + { + "name": "insCurrent", + "offset": 132, + "length": 2, + "type": "uint16", + "unit": "A", + "description": "绝缘电流" + }, + { + "name": "insPosInsulationResistance", + "offset": 134, + "length": 2, + "type": "uint16", + "unit": "kΩ", + "description": "正极绝缘电阻" + }, + { + "name": "insNegInsulationResistance", + "offset": 136, + "length": 2, + "type": "uint16", + "unit": "kΩ", + "description": "负极绝缘电阻" + }, + { + "name": "powerLinkVoltage", + "offset": 138, + "length": 2, + "type": "uint16", + "unit": "V", + "description": "功率链路电压" + }, + { + "name": "powerPackVoltage", + "offset": 140, + "length": 2, + "type": "uint16", + "unit": "V", + "description": "功率电池组电压" + }, + { + "name": "powerCurrent", + "offset": 142, + "length": 2, + "type": "uint16", + "unit": "A", + "description": "功率电流" + }, + { + "name": "powerPosInsulationResistance", + "offset": 144, + "length": 2, + "type": "uint16", + "unit": "kΩ", + "description": "功率正极绝缘电阻" + }, + { + "name": "powerNegInsulationResistance", + "offset": 146, + "length": 2, + "type": "uint16", + "unit": "kΩ", + "description": "功率负极绝缘电阻" + }, + { + "name": "insEmergencyStatusWord", + "offset": 148, + "length": 1, + "type": "uint8", + "description": "绝缘紧急状态字" + }, + { + "name": "powerEmergencyStatusWord", + "offset": 149, + "length": 1, + "type": "uint8", + "description": "功率紧急状态字" + }, + { + "name": "insAlarmIdentificationWord", + "offset": 150, + "length": 1, + "type": "uint8", + "description": "绝缘报警标识字" + }, + { + "name": "powerAlarmIdentificationWord", + "offset": 151, + "length": 1, + "type": "uint8", + "description": "功率报警标识字" + }, + { + "name": "insCurrentSocHold1", + "offset": 152, + "length": 1, + "type": "uint8", + "unit": "%", + "description": "绝缘电流SOC保持1" + }, + { + "name": "insCurrentSocHold2", + "offset": 153, + "length": 1, + "type": "uint8", + "unit": "%", + "description": "绝缘电流SOC保持2" + }, + { + "name": "insCurrentSocHold3", + "offset": 154, + "length": 1, + "type": "uint8", + "unit": "%", + "description": "绝缘电流SOC保持3" + }, + { + "name": "fcuCurrentToInsLimit1", + "offset": 155, + "length": 1, + "type": "uint8", + "unit": "A", + "description": "FCU到绝缘限制1" + }, + { + "name": "fcuCurrentToinsLimit2", + "offset": 156, + "length": 1, + "type": "uint8", + "unit": "A", + "description": "FCU到绝缘限制2" + }, + { + "name": "powerCurrentSocHold1", + "offset": 157, + "length": 1, + "type": "uint8", + "unit": "%", + "description": "功率电流SOC保持1" + }, + { + "name": "powerCurrentSocHold2", + "offset": 158, + "length": 1, + "type": "uint8", + "unit": "%", + "description": "功率电流SOC保持2" + }, + { + "name": "powerCurrentSocHold3", + "offset": 159, + "length": 1, + "type": "uint8", + "unit": "%", + "description": "功率电流SOC保持3" + }, + { + "name": "powerCurrentToInsLimit1", + "offset": 160, + "length": 1, + "type": "uint8", + "unit": "A", + "description": "功率到绝缘限制1" + }, + { + "name": "powerCurrentToinsLimit2", + "offset": 161, + "length": 1, + "type": "uint8", + "unit": "A", + "description": "功率到绝缘限制2" + }, + { + "name": "placeholder2", + "offset": 162, + "length": 4, + "type": "float32", + "description": "预留字段2" + }, + { + "name": "placeholder3", + "offset": 166, + "length": 4, + "type": "float32", + "description": "预留字段3" + }, + { + "name": "placeholder4", + "offset": 170, + "length": 4, + "type": "float32", + "description": "预留字段4" + }, + { + "name": "placeholder5", + "offset": 174, + "length": 4, + "type": "float32", + "description": "预留字段5" + }, + { + "name": "checkCode", + "offset": 178, + "length": 4, + "type": "uint32", + "description": "校验码(从start1到placeholder5的字节累加和)" + } + ], + "metadata": { + "total_length": 182, + "data_section_start": 6, + "data_section_end": 178, + "checksum_range": "0-178", + "float_precision": "IEEE-754单精度", + "reserved_fields": [ + "placeholder1", + "placeholder2", + "placeholder3", + "placeholder4", + "placeholder5" + ] + } +} \ No newline at end of file diff --git a/data/protocol-specs/udp/dis_high_a_vol_bus_fb.json b/data/protocol-specs/udp/dis_high_a_vol_bus_fb.json new file mode 100644 index 0000000..8495ad6 --- /dev/null +++ b/data/protocol-specs/udp/dis_high_a_vol_bus_fb.json @@ -0,0 +1,142 @@ +{ + "protocol_name": "高压A母线状态反馈", + "message_id": "0x0006", + "length": 10, + "checksum": { + "start_offset": 0, + "end_offset": 30, + "algorithm": "sum_low_byte" + }, + "fields": [ + { + "name": "start1", + "offset": 0, + "type": "uint8", + "value": "0x20", + "description": "起始字节1" + }, + { + "name": "start2", + "offset": 1, + "type": "uint8", + "value": "0x20", + "description": "起始字节2" + }, + { + "name": "id", + "offset": 2, + "type": "uint16", + "value": "0x0006", + "description": "消息ID" + }, + { + "name": "length", + "offset": 4, + "type": "uint16", + "value": 10, + "description": "消息长度" + }, + { + "name": "bowFTDevice123CircuitBreaker", + "offset": 6, + "type": "uint8", + "description": "艏部FT设备123断路器" + }, + { + "name": "actuatorCircuitBreaker", + "offset": 7, + "type": "uint8", + "description": "执行机构断路器" + }, + { + "name": "mastSteeringGearControlBoxCircuitBreaker", + "offset": 8, + "type": "uint8", + "description": "桅杆舵机控制箱断路器" + }, + { + "name": "xczCircuitBreaker", + "offset": 9, + "type": "uint8", + "description": "XCZ断路器" + }, + { + "name": "bowRudderControlBoxCircuitBreaker", + "offset": 10, + "type": "uint8", + "description": "艏舵控制箱断路器" + }, + { + "name": "openWaterCoverStartCylinderCircuitBreaker", + "offset": 11, + "type": "uint8", + "description": "开盖启动气缸断路器" + }, + { + "name": "instrumentPowerFailureSignal", + "offset": 12, + "type": "uint8", + "description": "仪表电源失效信号" + }, + { + "name": "emergencyPowerFailureSignal", + "offset": 13, + "type": "uint8", + "description": "应急电源失效信号" + }, + { + "name": "waterIngressionAlarm", + "offset": 14, + "type": "uint8", + "description": "进水报警" + }, + { + "name": "busbarBVoltage", + "offset": 15, + "type": "uint16", + "description": "B排电压(V)" + }, + { + "name": "busbarBCurrent", + "offset": 17, + "type": "uint16", + "description": "B排电流(A)" + }, + { + "name": "bowFTDevice123Current", + "offset": 19, + "type": "uint16", + "description": "艏部FT设备123电流(A)" + }, + { + "name": "actuatorCurrent", + "offset": 21, + "type": "uint16", + "description": "执行机构电流(A)" + }, + { + "name": "mastSteeringGearControlBoxCurrent", + "offset": 23, + "type": "uint16", + "description": "桅杆舵机控制箱电流(A)" + }, + { + "name": "xczCurrent", + "offset": 25, + "type": "uint16", + "description": "XCZ电流(A)" + }, + { + "name": "bowRudderControlBoxCurrent", + "offset": 27, + "type": "uint16", + "description": "艏舵控制箱电流(A)" + }, + { + "name": "openWaterCoverStartCylinderCurrent", + "offset": 29, + "type": "uint16", + "description": "开盖启动气缸电流(A)" + } + ] +} \ No newline at end of file diff --git a/data/protocol-specs/udp/dis_high_b_vol_bus_fb.json b/data/protocol-specs/udp/dis_high_b_vol_bus_fb.json new file mode 100644 index 0000000..d627ae1 --- /dev/null +++ b/data/protocol-specs/udp/dis_high_b_vol_bus_fb.json @@ -0,0 +1,154 @@ +{ + "protocol_name": "高压B母线状态反馈", + "message_id": "0x0007", + "length": 36, + "checksum": { + "start_offset": 0, + "end_offset": 34, + "algorithm": "sum_low_byte" + }, + "fields": [ + { + "name": "start1", + "offset": 0, + "type": "uint8", + "value": "0x20", + "description": "起始字节1" + }, + { + "name": "start2", + "offset": 1, + "type": "uint8", + "value": "0x20", + "description": "起始字节2" + }, + { + "name": "id", + "offset": 2, + "type": "uint16", + "value": "0x0007", + "description": "消息ID" + }, + { + "name": "length", + "offset": 4, + "type": "uint16", + "value": 36, + "description": "消息长度(包含校验码)" + }, + { + "name": "lithiumBatteryGroupInstrumentCircuitBreaker", + "offset": 6, + "type": "uint8", + "description": "锂电池组仪表断路器" + }, + { + "name": "bowLowVoltageDistributionBoxCircuitBreaker", + "offset": 7, + "type": "uint8", + "description": "艏部低压配电箱断路器" + }, + { + "name": "unit4InstrumentDC48VCircuitBreaker", + "offset": 8, + "type": "uint8", + "description": "单元4仪表DC48V断路器" + }, + { + "name": "dcC1DCDistributionPanelCircuitBreaker", + "offset": 9, + "type": "uint8", + "description": "DC C1直流配电板断路器" + }, + { + "name": "reservedCircuitBreaker1", + "offset": 10, + "type": "uint8", + "description": "备用断路器1" + }, + { + "name": "reservedCircuitBreaker2", + "offset": 11, + "type": "uint8", + "description": "备用断路器2" + }, + { + "name": "emergencyLithiumBatteryGroup2CircuitBreaker", + "offset": 12, + "type": "uint8", + "description": "应急锂电池组2断路器" + }, + { + "name": "instrumentPowerFailureSignal", + "offset": 13, + "type": "uint8", + "description": "仪表电源故障信号" + }, + { + "name": "emergencyPowerFailureSignal", + "offset": 14, + "type": "uint8", + "description": "应急电源故障信号" + }, + { + "name": "instrumentBusbarVoltage", + "offset": 15, + "type": "uint16", + "description": "仪表母线电压(V)" + }, + { + "name": "bowLowVoltageDistributionBoxCurrent", + "offset": 17, + "type": "uint16", + "description": "艏部低压配电箱电流(A)" + }, + { + "name": "dcC1InstrumentDC48VCurrent", + "offset": 19, + "type": "uint16", + "description": "DC C1仪表DC48V电流(A)" + }, + { + "name": "reservedCurrent1", + "offset": 21, + "type": "uint16", + "description": "备用电流1(A)" + }, + { + "name": "emergencyLithiumBatteryGroup2Current", + "offset": 23, + "type": "uint16", + "description": "应急锂电池组2电流(A)" + }, + { + "name": "lithiumBatteryGroupInstrumentCurrent", + "offset": 25, + "type": "uint16", + "description": "锂电池组仪表电流(A)" + }, + { + "name": "unit4InstrumentDC48VCurrent", + "offset": 27, + "type": "uint16", + "description": "单元4仪表DC48V电流(A)" + }, + { + "name": "reservedCurrent2", + "offset": 29, + "type": "uint16", + "description": "备用电流2(A)" + }, + { + "name": "emergency2BusbarVoltage", + "offset": 31, + "type": "uint16", + "description": "应急2母线电压(V)" + }, + { + "name": "compositeEnergyManagementSystemEmergencyDC48VCurrent", + "offset": 33, + "type": "uint16", + "description": "综合能源管理系统应急DC48V电流(A)" + } + ] +} diff --git a/data/protocol-specs/udp/dis_high_vol_bus_fb.json b/data/protocol-specs/udp/dis_high_vol_bus_fb.json new file mode 100644 index 0000000..2ea80a3 --- /dev/null +++ b/data/protocol-specs/udp/dis_high_vol_bus_fb.json @@ -0,0 +1,184 @@ +{ + "protocol_name": "高压母线状态反馈", + "message_id": "0x0005", + "length": 38, + "checksum": { + "start_offset": 0, + "end_offset": 37, + "algorithm": "sum_low_byte" + }, + "fields": [ + { + "name": "start1", + "offset": 0, + "type": "uint8", + "value": "0x20", + "description": "起始字节1" + }, + { + "name": "start2", + "offset": 1, + "type": "uint8", + "value": "0x20", + "description": "起始字节2" + }, + { + "name": "id", + "offset": 2, + "type": "uint16", + "value": "0x0005", + "description": "消息ID" + }, + { + "name": "length", + "offset": 4, + "type": "uint16", + "value": 38, + "description": "消息长度" + }, + { + "name": "DCB1", + "offset": 6, + "type": "uint8", + "description": "直流断路器1状态" + }, + { + "name": "DCB2", + "offset": 7, + "type": "uint8", + "description": "直流断路器2状态" + }, + { + "name": "ZK1", + "offset": 8, + "type": "uint8", + "description": "真空接触器1状态" + }, + { + "name": "ZK2", + "offset": 9, + "type": "uint8", + "description": "真空接触器2状态" + }, + { + "name": "ZK3", + "offset": 10, + "type": "uint8", + "description": "真空接触器3状态" + }, + { + "name": "ZK4", + "offset": 11, + "type": "uint8", + "description": "真空接触器4状态" + }, + { + "name": "ZK5", + "offset": 12, + "type": "uint8", + "description": "真空接触器5状态" + }, + { + "name": "ZK6", + "offset": 13, + "type": "uint8", + "description": "真空接触器6状态" + }, + { + "name": "ZK7", + "offset": 14, + "type": "uint8", + "description": "真空接触器7状态" + }, + { + "name": "ZK8", + "offset": 15, + "type": "uint8", + "description": "真空接触器8状态" + }, + { + "name": "ZK9", + "offset": 16, + "type": "uint8", + "description": "真空接触器9状态" + }, + { + "name": "ZK10", + "offset": 17, + "type": "uint8", + "description": "真空接触器10状态" + }, + { + "name": "busInsulationLow", + "offset": 18, + "type": "uint8", + "description": "母线绝缘低报警" + }, + { + "name": "busAInsulationHigh", + "offset": 19, + "type": "uint8", + "description": "A母线绝缘高报警" + }, + { + "name": "lostPower", + "offset": 20, + "type": "uint8", + "description": "失电信号" + }, + { + "name": "lostEmerPower", + "offset": 21, + "type": "uint8", + "description": "应急失电信号" + }, + { + "name": "powerBusVoltage", + "offset": 22, + "type": "uint16", + "description": "动力母线电压(V)" + }, + { + "name": "dcDc5ModuleCurrent", + "offset": 24, + "type": "uint16", + "description": "DC/DC5模块电流(A)" + }, + { + "name": "powerBusCurrent", + "offset": 26, + "type": "uint16", + "description": "动力母线电流(A)" + }, + { + "name": "busbarAVoltage", + "offset": 28, + "type": "uint16", + "description": "A排电压(V)" + }, + { + "name": "propulsionMotorControlBoxCurrent", + "offset": 30, + "type": "uint16", + "description": "推进电机控制箱电流(A)" + }, + { + "name": "busbarACurrent", + "offset": 32, + "type": "uint16", + "description": "A排电流(A)" + }, + { + "name": "lithiumBatteryGroupMeterCurrent", + "offset": 34, + "type": "uint16", + "description": "锂电池组表计电流(A)" + }, + { + "name": "bowHighVoltageDistributionBoxCurrent", + "offset": 36, + "type": "uint16", + "description": "艏部高压配电箱电流(A)" + } + ] +} \ No newline at end of file diff --git a/data/uPower_sysState_cmd.json b/data/uPower_sysState_cmd.json deleted file mode 100644 index 4309ae7..0000000 --- a/data/uPower_sysState_cmd.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "powerCMD":0, - "modCMD":0, - "workCMD":0 -} \ No newline at end of file diff --git a/src/pPowerManger/CMakeLists.txt b/src/pPowerManger/CMakeLists.txt index 31fee1c..506c265 100644 --- a/src/pPowerManger/CMakeLists.txt +++ b/src/pPowerManger/CMakeLists.txt @@ -22,10 +22,10 @@ SET(SRC PowerManger.cpp PowerManger_Info.cpp udpComm.cpp - fsm.cpp main.cpp SQLiteDB.cpp driver.cpp + PowerManagerFsm.cpp ) ADD_EXECUTABLE(pPowerManger ${SRC}) @@ -51,7 +51,7 @@ SET(SQLITEDB_SRC ) SET(FSMLIB_SRC - fsm.cpp) + PowerManagerFsm.cpp) SET(DRIVER_SRC driver.cpp) @@ -60,9 +60,9 @@ SET(POWERMANGE_SRC PowerManger.cpp PowerManger_Info.cpp udpComm.cpp - fsm.cpp SQLiteDB.cpp - driver.cpp) + driver.cpp + PowerManagerFsm.cpp) ADD_LIBRARY(SQLiteDB STATIC ${SQLITEDB_SRC}) ADD_LIBRARY(UDPComm STATIC ${UDPCOMM_SRC}) diff --git a/src/pPowerManger/PowerManagerFsm.cpp b/src/pPowerManger/PowerManagerFsm.cpp new file mode 100644 index 0000000..e351e5f --- /dev/null +++ b/src/pPowerManger/PowerManagerFsm.cpp @@ -0,0 +1,29 @@ +#include "PowerManagerFsm.hpp" +#include "PowerManger.h" + +// 初始化静态成员 +PowerManger* PowerManagerFsm::pm = nullptr; + +// 状态实例化 +InitState initState; +StandbyState standbyState; +FaultState faultState; + +// 状态机初始化 +void PowerManagerFsm::init(PowerManger* powerManager) { + pm = powerManager; + start(); +} + +// 状态转换接口实现 +void PowerManagerFsm::triggerInitEvent() { + dispatch(InitEvent()); +} + +void PowerManagerFsm::triggerStandbyEvent() { + dispatch(StandbyEvent()); +} + +void PowerManagerFsm::triggerFaultEvent(unsigned int faultCode) { + dispatch(FaultEvent(faultCode)); +} \ No newline at end of file diff --git a/src/pPowerManger/PowerManagerFsm.hpp b/src/pPowerManger/PowerManagerFsm.hpp new file mode 100644 index 0000000..06968a1 --- /dev/null +++ b/src/pPowerManger/PowerManagerFsm.hpp @@ -0,0 +1,153 @@ +#ifndef POWER_MANAGER_FSM_HPP +#define POWER_MANAGER_FSM_HPP + +#include "PowerManger.h" +#include "tinyfsm.hpp" + +// 前向声明 +class PowerManger; + +// 定义事件类型 +struct InitEvent : tinyfsm::Event { }; +struct StandbyEvent : tinyfsm::Event { }; +struct FaultEvent : tinyfsm::Event { + unsigned int faultCode; + FaultEvent(unsigned int code) : faultCode(code) {} +}; + +// 定义状态机基类 +class PowerManagerFsm : public tinyfsm::Fsm { +protected: + static PowerManger* pm; + +public: + // 初始化状态机 + static void init(PowerManger* powerManager) { + pm = powerManager; + } + + // 响应事件默认实现 + virtual void react(tinyfsm::Event const &) { } + + // 状态转换接口 + void triggerInitEvent() { dispatch(InitEvent()); } + void triggerStandbyEvent() { dispatch(StandbyEvent()); } + void triggerFaultEvent(unsigned int faultCode) { dispatch(FaultEvent(faultCode)); } +}; + +// 初始化静态成员 +PowerManger* PowerManagerFsm::pm = nullptr; + +// 定义状态类 +class InitState : public PowerManagerFsm { +public: + void entry() { + PowerManagerFsm::pm->m_pmEvent = "初始化状态"; + PowerManagerFsm::pm->printState("InitState", "进入初始化状态"); + } + + void react(InitEvent const &) { + // 1. 检查通信是否正常 + double StartTime = PowerManagerFsm::pm->GetAppStartTime(); + while (PowerManagerFsm::pm->connectState < 5) { + MOOSPause(1000); + PowerManagerFsm::pm->updateTime(); + double dft = abs(PowerManagerFsm::pm->m_current_time - StartTime); + if(dft > 10) { + transit(); + PowerManagerFsm::pm->m_faultNum = 1; + return; + } + string desp = "等待复合管控消息 : " + to_string(10-dft); + PowerManagerFsm::pm->printState("InitState", desp); + } + + // 2. 检查复合管控器是否上报故障 + if(PowerManagerFsm::pm->checkError() < 0) { + transit(); + PowerManagerFsm::pm->m_faultNum = 2; + return; + } + + // 3. 初始化系统为待机状态 + PowerManagerFsm::pm->initControlCmd(); + + // 4. 判断关键断路器是否闭合 + while (true) { + if(PowerManagerFsm::pm->m_currentDisBreakerState.bus3Breaker.unit4InstrumentDC48VCircuitBreaker == 1 || + PowerManagerFsm::pm->m_currentDisBreakerState.bus4Breaker.unit5CircuitBreaker == 1 || + PowerManagerFsm::pm->m_currentDisBreakerState.bus4Breaker.unit2CircuitBreaker == 1 || + PowerManagerFsm::pm->m_currentDisBreakerState.bus4Breaker.unit3CircuitBreaker == 1 || + PowerManagerFsm::pm->m_currentDisBreakerState.bus4Breaker.unit1CircuitBreaker == 1) { + transit(); + return; + } + PowerManagerFsm::pm->m_pmEvent = "等待关键断路器闭合"; + MOOSPause(1000); + PowerManagerFsm::pm->printState("InitState", PowerManagerFsm::pm->m_pmEvent); + } + } +}; + +class StandbyState : public PowerManagerFsm { +public: + void entry() { + PowerManagerFsm::pm->m_stateData.note = "待机状态"; + PowerManagerFsm::pm->printState("StandbyState", "进入待机状态"); + } + + void react(StandbyEvent const &) { + while (true) { + // 1. 检查当前是否存在故障 + if(PowerManagerFsm::pm->checkError() < 0) { + transit(); + return; + } + + // 2. 处理上位机控制指令 + handlePowerCommands(); + MOOSPause(1000); + } + } + +private: + void handlePowerCommands() { + switch (PowerManagerFsm::pm->m_msCmd.powerCMD) { + case 0: PowerManagerFsm::pm->m_pmEvent = "收到上位机控制指令:关机"; break; + case 1: handlePowerOn(); break; + // 其他处理函数省略... + } + } + + void handlePowerOn() { + PowerManagerFsm::pm->m_pmEvent = "动力电上电"; + PowerManagerFsm::pm->m_CcuColCmd.powerBatCmd = 0x10; + if(PowerManagerFsm::pm->m_pmCurrentState.ccustate.fcuState == 0x04) + PowerManagerFsm::pm->m_CcuColCmd.fcuCmd = 0x02; + } +}; + +class FaultState : public PowerManagerFsm { +public: + void entry() { + PowerManagerFsm::pm->printState("FaultState", "进入故障状态"); + } + + void react(FaultEvent const & e) { + switch (e.faultCode) { + case 1: + PowerManagerFsm::pm->m_pmEvent = "复合管控连接超时"; + PowerManagerFsm::pm->printState("FaultState", "通信故障"); + break; + case 2: + PowerManagerFsm::pm->m_pmEvent = "能源系统故障"; + PowerManagerFsm::pm->printState("FaultState", "能源故障"); + break; + } + } +}; + +// 设置初始状态 +FSM_INITIAL_STATE(PowerManagerFsm, InitState); + +#endif // POWER_MANAGER_FSM_HPP \ No newline at end of file diff --git a/src/pPowerManger/PowerManger.cpp b/src/pPowerManger/PowerManger.cpp index b5c5736..dd617f6 100644 --- a/src/pPowerManger/PowerManger.cpp +++ b/src/pPowerManger/PowerManger.cpp @@ -71,17 +71,9 @@ PowerManger::PowerManger() m_db->createDriversTables(VAR_TO_STR(m_subDisSysCmd)); m_db->createDriversTables(VAR_TO_STR(m_MSDriverCmd)); - //注册状态机 - m_fsm.RegisterState("Init", 1, m_Inite_s1); - m_fsm.RegisterState("Stady", 2, m_Standby_s2); - m_fsm.RegisterState("Fault", 99, m_Fault_s99); - - m_fsm.RegisterHandleFunction(&m_Inite_s1, handleInite_s1); - m_fsm.RegisterHandleFunction(&m_Standby_s2, handleStandby_s2); - m_fsm.RegisterHandleFunction(&m_Fault_s99, handleFault_s99); - // 初始化状态机 - m_pmState = m_Inite_s1; + m_fsm.init(this); + PowerManagerFsm::start(); } //--------------------------------------------------------- @@ -344,7 +336,14 @@ bool PowerManger::FsmLoop() //状态机循环 while (!m_FsmThread.IsQuitRequested()) { - m_fsm.run(m_pmState,this); + // 检查故障并触发事件 + if(int error = checkError()) { + triggerFaultEvent(error); + } else { + // 自动状态转换由状态机内部处理 + MOOSPause(1000); + } + //延时1s usleep(1000000); } @@ -599,7 +598,22 @@ int PowerManger::checkError() } -void PowerManger::printState(FSM_State st, string desp){ +void PowerManger::triggerInitEvent() +{ + PowerManagerFsm::dispatch(InitEvent()); +} + +void PowerManger::triggerStandbyEvent() +{ + PowerManagerFsm::dispatch(StandbyEvent()); +} + +void PowerManger::triggerFaultEvent(unsigned int faultCode) +{ + PowerManagerFsm::dispatch(FaultEvent(faultCode)); +} + +void PowerManger::printState(const std::string& stateName, const std::string& desp){ cout << MOOS::ConsoleColours::Yellow() << "STATE " << st.id << " [" << st.name << "] " << MOOS::ConsoleColours::reset(); cout << MOOS::ConsoleColours::Blue() << " -> " << MOOS::ConsoleColours::reset(); // 检查desp是否有“故障” @@ -610,214 +624,6 @@ void PowerManger::printState(FSM_State st, string desp){ cout << MOOS::ConsoleColours::Green() << desp << MOOS::ConsoleColours::reset() << endl; } -int PowerManger::handleInite_s1(FSM_State &fsm, void* pData) -{ - PowerManger* pm = (PowerManger*)pData; - bool ok = true; - //1. 检查通信是否正常 如果超时则进入故障状态 - double StartTime = pm->GetAppStartTime(); - while (pm->connectState < 5) - { - MOOSPause(1000); - pm->updateTime(); - double dft = abs(pm->m_current_time - StartTime); - if(dft > 10) - { - pm->m_pmState = pm->m_Fault_s99; - pm->m_faultNum = 1; //通信故障 - ok = false; - break; - } - string desp = "等待复合管控消息 : " + to_string(10-dft); - pm->printState(fsm,desp); - } - //2. 检查复合管控器是否上报故障 如果故障则进入故障状态 - if(pm->checkError() < 0) - { - ok = false; - pm->m_faultNum = 2; //能源故障 - } - //3. 初始化系统为待机状态 - pm->initControlCmd(); - //4.判断关键断路器是否闭合 - ok = false; - while (!ok) - { - if(pm->m_currentDisBreakerState.bus3Breaker.unit4InstrumentDC48VCircuitBreaker == 1 || - pm->m_currentDisBreakerState.bus4Breaker.unit5CircuitBreaker == 1 || - pm->m_currentDisBreakerState.bus4Breaker.unit2CircuitBreaker == 1 || - pm->m_currentDisBreakerState.bus4Breaker.unit3CircuitBreaker == 1 || - pm->m_currentDisBreakerState.bus4Breaker.unit1CircuitBreaker == 1) - { - ok = true; - } - pm->m_pmEvent = "等待关键断路器闭合"; - MOOSPause(1000); - pm->printState(fsm,pm->m_pmEvent); - } - //5. 进入下一状态 - if(ok) - { - pm->m_pmState = pm->m_Standby_s2; - } - if(!ok) - { - pm->m_pmState = pm->m_Fault_s99; - } - return 0; -} - -int PowerManger::handleStandby_s2(FSM_State &fsm, void* pData) -{ - PowerManger* pm = (PowerManger*)pData; - pm->m_stateData.note = "待机状态"; - while (true) - { - string desp = "待机状态"; - pm->printState(fsm,desp); - //1. 检查当前是否存在故障 - if(pm->checkError() < 0) - { - pm->m_pmState = pm->m_Fault_s99; - break; - } - //2. 检查上位机上电控制指令 - switch (pm->m_msCmd.powerCMD) - { - case 0: - pm->m_pmEvent = "收到上位机控制指令:关机"; - // pm->shutdown(); - break; - case 1: - pm->m_pmEvent = "动力电上电"; - // pm->powerOn(); - //1.先上动力锂电池 - pm->m_CcuColCmd.powerBatCmd = 0x10; - //2.检查燃料电池是否就绪,如果就绪则启动 - if(pm->m_pmCurrentState.ccustate.fcuState = 0x04) - pm->m_CcuColCmd.fcuCmd = 0x02; - break; - case 2: - pm->m_pmEvent = "锂动力电启动"; - pm->m_CcuColCmd.powerBatCmd = 0x10; - break; - case 3: - pm->m_pmEvent = "燃料电池启动"; - pm->m_CcuColCmd.fcuCmd = 0x02; - break; - case 4: - pm->m_pmEvent = "锂动力电关闭"; - pm->m_CcuColCmd.powerBatCmd = 0x20; - case 5: - pm->m_pmEvent = "燃料电池停机"; - pm->m_CcuColCmd.fcuCmd = 0x03; - break; - case 6: - pm->m_pmEvent = "燃料电池预热指令"; - pm->m_CcuColCmd.fcuCmd = 0x07; - break; - case 7: - pm->m_pmEvent = "燃料电池自检指令"; - pm->m_CcuColCmd.fcuCmd = 0x01; - break; - case 8: - pm->m_pmEvent = "燃料电池紧急停机"; - pm->m_CcuColCmd.fcuCmd = 0x05; - break; - case 9: - pm->m_pmEvent = "燃料电池复位指令"; - pm->m_CcuColCmd.fcuCmd = 0x04; - break; - case 10: - pm->m_pmEvent = "燃料电池补给指令"; - pm->m_CcuColCmd.fcuCmd = 0x06; - break; - case 11: - pm->m_pmEvent = "燃料电池停机维护"; - pm->m_CcuColCmd.fcuCmd = 0x08; - break; - default: - break; - } - //2. 检查上位机模式切换指令 - switch (pm->m_msCmd.modCMD) - { - case 0: - //无效 - break; - case 1: - pm->m_pmEvent = "待机工况"; - break; - case 2: - pm->m_pmEvent = "岸基备航"; - break; - case 3: - pm->m_pmEvent = "水中备航"; - break; - case 4: - pm->m_pmEvent = "遥控工况"; - break; - case 5: - pm->m_pmEvent = "巡航模式"; - break; - case 6: - pm->m_pmEvent = "高速模式"; - break; - case 7: - pm->m_pmEvent = "上浮下潜"; - break; - case 8: - pm->m_pmEvent = "浮调模式"; - break; - case 9: - pm->m_pmEvent = "水下侦查"; - break; - case 10: - pm->m_pmEvent = "水面侦查"; - break; - case 11: - pm->m_pmEvent = "DJ模式"; - break; - default: - break; - } - //3. 检查上位机工作模式切换控制指令 - switch (pm->m_msCmd.workCMD) - { - case 0: - pm->m_pmEvent = "正常模式(默认)"; - break; - case 1: - pm->m_pmEvent = "试验模式"; - pm->currentMod = 1; - break; - case 2: - pm->m_pmEvent = "调试模式"; - pm->currentMod = 2; - break; - } - MOOSPause(1000); - } - -} - -int PowerManger::handleFault_s99(FSM_State &fsm, void* pData) -{ - // cout << fsm.name << endl; - PowerManger* pm = (PowerManger*)pData; - switch (pm->m_faultNum) - { - case 1: - pm->printState(fsm,"通信故障"); - pm->m_pmEvent = "复合管控连接超时"; - break; - - default: - break; - } - pm->printState(fsm,"故障"); - return 0; -} //==============================系统操作函数==================== diff --git a/src/pPowerManger/PowerManger.h b/src/pPowerManger/PowerManger.h index b56b07b..44293ca 100644 --- a/src/pPowerManger/PowerManger.h +++ b/src/pPowerManger/PowerManger.h @@ -30,7 +30,7 @@ #include "json/json.h" #include "udpComm.h" #include "pmSysvariable.h" -#include "fsm.h" +#include "PowerManagerFsm.hpp" #include "SQLiteDB.h" #include "driver.h" @@ -96,92 +96,81 @@ class PowerManger : public AppCastingMOOSApp double msg_disHighAVolBusFbMsg_Update_time; double msg_disHighBVolBusFbMsg_Update_time; double msg_disLowBusFbMsg_Update_time; - - protected: - //===========================交互状态变量================================== - Driver m_driver; //设备驱动 - pmState m_pmCurrentState; //能源系统的当前状态 - disSysBreakerList m_currentDisBreakerState; //配电断路器状态 - disSysBreakerList m_targetDisBreakerState; - DriverTable m_currentDriverState; - DriverTable m_MSDriverCmd; - DriverTable m_subDisSysCmd; - DriverTable m_subDisSysState; -//=========================================================================== - //系统运行状态 - unsigned char workCondition; - unsigned char currentMod; - unsigned char powerState; - unsigned char falutLevel; - vector faultCode; - unsigned int soc; - unsigned int sustainableTime; - - // 配电和CCU的反馈状态 - msg_CcuStateFbMsg m_CcuCurrentState; - msg_disHighVolBusFbMsg m_disHighVolBusCurrentState; - msg_disHighAVolBusFbMsg m_disHighAVolBusCurrentState; - msg_disHighBVolBusFbMsg m_disHighBVolBusCurrentState; - msg_disLowBusFbMsg m_disLowBusState; - - //下位机操作函数 - ccuColCmd m_CcuColCmd; - void disSysOption(); - void ccuOption(); - - char getBreakerOption(char cmd); - void initControlCmd(); - - //上位机操作函数 - MSControlCmd m_msCmd; - bool buildPowerSysReport(); - bool getMsCmdFromJson(MSControlCmd &cmd,const string &strJson); - - private: - udpComm m_udpComm; - XPCUdpSocket *m_pCcuUdpComm; - CMOOSThread m_ListenThread; - CMOOSThread m_FsmThread; - long m_lPort; - unsigned int m_nReceiveBufferSizeKB; - unsigned int m_nSendBufferSizeKB; - double m_current_time; - unsigned int m_faultNum; - unsigned int m_ticker; - - public: - //===========================状态机实现============================================== - void printState(FSM_State st, string desp); + protected: + //===========================交互状态变量================================== + Driver m_driver; //设备驱动 + pmState m_pmCurrentState; //能源系统的当前状态 + disSysBreakerList m_currentDisBreakerState; //配电断路器状态 + disSysBreakerList m_targetDisBreakerState; + DriverTable m_currentDriverState; + DriverTable m_MSDriverCmd; + DriverTable m_subDisSysCmd; + DriverTable m_subDisSysState; + //=========================================================================== + //系统运行状态 + unsigned char workCondition; + unsigned char currentMod; + unsigned char powerState; + unsigned char falutLevel; + vector faultCode; + unsigned int soc; + unsigned int sustainableTime; + + // 配电和CCU的反馈状态 + msg_CcuStateFbMsg m_CcuCurrentState; + msg_disHighVolBusFbMsg m_disHighVolBusCurrentState; + msg_disHighAVolBusFbMsg m_disHighAVolBusCurrentState; + msg_disHighBVolBusFbMsg m_disHighBVolBusCurrentState; + msg_disLowBusFbMsg m_disLowBusState; + + //下位机操作函数 + ccuColCmd m_CcuColCmd; + void disSysOption(); + void ccuOption(); + + char getBreakerOption(char cmd); + void initControlCmd(); + + //上位机操作函数 + MSControlCmd m_msCmd; + bool buildPowerSysReport(); + bool getMsCmdFromJson(MSControlCmd &cmd,const string &strJson); + + private: + udpComm m_udpComm; + XPCUdpSocket *m_pCcuUdpComm; + CMOOSThread m_ListenThread; + CMOOSThread m_FsmThread; + long m_lPort; + unsigned int m_nReceiveBufferSizeKB; + unsigned int m_nSendBufferSizeKB; + double m_current_time; + unsigned int m_faultNum; + unsigned int m_ticker; + + // 状态机实例 + PowerManagerFsm m_fsm; + + public: + //===========================状态机接口======================================= + void printState(const std::string& stateName, const std::string& desp); bool FSM_RUN_IS_OK = true; - - StateData m_stateData; - FSM_State m_pmState; //当前状态 - string m_pmEvent; - FSM m_fsm; - - //初始化状态 - FSM_State m_Inite_s1; - static int handleInite_s1(FSM_State &fsm, void* pData); - - //待机状态 - FSM_State m_Standby_s2; - static int handleStandby_s2(FSM_State &fsm, void* pData); - - //岸基备航 - // FSM_State m_ShoreReady_s3; - - //水中备航 - - //自动工况 - - //故障处理 - FSM_State m_Fault_s99; - static int handleFault_s99(FSM_State &fsm, void* pData); - //====================================================================================== - int checkError(); - bool shutdown(); - bool powerOn(); - bool powerOff(); + + // 初始化状态机 + void initFsm() { + m_fsm.init(this); + } + + // 状态机事件触发接口 + void triggerInitEvent() { m_fsm.triggerInitEvent(); } + void triggerStandbyEvent() { m_fsm.triggerStandbyEvent(); } + void triggerFaultEvent(unsigned int faultCode) { m_fsm.triggerFaultEvent(faultCode); } + //================================================================================== + int checkError(); + bool shutdown(); + bool powerOn(); + bool powerOff(); + }; diff --git a/src/pPowerManger/fsm.h b/src/pPowerManger/fsm.h index 491b19a..9078755 100644 --- a/src/pPowerManger/fsm.h +++ b/src/pPowerManger/fsm.h @@ -27,14 +27,20 @@ public: int run(FSM_State &fsm,void* data); int run(FSM_State *fsm,void* data, std::string event); - //TODO: 事件注册机制实现 - int RegisterEvent(FSM_State* fsm, std::string event, FSM_State *state); - int unRegisterEvent(FSM_State* fsm, std::string event); - - int RegisterState(std::string name, unsigned int id,FSM_State &state); - FSM_State getState(std::string name); - unsigned int getStateId(std::string name); + // 事件处理机制 + int RegisterEvent(FSM_State* fsm, const std::string& event, FSM_State *state); + int unRegisterEvent(FSM_State* fsm, const std::string& event); + + // 状态管理 + int RegisterState(const std::string& name, unsigned int id, FSM_State &state); + FSM_State getState(const std::string& name) const; + unsigned int getStateId(const std::string& name) const; + + // 处理函数管理 int RegisterHandleFunction(FSM_State* fsm, FSM_Handle handle); int unRegisterHandleFunction(FSM_State* fsm); + + // 事件触发 + int triggerEvent(FSM_State* currentState, const std::string& event, void* data); }; #endif \ No newline at end of file diff --git a/src/pPowerManger/tinyfsm.hpp b/src/pPowerManger/tinyfsm.hpp new file mode 100644 index 0000000..5a11f8a --- /dev/null +++ b/src/pPowerManger/tinyfsm.hpp @@ -0,0 +1,251 @@ +/* + * TinyFSM - Tiny Finite State Machine Processor + * + * Copyright (c) 2012-2022 Axel Burri + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +/* --------------------------------------------------------------------- + * Version: 0.3.3 + * + * API documentation: see "../doc/50-API.md" + * + * The official TinyFSM website is located at: + * https://digint.ch/tinyfsm/ + * + * Author: + * Axel Burri + * --------------------------------------------------------------------- + */ + +#ifndef TINYFSM_HPP_INCLUDED +#define TINYFSM_HPP_INCLUDED + +#ifndef TINYFSM_NOSTDLIB +#include +#endif + +// #include +// #define DBG(str) do { std::cerr << str << std::endl; } while( false ) +// DBG("*** dbg_example *** " << __PRETTY_FUNCTION__); + +namespace tinyfsm +{ + + // -------------------------------------------------------------------------- + + struct Event { }; + + // -------------------------------------------------------------------------- + +#ifdef TINYFSM_NOSTDLIB + // remove dependency on standard library (silent fail!). + // useful in conjunction with -nostdlib option, e.g. if your compiler + // does not provide a standard library. + // NOTE: this silently disables all static_assert() calls below! + template + struct is_same_fsm { static constexpr bool value = true; }; +#else + // check if both fsm and state class share same fsmtype + template + struct is_same_fsm : std::is_same< typename F::fsmtype, typename S::fsmtype > { }; +#endif + + template + struct _state_instance + { + using value_type = S; + using type = _state_instance; + static S value; + }; + + template + typename _state_instance::value_type _state_instance::value; + + // -------------------------------------------------------------------------- + + template + class Fsm + { + public: + + using fsmtype = Fsm; + using state_ptr_t = F *; + + static state_ptr_t current_state_ptr; + + // public, leaving ability to access state instance (e.g. on reset) + template + static constexpr S & state(void) { + static_assert(is_same_fsm::value, "accessing state of different state machine"); + return _state_instance::value; + } + + template + static constexpr bool is_in_state(void) { + static_assert(is_same_fsm::value, "accessing state of different state machine"); + return current_state_ptr == &_state_instance::value; + } + + /// state machine functions + public: + + // explicitely specialized in FSM_INITIAL_STATE macro + static void set_initial_state(); + + static void reset() { }; + + static void enter() { + current_state_ptr->entry(); + } + + static void start() { + set_initial_state(); + enter(); + } + + template + static void dispatch(E const & event) { + current_state_ptr->react(event); + } + + + /// state transition functions + protected: + + template + void transit(void) { + static_assert(is_same_fsm::value, "transit to different state machine"); + current_state_ptr->exit(); + current_state_ptr = &_state_instance::value; + current_state_ptr->entry(); + } + + template + void transit(ActionFunction action_function) { + static_assert(is_same_fsm::value, "transit to different state machine"); + current_state_ptr->exit(); + // NOTE: do not send events in action_function definisions. + action_function(); + current_state_ptr = &_state_instance::value; + current_state_ptr->entry(); + } + + template + void transit(ActionFunction action_function, ConditionFunction condition_function) { + if(condition_function()) { + transit(action_function); + } + } + }; + + template + typename Fsm::state_ptr_t Fsm::current_state_ptr; + + // -------------------------------------------------------------------------- + + template + struct FsmList; + + template<> struct FsmList<> { + static void set_initial_state() { } + static void reset() { } + static void enter() { } + template + static void dispatch(E const &) { } + }; + + template + struct FsmList + { + using fsmtype = Fsm; + + static void set_initial_state() { + fsmtype::set_initial_state(); + FsmList::set_initial_state(); + } + + static void reset() { + F::reset(); + FsmList::reset(); + } + + static void enter() { + fsmtype::enter(); + FsmList::enter(); + } + + static void start() { + set_initial_state(); + enter(); + } + + template + static void dispatch(E const & event) { + fsmtype::template dispatch(event); + FsmList::template dispatch(event); + } + }; + + // -------------------------------------------------------------------------- + + template struct StateList; + template<> struct StateList<> { + static void reset() { } + }; + template + struct StateList + { + static void reset() { + _state_instance::value = S(); + StateList::reset(); + } + }; + + // -------------------------------------------------------------------------- + + template + struct MooreMachine : tinyfsm::Fsm + { + virtual void entry(void) { }; /* entry actions in some states */ + void exit(void) { }; /* no exit actions */ + }; + + template + struct MealyMachine : tinyfsm::Fsm + { + // input actions are modeled in react(): + // - conditional dependent of event type or payload + // - transit<>(ActionFunction) + void entry(void) { }; /* no entry actions */ + void exit(void) { }; /* no exit actions */ + }; + +} /* namespace tinyfsm */ + + +#define FSM_INITIAL_STATE(_FSM, _STATE) \ +namespace tinyfsm { \ + template<> void Fsm< _FSM >::set_initial_state(void) { \ + current_state_ptr = &_state_instance< _STATE >::value; \ + } \ +} + +#endif /* TINYFSM_HPP_INCLUDED */ diff --git a/test/model/ccu.slx b/test/model/ccu.slx deleted file mode 100644 index dc0770d..0000000 Binary files a/test/model/ccu.slx and /dev/null differ diff --git a/test/model/controlFlow.slx b/test/model/controlFlow.slx deleted file mode 100644 index 8bad347..0000000 Binary files a/test/model/controlFlow.slx and /dev/null differ diff --git a/test/model/untitled.slx b/test/model/untitled.slx deleted file mode 100644 index 6657b56..0000000 Binary files a/test/model/untitled.slx and /dev/null differ diff --git a/test/model/untitled.slx.original b/test/model/untitled.slx.original deleted file mode 100644 index 4a8ec29..0000000 Binary files a/test/model/untitled.slx.original and /dev/null differ