@@ -30,6 +30,11 @@ I2CRegisterContext::I2CRegisterContext (uint32_t address_, const oni_dev_idx_t d
3030 i2cContext = ctx_;
3131}
3232
33+ oni_dev_idx_t I2CRegisterContext::getDeviceIndex () const
34+ {
35+ return deviceIndex;
36+ }
37+
3338int I2CRegisterContext::WriteByte (uint32_t address, uint32_t value, bool sixteenBitAddress)
3439{
3540 uint32_t registerAddress = (address << 7 ) | (i2cAddress & 0x7F );
@@ -43,6 +48,25 @@ int I2CRegisterContext::ReadByte (uint32_t address, oni_reg_val_t* value, bool s
4348 return ReadWord (address, 1 , value, sixteenBitAddress);
4449}
4550
51+ int I2CRegisterContext::readBytes (uint32_t address, int count, std::vector<oni_reg_val_t >& value, bool sixteenBitAddress)
52+ {
53+ value.clear ();
54+
55+ oni_reg_val_t val;
56+ int rc = 0 ;
57+
58+ for (uint16_t i = 0 ; i < count; i++)
59+ {
60+ rc = ReadByte (address + i, &val, sixteenBitAddress);
61+ if (rc != ONI_ESUCCESS)
62+ return rc;
63+
64+ value.push_back (val);
65+ }
66+
67+ return rc;
68+ }
69+
4670int I2CRegisterContext::ReadWord (uint32_t address, uint32_t numBytes, uint32_t * value, bool sixteenBitAddress)
4771{
4872 if (numBytes < 1 || numBytes > 4 )
@@ -58,6 +82,26 @@ int I2CRegisterContext::ReadWord (uint32_t address, uint32_t numBytes, uint32_t*
5882 return i2cContext->readRegister (deviceIndex, registerAddress, value);
5983}
6084
85+ int I2CRegisterContext::readString (uint32_t address, int count, std::string& str, bool sixteenBitAddress)
86+ {
87+ std::vector<oni_dev_idx_t > data;
88+ str = " " ;
89+
90+ int rc = readBytes (address, count, data, sixteenBitAddress);
91+
92+ if (rc != ONI_ESUCCESS)
93+ {
94+ Onix1::showWarningMessageBoxAsync (" Error Reading String" , " Could not read the string at address " + std::to_string (address));
95+ return rc;
96+ }
97+
98+ auto it = std::find (data.begin (), data.end (), 0u );
99+ size_t len = (it != data.end ()) ? (size_t ) std::distance (data.begin (), it) : data.size ();
100+ str = std::string (data.begin (), data.begin () + len);
101+
102+ return ONI_ESUCCESS;
103+ }
104+
61105int I2CRegisterContext::set933I2cRate (double rate)
62106{
63107 auto sclTimes = (uint32_t ) (std::round (1.0 / (100e-9 * rate)));
0 commit comments