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}