2 #include <libFiles/bcm2835.h> 9 #define PIN18 RPI_GPIO_P1_18 10 #define PIN16 RPI_GPIO_P1_16 12 static float vreff = 1.8, ECG_GAIN = 1.4, RESPIRATION_gain = 1;
13 static unsigned int nFrames;
28 if (!bcm2835_init()) {
29 qDebug() << (
"Could not init bcm2835 in EcgCapture") << endl;
194 FRMCTL[3] = FRMCTL[3] & 0xF3;
195 FRMCTL[3] = FRMCTL[3] | 0x0C;
196 qDebug()<<
"Low freq";
199 FRMCTL[3] = FRMCTL[3] & 0xF3;
200 FRMCTL[3] = FRMCTL[3] | 0x04;
201 qDebug()<<
"Mid freq";
204 FRMCTL[3] = FRMCTL[3] & 0xF3;
205 FRMCTL[3] = FRMCTL[3] | 0x00;
206 qDebug()<<
"High freq";
235 void EcgCapture::spiInit()
237 bcm2835_gpio_fsel(
PIN18, BCM2835_GPIO_FSEL_OUTP);
238 bcm2835_gpio_write(
PIN18, LOW);
240 bcm2835_gpio_write(
PIN18, HIGH);
243 bcm2835_spi_setBitOrder(BCM2835_SPI_BIT_ORDER_MSBFIRST);
244 bcm2835_spi_setDataMode(BCM2835_SPI_MODE0);
245 bcm2835_spi_setClockDivider(BCM2835_SPI_CLOCK_DIVIDER_512);
246 bcm2835_spi_chipSelect(BCM2835_SPI_CS0);
247 bcm2835_spi_setChipSelectPolarity(BCM2835_SPI_CS0, LOW);
248 bcm2835_gpio_fsel(
PIN16, BCM2835_GPIO_FSEL_INPT);
275 qDebug()<<TESTOUT.toHex();
277 bcm2835_spi_transfernb(TESTIN.data(), TESTOUT.data(), TESTIN.size());
279 qDebug()<<TESTOUT.toHex();
281 if(bcm2835_gpio_lev(
PIN16)==LOW) {
302 qDebug()<<DATAOUT.toHex();
303 bcm2835_spi_transfernb(FRAMES.data(), DATAOUT.data(), FRAMES.size());
304 qDebug()<<DATAOUT.toHex();
310 bool EcgCapture::setReg(QByteArray writeCommand)
313 if (writeCommand.size() != 4)
316 enableRegisterWrite();
317 bcm2835_spi_transfern(writeCommand.data(), writeCommand.size());
325 void EcgCapture::csEnable()
327 bcm2835_spi_setChipSelectPolarity(BCM2835_SPI_CS0, LOW);
334 void EcgCapture::csDisable()
336 bcm2835_spi_setChipSelectPolarity(BCM2835_SPI_CS0, HIGH);
344 void EcgCapture::enableRegisterWrite()
355 enableRegisterWrite();
357 char FRAMES1[] = {0x40,0x00,0x00,0x00};
358 bcm2835_spi_transfern(FRAMES1,
sizeof(FRAMES1));
370 double EcgCapture::ecgVoltageConversion(
int ADCDecimal,
leadFormat format)
372 double ecg_voltage = 0;
375 if(ADCDecimal> 8388608) {
376 ecg_voltage = ((4*vreff*(-(16777216-ADCDecimal))/ECG_GAIN)/(16777215));
378 ecg_voltage = ((4*vreff*ADCDecimal)/ECG_GAIN)/(16777215);
381 ecg_voltage = (2*ADCDecimal*(vreff/ECG_GAIN))/(16777215);
390 double EcgCapture::respVoltageConversion(
int ADCDecimal)
392 return 4*(vreff/(1.6468*RESPIRATION_gain))*ADCDecimal/(16777215);
402 unsigned int counter = 0;
403 char FRAMES[] = {0x00,0x00,0x00,0x00};
404 char DATAOUT[] = {0,0,0,0};
406 QVector<double> frame;
407 bool ecgFlag =
false;
408 bool respFlag =
false;
409 bool loffFlag =
false;
413 while (counter<nFrames) {
414 if(bcm2835_gpio_lev(
PIN16)==LOW) {
415 bcm2835_spi_transfernb(FRAMES, DATAOUT,
sizeof(FRAMES));
429 if (DATAOUT[0] == 0x11) {
431 lead |= (DATAOUT[1] << 16);
432 lead |= (DATAOUT[2] << 8);
435 }
else if (DATAOUT[0] == 0x12) {
437 lead |= (DATAOUT[1] << 16);
438 lead |= (DATAOUT[2] << 8);
441 }
else if (DATAOUT[0] == 0x13) {
443 lead |= (DATAOUT[1] << 16);
444 lead |= (DATAOUT[2] << 8);
447 }
else if (DATAOUT[0] == 27) {
449 lead |= (DATAOUT[1] << 16);
450 lead |= (DATAOUT[2] << 8);
453 }
else if (DATAOUT[0] == 0x1D) {
456 int tmp = (DATAOUT[1] & mask) >> 4;
468 frame.append(ecgVoltageConversion(lead, leadMode));
470 }
else if (respFlag) {
471 frame.append(
filterVal(respVoltageConversion(lead)));
472 }
else if (loffFlag) {
const QVector< double > readFrame()
Reads a single frame.
void testDevice()
Method used to test if the device is working properly.
void start()
Start capturing frames from the ADAS1000.
void init(OperatingMode, Frequency)
Initiate the device by configuring the registers depending on operating mode and sampling frequency...
double filterVal(double val)