Skip to content

Commit fc59abd

Browse files
authored
feat: added I2C API (#2786)
1 parent c21d63e commit fc59abd

File tree

1 file changed

+202
-0
lines changed

1 file changed

+202
-0
lines changed
Lines changed: 202 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,202 @@
1+
import 'package:flutter/foundation.dart';
2+
import 'package:pslab/communication/commands_proto.dart';
3+
import 'package:pslab/communication/packet_handler.dart';
4+
import 'package:pslab/others/logger_service.dart';
5+
6+
class I2C {
7+
late List<double> buffer;
8+
int frequency = 100000;
9+
late CommandsProto commandsProto;
10+
late PacketHandler packetHandler;
11+
int totalBytes = 0;
12+
int channels = 0;
13+
int samples = 0;
14+
int timeGap = 0;
15+
16+
I2C(this.packetHandler) {
17+
buffer = List.filled(10000, 0);
18+
commandsProto = CommandsProto();
19+
}
20+
21+
Future<void> init() async {
22+
packetHandler.sendByte(commandsProto.i2cHeader);
23+
packetHandler.sendByte(commandsProto.i2cInit);
24+
await packetHandler.getAcknowledgement();
25+
}
26+
27+
Future<void> enableSMBus() async {
28+
packetHandler.sendByte(commandsProto.i2cHeader);
29+
packetHandler.sendByte(commandsProto.i2cEnableSmbus);
30+
await packetHandler.getAcknowledgement();
31+
}
32+
33+
Future<void> pullSCLow(int uSec) async {
34+
packetHandler.sendByte(commandsProto.i2cHeader);
35+
packetHandler.sendByte(commandsProto.i2cPulldownScl);
36+
packetHandler.sendInt(uSec);
37+
await packetHandler.getAcknowledgement();
38+
}
39+
40+
Future<void> config(int frequency) async {
41+
packetHandler.sendByte(commandsProto.i2cHeader);
42+
packetHandler.sendByte(commandsProto.i2cConfig);
43+
int brgval = ((1 / frequency - 1 / 1e7) * 64e6 - 1).toInt();
44+
if (brgval > 511) {
45+
brgval = 511;
46+
logger.t("Frequency too low");
47+
}
48+
packetHandler.sendInt(brgval);
49+
await packetHandler.getAcknowledgement();
50+
}
51+
52+
Future<int> start(int address, int rw) async {
53+
packetHandler.sendByte(commandsProto.i2cHeader);
54+
packetHandler.sendByte(commandsProto.i2cStart);
55+
packetHandler.sendByte((address << 1) | rw & 0xFF);
56+
return (await packetHandler.getAcknowledgement() >> 4);
57+
}
58+
59+
Future<void> stop() async {
60+
packetHandler.sendByte(commandsProto.i2cHeader);
61+
packetHandler.sendByte(commandsProto.i2cStop);
62+
await packetHandler.getAcknowledgement();
63+
}
64+
65+
Future<void> wait() async {
66+
packetHandler.sendByte(commandsProto.i2cHeader);
67+
packetHandler.sendByte(commandsProto.i2cWait);
68+
await packetHandler.getAcknowledgement();
69+
}
70+
71+
Future<int> send(int data) async {
72+
packetHandler.sendByte(commandsProto.i2cHeader);
73+
packetHandler.sendByte(commandsProto.i2cSend);
74+
packetHandler.sendByte(data);
75+
return (await packetHandler.getAcknowledgement() >> 4);
76+
}
77+
78+
Future<int> restart(int address, int rw) async {
79+
packetHandler.sendByte(commandsProto.i2cHeader);
80+
packetHandler.sendByte(commandsProto.i2cRestart);
81+
packetHandler.sendByte((address << 1) | rw & 0xFF);
82+
return (await packetHandler.getAcknowledgement() >> 4);
83+
}
84+
85+
Future<List<int>> simpleRead(int address, int numBytes) async {
86+
await start(address, 1);
87+
return await read(numBytes);
88+
}
89+
90+
Future<List<int>> read(int length) async {
91+
List<int> data = [];
92+
for (int i = 0; i < length - 1; i++) {
93+
packetHandler.sendByte(commandsProto.i2cHeader);
94+
packetHandler.sendByte(commandsProto.i2cReadMore);
95+
data.add(await packetHandler.getByte());
96+
await packetHandler.getAcknowledgement();
97+
}
98+
packetHandler.sendByte(commandsProto.i2cHeader);
99+
packetHandler.sendByte(commandsProto.i2cReadEnd);
100+
data.add(await packetHandler.getByte());
101+
await packetHandler.getAcknowledgement();
102+
return data;
103+
}
104+
105+
Future<int> readStatus() async {
106+
packetHandler.sendByte(commandsProto.i2cHeader);
107+
packetHandler.sendByte(commandsProto.i2cStatus);
108+
int val = await packetHandler.getInt();
109+
await packetHandler.getAcknowledgement();
110+
return val;
111+
}
112+
113+
Future<List<int>> readBulk(
114+
int deviceAddress, int registerAddress, int bytesToRead) async {
115+
packetHandler.sendByte(commandsProto.i2cHeader);
116+
packetHandler.sendByte(commandsProto.i2cReadBulk);
117+
packetHandler.sendByte(deviceAddress);
118+
packetHandler.sendByte(registerAddress);
119+
packetHandler.sendByte(bytesToRead);
120+
Uint8List buffer = Uint8List(bytesToRead + 1);
121+
await packetHandler.read(buffer, bytesToRead + 1);
122+
List<int> data = [];
123+
for (int i in buffer) {
124+
data.add(i.toInt());
125+
}
126+
return data;
127+
}
128+
129+
Future<int> readByte(int deviceAddress, int registerAddress) async {
130+
List<int> data = await readBulk(deviceAddress, registerAddress, 1);
131+
return data[0];
132+
}
133+
134+
Future<int> readInt(int deviceAddress, int registerAddress) async {
135+
List<int> data = await readBulk(deviceAddress, registerAddress, 2);
136+
return (data[0] << 8) | data[1];
137+
}
138+
139+
Future<int> readLong(int deviceAddress, int registerAddress) async {
140+
List<int> data = await readBulk(deviceAddress, registerAddress, 4);
141+
return (data[0] << 24) | (data[1] << 16) | (data[2] << 8) | data[3];
142+
}
143+
144+
Future<void> writeBulk(int deviceAddress, List<int> data) async {
145+
packetHandler.sendByte(commandsProto.i2cHeader);
146+
packetHandler.sendByte(commandsProto.i2cWriteBulk);
147+
packetHandler.sendByte(deviceAddress);
148+
packetHandler.sendByte(data.length);
149+
for (int d in data) {
150+
packetHandler.sendByte(d);
151+
}
152+
await packetHandler.getAcknowledgement();
153+
}
154+
155+
Future<void> write(
156+
int deviceAddress, List<int> data, int registerAddress) async {
157+
List<int> finalData = [registerAddress, ...data];
158+
await writeBulk(deviceAddress, finalData);
159+
}
160+
161+
Future<void> writeByte(
162+
int deviceAddress, int registerAddress, int data) async {
163+
await write(deviceAddress, [data], registerAddress);
164+
}
165+
166+
Future<void> writeInt(
167+
int deviceAddress, int registerAddress, int data) async {
168+
await write(
169+
deviceAddress, [data & 0xFF, (data >> 8) & 0xFF], registerAddress);
170+
}
171+
172+
Future<void> writeLong(
173+
int deviceAddress, int registerAddress, int data) async {
174+
await write(
175+
deviceAddress,
176+
[
177+
data & 0xFF,
178+
(data >> 8) & 0xFF,
179+
(data >> 16) & 0xFF,
180+
(data >> 24) & 0xFF
181+
],
182+
registerAddress);
183+
}
184+
185+
Future<List<int>> scan(int? frequency) async {
186+
frequency ??= 125000;
187+
await config(frequency);
188+
List<int> addresses = [];
189+
for (int i = 0; i < 128; i++) {
190+
int x = await start(i, 0);
191+
if ((x & 1) == 0) addresses.add(i);
192+
await stop();
193+
}
194+
return addresses;
195+
}
196+
197+
Future<void> sendBurst(int data) async {
198+
packetHandler.sendByte(commandsProto.i2cHeader);
199+
packetHandler.sendByte(commandsProto.i2cSend);
200+
packetHandler.sendByte(data);
201+
}
202+
}

0 commit comments

Comments
 (0)