diff --git a/src/recorder.cpp b/src/recorder.cpp index efb1d7291977fc2490ab7d6296a4b358c30791b8..2f02a81c07c9af72d2045c6f762fecfc36a2bcd9 100644 --- a/src/recorder.cpp +++ b/src/recorder.cpp @@ -6,11 +6,13 @@ */ #include "recorder.h" +#include <unistd.h> #include <stdexcept> #include <iostream> #include <vector> #include <array> #include <algorithm> +#include <fstream> JasonRecorder::JasonRecorder(bool verbose) : verbose(verbose) { // create libusb context @@ -90,7 +92,7 @@ void JasonRecorder::send_message(std::uint16_t cmd, std::uint8_t *payload, size_ if (!handle) { throw std::logic_error("must call set_device() first"); } - // message format: 0xfe + payload size (2 byte) + command (1 byte) + payload + // message format: 0xfe + command (2 byte) + payload size (2 byte) + payload std::vector<std::uint8_t> data; data.reserve(6 + length); data.push_back(FRAME_START); @@ -135,70 +137,79 @@ void JasonRecorder::start_recording(int qhb_version, std::uint8_t num_channels, send_message(START_ID, payload1); } else if (qhb_version == 3) { - std::array<unsigned char, 4> accelSamplingRateBytes = {0}; - std::array<unsigned char, 4> accelRangeScaleBytes = {0}; - getBytesFromFloat(accelSamplingRateBytes, accelSamplingRate); - getBytesFromFloat(accelRangeScaleBytes, accelRangeScale); - std::vector<std::uint8_t> payload2 = { - (std::uint8_t) (0x01), - (std::uint8_t) (0x00), - (std::uint8_t) (accelRangeScaleBytes[0]), - (std::uint8_t) (accelRangeScaleBytes[1]), - (std::uint8_t) (accelRangeScaleBytes[2]), - (std::uint8_t) (accelRangeScaleBytes[3]), - (std::uint8_t) (accelSamplingRateBytes[0]), - (std::uint8_t) (accelSamplingRateBytes[1]), - (std::uint8_t) (accelSamplingRateBytes[2]), - (std::uint8_t) (accelSamplingRateBytes[3]) - }; - send_message(SET_SENSOR, payload2); - - std::array<unsigned char, 4> gyroSamplingRateBytes = {0}; - std::array<unsigned char, 4> gyroRangeScaleBytes = {0}; - getBytesFromFloat(gyroSamplingRateBytes, gyroSamplingRate); - getBytesFromFloat(gyroRangeScaleBytes, gyroRangeScale); - std::vector<std::uint8_t> payload3 = { - (std::uint8_t) (0x02), - (std::uint8_t) (0x00), - (std::uint8_t) (gyroRangeScaleBytes[0]), - (std::uint8_t) (gyroRangeScaleBytes[1]), - (std::uint8_t) (gyroRangeScaleBytes[2]), - (std::uint8_t) (gyroRangeScaleBytes[3]), - (std::uint8_t) (gyroSamplingRateBytes[0]), - (std::uint8_t) (gyroSamplingRateBytes[1]), - (std::uint8_t) (gyroSamplingRateBytes[2]), - (std::uint8_t) (gyroSamplingRateBytes[3]) - }; - send_message(SET_SENSOR, payload3); - - std::array<unsigned char, 4> magSamplingRateBytes = {0}; - std::array<unsigned char, 4> magRangeScaleBytes = {0}; - getBytesFromFloat(magSamplingRateBytes, magSamplingRate); - getBytesFromFloat(magRangeScaleBytes, magRangeScale); - std::vector<uint8_t> payload4 { - (std::uint8_t) (0x03), - (std::uint8_t) (0x00), - (std::uint8_t) (magRangeScaleBytes[0]), - (std::uint8_t) (magRangeScaleBytes[1]), - (std::uint8_t) (magRangeScaleBytes[2]), - (std::uint8_t) (magRangeScaleBytes[3]), - (std::uint8_t) (magSamplingRateBytes[0]), - (std::uint8_t) (magSamplingRateBytes[1]), - (std::uint8_t) (magSamplingRateBytes[2]), - (std::uint8_t) (magSamplingRateBytes[3]) - }; - send_message(SET_SENSOR, payload4); - std::vector<std::uint8_t> payload1 = { START, (std::uint8_t) ((sample_rate >> 24) & 0xFF), (std::uint8_t) ((sample_rate >> 16) & 0xFF), (std::uint8_t) ((sample_rate >> 8) & 0xFF), (std::uint8_t) (sample_rate & 0xFF), - num_channels, + (std::uint8_t) (num_channels), (std::uint8_t) (8 * depth), - num_filter}; + (std::uint8_t) (1 * num_filter)}; send_message(START_ID, payload1); + std::cout << "Start message sent\n"; + + // std::array<unsigned char, 4> accelSamplingRateBytes = {0}; + // std::array<unsigned char, 4> accelRangeScaleBytes = {0}; + // getBytesFromFloat(accelSamplingRateBytes, accelSamplingRate); + // getBytesFromFloat(accelRangeScaleBytes, accelRangeScale); + // std::vector<std::uint8_t> payload2 = { + // (std::uint8_t) (ACCEL), + // (std::uint8_t) (0x00), + // (std::uint8_t) (accelRangeScaleBytes[0]), + // (std::uint8_t) (accelRangeScaleBytes[1]), + // (std::uint8_t) (accelRangeScaleBytes[2]), + // (std::uint8_t) (accelRangeScaleBytes[3]), + // (std::uint8_t) (accelSamplingRateBytes[0]), + // (std::uint8_t) (accelSamplingRateBytes[1]), + // (std::uint8_t) (accelSamplingRateBytes[2]), + // (std::uint8_t) (accelSamplingRateBytes[3]) + // }; + // send_message(SET_SENSOR, payload2); + // std::cout << "Accel set\n"; + // sleep(0.01); + + // std::array<unsigned char, 4> gyroSamplingRateBytes = {0}; + // std::array<unsigned char, 4> gyroRangeScaleBytes = {0}; + // getBytesFromFloat(gyroSamplingRateBytes, gyroSamplingRate); + // getBytesFromFloat(gyroRangeScaleBytes, gyroRangeScale); + // std::vector<std::uint8_t> payload3 = { + // (std::uint8_t) (GYRO), + // (std::uint8_t) (0x00), + // (std::uint8_t) (gyroRangeScaleBytes[0]), + // (std::uint8_t) (gyroRangeScaleBytes[1]), + // (std::uint8_t) (gyroRangeScaleBytes[2]), + // (std::uint8_t) (gyroRangeScaleBytes[3]), + // (std::uint8_t) (gyroSamplingRateBytes[0]), + // (std::uint8_t) (gyroSamplingRateBytes[1]), + // (std::uint8_t) (gyroSamplingRateBytes[2]), + // (std::uint8_t) (gyroSamplingRateBytes[3]) + // }; + // send_message(SET_SENSOR, payload3); + // std::cout << "Gyro set\n"; + // sleep(0.01); + + // std::array<unsigned char, 4> magSamplingRateBytes = {0}; + // std::array<unsigned char, 4> magRangeScaleBytes = {0}; + // getBytesFromFloat(magSamplingRateBytes, magSamplingRate); + // getBytesFromFloat(magRangeScaleBytes, magRangeScale); + // std::vector<uint8_t> payload4 { + // (std::uint8_t) (MAG), + // (std::uint8_t) (0x00), + // (std::uint8_t) (magRangeScaleBytes[0]), + // (std::uint8_t) (magRangeScaleBytes[1]), + // (std::uint8_t) (magRangeScaleBytes[2]), + // (std::uint8_t) (magRangeScaleBytes[3]), + // (std::uint8_t) (magSamplingRateBytes[0]), + // (std::uint8_t) (magSamplingRateBytes[1]), + // (std::uint8_t) (magSamplingRateBytes[2]), + // (std::uint8_t) (magSamplingRateBytes[3]) + // }; + // send_message(SET_SENSOR, payload4); + // std::cout << "Mag set\n"; + // sleep(0.01); + + // libusb_clear_halt(handle, ENDPOINT_SEND); } this->num_channels = num_channels; @@ -250,6 +261,8 @@ void JasonRecorder::get_samples(std::vector<std::uint8_t> &samples, std::vector< //size_t length = buffer[1] << 8 + buffer[2]; if (buffer[0] != FRAME_START); // invalid message else if ((((std::uint16_t) buffer[1] << 8 )|(buffer[2])) == DATA_ID) { + std::cout << "IMU Data buffer\n"; + // find the beginning and length of the samples in the buffer size_t start = this->additional_data_size + 6; imu_data.resize(0); diff --git a/src/recorder.h b/src/recorder.h index 4bcf71f3c3786e87b517fae464fcd910987787e2..98a7a48f73c56206b3937db0ae5179f908cd989b 100644 --- a/src/recorder.h +++ b/src/recorder.h @@ -33,8 +33,13 @@ class JasonRecorder { const std::uint16_t DATA_ID = 0x0B01; const std::uint16_t STATUS_ID = 0x0B02; - const std::uint8_t START = 1; - const std::uint8_t STOP = 0; + const std::uint8_t START = 0x01; + const std::uint8_t STOP = 0x00; + + // sensor types for sensor parameters setting + const std::uint16_t ACCEL = 0x01; + const std::uint16_t GYRO = 0x02; + const std::uint16_t MAG = 0x03; private: // libusb handles struct libusb_context *ctx;