1package ads1293
2
3import (
4 "time"
5
6 "tinygo.org/x/drivers"
7
8 "machine"
9)
10
11// Device holds the already configured I2C bus and the address of the sensor.
12type Device struct {
13 DrdyPin machine.Pin
14 csPin machine.Pin
15 spiBus drivers.SPI
16}
17
18// Config is the configuration for the ADS1293.
19type Config struct {
20 DrdyPin machine.Pin
21 CsPin machine.Pin
22 SPIBus drivers.SPI
23}
24
25func New(config Config) Device {
26 return Device{DrdyPin: config.DrdyPin, csPin: config.CsPin, spiBus: config.SPIBus}
27}
28
29func (d *Device) GetECGdata(channel uint8) int32 {
30 var rawData [3]uint8
31 var ecgData int32
32
33 if channel < 1 || channel > 3 {
34 return -1 //return error, -1
35 } else {
36 channel -= 1
37 }
38
39 rawData[0] = d.ads1293ReadRegister(0x37 + (channel * 3))
40 rawData[1] = d.ads1293ReadRegister(0x38 + (channel * 3))
41 rawData[2] = d.ads1293ReadRegister(0x39 + (channel * 3))
42
43 var tempData uint32 = uint32(rawData[0]) << 16
44 tempData += uint32(rawData[1]) << 8
45 tempData += uint32(rawData[2])
46 tempData = tempData << 8
47 ecgData = int32(tempData)
48
49 return ecgData
50}
51
52func (d *Device) SetAds1293Pins() {
53 d.DrdyPin.Configure(machine.PinConfig{Mode: machine.PinInputPullup})
54 d.csPin.Configure(machine.PinConfig{Mode: machine.PinOutput})
55}
56
57func (d *Device) Ads1293Begin3LeadECG() {
58 d.ads1293WriteRegister(CONFIG, 0x00)
59 time.Sleep(1 * time.Millisecond)
60
61 d.ads1293WriteRegister(FLEX_CH1_CN, 0x11)
62 time.Sleep(1 * time.Millisecond)
63
64 d.ads1293WriteRegister(FLEX_CH2_CN, 0x19)
65 time.Sleep(1 * time.Millisecond)
66
67 d.ads1293WriteRegister(CMDET_EN, 0x07)
68 time.Sleep(1 * time.Millisecond)
69
70 d.ads1293WriteRegister(RLD_CN, 0x04)
71 time.Sleep(1 * time.Millisecond)
72
73 d.ads1293WriteRegister(OSC_CN, 0x04)
74 time.Sleep(1 * time.Millisecond)
75
76 d.ads1293WriteRegister(AFE_SHDN_CN, 0x24)
77 time.Sleep(1 * time.Millisecond)
78
79 d.ads1293WriteRegister(R2_RATE, 0x02)
80 time.Sleep(1 * time.Millisecond)
81
82 d.ads1293WriteRegister(R3_RATE_CH1, 0x02)
83 time.Sleep(1 * time.Millisecond)
84
85 d.ads1293WriteRegister(R3_RATE_CH2, 0x02)
86 time.Sleep(1 * time.Millisecond)
87
88 d.ads1293WriteRegister(DRDYB_SRC, 0x08)
89 time.Sleep(1 * time.Millisecond)
90
91 d.ads1293WriteRegister(CH_CNFG, 0x30)
92 time.Sleep(1 * time.Millisecond)
93
94 d.ads1293WriteRegister(CONFIG, 0x01)
95 time.Sleep(1 * time.Millisecond)
96}
97
98func (d *Device) Ads1293Begin5LeadECG() {
99
100 //channel 1 cn
101 d.ads1293WriteRegister(0x01, 0x11)
102 time.Sleep(1 * time.Millisecond)
103
104 //channel2
105 d.ads1293WriteRegister(0x02, 0x19)
106 time.Sleep(1 * time.Millisecond)
107
108 ///channel3 cn
109 d.ads1293WriteRegister(0x03, 0x2e)
110 time.Sleep(1 * time.Millisecond)
111
112 //Common-Mode Detection and Right-Leg Drive Common-Mode Feedback Control Register
113 d.ads1293WriteRegister(0x0a, 0x07)
114 time.Sleep(1 * time.Millisecond)
115
116 //RLD control
117 d.ads1293WriteRegister(0x0c, 0x04)
118 time.Sleep(1 * time.Millisecond)
119
120 d.ads1293WriteRegister(0x0d, 0x01)
121 time.Sleep(1 * time.Millisecond)
122
123 d.ads1293WriteRegister(0x0e, 0x02)
124 time.Sleep(1 * time.Millisecond)
125
126 d.ads1293WriteRegister(0x0f, 0x03) //0000 0011
127 time.Sleep(1 * time.Millisecond)
128
129 d.ads1293WriteRegister(0x10, 0x01)
130 time.Sleep(1 * time.Millisecond)
131
132 d.ads1293WriteRegister(0x12, 0x04)
133 time.Sleep(1 * time.Millisecond)
134
135 //debug
136 // d.ads1293WriteRegister(0x13, 0x07);
137 time.Sleep(1 * time.Millisecond)
138
139 //debug
140 d.ads1293WriteRegister(0x14, 0x00)
141 time.Sleep(1 * time.Millisecond)
142
143 d.ads1293WriteRegister(0x21, 0x02)
144 time.Sleep(1 * time.Millisecond)
145
146 d.ads1293WriteRegister(0x22, 0x02)
147 time.Sleep(1 * time.Millisecond)
148
149 d.ads1293WriteRegister(0x23, 0x02)
150 time.Sleep(1 * time.Millisecond)
151
152 d.ads1293WriteRegister(0x24, 0x02)
153 time.Sleep(1 * time.Millisecond)
154
155 d.ads1293WriteRegister(0x27, 0x08)
156 time.Sleep(1 * time.Millisecond)
157
158 d.ads1293WriteRegister(0x2f, 0x70)
159 time.Sleep(1 * time.Millisecond)
160
161 d.ads1293WriteRegister(00, 0x01)
162 time.Sleep(1 * time.Millisecond)
163}
164
165func (d *Device) ads1293WriteRegister(wrAddress uint8, data uint8) {
166
167 var dataToSend uint8 = (wrAddress & WREG)
168 d.csPin.Low()
169 d.spiBus.Transfer(dataToSend)
170 d.spiBus.Transfer(data)
171 d.csPin.High()
172}
173
174func (d *Device) ads1293ReadRegister(rdAddress uint8) uint8 {
175
176 var rdData uint8
177 var dataToSend uint8 = (rdAddress | RREG)
178 d.csPin.Low()
179 d.spiBus.Transfer(dataToSend)
180 rdData, _ = d.spiBus.Transfer(0)
181 d.csPin.High()
182
183 return rdData
184}
185
186func (d *Device) ReadSensorID() (uint8, bool) {
187
188 var ID uint8 = 0xff
189 ID = d.ads1293ReadRegister(REVID)
190 println(ID)
191 if ID != 0xff {
192 return ID, true
193 } else {
194 return ID, false
195 }
196}
197
198func (d *Device) configDCleadoffDetect() {
199
200}
201
202func (d *Device) configACleadoffDetect() {
203
204}
205
206func (d *Device) setSamplingRate() {
207
208}
209
210func (d *Device) DisableCh1() {
211 d.ads1293WriteRegister(FLEX_CH1_CN, 0x00)
212 time.Sleep(1 * time.Millisecond)
213}
214
215func (d *Device) DisableFilterAllChannels() {
216 d.ads1293WriteRegister(DIS_EFILTER, 0x07)
217 time.Sleep(1 * time.Millisecond)
218}
219
220func (d *Device) DisableFilter(channel uint8) bool {
221
222 if channel > 3 || channel < 0 {
223 println("Wrong channel error!")
224 return false
225 }
226
227 var channelBitMask uint8 = 0x01
228 channelBitMask = channelBitMask << (channel - 1)
229 d.ads1293WriteRegister(DIS_EFILTER, channelBitMask)
230 time.Sleep(1 * time.Millisecond)
231 return true
232}
233
234func (d *Device) readErrorStatus() uint8 {
235
236 return d.ads1293ReadRegister(ERR_STATUS)
237}
238
239func (d *Device) attachTestSignal(channel uint8, pol uint8) bool {
240
241 if (channel > 3) || (channel < 1) {
242 println("Wrong channel error!")
243 return false
244 }
245
246 pol = (pol << 6)
247 d.ads1293WriteRegister(channel, pol)
248 time.Sleep(1 * time.Millisecond)
249
250 return true
251}
252
253func (d *Device) ReadChannelsIfReady() (ready bool, ecgCh1, ecgCh2, ecgCh3 int32) {
254 if !d.DrdyPin.Get() {
255 return true, d.GetECGdata(1), d.GetECGdata(2), d.GetECGdata(3)
256 }
257 return false, 0, 0, 0
258}