Lamp-Da 0.1
A compact lantern project
Loading...
Searching...
No Matches
BQ25713_mock.h
Go to the documentation of this file.
1
5#ifndef BQ25713_MOCK_H
6#define BQ25713_MOCK_H
7
8#include "i_ic.h"
9
10// use depend of real component (to have the registers)
12
13// hardwaree influencer simulator
15
17
20
21#include <map>
22
23namespace simulator {
24
25// independant of enabl/disable
26float targetOTGVoltage = 0.0;
27namespace __private {
28::lampda::platform::gpio::DigitalPin enableOTG(::lampda::platform::gpio::DigitalPin::GPIO::Output_EnableOnTheGo);
29}
30
32{
33public:
35 {
36 // fill register map
37
38 // ids
39 _registerMap[bq25713::MANUFACTURER_ID_ADDR] = std::make_unique<ManufacturerId>();
40 _registerMap[bq25713::DEVICE_ID_ADDR] = std::make_unique<DeviceId>();
41
42 // simple read bit
43 _registerMap[bq25713::CHARGE_OPTION_0_ADDR] = std::make_unique<Register>();
44 _registerMap[bq25713::CHARGE_OPTION_1_ADDR] = std::make_unique<Register>();
45 _registerMap[bq25713::CHARGE_OPTION_2_ADDR] = std::make_unique<Register>();
46 _registerMap[bq25713::CHARGE_OPTION_3_ADDR] = std::make_unique<Register>();
47
48 _registerMap[bq25713::ADC_OPTION_ADDR] = std::make_unique<AdcOption_Register>();
49 _registerMap[bq25713::PROCHOT_STATUS_ADDR] = std::make_unique<Register>();
50
51 _registerMap[bq25713::PROCHOT_OPTION_0_ADDR] = std::make_unique<Register>();
52 _registerMap[bq25713::PROCHOT_OPTION_1_ADDR] = std::make_unique<Register>();
53
54 // status
55 _registerMap[bq25713::CHARGE_STATUS_ADDR] = std::make_unique<ChargerStatus_Register>();
56 //
57 _registerMap[bq25713::VBAT_ADC_ADDR] = std::make_unique<VBAT_ADC_Register>();
58 _registerMap[bq25713::CHARGE_CURRENT_ADDR] = std::make_unique<Register>();
59 _registerMap[bq25713::MAX_CHARGE_VOLTAGE_ADDR] = std::make_unique<Register>();
60 _registerMap[bq25713::MINIMUM_SYSTEM_VOLTAGE_ADDR] = std::make_unique<Register>();
61 _registerMap[bq25713::OTG_VOLTAGE_ADDR] = std::make_unique<OTG_Register>();
62 _registerMap[bq25713::OTG_CURRENT_ADDR] = std::make_unique<Register>();
63 _registerMap[bq25713::INPUT_VOLTAGE_ADDR] = std::make_unique<Register>();
64 _registerMap[bq25713::IIN_HOST_ADDR] = std::make_unique<Register>();
65 _registerMap[bq25713::IIN_DPM_ADDR] = std::make_unique<Register>();
66
67 _registerMap[bq25713::ADC_VBUS_PSYS_ADC_ADDR] = std::make_unique<AdcVbusPsys_Register>();
68 _registerMap[bq25713::ADC_IBAT_ADDR] = std::make_unique<Register>();
69 _registerMap[bq25713::CMPIN_ADC_ADDR] = std::make_unique<Register>();
70 }
71
72 void run_electrical_update() override
73 {
74 // TODO
75
76 // check OTG enable
77 const uint16_t chargeOption3 = _registerMap[bq25713::CHARGE_OPTION_3_ADDR]->read();
78 if (chargeOption3)
79 {
80 const uint8_t val0 = chargeOption3 & 0xff;
81 const uint8_t val1 = (chargeOption3 >> 8) & 0xff;
82 // EN_OTG
83 if ((val1 & (1 << 0x04)) != 0 && __private::enableOTG.is_high())
84 {
85 mock_electrical::chargeOtgOutput = targetOTGVoltage;
86 }
87 else
88 {
89 mock_electrical::chargeOtgOutput = 0;
90 }
91 }
92 }
93
94 uint8_t get_i2c_address() const override { return bq25713::BQ25713::BQ25713addr; }
95
96protected:
97private:
98 // Create instance of registers data structure
99 inline static bq25713::BQ25713::Regt IcRegisters;
100
101 // interface with base registers
102 static uint16_t encode_to_base_read_register(const uint16_t val, const bq25713::BQ25713::IBaseReadRegister* reg)
103 {
104 // constraint
105 uint16_t valC =
106 (::lampda::lmpd_constrain<uint16_t>(val, reg->minVal(), reg->maxVal()) - reg->minVal()) / reg->resolution();
107 // rectified
108 uint16_t valR = (valC & reg->mask()) << reg->offset();
109 return valR;
110 }
111 static uint16_t decode_base_register_value(const uint16_t val, const bq25713::BQ25713::IBaseReadRegister* reg)
112 {
113 // unpack
114 uint16_t res = val;
115 res >>= reg->offset();
116 res &= reg->mask();
117 // convert to real units
118 return res * reg->resolution() + reg->minVal();
119 }
120
121 static uint16_t encode_to_double_register(const uint16_t val0,
122 const uint16_t val1,
124 {
125 // rectified vals
126 uint8_t val0R = (std::max<uint16_t>(val0, reg->minVal0()) - reg->minVal0()) / reg->resolutionVal0();
127 uint8_t val1R = (std::max<uint16_t>(val1, reg->minVal1()) - reg->minVal1()) / reg->resolutionVal1();
128
129 uint16_t result = (val1R & reg->maskVal1()) << 8 | (val0R & reg->maskVal0());
130 return result;
131 }
132
133 struct ChargerStatus_Register : public Register
134 {
135 uint16_t read() override
136 {
137 uint8_t val0 = 0;
138
139 uint8_t val1 = 0;
140 // val1 |= 1 << 0x07; // AC stat
141 val1 |= 1 << 0x06; // ICO done
142 val1 |= 1 << 0x00; // in OTG
143
144 return val1 << 8 | val0;
145 }
146 };
147
148 struct AdcOption_Register : public Register
149 {
150 uint16_t read() override
151 {
152 uint8_t val0 = 0;
153
154 uint8_t val1 = 0;
155 val1 |= 0 << 0x06; // ADC_START
156
157 return val1 << 8 | val0;
158 }
159 };
160
161 struct OTG_Register : public Register
162 {
163 int write(uint16_t data) override
164 {
165 const uint16_t decoded = decode_base_register_value(data, &IcRegisters.oTGVoltage);
166
167 // adjust for low range
168 targetOTGVoltage = (decoded + (IcRegisters.chargeOption3.OTG_RANGE_LOW() ? 0 : 1280) + 154) / 1000.0;
169
170 _data = data;
171 return 0;
172 }
173 };
174
175 struct AdcVbusPsys_Register : public Register
176 {
177 uint16_t read() override
178 {
179 return encode_to_double_register(
180 mock_battery::voltage * 1000.0, mock_electrical::powerRailVoltage * 1000.0, &IcRegisters.aDCVBUSPSYS);
181 }
182 };
183
184 // Battery and Vsys register
185 struct VBAT_ADC_Register : public Register
186 {
187 uint16_t read() override
188 {
189 return encode_to_double_register(
190 mock_battery::voltage * 1000.0, mock_battery::voltage * 1000.0, &IcRegisters.aDCVSYSVBAT);
191 }
192 };
193
194 struct ManufacturerId : public Register
195 {
196 uint16_t read() override { return bq25713::MANUFACTURER_ID; }
197 };
198
199 struct DeviceId : public Register
200 {
201 uint16_t read() override { return bq25713::DEVICE_ID; }
202 };
203};
204
205} // namespace simulator
206
207#endif
Definition: BQ25713_mock.h:32
Interface for the platform specific GeneralPurposeInputOutputs.
Handle the physical simulation paremeters of a real lamp.
Electrical simulation interface with the electrical simulator.
Simulator dedicated namespace.
Definition: default_simulation.h:8
Interface for the platform specific debug and prints.
Definition: BQ25713.h:121
Definition: BQ25713.h:195
Definition: BQ25713.h:242
Define useful functions.