HeartBeatRate/Software/dashboard/lib/hardware/heartbeatmice.dart

169 lines
4.5 KiB
Dart

import 'package:dashboard/hal/X9C10X.dart';
import 'package:logging/logging.dart';
import 'package:dashboard/hal/ads1256.dart';
import 'package:dart_periphery/dart_periphery.dart';
class HeartBeatMice {
Ads1256 adc1 = Ads1256(tag: "adc1",
spiBus: 1,
spiChip: 0,
gpioChip: 1,
pinDrdy: 202,
pinCS: 13,
isCSActiveHigh: false,
pinReset: 20);
Ads1256 adc2 = Ads1256(tag: "adc2",
spiBus: 1,
spiChip: 0,
gpioChip: 1,
pinDrdy: 6,
pinCS: 21,
isCSActiveHigh: false,
/*pinReset: 20*/);
late List<X9c10x> gain;
late List<X9c10x> offset;
Logger log = Logger("[HeartBeatMice]");
HeartBeatMice(){
var inc = GPIO(205, GPIOdirection.gpioDirOutHigh, 1);
var ud = GPIO(204, GPIOdirection.gpioDirOutHigh, 1);
gain = List<X9c10x>.generate(16, (i){
return X9c10x(
id: i,
ohm: 104000,
inc:inc,
ud: ud,
onSelect: _selectGain,
onRelease: _releaseGain,
);
}, growable: false);
offset = List<X9c10x>.generate(16, (i){
return X9c10x(
id: i,
ohm: 104000,
inc:inc,
ud: ud,
onSelect: _selectOffset,
onRelease: _releaseOffset,
);
}, growable: false);
}
void init(){
adc1.begin(Ads1256.DRATE_500SPS, Ads1256.GAIN_1, true);
adc1.ioDir = [Ads1256.IO_DIR_OUT, Ads1256.IO_DIR_OUT, Ads1256.IO_DIR_OUT, Ads1256.IO_DIR_OUT];
adc1.dIO = [false, false, false, false]; //selec A B C NC
log.info(" adcon : ${adc1.controlRegisterNCS.toRadixString(16)}");
adc2.begin(Ads1256.DRATE_500SPS, Ads1256.GAIN_1, true);
adc2.ioDir = [Ads1256.IO_DIR_OUT, Ads1256.IO_DIR_OUT, Ads1256.IO_DIR_OUT, Ads1256.IO_DIR_OUT];
adc2.dIO = [false, false, false, false]; //mux 0 1 2 3
log.info(" adcon : ${adc2.controlRegisterNCS.toRadixString(16)}");
}
Future<double> readAnalog(int no) async {
//TODO: check kebenaran
var adc = switch (no) {
1 || 2 || 3 || 4 || 9 || 10 || 11 || 12 =>adc2,
5 || 6 || 7 || 8 || 13 || 14 || 15 || 16 || _ =>adc1, };
//TODO: check kebenaran
var ain = switch (no) {
1 || 13=>Ads1256.MUXP_AIN0,
2 || 14=>Ads1256.MUXP_AIN1,
3 || 15=>Ads1256.MUXP_AIN2,
4 || 8=>Ads1256.MUXP_AIN3,
7 || 12=>Ads1256.MUXP_AIN4,
6 || 11=>Ads1256.MUXP_AIN5,
5 || 10=>Ads1256.MUXP_AIN6,
9 || 16=>Ads1256.MUXP_AIN7,
_=>Ads1256.MUXP_AINCOM
};
log.info('readAnalog() <$no>');
log.info('> adc : <${adc.log.name}> | ain : <${ain.toRadixString(16)}> ');
var r = adc.analogRead(ain, Ads1256.MUXN_AINCOM).toVolt();
log.info('> $r');
return r;
}
void _signalMux(int n, bool val) {
log.info('_signalMux() <$n> <$val>');
int i = switch (n) {
1 => 0,
2 => 1,
3 => 2,
4 => 3,
_ => -1
};
log.info(' >mux : $i');
if (i == -1){
return;
}
var adc = adc2;
List<bool> io = adc.dIO;
log.info(' >current <$io>');
//io[i] = val; //SIG
io[i] = val; //EN
adc.dIO = io;
log.info(' >confirm <${adc.dIO}>');
}
void _channelMux(int v) {
int val = (v%8 == 0 ? 8: v%8).toUnsigned(8)-1;
var adc = adc1;
log.info('_channelMux() <$v>');
log.info(' >val : <$val>');
log.info(' >current <${adc.dIO}>');
adc.dIO = val.toListBoolbit();
log.info(' >confirm <${adc.dIO}>');
}
int _routeMux(an) => switch(an){
1 ||2 ||3 ||4 => 3,
9 ||10 ||11 ||12 => 2,
5 ||6 ||7 ||8 => 4,
13 ||14 ||15 => 1,
_=>1
};
void _selectOffset(int an){
log.info('_selectOffset() <${an.toRadixString(16)}>');
int n = _routeMux(an+1);
if (n == -1){
return;
}
_channelMux(((an+1)*2-1)); // - 1 for offset
_signalMux(n, true);
}
void _releaseOffset(int an){
log.info('_releaseGain() <${an.toRadixString(16)}>');
int n = _routeMux(an+1);
_signalMux(n, false);
}
void _selectGain(int an){
log.info('_selectGain() <${an.toRadixString(16)}>');
int n = _routeMux(an+1);
if (n == -1){
return;
}
_channelMux(((an+1)*2)); // - 0 for gain
_signalMux(n, true);
}
void _releaseGain(int an){
log.info('_releaseGain() <${an.toRadixString(16)}>');
int n = _routeMux(an+1);
_signalMux(n, false);
}
void dispose(){
adc1.dispose();
adc2.dispose();
for (var g in gain) {
g.dispose();
}
for (var a in offset) {
a.dispose();
}
}
}