m9803r.cpp

Go to the documentation of this file.
00001 //======================================================================
00002 // File:        m9803r.cpp
00003 // Author:      Matthias Toussaint
00004 // Created:     Sun Nov 26 12:18:18 CET 2006
00005 // Project:     QtDMM
00006 // Description: Encapsulates a DMM class (protokoll)
00007 //----------------------------------------------------------------------
00008 // This file  may  be used under  the terms of  the GNU  General Public
00009 // License  version 2.0 as published   by the Free Software  Foundation
00010 // and appearing  in the file LICENSE.GPL included  in the packaging of
00011 // this file.
00012 // 
00013 // This file is provided AS IS with  NO WARRANTY OF ANY KIND, INCLUDING 
00014 // THE WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR 
00015 // PURPOSE.
00016 //----------------------------------------------------------------------
00017 // Copyright 2006 Matthias Toussaint
00018 //======================================================================
00019 
00020 #include <m9803r.h>
00021 
00022 #include <iostream>
00023 
00024 M9803R::M9803R() :
00025   DMMClass()
00026 {
00027 }
00028 
00029 M9803R::~M9803R()
00030 {
00031   m_port.close();
00032 }
00033 
00034 Port::Error M9803R::open_impl( const std::string & config )
00035 {
00036   return m_port.open( config );
00037 }
00038 
00039 Port::Error M9803R::close()
00040 {
00041   return m_port.close();
00042 }
00043 
00044 void M9803R::run()
00045 {
00046   char data[64];
00047   
00048   while (m_run)
00049   {
00050     int cnt = readData( &m_port, (unsigned char *)data, 
00051                          0x0a, 11, 3*11 );
00052     
00053     if (-1 != cnt)
00054     {
00055       char *byte = data+cnt-11;
00056       
00057       m_mutex.lock();
00058       
00059       if (byte[0] & 0x01) m_overflow = true;
00060       else                m_overflow = false;
00061       
00062       // assemble value display
00063       std::string digits;
00064       // sign
00065       if (byte[0] & 0x08) digits = "-";
00066       // digits
00067       digits += (char)('0'+byte[4]);
00068       digits += (char)('0'+byte[3]);
00069       digits += (char)('0'+byte[2]);
00070       digits += (char)('0'+byte[1]);
00071       
00072       double d_val;
00073       Util::fromString( &d_val, digits );
00074       
00075       // find decimal point, mode and unit
00076       switch (byte[5])
00077       {
00078         case 0x00:
00079           m_mode[0] = "DC";
00080           switch (byte[6])
00081           {
00082             case 0x00:
00083               m_unit[0] = "mV";
00084               d_val /= 10.0;
00085               break;
00086             case 0x01:
00087               m_unit[0] = "V";
00088               d_val /= 1000.0;
00089               break;
00090             case 0x02:
00091               m_unit[0] = "V";
00092               d_val /= 100.0;
00093               break;
00094             case 0x03:
00095               m_unit[0] = "V";
00096               d_val /= 10.0;
00097               break;
00098             case 0x04:
00099               m_unit[0] = "V";
00100               break;
00101           }
00102           break;
00103         case 0x01:
00104           m_mode[0] = "AC";
00105           switch (byte[6])
00106           {
00107             case 0x00:
00108               m_unit[0] = "mV";
00109               d_val /= 10.0;
00110               break;
00111             case 0x01:
00112               m_unit[0] = "V";
00113               d_val /= 1000.0;
00114               break;
00115             case 0x02:
00116               m_unit[0] = "V";
00117               d_val /= 100.0;
00118               break;
00119             case 0x03:
00120               m_unit[0] = "V";
00121               d_val /= 10.0;
00122               break;
00123             case 0x04:
00124               m_unit[0] = "V";
00125               break;
00126           }
00127           break;
00128         case 0x02:
00129           m_mode[0] = "DC";
00130           switch (byte[6])
00131           {
00132             case 0x00:
00133               m_unit[0] = "mA";
00134               d_val /= 1000.0;
00135               break;
00136             case 0x01:
00137               m_unit[0] = "mA";
00138               d_val /= 100.0;
00139               break;
00140             case 0x02:
00141               m_unit[0] = "mA";
00142               d_val /= 10.0;
00143               break;
00144           }
00145           break;
00146         case 0x03:
00147           m_mode[0] = "AC";
00148           switch (byte[6])
00149           {
00150             case 0x00:
00151               m_unit[0] = "mA";
00152               d_val /= 1000.0;
00153               break;
00154             case 0x01:
00155               m_unit[0] = "mA";
00156               d_val /= 100.0;
00157               break;
00158             case 0x02:
00159               m_unit[0] = "mA";
00160               d_val /= 10.0;
00161               break;
00162           }
00163           break;
00164         case 0x04:
00165           m_mode[0] = "OH";
00166           switch (byte[6])
00167           {
00168             case 0x00:
00169               m_unit[0] = "Ohm";
00170               d_val /= 10.0;
00171               break;
00172             case 0x01:
00173               m_unit[0] = "kOhm";
00174               d_val /= 1000.0;
00175               break;
00176             case 0x02:
00177               m_unit[0] = "kOhm";
00178               d_val /= 100.0;
00179               break;
00180             case 0x03:
00181               m_unit[0] = "kOhm";
00182               d_val /= 10.0;
00183               break;
00184             case 0x04:
00185               m_unit[0] = "kOhm";
00186               break;
00187             case 0x05:
00188               m_unit[0] = "MOhm";
00189               d_val /= 100.0;
00190               break;
00191           }
00192           break;
00193         case 0x05:
00194           m_mode[0] = "OH";
00195           switch (byte[6])
00196           {
00197             case 0x00:
00198               m_unit[0] = "Ohm";
00199               d_val /= 10.0;
00200               break;
00201           }
00202           break;
00203         case 0x06:
00204           m_mode[0] = "DI";
00205           m_unit[0] = "V";
00206           d_val /= 1000.0;
00207           break;
00208         case 0x08:
00209           m_mode[0] = "DC";
00210           m_unit[0] = "A";
00211           d_val /= 100.0;
00212           break;
00213         case 0x09:
00214           m_mode[0] = "AC";
00215           m_unit[0] = "A";
00216           d_val /= 100.0;
00217           break;
00218         case 0x0A:
00219           m_mode[0] = "FR";
00220           switch (byte[6])
00221           {
00222             case 0x00:
00223               m_unit[0] = "kHz";
00224               d_val /= 1000.0;
00225               break;
00226             case 0x01:
00227               m_unit[0] = "kHz";
00228               d_val *= 10.0;
00229               break;
00230             case 0x05:
00231               m_unit[0] = "Hz";
00232               d_val /= 100.0;
00233               break;
00234             case 0x06:
00235               m_unit[0] = "Hz";
00236               d_val /= 10.0;
00237               break;
00238           }
00239           break;
00240         case 0x0C:
00241           m_mode[0] = "CA";
00242           switch (byte[6])
00243           {
00244             case 0x00:
00245               m_unit[0] = "nF";
00246               d_val /= 1000.0;
00247               break;
00248             case 0x01:
00249               m_unit[0] = "nF";
00250               d_val /= 100.0;
00251               break;
00252             case 0x02:
00253               m_unit[0] = "nF";
00254               d_val /= 10.0;
00255               break;
00256             case 0x03:
00257               m_unit[0] = "uF";
00258               d_val /= 1000.0;
00259               break;
00260             case 0x04:
00261               m_unit[0] = "uF";
00262               d_val /= 100.0;
00263               break;
00264           }
00265           break;
00266       }
00267       
00268       addValue( d_val, 0 );
00269       
00270       m_hasValue = true;
00271       m_mutex.unlock();
00272     }
00273     else m_hasValue = false;
00274   }
00275 }

Generated on Mon Jan 22 23:24:18 2007 for cdmm by  doxygen 1.4.6