Line data Source code
1 : #include "SIM_BattMonitor_SMBus_Generic.h" 2 : 3 6435 : SITL::SIM_BattMonitor_SMBus_Generic::SIM_BattMonitor_SMBus_Generic() : 4 6435 : SIM_BattMonitor_SMBus() 5 : { 6 : 7 6435 : const char *manufacturer_name = "sitl_smbus_generic"; 8 6435 : set_block(SMBusBattDevReg::MANUFACTURE_NAME, manufacturer_name); 9 : 10 6435 : } 11 : 12 6282 : void SITL::SIM_BattMonitor_SMBus_Generic::init() 13 : { 14 6282 : switch (cellcount()) { 15 2094 : case 14: 16 2094 : add_register("Cell14", SMBusBattGenericDevReg::CELL14, SITL::I2CRegisters::RegMode::RDONLY); 17 : FALLTHROUGH; 18 2094 : case 13: 19 2094 : add_register("Cell13", SMBusBattGenericDevReg::CELL13, SITL::I2CRegisters::RegMode::RDONLY); 20 : FALLTHROUGH; 21 4188 : case 12: 22 4188 : add_register("Cell12", SMBusBattGenericDevReg::CELL12, SITL::I2CRegisters::RegMode::RDONLY); 23 : FALLTHROUGH; 24 4188 : case 11: 25 4188 : add_register("Cell11", SMBusBattGenericDevReg::CELL11, SITL::I2CRegisters::RegMode::RDONLY); 26 : FALLTHROUGH; 27 4188 : case 10: 28 4188 : add_register("Cell10", SMBusBattGenericDevReg::CELL10, SITL::I2CRegisters::RegMode::RDONLY); 29 : FALLTHROUGH; 30 4188 : case 9: 31 4188 : add_register("Cell9", SMBusBattGenericDevReg::CELL9, SITL::I2CRegisters::RegMode::RDONLY); 32 : FALLTHROUGH; 33 4188 : case 8: 34 4188 : add_register("Cell8", SMBusBattGenericDevReg::CELL8, SITL::I2CRegisters::RegMode::RDONLY); 35 : FALLTHROUGH; 36 4188 : case 7: 37 4188 : add_register("Cell7", SMBusBattGenericDevReg::CELL7, SITL::I2CRegisters::RegMode::RDONLY); 38 : FALLTHROUGH; 39 4188 : case 6: 40 4188 : add_register("Cell6", SMBusBattGenericDevReg::CELL6, SITL::I2CRegisters::RegMode::RDONLY); 41 : FALLTHROUGH; 42 4188 : case 5: 43 4188 : add_register("Cell5", SMBusBattGenericDevReg::CELL5, SITL::I2CRegisters::RegMode::RDONLY); 44 : FALLTHROUGH; 45 4188 : case 4: 46 4188 : add_register("Cell4", SMBusBattGenericDevReg::CELL4, SITL::I2CRegisters::RegMode::RDONLY); 47 : FALLTHROUGH; 48 6282 : case 3: 49 6282 : add_register("Cell3", SMBusBattGenericDevReg::CELL3, SITL::I2CRegisters::RegMode::RDONLY); 50 : FALLTHROUGH; 51 6282 : case 2: 52 6282 : add_register("Cell2", SMBusBattGenericDevReg::CELL2, SITL::I2CRegisters::RegMode::RDONLY); 53 : FALLTHROUGH; 54 6282 : case 1: 55 6282 : add_register("Cell1", SMBusBattGenericDevReg::CELL1, SITL::I2CRegisters::RegMode::RDONLY); 56 6282 : return; 57 0 : default: 58 0 : AP_HAL::panic("Bad cellcount %u", cellcount()); 59 : } 60 : } 61 : 62 536279826 : void SITL::SIM_BattMonitor_SMBus_Generic::update(const class Aircraft &aircraft) 63 : { 64 536279826 : SIM_BattMonitor_SMBus::update(aircraft); 65 : 66 : // pretend to have three cells connected 67 536279826 : const float millivolts = aircraft.get_battery_voltage() * 1000.0f; 68 536279826 : uint16_t value_even = -1; 69 536279826 : uint16_t value_odd = -1; 70 536279826 : const uint8_t _connected_cells = connected_cells(); 71 536279826 : if (millivolts > 0) { 72 536279823 : const float volts_per_cell = millivolts/float(_connected_cells); 73 536279823 : value_even = uint16_t(volts_per_cell - 100.0f); 74 536279823 : value_odd = uint16_t(volts_per_cell + 100.0f); 75 : } 76 536279826 : switch (_connected_cells) { 77 178759942 : case 14: 78 178759942 : set_register(SMBusBattGenericDevReg::CELL14, value_even); 79 : FALLTHROUGH; 80 178759942 : case 13: 81 178759942 : set_register(SMBusBattGenericDevReg::CELL13, value_odd); 82 : FALLTHROUGH; 83 178759942 : case 12: 84 178759942 : set_register(SMBusBattGenericDevReg::CELL12, value_even); 85 : FALLTHROUGH; 86 178759942 : case 11: 87 178759942 : set_register(SMBusBattGenericDevReg::CELL11, value_odd); 88 : FALLTHROUGH; 89 178759942 : case 10: 90 178759942 : set_register(SMBusBattGenericDevReg::CELL10, value_even); 91 : FALLTHROUGH; 92 178759942 : case 9: 93 178759942 : set_register(SMBusBattGenericDevReg::CELL9, value_odd); 94 : FALLTHROUGH; 95 178759942 : case 8: 96 178759942 : set_register(SMBusBattGenericDevReg::CELL8, value_even); 97 : FALLTHROUGH; 98 178759942 : case 7: 99 178759942 : set_register(SMBusBattGenericDevReg::CELL7, value_odd); 100 : FALLTHROUGH; 101 178759942 : case 6: 102 178759942 : set_register(SMBusBattGenericDevReg::CELL6, value_even); 103 : FALLTHROUGH; 104 178759942 : case 5: 105 178759942 : set_register(SMBusBattGenericDevReg::CELL5, value_odd); 106 : FALLTHROUGH; 107 178759942 : case 4: 108 178759942 : set_register(SMBusBattGenericDevReg::CELL4, value_even); 109 : FALLTHROUGH; 110 536279826 : case 3: 111 536279826 : set_register(SMBusBattGenericDevReg::CELL3, value_odd); 112 : FALLTHROUGH; 113 536279826 : case 2: 114 536279826 : set_register(SMBusBattGenericDevReg::CELL2, value_even); 115 : FALLTHROUGH; 116 536279826 : case 1: 117 536279826 : set_register(SMBusBattGenericDevReg::CELL1, value_odd); 118 536279826 : return; 119 0 : default: 120 0 : AP_HAL::panic("Bad connected_cellcount %u", _connected_cells); 121 : } 122 : }