Skip to content
Snippets Groups Projects
Select Git revision
  • af9090eeac70c879d7824b923548d74cfbc04c1a
  • ballinvoher default protected
  • client-http-server-for-token
  • master
  • gitlab-auth-issue
  • windows
  • microsoft
  • message
  • azure_auth
  • prometheus
  • permission-templates
  • no-datastore
  • save-public-keys
  • gitlab-group-level-start
  • v1.1.0
  • v1.0.0
  • v0.1
17 results

README.md

Blame
  • main.cc 7.42 KiB
    // **************************************************************************
    // 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()