Created
May 31, 2020 23:30
-
-
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!)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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