From 4ec8a495ebfebd4e93d590ba2d8a73408509150c Mon Sep 17 00:00:00 2001 From: Kevin Lyda <kevin@ie.suberic.net> Date: Tue, 31 Jan 2017 22:01:28 +0000 Subject: [PATCH] Remove older c++ versions. --- gqgmc.hh | 649 ------------------------------------------------------- main.cc | 293 ------------------------- 2 files changed, 942 deletions(-) delete mode 100644 gqgmc.hh delete mode 100644 main.cc diff --git a/gqgmc.hh b/gqgmc.hh deleted file mode 100644 index cc6e3be..0000000 --- a/gqgmc.hh +++ /dev/null @@ -1,649 +0,0 @@ -// ************************************************************************** -// File: gqgmc.hh -// -// Author: Phil Gillaspy -// -// Last Modified: 04/26/2012 -// -// Description: -// Declare the class and its methods describing the capabilities -// of the GQ Electronics LLC Geiger-Muller Counter (GQ GMC). -// This code covers the GMC-300 and later models. -// -// INTRODUCTION: -// -// Detailed design documentation is embedded in the source code files. -// The intent is to combine source code and documentation such that a -// separate design document is unnecessary. The author's philosophy is that -// the source code should be considered as part of the design documentation. -// This philosophy was developed over many years of experience wherein the -// design document replicated so much information that was in the source -// code, that doing so generated needless opportunity for inconsistency. -// It is widely recognized that replicating information only increases -// the chances for human error and undue maintenance hardship. -// -// Since the design documentation will be embedded in the source code, -// the organization is constrained to the C/C++ compilation requirements -// that there exist a separate include and source body files. However, -// the author's philosophy is that sofware engineers find the separation -// of information between two files to be an annoyance. It would be much -// preferred that all information were located at the point where the -// software engineer needs to read the code to understand its operation, -// in other words, the source body file (.c,.cc). However, the C/C++ -// convention of separate header and body files precludes that idealism. -// It will be realized that various C/C++ constructs and objects appear -// in both the header and source body files. So the following convention -// is followed as to where to embed the documentation: the documentation -// should appear where the object is defined, not where it declared. -// For example, an enumeration which must be defined as publicly -// visible, will be defined only in the header file and consequently -// should be documented in the header file. As another example, a -// class method is declared in the header file, but defined in the source -// file. Therefore the bulk of the documentation for the method should -// be placed in the source file. -// -// The documentation presented here will not cover any nuclear physics -// technical aspects of the GQ Geiger-Muller counter. -// -// GQ GEIGER-MULLER FEATURES -// -// The discussion of the GQ LLC geiger counter is drawn principally -// from the the GMC-300 model with firmware revision 2.15 and later. -// The GMC-300 records high energy particles which when passing through -// geiger-muller tube ionize the gas and create a transient current. -// Each transient pulsed current is considered a 'count'. -// The basic measured form of the radiation is reported in terms of -// counts per second, counts per minute, or the counts per minute -// averaged over an hour. The GMC-300 is also capable of recording -// the aforementioned measures in a history buffer of 64K bytes. -// The GMC-300 provides a USB interface which, however, is physically -// and logically implemented as a traditional RS-232 serial interface. -// The GMC-300 provides a variety of commands to collect data and -// set operational parameters. The reader is referred to the GQ -// Electronics LLC GMC-200 User Manual for a more thorough -// discussion of the its features. -// -// -// SOFTWARE LICENSE STATEMENT -// -// This software contained in the gqgmc.hh and gqgmc.cc files are -// licensed to the public domain under terms of the GNU GPL -// reproduced here. -// Copyright (C) 2012 Phil Gillaspy -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// Additionally, the author, Phil Gillaspy, requires that no copyright -// notice nor acknowledgement to the author is necessary for any -// derivative software using any or all part of this software. -// -// DEVELOPMENT AND BUILD OVERVIEW -// -// The code as written is Linux dependent, however, it should not -// be word-size dependent. So far it has only been compiled for -// 64-bit word size on Linux using GNU g++ 4.6.1. The Eclipse -// IDE was used for software development but this is not a -// necessity. A Makefile is provided so that it is perfectly -// acceptable to compile from the command line using -// "make all", "make bin", or "make lib". The makefile creates -// a library containing the gqgmc class and its methods. This was -// done so third party usage could simply link to the library. -// Along with the makefile there are three associated files, -// Defines.mk, Targets.mk, and Patterns.mk. Defines.mk defines -// the root path of the development directory and various -// compile macros. Targets.mk defines the makefile targets and -// Patterns.mk defines makefile compilation dependencies. -// The makefile expects a specific directory structure. Given the -// the root directory of the source, there should be the following -// subdirectories existing; libs, bin, obj. The libGQGMC.a is -// located in the libs directory. Object files are placed in the -// obj directory. A sample main.c is compiled into a executable, -// gqgmc, and placed in the bin directory. The main.c contains -// sample test code to excercise the various capabilities of -// the GQ GMC geiger counter. -// -// -// DESIGN OVERVIEW -// -// This code provides an interface to GQ Electronics LLC GMC-300 -// geiger counter. Therefore the functionality implemented by this -// software consists of providing access to the capabilities -// provided by the geiger counter. These capabilities are -// elucidated in the interface document titled GQ-GMC-ICD.odt. -// Generally, the public methods defined for the gqgmc class -// are matched one for one with the capabilities of the -// GMC-300. Therefore, the user is referred to the interface -// document to ascertain what functionality can be expected of -// this software. The software does make an attempt to abstract -// or otherwise mask the details of the communications mechanism. -// Some capabilities of the GMC-300 are not implemented for the -// reason that they are not meaningful to accessing the radiation -// measurements through a remote computer, or in other words, -// the capability is only useful if the user carries the geiger -// counter in hand. For example, only two of the approximately -// 50 configuration parameters are provided with get and set methods. -// -// -// INCLUDE FILE DOCUMENTATION -// -// This include for C++ string handling -#include <string> - -// This include allows use of Linux predefined types -#include <stdint.h> - -#ifndef gqgmc_hh_ -#define gqgmc_hh_ - -// Define a name space for the GQ LLC geiger counter product line -namespace GQLLC -{ - - // CONFIGURATION PARAMETER ENUMERATION - // - // Declare a globally visible enumeration to be used for calling the - // writeConfigurationData() method. The value of the enumeration is - // equal to the offset of the parameter in the configuration data - // structure. This is then used as the first parameter in the call to - // writeConfigurationData(). See writeConfigurationData() method in - // gqgmc.cc. - enum cfg_param_t - { - ePowerOnOff = 0, - eAlarmOnOff = 1, - eSpeakerOnOff = 2, - eGraphicModeOnOff = 3, - eBacklightTimeoutSeconds = 4, - eIdleTitleDisplayMode = 5, - eAlarmCPMValue = 6, - eCalibrationCPM0 = 8, - eCalibrationSvUc0 = 10, - eCalibrationCPM1 = 14, - eCalibrationSvUc1 = 16, - eCalibrationCPM2 = 20, - eCalibrationSvUc2 = 22, - eIdleDisplayMode = 26, - eAlarmValueuSvUc = 27, - eAlarmType = 31, - eSaveDataType = 32, - eSwivelDisplay = 33, - eZoom = 34, - eDataSaveAddress = 38, - eDataReadAddress = 41, - eNPowerSavingMode = 44, - eNSensitivityMode = 45, - eNCounterDelay = 46, - eNVoltageOffset = 48, - eMaxCPM = 49, - eNSensitivityAutoModeThreshold = 51, - eSaveDate = 52, - eSaveTime = 55, - eMaxBytes = 58 - }; // end enum cfg_param_t - - // CONFIGURATION PARAMETER DATA BYTE COUNT - // - // Declare an globally visible enumeration to be used for calling the - // writeConfigurationData() method. The value of the enumeration is equal - // to the number of bytes of data passed to the writeConfigurationData() - // method. For each enumeration element, enum cfg_param_t, there is a - // matching enum cfg_bytecnt_t entry. - enum cfg_bytecnt_t - { - ePowerOnOff_bytecnt = 1, - eAlarmOnOff_bytecnt = 1, - eSpeakerOnOff_bytecnt = 1, - eGraphicModeOnOff_bytecnt = 1, - eBacklightTimeoutSeconds_bytecnt = 1, - eIdleTitleDisplayMode_bytecnt = 1, - eAlarmCPMValue_bytecnt = 2, - eCalibrationCPM0_bytecnt = 2, - eCalibrationSvUc0_bytecnt = 4, - eCalibrationCPM1_bytecnt = 2, - eCalibrationSvUc1_bytecnt = 4, - eCalibrationCPM2_bytecnt = 2, - eCalibrationSvUc2_bytecnt = 4, - eIdleDisplayMode_bytecnt = 1, - eAlarmValueuSvUc_bytecnt = 4, - eAlarmType_bytecnt = 1, - eSaveDataType_bytecnt = 1, - eSwivelDisplay_bytecnt = 1, - eZoom_bytecnt = 4, - eDataSaveAddress_bytecnt = 3, - eDataReadAddress_bytecnt = 3, - eNPowerSavingMode_bytecnt = 1, - eNSensitivityMode_bytecnt = 1, - eNCounterDelay_bytecnt = 2, - eNVoltageOffset_bytecnt = 1, - eMaxCPM_bytecnt = 2, - eNSensitivityAutoModeThreshold_bytecnt = 1, - eSaveDate_bytecnt = 3, - eSaveTime_bytecnt = 3, - eMaxBytes_bytecnt = 1 - }; // end enum cfg_bytecnt_t - - // SAVE DATA TYPE ENUMERATON - // Define a globally visible enumeration which defines the - // type of data that will be logged in the history buffer. - // This enumeration is to be used in the get and set method - // for the eSaveDataType configuration parameter. See - // getSaveDataType() and setSaveDataType() methods in gqgmc.cc. - enum saveDataType_t - { - eSaveOff = 0, // data logging is off - eCPS = 1, // counts per second - eCPM = 2, // counts per minute - eCPH = 3, // CPM averaged per hour - eMaxSaveDataType = 4 - }; - - // SOFTWARE KEY ENUMERATION - // - // Define a globally visible enumeration for use in calling the - // sendKey (send software key) command. The software key command - // emulates the same menu keys available on the front panel of - // the GMC-300. The user uses this enumeration as the parameter - // to the sendKey() call. See sendKey() method in gqgmc.cc. - enum softkey_t - { - // The GQGMC User Manual numbers the software keys 1 through 4, - // but the actual value is ASCII 0 through 3. - // We provide one enum named following the User Manual convention. - eKey1 = '0', eKey2 = '1', eKey3 = '2', eKey4 = '3', - // The user can use a second, more intuitive, enumeration: - // key 1 is the left arrow - // key 2 is the up arrow - // key 3 is the down arrow - // key 4 is the enter/menu key - eLeftArrow = '0', eUpArrow = '1', eDownArrow = '2', eEnter = '3' - }; - - // GMC ERROR CODES - // - // Define an enumeration of all possible error conditions. This needs - // to be globally visible so external routines can use the error code - // to access error text with the idea that the display of the error - // condition and its associated text message to the end user can - // be separated from this class. The idea is that this is a low level - // driver which should be not contain high level GUI functionality. - enum gmc_error_t - { - eNoProblem, eUSB_open_failed, eOlder_firmware, eGet_version, - eGet_serial_number, eGet_CPM, eGet_CPS, eGet_AutoCPS, eGet_CFG, - eErase_CFG, eUpdate_CFG, eWrite_CFG, eClear_USB, - eGet_battery_voltage, eGet_history_data, - eGet_history_data_length, eGet_history_data_address, - eGet_history_data_overrun, eSet_Year, eSet_Month, eSet_Day, - eSet_Hour, eSet_Minute, eSet_Second, - eLast_error_code - }; - - // PUBLIC CONSTANTS - // - // Publicly available constants which specify the maximum allowed - // requested length of history data and the maximum address in history - // buffer, respectively. External users can use this to guard against - // erroneous requests for history data. Actually, getHistoryData() - // method has guards also. - uint32_t const kHistory_Data_Maxsize = 0x1000; // 4k bytes - uint32_t const kHistory_Addr_Maxsize = 0x10000; // 64k bytes - - // CLASS DECLARATION - // - // The Class declaration - see gqgmc.cc for documentation - class GQGMC - { - // PUBLIC METHODS - public: - - // Constructor - GQGMC(); - - // Destructor is trivial, so coded inline - virtual - ~GQGMC() - { - delete[] mHistory_data; - }; - - // SUPPORTING PUBLIC METHODS - - // Method to call to open USB port. - virtual - void - openUSB(string usb_device_name); - - // Method to close USB port - virtual - void - closeUSB(void); - - // Method to clear the read (input) buffer of the USB-serial port. - // This arguably should be a private method, but I can see the - // outside possibility that a third party might need this. - virtual - void - clearUSB(); - - // Method to call to check any and all error conditions exihibited - // by the GQGMC class, implementation is trivial so coded inline. - virtual - enum gmc_error_t - getErrorCode() - { - return mError_code; - }; - - // Method to get a text description of the error code. - virtual - std::string - getErrorText(gmc_error_t err); - - // PUBLIC METHODS PROVIDING ACCESS TO GQ GMC CAPABILITIES - // Begin the public methods for issuing commands to the GQ GMC - // and returning data (if any). - - // Method to get GQ GMC version. - virtual - std::string - getVersion(); - - // Method to get serial number - virtual - std::string - getSerialNumber(); - - // Method to get the count per minute value. - virtual - uint16_t - getCPM(); - - - // Method to get the count per second value. - virtual - uint16_t - getCPS(); - - // Method to get voltage value of battery. - virtual - float - getBatteryVoltage(); - - // Method to get history data from internal flash. Returned - // pointer points to private data history data buffer. - virtual - uint8_t * const - getHistoryData(uint32_t address, uint32_t length); - - // Method to enable automatic reporting of count per second value. - virtual - void - turnOnCPS(); - - // Method to disable automatic reporting of count per second value. - virtual - void - turnOffCPS(); - - // Method to read the automatically transmitted CPS value. - virtual - uint16_t - getAutoCPS(); - - // Method to turn off the GQ GMC. - virtual - void - turnOffPower(); - - // Method to read configuration data. - virtual - void - getConfigurationData(); - - // Method to retrieve the data type logged in the history buffer. - virtual - enum saveDataType_t - getSaveDataType(); - - // Method to set the data type logged in the history buffer. - virtual - void - setSaveDataType(enum saveDataType_t newSaveDataType); - - // Method to retrieve the address in the history buffer - // where the logged data begins. - virtual - uint32_t - getDataSaveAddress(); - - // Method to set DataSaveAddress to zero, in other words, - // set the address of data logging to begin in the - // history buffer at address zero. - virtual - void - resetDataSaveAddress(); - - // Method to write configuration data. - virtual - void - writeConfigurationData(enum cfg_param_t cfgParameter, - enum cfg_bytecnt_t cfgDataCount, - uint8_t const * const cfgData); - - // Method to erase configuration data. - virtual - void - eraseConfigurationData(); - - // Method to make latest changes to configuration data take effect. - // Invoke this method after setting configuration data using - // writeConfiguration(), setDataSaveAddress(), or setSaveDataType(). - virtual - void - updateConfigurationData(); - - // Public method to send key (emulate one of the 4 keys on the - // front panel of the GQ GMC). - virtual - void - sendKey(enum softkey_t key); - - // Public method to set the date month-day-year format. For example, - // for January 1, 2013 use "013113". - virtual - void - setDate(string date); - - // Public method to set the time of day: hour:minutes:seconds format. - // For example, for 30 minutes past 1PM use "133000". - virtual - void - setTime(string time); - - // There are no public data members - - - private: - - // PRIVATE DATA - - // The device name of the USB port connected to the GQ GMC. - std::string mUSB_device; - - // Forced to use C style IO because C++ streams does not support - // setting line discipline sufficiently on the serial port. - int mUSB_serial; - - // Error flag for indicating failure, see enumeration of error codes - // declared above enum gmc_error_t. - enum gmc_error_t mError_code; - - // The failure of each command results from failing to read the - // returned data. So we need a separate status for the read failure - // so it can be tested privately. - bool mRead_status; - - // Special flag indicating that automatic reporting of counts per - // second is turned off or on (off==false, on==true). This should - // and is intended to be implemented as a mutex if and when threading - // is implemented. - bool mCPS_is_on; - - // The USB port uses big endian transfer (ie, MSB transmitted 1st). - // This flag indicates the endianess of the host CPU. This is set - // in the constructor by calling isBigEndian() method. - bool mBig_endian; - - // This real number is the GQ GMC's firmware revision. This is needed - // because the GQ GMC changed the command string for various commands - // between versions of the firmware. This means that not all commands - // will work with firmware prior to 2.15. - float mFirmware_revision; - - // Storage for the history data, maximum of 4K bytes to be allocated - // in constructor. The user can only request a max of 4K at a time. - uint8_t * mHistory_data; - - // Declare a structure for storage of the configuration data. - // This is a replica of the GQ GMC's internal configuration data. - // This is referred to as the host computer's local copy of the - // GQ GMC's NVM configuration data elsewhere in the documentation. - // The getConfigurationData method will deposit the GQ GMC's NVM data - // into this structure. All configuration data is the binary value. - // Booleans are just 0 or 1. But remember that the byte order is - // big endian for multibyte data. So multibyte data may require - // reversing the byte order for display to a user. Those data - // whose semantics are understood are documented below, otherwise - // no explanation means either we have no interest or the parameter - // is better left to being updated physically using the GQ GMC's - // front panel keys. - struct cfg_data_t - { - uint8_t powerOnOff; // byte 0 - uint8_t alarmOnOff; - uint8_t speakerOnOff; - uint8_t graphicModeOnOff; - uint8_t backlightTimeoutSeconds; // byte 4 - uint8_t idleTitleDisplayMode; - uint8_t alarmCPMValueHiByte; - uint8_t alarmCPMValueLoByte; - uint8_t calibrationCPMHiByte_0; // byte 8 - uint8_t calibrationCPMLoByte_0; - uint8_t calibrationSvUcByte3_0; - uint8_t calibrationSvUcByte2_0; - uint8_t calibrationSvUcByte1_0; // byte 12 - uint8_t calibrationSvUcByte0_0; - uint8_t calibrationCPMHiByte_1; - uint8_t calibrationCPMLoByte_1; - uint8_t calibrationSvUcByte3_1; // byte 16 - uint8_t calibrationSvUcByte2_1; - uint8_t calibrationSvUcByte1_1; - uint8_t calibrationSvUcByte0_1; - uint8_t calibrationCPMHiByte_2; // byte 20 - uint8_t calibrationCPMLoByte_2; - uint8_t calibrationSvUcByte3_2; - uint8_t calibrationSvUcByte2_2; - uint8_t calibrationSvUcByte1_2; // byte 24 - uint8_t calibrationSvUcByte0_2; - uint8_t idleDisplayMode; - uint8_t alarmValueuSvUcByte3; - uint8_t alarmValueuSvUcByte2; // byte 28 - uint8_t alarmValueuSvUcByte1; - uint8_t alarmValueuSvUcByte0; - uint8_t alarmType; - // saveDataType specifies both the interval of data logging where - // 0 = data logging is off, 1 = once per second, 2 = once per minute, - // 3 = once per hour and the type of data saved where 0 = don't care, - // 1 = counts/second, 2 = counts/minute, 3 = CPM averaged over hour. - // Whenever this is changed, the GQ GMC inserts a date/timestamp - // into the history data buffer. - uint8_t saveDataType; // byte 32 - uint8_t swivelDisplay; - uint8_t zoomByte3; - uint8_t zoomByte2; - uint8_t zoomByte1; // byte 36 - uint8_t zoomByte0; - // dataSaveAddress represents the address of the first sample following - // the insertion of a date/timestamp or label tag into the data buffer. - // Periodically, a label or date/timestamp will be put into the buffer - // without a change made to dataSaveAddress. So you always have to be - // on the lookout for 55AA sequence when parsing data buffer. But you - // have to do that anyway because you might encounter double byte data. - uint8_t dataSaveAddress2; - uint8_t dataSaveAddress1; - uint8_t dataSaveAddress0; // byte 40 - // dataReadAddress semantics is unknown. As far as I have seen, - // its value is always zero. - uint8_t dataReadAddress2; - uint8_t dataReadAddress1; - uint8_t dataReadAddress0; - uint8_t nPowerSavingMode; // byte 44 - uint8_t nSensitivityMode; - uint8_t nCounterDelayHiByte; - uint8_t nCounterDelayLoByte; - uint8_t nVoltageOffset; // byte 48 - uint8_t maxCPMHiByte; - uint8_t maxCPMLoByte; - uint8_t nSensitivityAutoModeThreshold; - // saveDateTimeStamp is the date/timestamp of the logging run, - // all data following up to the next date/timestamp are marked - // in time by this date/timestamp, where - uint8_t saveDateTimeStampByte5; // = year (last two digits) // byte 52 - uint8_t saveDateTimeStampByte4; // = month - uint8_t saveDateTimeStampByte3; // = day - uint8_t saveDateTimeStampByte2; // = hour - uint8_t saveDateTimeStampByte1; // = minute // byte 56 - uint8_t saveDateTimeStampByte0; // = second - // maxBytes is always 0xff - uint8_t maxBytes; - uint8_t spare[197]; // add spare to total 256 bytes - } mCFG_Data; - - // PRIVATE METHODS - - - // Method to load configuration data which writes all 256 bytes - // of the configuration data to the GQ GMC in sequence. This is - // called by updateConfigurationData(). - virtual - void - loadConfigurationData(); - - // Because of the returned byte stream from the GQ GMC has no protocol, - // that is, it is just a sequence of N bytes, we need a specialized - // read. The write is straight forward, but is combined with the read - // for reasons of code commonality. So we will call the write followed - // by read as the 'communicate' method. - void - communicate(const std::string cmd, char * retdata, uint32_t retbytes); - - // This is the basic method to transmit the command to the GQ GMC. - // communicate() calls this to transmit command. - void - sendCmd(const std::string cmd); - - // This is the basic method to read the return bytes from the command. - // communicate() calls this to read the return byte stream of the - // command. - void - readCmdReturn(char * retdata, uint32_t retbytes); - - // This is the method to determine endianess of host CPU. This is to be - // called by constructor once and once only. - bool - isBigEndian(void); - - }; // end class GQGMC - -} // end namespace GQLLC - -// DOCUMENTATION CONTINUES IN gqgmc.cc -#endif // gqgmc_hh_ diff --git a/main.cc b/main.cc deleted file mode 100644 index cbf6605..0000000 --- a/main.cc +++ /dev/null @@ -1,293 +0,0 @@ -// ************************************************************************** -// File: main.cc -// -// Author: Phil Gillaspy -// -// Description: Demonstration program for GQ GMC (geiger-muller counter). -// -// Usage: gqgmc <usb-port-device-name> -// Example: gqgmc /dev/ttyUSB0 -// -// ************************************************************************** -#include <string> -#include <sstream> -#include <iostream> -#include <iomanip> -using namespace std; - -#include <unistd.h> - -#include "gqgmc.hh" -using namespace GQLLC; - - -void mypause() -{ - cout << "Paused: to continue, press ENTER.. " << flush; - cin.ignore(1, '\n'); - return; -} - -// Utility to show message to user. To be adapted to a pop-up window -// when code developed for GUI. -void Display_message(string msg) -{ - cout << msg << endl; -} - -// Utility to encapsulate the code to display an error message. This is -// separated from Display_message() because this is specialized to -// accessing and formulating the GQGMC error status, but not displaying. -void Display_error(const GQGMC & gmc) -{ - gmc_error_t err; - err = const_cast<GQGMC &>(gmc).getErrorCode(); - stringstream msg; - msg << const_cast<GQGMC &>(gmc).getErrorText(err); - Display_message(msg.str()); - return; -} - -int -main(int argc, char **argv) -{ - // Open the USB port using a USB to serial converter device driver. - // Using UDEV rule file 51-gqgmc.rules to create symlink to /dev/gqgmc. - string usb_device = "/dev/gqgmc"; - - if (argc > 1) - usb_device = argv[1]; - else - { - cout << "Usage: gqgmc <usb-port-device-name>" << endl; - cout << "Example: gqgmc /dev/ttyUSB0" << endl; - return 0; - } - -// cout << usb_device << endl; // debug - - // Instantiate the GQGMC object on the heap - GQGMC * gqgmc = new GQGMC; - - // Open USB port - gqgmc->openUSB(usb_device); - - // Check success of opening USB port - if (gqgmc->getErrorCode() == eNoProblem) - { - stringstream msg; - msg << "USB is opened" << endl; - Display_message(msg.str()); - } - else - { - Display_error(*gqgmc); // dereference to pass by reference - gqgmc->closeUSB(); - return 0; - } - - // Test string for date and time - string date = "030513"; - string time = "171730"; - - // Set date - cout << "date: " << date << endl; - gqgmc->setDate(date); - - // Set time of day - cout << "time: " << time << endl; - gqgmc->setTime(time); - - - // Get version - cout << "get version" << endl; - string version; - version = gqgmc->getVersion(); - if (gqgmc->getErrorCode() == eNoProblem) - { - stringstream msg; - msg << version << endl; - Display_message(msg.str()); - } - else - Display_error(*gqgmc); - - cout << "get serial number" << endl; - mypause(); - // Get serial number. The serial number is returned as 7 binary bytes. - // So it is necessary to convert the numeric byte value to an ASCII - // digit equivalent. - string serial_number; - serial_number = gqgmc->getSerialNumber(); - if (gqgmc->getErrorCode() == eNoProblem) - { - stringstream msg; - msg << hex << serial_number << endl; - Display_message(msg.str()); - } - else - Display_error(*gqgmc); - - cout << "get CPM" << endl; - mypause(); - // Get CPM - uint16_t cpm; - cpm = gqgmc->getCPM(); - if (gqgmc->getErrorCode() == eNoProblem) - { - stringstream msg; - msg << dec << cpm << endl; - Display_message(msg.str()); - } - else - Display_error(*gqgmc); - - cout << "get 5 samples of CPS" << endl; - mypause(); - // Get CPS - for(int i=0;i<5;i++) - { - uint16_t cps; - cps = gqgmc->getCPS(); - if (gqgmc->getErrorCode() == eNoProblem) - { - stringstream msg; - msg << dec << cps; - Display_message(msg.str()); - } - else - Display_error(*gqgmc); - - sleep(1); - } - - cout << "get battery voltage" << endl; - mypause(); - // Get battery voltage - float voltage; - voltage = gqgmc->getBatteryVoltage(); - if (gqgmc->getErrorCode() == eNoProblem) - { - stringstream msg; - msg.precision(1); - msg << fixed << voltage << "V" << endl; - Display_message(msg.str()); - } - else - Display_error(*gqgmc); - - cout << "Turning on auto-CPS data" << endl; - mypause(); - // Turn on CPS - gqgmc->turnOnCPS(); - sleep(1); - uint16_t cps_int = 0; - for(uint32_t i=0; i<10; i++) - { - cps_int = gqgmc->getAutoCPS(); - if (gqgmc->getErrorCode() == eNoProblem) - { - cout << dec << "s=" << i << " " << cps_int << endl; // debug - } - else - Display_error(*gqgmc); - - sleep(1); - } // end for loop - - // Turn off CPS reporting - cout << "turning off CPS" << endl; - gqgmc->turnOffCPS(); - if (gqgmc->getErrorCode() != eNoProblem) - Display_error(*gqgmc); - - cout << "get history" << endl; - mypause(); - // Read history - const - uint16_t histsize(0x100); - uint32_t dataSaveAddress; - uint32_t backup =16; - dataSaveAddress = gqgmc->getDataSaveAddress(); - if (dataSaveAddress < 16) backup = 0; - const uint32_t address(dataSaveAddress - backup); - uint8_t * pHistoryData; - pHistoryData = gqgmc->getHistoryData(address,histsize); - - for(uint16_t i=0; i<histsize; i++) - { - cout << hex << uint16_t(pHistoryData[i]) << " "; - if (((i+1)%16) == 0) cout << endl; - } - - cout << "test writing configuration data" << endl; - cout << "Manually set the save data to counts per hour" << endl; - mypause(); - gqgmc->getConfigurationData(); // Need to update for user's change - - enum saveDataType_t saveDataType0; - saveDataType0 = gqgmc->getSaveDataType(); - cout << "saveDataType= " << dec << uint16_t(saveDataType0) << endl; - - uint32_t dataSaveAddress99; - dataSaveAddress99 = gqgmc->getDataSaveAddress(); - cout << "dataSaveAddress= " << hex << dataSaveAddress99 << endl; - - // set save data type - cout << "set saveDatatype= " << GQLLC::eCPM << endl; - mypause(); - gqgmc->setSaveDataType(GQLLC::eCPM); - - enum saveDataType_t saveDataType1; - saveDataType1 = gqgmc->getSaveDataType(); - cout << "saveDataType= " << dec << uint16_t(saveDataType1) << endl; - - cout << "reset DataSaveAddress" << endl; - mypause(); - gqgmc->resetDataSaveAddress(); - dataSaveAddress99 = gqgmc->getDataSaveAddress(); - cout << "dataSaveAddress= " << hex << dataSaveAddress99 << endl; - - // update configuration - this takes a long time to complete - cout << "update configuration- " << "this will take about a minute" << endl; - mypause(); - gqgmc->updateConfigurationData(); - - // Read configuration data, to get a print out of config data, - // you need to enable the debug code in getConfiguration(). - cout << "get configuration" << endl; - mypause(); - gqgmc->getConfigurationData(); - - enum saveDataType_t saveDataType9; - saveDataType9 = gqgmc->getSaveDataType(); - cout << "saveDataType= " << dec << uint16_t(saveDataType9) << endl; - - cout << "get dataSaveAddress" << endl; - uint32_t dataSaveAddress2; - dataSaveAddress2 = gqgmc->getDataSaveAddress(); - cout << "dataSaveAddress= " << hex << dataSaveAddress2 << endl; - - // Read history - cout << "get history" << endl; - mypause(); - pHistoryData = gqgmc->getHistoryData(address,histsize); - - for(uint16_t i=0; i<histsize; i++) - { - cout << hex << uint16_t(pHistoryData[i]) << " "; - if (((i+1)%16) == 0) cout << endl; - } - - cout << "turn off GQ GMC" << endl; - mypause(); - // Turn off GMC-300 power - gqgmc->turnOffPower(); - - // Close USB port - gqgmc->closeUSB(); - - delete gqgmc; - - return 0; -} // end main() -- GitLab