Skip to content

Commit 358eb72

Browse files
committed
Add readBytes and readString methods
1 parent 7a2cfd7 commit 358eb72

File tree

2 files changed

+51
-2
lines changed

2 files changed

+51
-2
lines changed

Source/I2CRegisterContext.cpp

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
3338
int 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+
4670
int 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+
61105
int I2CRegisterContext::set933I2cRate (double rate)
62106
{
63107
auto sclTimes = (uint32_t) (std::round (1.0 / (100e-9 * rate)));

Source/I2CRegisterContext.h

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,18 +37,23 @@ class I2CRegisterContext
3737
I2CRegisterContext (uint32_t address, const oni_dev_idx_t, std::shared_ptr<Onix1>);
3838

3939
int WriteByte (uint32_t address, uint32_t value, bool sixteenBitAddress = false);
40-
int WriteWord (uint32_t address, uint32_t value, uint32_t numBytes, bool sixteenBitAddress = false);
40+
4141
int ReadByte (uint32_t address, oni_reg_val_t* value, bool sixteenBitAddress = false);
42+
int readBytes (uint32_t address, int count, std::vector<oni_reg_val_t>& value, bool sixteenBitAddress = false);
4243
int ReadWord (uint32_t address, uint32_t numBytes, uint32_t* value, bool sixteenBitAddress = false);
4344

45+
int readString (uint32_t address, int count, std::string& str, bool sixteenBitAddress = false);
46+
4447
int set933I2cRate (double);
4548

49+
oni_dev_idx_t getDeviceIndex() const;
50+
4651
protected:
4752
std::shared_ptr<Onix1> i2cContext;
4853

4954
private:
50-
const oni_dev_idx_t deviceIndex;
5155

56+
const oni_dev_idx_t deviceIndex;
5257
const uint32_t i2cAddress;
5358

5459
JUCE_LEAK_DETECTOR (I2CRegisterContext);

0 commit comments

Comments
 (0)