|
| 1 | +#include "lsl_cpp.h" |
| 2 | +#include <iostream> |
| 3 | +#include <time.h> |
| 4 | +#include <stdlib.h> |
| 5 | +#include "mccdevice.h" |
| 6 | +using namespace std; |
| 7 | + |
| 8 | +MCCDevice* device; |
| 9 | +const char *channels[] = {"RAW1","SPK1","RAW2","SPK2","RAW3","SPK3","NC1","NC2"}; |
| 10 | +unsigned short * data; |
| 11 | + |
| 12 | +int main(int argc, char* argv[]) |
| 13 | +{ |
| 14 | + string name = "MCCDaq"; |
| 15 | + string type = "RawBrainSignal"; |
| 16 | + try { |
| 17 | + |
| 18 | + device = new MCCDevice(USB_1608_FS_PLUS); |
| 19 | + device->sendMessage("AISCAN:STOP"); |
| 20 | + device->flushInputData(); // Flush out any old data from the buffer |
| 21 | + device->sendMessage("AISCAN:XFRMODE=BLOCKIO"); // Good for fast acquisitions. |
| 22 | + //device->sendMessage("AISCAN:XFRMODE=SINGLEIO"); // Good for slow acquisitions |
| 23 | + device->sendMessage("AISCAN:SAMPLES=0"); // Set to continuous scan. |
| 24 | + device->sendMessage("AISCAN:RANGE=BIP5V");//Set the voltage range on the device |
| 25 | + device->sendMessage("AISCAN:LOWCHAN=0"); |
| 26 | + device->sendMessage("AISCAN:HIGHCHAN=5"); |
| 27 | + device->sendMessage("AISCAN:RATE=16384"); |
| 28 | + //device->mSamplesPerBlock = 512; |
| 29 | + //device->mScanParams.samplesPerBlock = 32/8; // nSamples*nChannels must be integer multiple of 32. |
| 30 | + device->reconfigure(); |
| 31 | + |
| 32 | + |
| 33 | + lsl::stream_info info(name, type, 6, 16384, lsl::cf_float32, string(name) += type); |
| 34 | + |
| 35 | + // add some description fields |
| 36 | + lsl::xml_element info_xml = info.desc(); |
| 37 | + lsl::xml_element manufac_xml = info_xml.append_child_value("manufacturer", "MeasurementComputing"); |
| 38 | + lsl::xml_element channels_xml = info.desc().append_child("channels"); |
| 39 | + int k; |
| 40 | + for (k = 0; k < 6; k++) |
| 41 | + { |
| 42 | + lsl::xml_element chn = channels_xml.append_child("channel"); |
| 43 | + chn.append_child_value("label", channels[k]) |
| 44 | + .append_child_value("unit", "V") |
| 45 | + .append_child_value("type", "LFP"); |
| 46 | + } |
| 47 | + |
| 48 | + // make a new outlet |
| 49 | + lsl::stream_outlet outlet(info); |
| 50 | + |
| 51 | + int dataLengthSamples = 512 * 6; |
| 52 | + std::vector<std::vector<float> > chunk(512, std::vector<float>(6)); // Used by LSL |
| 53 | + unsigned short *data = new unsigned short[dataLengthSamples]; // Pulled from the device. |
| 54 | + |
| 55 | + device->sendMessage("AISCAN:START"); // Start the scan on the device |
| 56 | + cout << "Now sending data..."; |
| 57 | + |
| 58 | + unsigned t; |
| 59 | + int c, s; |
| 60 | + //double timestamp = lsl::local_clock(); |
| 61 | + for (t=0; ; t++) { |
| 62 | + //device->getBlock(); |
| 63 | + device->readScanData(data, dataLengthSamples); |
| 64 | + for(c=0; c<6; c++) |
| 65 | + { |
| 66 | + for(s=0; s<512; s++) |
| 67 | + { |
| 68 | + chunk[s][c] = device->scaleAndCalibrateData( data[(s*6)+c], c); |
| 69 | + } |
| 70 | + } |
| 71 | + outlet.push_chunk(chunk);// , timestamp); |
| 72 | + //timestamp += 512.0/16384.0; |
| 73 | + //cout << "Pushed chunk at timestamp " << timestamp << " (diff=" << lsl::local_clock()-timestamp << ")." << endl; |
| 74 | + } |
| 75 | + |
| 76 | + } catch(std::exception &e) { |
| 77 | + cerr << "Got an exception: " << e.what() << endl; |
| 78 | + } |
| 79 | + cout << "Press any key to exit. " << endl; cin.get(); |
| 80 | + device->sendMessage("AISCAN:STOP"); |
| 81 | + delete device; |
| 82 | + return 0; |
| 83 | +} |
0 commit comments