UmberHubManager/api/examples/c_cpp/BrainStem2-Signal-Example/BrainStem2Example/main.cpp

208 lines
8.8 KiB
C++
Executable File

//
// main.cpp
// BrainStem2Example
//
/////////////////////////////////////////////////////////////////////
// //
// Copyright (c) 2019 Acroname Inc. - All Rights Reserved //
// //
// This file is part of the BrainStem release. See the license.txt //
// file included with this package or go to //
// https://acroname.com/software/brainstem-development-kit //
// for full license details. //
/////////////////////////////////////////////////////////////////////
//
// This Example shows basic interaction with the MTMUSBStem. Please see the
// the product datasheet and the reference material at: http://acroname.com/reference
// 1. Create a MTMUSBStem object and connect.
// 2. Configure the MTMUSBStem to output a square wave via digital pin 6.
// 3. Set the T3 Time for signal entity 2 to 100000000.
// 4. Get and display the T3 Time for signal entity 2.
// 5. Set the T2 Time for signal entity 2 to 50000000.
// 6. Get and display the T2 Time for signal entity 2.
// 7. Enable the signal output on signal entity 2.
// 8. Configure the MTMUSBStem to receive a square wave via digital pin 4.
// 9. Enable the signal input on signal entity 0.
// 10. Get and display the T3 Time for signal entity 0.
// 11. Get and display the T2 Time for signal entity 0.
// 12. Calculate the Duty Cycle with the read T3 and T2 values.
// 13. Disable the signal output on signal entity 2.
// 14. Disable the signal input on signal entity 0.
// 15. Disconnect from the MTMUSBStem object.
#include <iostream>
#include "BrainStem2/BrainStem-all.h"
#include "BrainStem2/aMTMUSBStem.h"
int main(int argc, const char * argv[]) {
std::cout << "Creating a signal loopback, between digital pins 6 and 4, with a MTMUSBStem module" << std::endl << std::endl << std::endl;
// Lookup Table for Signal to Digital Mapping
// The indicies refer to the signal [0-4], while the values
// held in those indicies refer to the digital pins they
// are associated with.
// Note: This Lookup Table is for the MTMUSBStem only.
// Digital Entity to Signal Entity mapping varies per
// device. Please refer to the data sheet for the MTM
// Device you are using to see its unique mapping.
const int signalToDigitalMapping[] = {4, 5, 6, 7, 8};
// T Times to be set. Editable by user
const uint32_t T3_TIME = 100000000;
const uint32_t T2_TIME = 50000000;
// Signal Entity indexs to be used for input and output.
const uint8_t SIGNAL_OUTPUT_IDX = 2;
const uint8_t SIGNAL_INPUT_IDX = 0;
aMTMUSBStem usbstem; // Create an instance of a MTMUSBStem module
aErr err = aErrNone; // aErr variable which will hold the return value of the last command executed
uint32_t readFromOutputT3Time = 0; // T3 Time read from signal entity 2
uint32_t readFromOutputT2Time = 0; // T2 Time read from signal entity 2
uint32_t readFromInputT3Time = 0; // T3 Time read from signal entity 0
uint32_t readFromInputT2Time = 0; // T2 Time read from signal entity 0
// Connect to the hardware.
// The only difference for TCP/IP modules is to change 'USB' to 'TCP';
err = usbstem.discoverAndConnect(USB);
if (err != aErrNone) {
std::cout << "Error "<< err <<" encountered connecting to BrainStem module. Aborting example!" << std::endl;
return 1;
} else {
std::cout << "Connected to BrainStem module." << std::endl;
}
std::cout << std::endl;
/*
* Output
*/
// Configure the MTMUSBStem to output a square wave via digital pin 6
err = usbstem.digital[signalToDigitalMapping[SIGNAL_OUTPUT_IDX]].setConfiguration(digitalConfigurationSignalOutput);
if (err != aErrNone) {
std::cout << "Error "<< err <<" encountered attempting to set the configuration for digital pin 6 on the MTMUSBStem. Aborting example!" << std::endl << std::endl;
return 1;
}
// Set the T3 Time for signal entity 2 to 100000000
err = usbstem.signal[SIGNAL_OUTPUT_IDX].setT3Time(T3_TIME);
if (err != aErrNone) {
std::cout << "Error "<< err <<" encountered attempting to set the T3 Time for signal entity 2 on the MTMUSBStem. Aborting example!" << std::endl;
return 1;
}
// Get and display the T3 Time from signal entity 2
err = usbstem.signal[SIGNAL_OUTPUT_IDX].getT3Time(&readFromOutputT3Time);
if (err != aErrNone) {
std::cout << "Error "<< err <<" encountered attempting to get the T3 Time for signal entity 2 on the MTMUSBStem." << std::endl;
}
else if (readFromOutputT3Time == 0) {
std::cout << "T3 Time cannot be 0. Aborting example!" << std::endl;
return 1;
}
else {
std::cout << "T3 Time from Output Pin: " << readFromOutputT3Time << std::endl;
}
// Set the T2 Time for signal entity 2 to 50000000
err = usbstem.signal[SIGNAL_OUTPUT_IDX].setT2Time(T2_TIME);
if (err != aErrNone) {
std::cout << "Error "<< err <<" encountered attempting to set the T2 Time for signal entity 2 on the MTMUSBStem. Aborting example!" << std::endl;
return 1;
}
// Get and display the T2 Time from signal entity 2
err = usbstem.signal[SIGNAL_OUTPUT_IDX].getT2Time(&readFromOutputT2Time);
if (err != aErrNone) {
std::cout << "Error "<< err <<" encountered attempting to get the T2 Time for signal entity 2 on the MTMUSBStem" << std::endl;
}
else {
std::cout << "T2 Time from Output Pin: " << readFromOutputT2Time << std::endl;
}
err = usbstem.signal[SIGNAL_OUTPUT_IDX].setEnable(true);
if (err != aErrNone) {
std::cout << "Error "<< err <<" encountered attempting to set the signal enabled state of signal entity 2 to true on the MTMUSBStem. Aborting example!" << std::endl;
return 1;
}
std::cout << std::endl;
/*
* Input
*/
// Configure the MTMUSBStem to receive a square wave via digital pin 4
err = usbstem.digital[signalToDigitalMapping[SIGNAL_INPUT_IDX]].setConfiguration(digitalConfigurationSignalInput);
if (err != aErrNone) {
std::cout << "Error "<< err <<" encountered attempting to set the configuration for digital pin 4 on the MTMUSBStem. Aborting example!" << std::endl << std::endl;
return 1;
}
// Enable the signal input on signal entity 0
err = usbstem.signal[SIGNAL_INPUT_IDX].setEnable(true);
if (err != aErrNone) {
std::cout << "Error "<< err <<" encountered attempting to set the signal enabled state of signal entity 0 to true on the MTMUSBStem. Aborting example!" << std::endl << std::endl;
return 1;
}
/*
* Sleep for 500ms so the ouput can stabilize
* and the input can have time to calculate the
* time high/low
*/
aTime_MSSleep(500);
// Get and display the T3 Time from signal entity 0
err = usbstem.signal[SIGNAL_INPUT_IDX].getT3Time(&readFromInputT3Time);
if (err != aErrNone) {
std::cout << "Error "<< err <<" encountered attempting to get the T3 Time for signal entity 0 on the MTMUSBStem. Aborting example!" << std::endl;
return 1;
}
else if (readFromInputT3Time == 0) {
std::cout << "T3 Time cannot be 0. Aborting example!" << std::endl;
return 1;
}
else {
std::cout << "T3 Time from Input Pin: " << readFromInputT3Time << std::endl;
}
// Get and display the T2 Time from signal entity 0
err = usbstem.signal[SIGNAL_INPUT_IDX].getT2Time(&readFromInputT2Time);
if (err != aErrNone) {
std::cout << "Error "<< err <<" encountered attempting to get the T2 Time for signal entity 0 on the MTMUSBStem. Aborting example!" << std::endl;
return 1;
}
else {
std::cout << "T2 Time from Input Pin: " << readFromInputT2Time << std::endl;
}
std::cout << std::endl;
double dutyCycle = ((double)readFromInputT2Time / (double)readFromInputT3Time) * 100.0; // Calculate the Duty Cycle
std::cout << "Duty Cycle: "<< dutyCycle << std::endl << std::endl; // Display the Duty Cycle
// Disable the signal output on signal entity 2
err = usbstem.signal[SIGNAL_OUTPUT_IDX].setEnable(false);
if (err != aErrNone) {
std::cout << "Error "<< err <<" encountered attempting to set the signal enabled state of signal entity 2 to false on the MTMUSBStem" << std::endl;
}
// Disable the signal input on signal entity 0
err = usbstem.signal[SIGNAL_INPUT_IDX].setEnable(false);
if (err != aErrNone) {
std::cout << "Error "<< err <<" encountered attempting to set the signal enabled state of signal entity 0 to false on the MTMUSBStem" << std::endl;
}
std::cout << std::endl;
usbstem.disconnect(); // Disconnect from the MTMUSBStem
return 0;
}