Skip to content

Instantly share code, notes, and snippets.

@elexisvenator
Created May 31, 2020 23:30
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save elexisvenator/03c06bee7ce4da0e7138fbbb492085bc to your computer and use it in GitHub Desktop.
Save elexisvenator/03c06bee7ce4da0e7138fbbb492085bc to your computer and use it in GitHub Desktop.
Helper class that wraps an `II2cBus` and allows for bus addresses to be remapped. Useful as a workaround for I2c drivers that expect a specific address range. Can be used by calling the `Remap` or `RemapAll` extension methods on any II2cBus (including itself!)
public class I2cRemapper : II2cBus
{
private readonly byte[] _addressMap = new byte[256]
{
0,
1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
11,
12,
13,
14,
15,
16,
17,
18,
19,
20,
21,
22,
23,
24,
25,
26,
27,
28,
29,
30,
31,
32,
33,
34,
35,
36,
37,
38,
39,
40,
41,
42,
43,
44,
45,
46,
47,
48,
49,
50,
51,
52,
53,
54,
55,
56,
57,
58,
59,
60,
61,
62,
63,
64,
65,
66,
67,
68,
69,
70,
71,
72,
73,
74,
75,
76,
77,
78,
79,
80,
81,
82,
83,
84,
85,
86,
87,
88,
89,
90,
91,
92,
93,
94,
95,
96,
97,
98,
99,
100,
101,
102,
103,
104,
105,
106,
107,
108,
109,
110,
111,
112,
113,
114,
115,
116,
117,
118,
119,
120,
121,
122,
123,
124,
125,
126,
127,
128,
129,
130,
131,
132,
133,
134,
135,
136,
137,
138,
139,
140,
141,
142,
143,
144,
145,
146,
147,
148,
149,
150,
151,
152,
153,
154,
155,
156,
157,
158,
159,
160,
161,
162,
163,
164,
165,
166,
167,
168,
169,
170,
171,
172,
173,
174,
175,
176,
177,
178,
179,
180,
181,
182,
183,
184,
185,
186,
187,
188,
189,
190,
191,
192,
193,
194,
195,
196,
197,
198,
199,
200,
201,
202,
203,
204,
205,
206,
207,
208,
209,
210,
211,
212,
213,
214,
215,
216,
217,
218,
219,
220,
221,
222,
223,
224,
225,
226,
227,
228,
229,
230,
231,
232,
233,
234,
235,
236,
237,
238,
239,
240,
241,
242,
243,
244,
245,
246,
247,
248,
249,
250,
251,
252,
253,
254,
255
};
public I2cRemapper(II2cBus i2CBus, byte from, byte to)
{
Base = i2CBus;
_addressMap[from] = to;
}
public I2cRemapper(II2cBus i2CBus, byte remapAllTo)
{
Base = i2CBus;
foreach (var from in _addressMap)
{
_addressMap[from] = remapAllTo;
}
}
public I2cRemapper(II2cBus i2CBus, IList<byte> mapping)
{
Base = i2CBus;
for (var i = 0; i < mapping.Count; i++)
{
_addressMap[i] = mapping[i];
}
}
public I2cRemapper(II2cBus i2CBus, IList<byte?> mapping)
{
Base = i2CBus;
for (var i = 0; i < mapping.Count; i++)
{
if (mapping[i] != null)
{
_addressMap[i] = mapping[i].Value;
}
}
}
public I2cRemapper(II2cBus i2CBus, IReadOnlyList<byte> mapping)
{
Base = i2CBus;
for (var i = 0; i < mapping.Count; i++)
{
_addressMap[i] = mapping[i];
}
}
public I2cRemapper(II2cBus i2CBus, IReadOnlyList<byte?> mapping)
{
Base = i2CBus;
for (var i = 0; i < mapping.Count; i++)
{
if (mapping[i] != null)
{
_addressMap[i] = mapping[i].Value;
}
}
}
public I2cRemapper(II2cBus i2CBus, IDictionary<byte, byte> mapping)
{
Base = i2CBus;
foreach (var (from, to) in mapping)
{
_addressMap[from] = to;
}
}
public I2cRemapper(II2cBus i2CBus, params (byte from, byte to)[] mapping)
{
Base = i2CBus;
foreach (var (from, to) in mapping)
{
_addressMap[from] = to;
}
}
public II2cBus Base { get; }
public int Frequency { get; set; }
public byte[] ReadData(byte peripheralAddress, int numberOfBytes)
{
return Base.ReadData(_addressMap[peripheralAddress], numberOfBytes);
}
public void WriteData(byte peripheralAddress, params byte[] data)
{
Base.WriteData(_addressMap[peripheralAddress], data);
}
public void WriteData(byte peripheralAddress, IEnumerable<byte> data)
{
Base.WriteData(_addressMap[peripheralAddress], data);
}
public void WriteData(byte peripheralAddress, Span<byte> data)
{
Base.WriteData(_addressMap[peripheralAddress], data);
}
public byte[] WriteReadData(byte peripheralAddress, int byteCountToRead, params byte[] dataToWrite)
{
#pragma warning disable 618
return Base.WriteReadData(_addressMap[peripheralAddress], byteCountToRead, dataToWrite);
#pragma warning restore 618
}
public void WriteReadData(byte peripheralAddress, Span<byte> writeBuffer, Span<byte> readBuffer)
{
Base.WriteReadData(_addressMap[peripheralAddress], writeBuffer, readBuffer);
}
}
public static class I2cBusRemapExtensions
{
public static I2cRemapper Remap(this II2cBus bus, byte from, byte to)
{
return new I2cRemapper(bus, from, to);
}
public static I2cRemapper Remap(this II2cBus bus, IList<byte> mapping)
{
return new I2cRemapper(bus, mapping);
}
public static I2cRemapper Remap(this II2cBus bus, IList<byte?> mapping)
{
return new I2cRemapper(bus, mapping);
}
public static I2cRemapper Remap(this II2cBus bus, IReadOnlyList<byte> mapping)
{
return new I2cRemapper(bus, mapping);
}
public static I2cRemapper Remap(this II2cBus bus, IReadOnlyList<byte?> mapping)
{
return new I2cRemapper(bus, mapping);
}
public static I2cRemapper Remap(this II2cBus bus, IDictionary<byte, byte> mapping)
{
return new I2cRemapper(bus, mapping);
}
public static I2cRemapper Remap(this II2cBus bus, params (byte from, byte to)[] mapping)
{
return new I2cRemapper(bus, mapping);
}
public static I2cRemapper RemapAll(this II2cBus bus, byte remapAllTo)
{
return new I2cRemapper(bus, remapAllTo);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment