diff --git a/include/AmptekHardwareInterface.h b/include/AmptekHardwareInterface.h
index 544ffdd331339f2147d4a9cfaf0f14323ab799c0..f183957f8907b707843b229dd813df862424337f 100644
--- a/include/AmptekHardwareInterface.h
+++ b/include/AmptekHardwareInterface.h
@@ -4,10 +4,13 @@
 #include <chrono>
 #include <thread>
 #include <fstream>
+#include <utility>
 
 #include "AmptekConnectionHandler.h"
 
-#define STATUS_SIZE 64
+#include "AmptekStatus.h"
+#include "AmptekSpectrum.h"
+
 #define SPECLEN 8192
 
 enum AmptekState{
@@ -29,9 +32,6 @@ public:
     void connectSimulator();
     void connectUDP(std::string hostname, int port, double timeout);
 
-    //bool readStatus(const byte*, int&, double max_age_ms = -1);
-    const byte* readSpectrum(double max_age_ms = -1);
-    const byte* readSpectrumAndStatus(const byte* statusbuffer, double max_age_ms = -1);
 
     bool Enable();
     bool Disable();
@@ -41,7 +41,7 @@ public:
     bool SetPresetRealTime(double t);
     bool SetPresetCounts(int c);
     bool SetTextConfiguration(std::vector<std::string> commands);
-    bool UpdateStatus() {return updateStatus(-1);};
+    AmptekStatus& updateStatus(double max_age_ms );
 
     bool EnableListMode(std::string targetfile);
     bool ResetListModeTimer();
@@ -49,35 +49,14 @@ public:
 
     bool startBuffering();
     bool stopBuffering();
-    std::vector<unsigned int> GetBuffered(size_t id);
+    std::pair<AmptekSpectrum, AmptekStatus> GetBufferedSpectrum(size_t id);
 
     bool StartCommtestStreaming(uint16_t min_channel,uint16_t max_channel, 
                                     uint16_t increment, uint32_t rate);
     bool StopCommtestStreaming();
 
-    int FastCount(double max_age_ms = 100);
-    int SlowCount(double max_age_ms = 100);
-    double DeadTime(double max_age_ms = 100);
-    double AccTime(double max_age_ms = 100);
-    double RealTime(double max_age_ms = 100);
-    int FirmwareMajor(double max_age_ms  = 1000000);
-    int FirmwareMinor(double max_age_ms = 1000000);
-    int FirmwareBuild(double max_age_ms = 1000000);
-    int FpgaMajor(double max_age_ms = 1000000);
-    int FpgaMinor(double max_age_ms = 1000000);
-    int SerialNb(double max_age_ms = 1000000);
-    double HighVoltage(double max_age_ms = 100);
-    double DetectorTemp(double max_age_ms = 100);
-    int BoardTemp(double max_age_ms = 100);
-    bool IsPresetTimeReached(double max_age_ms = 100);
-    bool IsEnabled(double max_age_ms = 100);
-    bool IsPresetCountReached(double max_age_ms = 100);
-    bool IsGated(double max_age_ms = 100);
-    int FpgaClock(double max_age_ms = 100);
-    int DeviceType(double max_age_ms = 1000000);
-    double TecVoltage(double max_age_ms = 100);
-
-    int GetSpectrum(unsigned int* spectrum, double max_age_ms = 100);
+
+    // int GetSpectrum(unsigned int* spectrum, double max_age_ms = 100);
     std::vector<unsigned int> GetSpectrum(double max_age_ms = 100);
     std::vector<std::string> GetTextConfiguration(std::vector<std::string> commands);
 
@@ -87,15 +66,17 @@ private:
 
     bool spectrumAgeOk( double max_age_ms ) const;
     bool statusAgeOk( double max_age_ms ) const;
-    bool updateStatus(double max_age_ms );
+    
     bool updateSpectrum( double max_age_ms);
     void expectAcknowledge(Packet);
 
-    byte last_status[STATUS_SIZE];
-    unsigned int last_spectrum[SPECLEN];
-    unsigned int spectrum_length = 0;
-    std::chrono::time_point<std::chrono::system_clock> last_status_update_time;
-    std::chrono::time_point<std::chrono::system_clock> last_spectrum_update_time;
+    //byte last_status[STATUS_SIZE];
+    AmptekStatus last_status;
+    AmptekSpectrum last_spectrum;
+    // unsigned int last_spectrum[SPECLEN];
+    // unsigned int spectrum_length = 0;
+    //std::chrono::time_point<std::chrono::system_clock> last_status_update_time;
+    // std::chrono::time_point<std::chrono::system_clock> last_spectrum_update_time;
 
     bool listmode_flag;
 
diff --git a/include/AmptekSpectrum.h b/include/AmptekSpectrum.h
new file mode 100644
index 0000000000000000000000000000000000000000..838595067a6a899887e0104e72bfa189eeb8236a
--- /dev/null
+++ b/include/AmptekSpectrum.h
@@ -0,0 +1,43 @@
+#ifndef AmptekSpectrum_h
+#define AmptekSpectrum_h
+
+#include "types.h"
+#include <chrono>
+
+struct AmptekSpectrum{
+    std::vector<unsigned int> bins;
+    size_t nbins;
+    std::chrono::time_point<std::chrono::system_clock> timestamp;
+
+
+    AmptekSpectrum(const byte* raw_spec, size_t nbins, std::chrono::time_point<std::chrono::system_clock> timestamp)
+        : nbins(nbins), timestamp(timestamp)
+    {
+        for (size_t i = 0; i < nbins; ++i){
+            bins.push_back(mergeBytes( raw_spec[DATA + 3*i + 2],
+                                          raw_spec[DATA + 3*i + 1],
+                                          raw_spec[DATA + 3*i    ]
+                                        )
+                            );
+        }
+    }
+
+    AmptekSpectrum(const byte* raw_spec, size_t nbins) 
+        : AmptekSpectrum(raw_spec, nbins,std::chrono::system_clock::now())
+    {
+
+    }
+
+    AmptekSpectrum() 
+        : AmptekSpectrum(nullptr, 0, std::chrono::system_clock::from_time_t(0))
+    {
+
+    }
+
+    double AgeMillis() const{
+        auto now = std::chrono::system_clock::now();
+        return std::chrono::duration_cast<std::chrono::milliseconds>(now - timestamp).count();
+    }
+};
+
+#endif
\ No newline at end of file
diff --git a/include/AmptekSpectrumAndStatus.h b/include/AmptekSpectrumAndStatus.h
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/include/AmptekStatus.h b/include/AmptekStatus.h
new file mode 100644
index 0000000000000000000000000000000000000000..9ff6cb7a23a03d32e83757489f3009b896945afd
--- /dev/null
+++ b/include/AmptekStatus.h
@@ -0,0 +1,52 @@
+#ifndef AmptekStatus_h
+#define AmptekStatus_h
+
+#include "types.h"
+#include <chrono>
+#define STATUS_SIZE 64
+
+class AmptekStatus{
+
+public:
+    AmptekStatus(const byte* raw);
+    AmptekStatus(const byte* raw, std::chrono::time_point<std::chrono::system_clock> timestamp);
+    AmptekStatus();
+    ~AmptekStatus();
+    int FastCount();
+    int SlowCount();
+    double DeadTime();
+    double AccTime();
+    double RealTime();
+    int FirmwareMajor();
+    int FirmwareMinor();
+    int FirmwareBuild();
+    int FpgaMajor();
+    int FpgaMinor();
+    int SerialNb();
+    double HighVoltage();
+    double DetectorTemp();
+    int BoardTemp();
+    bool IsPresetTimeReached();
+    bool IsEnabled();
+    bool IsPresetCountReached();
+    bool IsGated();
+    int FpgaClock();
+    int DeviceType();
+    double TecVoltage();
+
+    bool ListModeLMMO();
+    int ListModeClock();
+    int ListModeSync();
+    bool SequentialBufferRunning();
+    int SequentialBufferIndex();
+
+
+    double AgeMillis() const;
+private:
+    byte raw_status[STATUS_SIZE];
+    std::chrono::time_point<std::chrono::system_clock> timestamp;
+
+
+};
+
+#endif
\ No newline at end of file
diff --git a/python/AmptekHardwareInterface.i b/python/AmptekHardwareInterface.i
index 2de150ee1812fc756644d535f0f60912fdb047ac..7ab124965208cc1e591e353ad262bca89b083a37 100644
--- a/python/AmptekHardwareInterface.i
+++ b/python/AmptekHardwareInterface.i
@@ -14,6 +14,8 @@
 
 %include "stdint.i"
 %include "std_vector.i"
+%include "std_pair.i"
+
 %include exception.i       
 namespace std {
    %template(IntVector) vector<int>;
@@ -37,4 +39,6 @@ namespace std {
 	}
 }
 
-%include "include/AmptekHardwareInterface.h"
\ No newline at end of file
+%include "include/AmptekHardwareInterface.h"
+%include "include/AmptekStatus.h"
+%include "include/AmptekSpectrum.h"
\ No newline at end of file
diff --git a/python/AmptekHardwareInterface.py b/python/AmptekHardwareInterface.py
index 11c98d754dd64c2019e42f3debe434af27d00b7a..ef98f02e7ef5849791de87783b2be96a5c5ea4c4 100644
--- a/python/AmptekHardwareInterface.py
+++ b/python/AmptekHardwareInterface.py
@@ -1,15 +1,22 @@
 # This file was automatically generated by SWIG (http://www.swig.org).
-# Version 3.0.8
+# Version 3.0.12
 #
 # Do not make changes to this file unless you know what you are doing--modify
 # the SWIG interface file instead.
 
-
-
-
-
-from sys import version_info
-if version_info >= (2, 6, 0):
+from sys import version_info as _swig_python_version_info
+if _swig_python_version_info >= (2, 7, 0):
+    def swig_import_helper():
+        import importlib
+        pkg = __name__.rpartition('.')[0]
+        mname = '.'.join((pkg, '_AmptekHardwareInterface')).lstrip('.')
+        try:
+            return importlib.import_module(mname)
+        except ImportError:
+            return importlib.import_module('_AmptekHardwareInterface')
+    _AmptekHardwareInterface = swig_import_helper()
+    del swig_import_helper
+elif _swig_python_version_info >= (2, 6, 0):
     def swig_import_helper():
         from os.path import dirname
         import imp
@@ -19,22 +26,27 @@ if version_info >= (2, 6, 0):
         except ImportError:
             import _AmptekHardwareInterface
             return _AmptekHardwareInterface
-        if fp is not None:
-            try:
-                _mod = imp.load_module('_AmptekHardwareInterface', fp, pathname, description)
-            finally:
+        try:
+            _mod = imp.load_module('_AmptekHardwareInterface', fp, pathname, description)
+        finally:
+            if fp is not None:
                 fp.close()
-            return _mod
+        return _mod
     _AmptekHardwareInterface = swig_import_helper()
     del swig_import_helper
 else:
     import _AmptekHardwareInterface
-del version_info
+del _swig_python_version_info
+
 try:
     _swig_property = property
 except NameError:
     pass  # Python < 2.2 doesn't have 'property'.
 
+try:
+    import builtins as __builtin__
+except ImportError:
+    import __builtin__
 
 def _swig_setattr_nondynamic(self, class_type, name, value, static=1):
     if (name == "thisown"):
@@ -56,37 +68,22 @@ def _swig_setattr(self, class_type, name, value):
     return _swig_setattr_nondynamic(self, class_type, name, value, 0)
 
 
-def _swig_getattr_nondynamic(self, class_type, name, static=1):
+def _swig_getattr(self, class_type, name):
     if (name == "thisown"):
         return self.this.own()
     method = class_type.__swig_getmethods__.get(name, None)
     if method:
         return method(self)
-    if (not static):
-        return object.__getattr__(self, name)
-    else:
-        raise AttributeError(name)
-
-def _swig_getattr(self, class_type, name):
-    return _swig_getattr_nondynamic(self, class_type, name, 0)
+    raise AttributeError("'%s' object has no attribute '%s'" % (class_type.__name__, name))
 
 
 def _swig_repr(self):
     try:
         strthis = "proxy of " + self.this.__repr__()
-    except Exception:
+    except __builtin__.Exception:
         strthis = ""
     return "<%s.%s; %s >" % (self.__class__.__module__, self.__class__.__name__, strthis,)
 
-try:
-    _object = object
-    _newclass = 1
-except AttributeError:
-    class _object:
-        pass
-    _newclass = 0
-
-
 
 def _swig_setattr_nondynamic_method(set):
     def set_attr(self, name, value):
@@ -239,7 +236,7 @@ class IntVector(object):
         this = _AmptekHardwareInterface.new_IntVector(*args)
         try:
             self.this.append(this)
-        except Exception:
+        except __builtin__.Exception:
             self.this = this
 
     def push_back(self, x):
@@ -349,7 +346,7 @@ class StringVector(object):
         this = _AmptekHardwareInterface.new_StringVector(*args)
         try:
             self.this.append(this)
-        except Exception:
+        except __builtin__.Exception:
             self.this = this
 
     def push_back(self, x):
@@ -459,7 +456,7 @@ class DoubleVector(object):
         this = _AmptekHardwareInterface.new_DoubleVector(*args)
         try:
             self.this.append(this)
-        except Exception:
+        except __builtin__.Exception:
             self.this = this
 
     def push_back(self, x):
@@ -569,7 +566,7 @@ class UIntVector(object):
         this = _AmptekHardwareInterface.new_UIntVector(*args)
         try:
             self.this.append(this)
-        except Exception:
+        except __builtin__.Exception:
             self.this = this
 
     def push_back(self, x):
@@ -600,23 +597,10 @@ class UIntVector(object):
 UIntVector_swigregister = _AmptekHardwareInterface.UIntVector_swigregister
 UIntVector_swigregister(UIntVector)
 
-
-_AmptekHardwareInterface.STATUS_SIZE_swigconstant(_AmptekHardwareInterface)
-STATUS_SIZE = _AmptekHardwareInterface.STATUS_SIZE
-
-_AmptekHardwareInterface.SPECLEN_swigconstant(_AmptekHardwareInterface)
 SPECLEN = _AmptekHardwareInterface.SPECLEN
-
-_AmptekHardwareInterface.NOT_CONNECTED_swigconstant(_AmptekHardwareInterface)
 NOT_CONNECTED = _AmptekHardwareInterface.NOT_CONNECTED
-
-_AmptekHardwareInterface.ON_swigconstant(_AmptekHardwareInterface)
 ON = _AmptekHardwareInterface.ON
-
-_AmptekHardwareInterface.RECORDING_swigconstant(_AmptekHardwareInterface)
 RECORDING = _AmptekHardwareInterface.RECORDING
-
-_AmptekHardwareInterface.ERROR_swigconstant(_AmptekHardwareInterface)
 ERROR = _AmptekHardwareInterface.ERROR
 class AmptekHardwareInterface(object):
     thisown = _swig_property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc='The membership flag')
@@ -626,7 +610,7 @@ class AmptekHardwareInterface(object):
         this = _AmptekHardwareInterface.new_AmptekHardwareInterface()
         try:
             self.this.append(this)
-        except Exception:
+        except __builtin__.Exception:
             self.this = this
     __swig_destroy__ = _AmptekHardwareInterface.delete_AmptekHardwareInterface
     __del__ = lambda self: None
@@ -640,12 +624,6 @@ class AmptekHardwareInterface(object):
     def connectUDP(self, hostname, port, timeout):
         return _AmptekHardwareInterface.AmptekHardwareInterface_connectUDP(self, hostname, port, timeout)
 
-    def readSpectrum(self, max_age_ms=-1):
-        return _AmptekHardwareInterface.AmptekHardwareInterface_readSpectrum(self, max_age_ms)
-
-    def readSpectrumAndStatus(self, statusbuffer, max_age_ms=-1):
-        return _AmptekHardwareInterface.AmptekHardwareInterface_readSpectrumAndStatus(self, statusbuffer, max_age_ms)
-
     def Enable(self):
         return _AmptekHardwareInterface.AmptekHardwareInterface_Enable(self)
 
@@ -670,8 +648,8 @@ class AmptekHardwareInterface(object):
     def SetTextConfiguration(self, commands):
         return _AmptekHardwareInterface.AmptekHardwareInterface_SetTextConfiguration(self, commands)
 
-    def UpdateStatus(self):
-        return _AmptekHardwareInterface.AmptekHardwareInterface_UpdateStatus(self)
+    def updateStatus(self, max_age_ms):
+        return _AmptekHardwareInterface.AmptekHardwareInterface_updateStatus(self, max_age_ms)
 
     def EnableListMode(self, targetfile):
         return _AmptekHardwareInterface.AmptekHardwareInterface_EnableListMode(self, targetfile)
@@ -688,8 +666,8 @@ class AmptekHardwareInterface(object):
     def stopBuffering(self):
         return _AmptekHardwareInterface.AmptekHardwareInterface_stopBuffering(self)
 
-    def GetBuffered(self, id):
-        return _AmptekHardwareInterface.AmptekHardwareInterface_GetBuffered(self, id)
+    def GetBufferedSpectrum(self, id):
+        return _AmptekHardwareInterface.AmptekHardwareInterface_GetBufferedSpectrum(self, id)
 
     def StartCommtestStreaming(self, min_channel, max_channel, increment, rate):
         return _AmptekHardwareInterface.AmptekHardwareInterface_StartCommtestStreaming(self, min_channel, max_channel, increment, rate)
@@ -697,79 +675,134 @@ class AmptekHardwareInterface(object):
     def StopCommtestStreaming(self):
         return _AmptekHardwareInterface.AmptekHardwareInterface_StopCommtestStreaming(self)
 
-    def FastCount(self, max_age_ms=100):
-        return _AmptekHardwareInterface.AmptekHardwareInterface_FastCount(self, max_age_ms)
+    def GetSpectrum(self, max_age_ms=100):
+        return _AmptekHardwareInterface.AmptekHardwareInterface_GetSpectrum(self, max_age_ms)
 
-    def SlowCount(self, max_age_ms=100):
-        return _AmptekHardwareInterface.AmptekHardwareInterface_SlowCount(self, max_age_ms)
+    def GetTextConfiguration(self, commands):
+        return _AmptekHardwareInterface.AmptekHardwareInterface_GetTextConfiguration(self, commands)
 
-    def DeadTime(self, max_age_ms=100):
-        return _AmptekHardwareInterface.AmptekHardwareInterface_DeadTime(self, max_age_ms)
+    def GetState(self):
+        return _AmptekHardwareInterface.AmptekHardwareInterface_GetState(self)
+AmptekHardwareInterface_swigregister = _AmptekHardwareInterface.AmptekHardwareInterface_swigregister
+AmptekHardwareInterface_swigregister(AmptekHardwareInterface)
 
-    def AccTime(self, max_age_ms=100):
-        return _AmptekHardwareInterface.AmptekHardwareInterface_AccTime(self, max_age_ms)
+STATUS_SIZE = _AmptekHardwareInterface.STATUS_SIZE
+class AmptekStatus(object):
+    thisown = _swig_property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc='The membership flag')
+    __repr__ = _swig_repr
 
-    def RealTime(self, max_age_ms=100):
-        return _AmptekHardwareInterface.AmptekHardwareInterface_RealTime(self, max_age_ms)
+    def __init__(self, *args):
+        this = _AmptekHardwareInterface.new_AmptekStatus(*args)
+        try:
+            self.this.append(this)
+        except __builtin__.Exception:
+            self.this = this
+    __swig_destroy__ = _AmptekHardwareInterface.delete_AmptekStatus
+    __del__ = lambda self: None
 
-    def FirmwareMajor(self, max_age_ms=1000000):
-        return _AmptekHardwareInterface.AmptekHardwareInterface_FirmwareMajor(self, max_age_ms)
+    def FastCount(self):
+        return _AmptekHardwareInterface.AmptekStatus_FastCount(self)
 
-    def FirmwareMinor(self, max_age_ms=1000000):
-        return _AmptekHardwareInterface.AmptekHardwareInterface_FirmwareMinor(self, max_age_ms)
+    def SlowCount(self):
+        return _AmptekHardwareInterface.AmptekStatus_SlowCount(self)
 
-    def FirmwareBuild(self, max_age_ms=1000000):
-        return _AmptekHardwareInterface.AmptekHardwareInterface_FirmwareBuild(self, max_age_ms)
+    def DeadTime(self):
+        return _AmptekHardwareInterface.AmptekStatus_DeadTime(self)
 
-    def FpgaMajor(self, max_age_ms=1000000):
-        return _AmptekHardwareInterface.AmptekHardwareInterface_FpgaMajor(self, max_age_ms)
+    def AccTime(self):
+        return _AmptekHardwareInterface.AmptekStatus_AccTime(self)
 
-    def FpgaMinor(self, max_age_ms=1000000):
-        return _AmptekHardwareInterface.AmptekHardwareInterface_FpgaMinor(self, max_age_ms)
+    def RealTime(self):
+        return _AmptekHardwareInterface.AmptekStatus_RealTime(self)
 
-    def SerialNb(self, max_age_ms=1000000):
-        return _AmptekHardwareInterface.AmptekHardwareInterface_SerialNb(self, max_age_ms)
+    def FirmwareMajor(self):
+        return _AmptekHardwareInterface.AmptekStatus_FirmwareMajor(self)
 
-    def HighVoltage(self, max_age_ms=100):
-        return _AmptekHardwareInterface.AmptekHardwareInterface_HighVoltage(self, max_age_ms)
+    def FirmwareMinor(self):
+        return _AmptekHardwareInterface.AmptekStatus_FirmwareMinor(self)
 
-    def DetectorTemp(self, max_age_ms=100):
-        return _AmptekHardwareInterface.AmptekHardwareInterface_DetectorTemp(self, max_age_ms)
+    def FirmwareBuild(self):
+        return _AmptekHardwareInterface.AmptekStatus_FirmwareBuild(self)
 
-    def BoardTemp(self, max_age_ms=100):
-        return _AmptekHardwareInterface.AmptekHardwareInterface_BoardTemp(self, max_age_ms)
+    def FpgaMajor(self):
+        return _AmptekHardwareInterface.AmptekStatus_FpgaMajor(self)
 
-    def IsPresetTimeReached(self, max_age_ms=100):
-        return _AmptekHardwareInterface.AmptekHardwareInterface_IsPresetTimeReached(self, max_age_ms)
+    def FpgaMinor(self):
+        return _AmptekHardwareInterface.AmptekStatus_FpgaMinor(self)
 
-    def IsEnabled(self, max_age_ms=100):
-        return _AmptekHardwareInterface.AmptekHardwareInterface_IsEnabled(self, max_age_ms)
+    def SerialNb(self):
+        return _AmptekHardwareInterface.AmptekStatus_SerialNb(self)
 
-    def IsPresetCountReached(self, max_age_ms=100):
-        return _AmptekHardwareInterface.AmptekHardwareInterface_IsPresetCountReached(self, max_age_ms)
+    def HighVoltage(self):
+        return _AmptekHardwareInterface.AmptekStatus_HighVoltage(self)
 
-    def IsGated(self, max_age_ms=100):
-        return _AmptekHardwareInterface.AmptekHardwareInterface_IsGated(self, max_age_ms)
+    def DetectorTemp(self):
+        return _AmptekHardwareInterface.AmptekStatus_DetectorTemp(self)
 
-    def FpgaClock(self, max_age_ms=100):
-        return _AmptekHardwareInterface.AmptekHardwareInterface_FpgaClock(self, max_age_ms)
+    def BoardTemp(self):
+        return _AmptekHardwareInterface.AmptekStatus_BoardTemp(self)
 
-    def DeviceType(self, max_age_ms=1000000):
-        return _AmptekHardwareInterface.AmptekHardwareInterface_DeviceType(self, max_age_ms)
+    def IsPresetTimeReached(self):
+        return _AmptekHardwareInterface.AmptekStatus_IsPresetTimeReached(self)
 
-    def TecVoltage(self, max_age_ms=100):
-        return _AmptekHardwareInterface.AmptekHardwareInterface_TecVoltage(self, max_age_ms)
+    def IsEnabled(self):
+        return _AmptekHardwareInterface.AmptekStatus_IsEnabled(self)
 
-    def GetSpectrum(self, *args):
-        return _AmptekHardwareInterface.AmptekHardwareInterface_GetSpectrum(self, *args)
+    def IsPresetCountReached(self):
+        return _AmptekHardwareInterface.AmptekStatus_IsPresetCountReached(self)
 
-    def GetTextConfiguration(self, commands):
-        return _AmptekHardwareInterface.AmptekHardwareInterface_GetTextConfiguration(self, commands)
+    def IsGated(self):
+        return _AmptekHardwareInterface.AmptekStatus_IsGated(self)
 
-    def GetState(self):
-        return _AmptekHardwareInterface.AmptekHardwareInterface_GetState(self)
-AmptekHardwareInterface_swigregister = _AmptekHardwareInterface.AmptekHardwareInterface_swigregister
-AmptekHardwareInterface_swigregister(AmptekHardwareInterface)
+    def FpgaClock(self):
+        return _AmptekHardwareInterface.AmptekStatus_FpgaClock(self)
+
+    def DeviceType(self):
+        return _AmptekHardwareInterface.AmptekStatus_DeviceType(self)
+
+    def TecVoltage(self):
+        return _AmptekHardwareInterface.AmptekStatus_TecVoltage(self)
+
+    def ListModeLMMO(self):
+        return _AmptekHardwareInterface.AmptekStatus_ListModeLMMO(self)
+
+    def ListModeClock(self):
+        return _AmptekHardwareInterface.AmptekStatus_ListModeClock(self)
+
+    def ListModeSync(self):
+        return _AmptekHardwareInterface.AmptekStatus_ListModeSync(self)
+
+    def SequentialBufferRunning(self):
+        return _AmptekHardwareInterface.AmptekStatus_SequentialBufferRunning(self)
+
+    def SequentialBufferIndex(self):
+        return _AmptekHardwareInterface.AmptekStatus_SequentialBufferIndex(self)
+
+    def AgeMillis(self):
+        return _AmptekHardwareInterface.AmptekStatus_AgeMillis(self)
+AmptekStatus_swigregister = _AmptekHardwareInterface.AmptekStatus_swigregister
+AmptekStatus_swigregister(AmptekStatus)
+
+class AmptekSpectrum(object):
+    thisown = _swig_property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc='The membership flag')
+    __repr__ = _swig_repr
+    bins = _swig_property(_AmptekHardwareInterface.AmptekSpectrum_bins_get, _AmptekHardwareInterface.AmptekSpectrum_bins_set)
+    nbins = _swig_property(_AmptekHardwareInterface.AmptekSpectrum_nbins_get, _AmptekHardwareInterface.AmptekSpectrum_nbins_set)
+    timestamp = _swig_property(_AmptekHardwareInterface.AmptekSpectrum_timestamp_get, _AmptekHardwareInterface.AmptekSpectrum_timestamp_set)
+
+    def __init__(self, *args):
+        this = _AmptekHardwareInterface.new_AmptekSpectrum(*args)
+        try:
+            self.this.append(this)
+        except __builtin__.Exception:
+            self.this = this
+
+    def AgeMillis(self):
+        return _AmptekHardwareInterface.AmptekSpectrum_AgeMillis(self)
+    __swig_destroy__ = _AmptekHardwareInterface.delete_AmptekSpectrum
+    __del__ = lambda self: None
+AmptekSpectrum_swigregister = _AmptekHardwareInterface.AmptekSpectrum_swigregister
+AmptekSpectrum_swigregister(AmptekSpectrum)
 
 
 
diff --git a/python/AmptekHardwareInterface_wrap.cpp b/python/AmptekHardwareInterface_wrap.cpp
index 314ff42e500f5088fc780ca0b8107fe1e4fd3901..696f3ab6f49a0c7927df6b61bd3d5fff9fe99ac9 100644
--- a/python/AmptekHardwareInterface_wrap.cpp
+++ b/python/AmptekHardwareInterface_wrap.cpp
@@ -1,6 +1,6 @@
 /* ----------------------------------------------------------------------------
  * This file was automatically generated by SWIG (http://www.swig.org).
- * Version 3.0.8
+ * Version 3.0.12
  *
  * This file is not intended to be easily readable and contains a number of
  * coding conventions designed to improve portability and efficiency. Do not make
@@ -106,9 +106,11 @@ template <typename T> T SwigValueInit() {
 #endif
 
 /* exporting methods */
-#if (__GNUC__ >= 4) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
-#  ifndef GCC_HASCLASSVISIBILITY
-#    define GCC_HASCLASSVISIBILITY
+#if defined(__GNUC__)
+#  if (__GNUC__ >= 4) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
+#    ifndef GCC_HASCLASSVISIBILITY
+#      define GCC_HASCLASSVISIBILITY
+#    endif
 #  endif
 #endif
 
@@ -668,16 +670,16 @@ SWIG_UnpackData(const char *c, void *ptr, size_t sz) {
     char d = *(c++);
     unsigned char uu;
     if ((d >= '0') && (d <= '9'))
-      uu = ((d - '0') << 4);
+      uu = (unsigned char)((d - '0') << 4);
     else if ((d >= 'a') && (d <= 'f'))
-      uu = ((d - ('a'-10)) << 4);
+      uu = (unsigned char)((d - ('a'-10)) << 4);
     else
       return (char *) 0;
     d = *(c++);
     if ((d >= '0') && (d <= '9'))
-      uu |= (d - '0');
+      uu |= (unsigned char)(d - '0');
     else if ((d >= 'a') && (d <= 'f'))
-      uu |= (d - ('a'-10));
+      uu |= (unsigned char)(d - ('a'-10));
     else
       return (char *) 0;
     *u = uu;
@@ -860,10 +862,6 @@ PyString_FromFormat(const char *fmt, ...) {
 }
 #endif
 
-/* Add PyObject_Del for old Pythons */
-#if PY_VERSION_HEX < 0x01060000
-# define PyObject_Del(op) PyMem_DEL((op))
-#endif
 #ifndef PyObject_DEL
 # define PyObject_DEL PyObject_Del
 #endif
@@ -978,6 +976,7 @@ typedef destructor freefunc;
 #if PY_VERSION_HEX < 0x03020000
 #define PyDescr_TYPE(x) (((PyDescrObject *)(x))->d_type)
 #define PyDescr_NAME(x) (((PyDescrObject *)(x))->d_name)
+#define Py_hash_t long
 #endif
 
 /* -----------------------------------------------------------------------------
@@ -1926,7 +1925,6 @@ SwigPyObject_TypeOnce(void) {
   static int type_init = 0;
   if (!type_init) {
     const PyTypeObject tmp = {
-      /* PyObject header changed in Python 3 */
 #if PY_VERSION_HEX >= 0x03000000
       PyVarObject_HEAD_INIT(NULL, 0)
 #else
@@ -1937,7 +1935,7 @@ SwigPyObject_TypeOnce(void) {
       sizeof(SwigPyObject),                 /* tp_basicsize */
       0,                                    /* tp_itemsize */
       (destructor)SwigPyObject_dealloc,     /* tp_dealloc */
-      0,				    /* tp_print */
+      0,                                    /* tp_print */
 #if PY_VERSION_HEX < 0x02020000
       (getattrfunc)SwigPyObject_getattr,    /* tp_getattr */
 #else
@@ -1945,7 +1943,7 @@ SwigPyObject_TypeOnce(void) {
 #endif
       (setattrfunc)0,                       /* tp_setattr */
 #if PY_VERSION_HEX >= 0x03000000
-    0, /* tp_reserved in 3.0.1, tp_compare in 3.0.0 but not used */
+      0, /* tp_reserved in 3.0.1, tp_compare in 3.0.0 but not used */
 #else
       (cmpfunc)SwigPyObject_compare,        /* tp_compare */
 #endif
@@ -1955,7 +1953,7 @@ SwigPyObject_TypeOnce(void) {
       0,                                    /* tp_as_mapping */
       (hashfunc)0,                          /* tp_hash */
       (ternaryfunc)0,                       /* tp_call */
-      0,				    /* tp_str */
+      0,                                    /* tp_str */
       PyObject_GenericGetAttr,              /* tp_getattro */
       0,                                    /* tp_setattro */
       0,                                    /* tp_as_buffer */
@@ -2118,7 +2116,6 @@ SwigPyPacked_TypeOnce(void) {
   static int type_init = 0;
   if (!type_init) {
     const PyTypeObject tmp = {
-      /* PyObject header changed in Python 3 */
 #if PY_VERSION_HEX>=0x03000000
       PyVarObject_HEAD_INIT(NULL, 0)
 #else
@@ -3010,33 +3007,37 @@ SWIG_Python_NonDynamicSetAttr(PyObject *obj, PyObject *name, PyObject *value) {
 /* -------- TYPES TABLE (BEGIN) -------- */
 
 #define SWIGTYPE_p_AmptekHardwareInterface swig_types[0]
-#define SWIGTYPE_p_allocator_type swig_types[1]
-#define SWIGTYPE_p_byte swig_types[2]
-#define SWIGTYPE_p_char swig_types[3]
-#define SWIGTYPE_p_difference_type swig_types[4]
-#define SWIGTYPE_p_int swig_types[5]
-#define SWIGTYPE_p_long_long swig_types[6]
-#define SWIGTYPE_p_p_PyObject swig_types[7]
-#define SWIGTYPE_p_short swig_types[8]
-#define SWIGTYPE_p_signed_char swig_types[9]
-#define SWIGTYPE_p_size_type swig_types[10]
-#define SWIGTYPE_p_std__allocatorT_double_t swig_types[11]
-#define SWIGTYPE_p_std__allocatorT_int_t swig_types[12]
-#define SWIGTYPE_p_std__allocatorT_std__string_t swig_types[13]
-#define SWIGTYPE_p_std__allocatorT_unsigned_int_t swig_types[14]
-#define SWIGTYPE_p_std__invalid_argument swig_types[15]
-#define SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t swig_types[16]
-#define SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t swig_types[17]
-#define SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t swig_types[18]
-#define SWIGTYPE_p_std__vectorT_unsigned_int_std__allocatorT_unsigned_int_t_t swig_types[19]
-#define SWIGTYPE_p_swig__SwigPyIterator swig_types[20]
-#define SWIGTYPE_p_unsigned_char swig_types[21]
-#define SWIGTYPE_p_unsigned_int swig_types[22]
-#define SWIGTYPE_p_unsigned_long_long swig_types[23]
-#define SWIGTYPE_p_unsigned_short swig_types[24]
-#define SWIGTYPE_p_value_type swig_types[25]
-static swig_type_info *swig_types[27];
-static swig_module_info swig_module = {swig_types, 26, 0, 0, 0, 0};
+#define SWIGTYPE_p_AmptekSpectrum swig_types[1]
+#define SWIGTYPE_p_AmptekStatus swig_types[2]
+#define SWIGTYPE_p_allocator_type swig_types[3]
+#define SWIGTYPE_p_byte swig_types[4]
+#define SWIGTYPE_p_char swig_types[5]
+#define SWIGTYPE_p_difference_type swig_types[6]
+#define SWIGTYPE_p_int swig_types[7]
+#define SWIGTYPE_p_long_long swig_types[8]
+#define SWIGTYPE_p_p_PyObject swig_types[9]
+#define SWIGTYPE_p_short swig_types[10]
+#define SWIGTYPE_p_signed_char swig_types[11]
+#define SWIGTYPE_p_size_type swig_types[12]
+#define SWIGTYPE_p_std__allocatorT_double_t swig_types[13]
+#define SWIGTYPE_p_std__allocatorT_int_t swig_types[14]
+#define SWIGTYPE_p_std__allocatorT_std__string_t swig_types[15]
+#define SWIGTYPE_p_std__allocatorT_unsigned_int_t swig_types[16]
+#define SWIGTYPE_p_std__chrono__time_pointT_std__chrono__system_clock_t swig_types[17]
+#define SWIGTYPE_p_std__invalid_argument swig_types[18]
+#define SWIGTYPE_p_std__pairT_AmptekSpectrum_AmptekStatus_t swig_types[19]
+#define SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t swig_types[20]
+#define SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t swig_types[21]
+#define SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t swig_types[22]
+#define SWIGTYPE_p_std__vectorT_unsigned_int_std__allocatorT_unsigned_int_t_t swig_types[23]
+#define SWIGTYPE_p_swig__SwigPyIterator swig_types[24]
+#define SWIGTYPE_p_unsigned_char swig_types[25]
+#define SWIGTYPE_p_unsigned_int swig_types[26]
+#define SWIGTYPE_p_unsigned_long_long swig_types[27]
+#define SWIGTYPE_p_unsigned_short swig_types[28]
+#define SWIGTYPE_p_value_type swig_types[29]
+static swig_type_info *swig_types[31];
+static swig_module_info swig_module = {swig_types, 30, 0, 0, 0, 0};
 #define SWIG_TypeQuery(name) SWIG_TypeQueryModule(&swig_module, &swig_module, name)
 #define SWIG_MangledTypeQuery(name) SWIG_MangledTypeQueryModule(&swig_module, &swig_module, name)
 
@@ -3063,7 +3064,7 @@ static swig_module_info swig_module = {swig_types, 26, 0, 0, 0, 0};
 #endif
 #define SWIG_name    "_AmptekHardwareInterface"
 
-#define SWIGVERSION 0x030008 
+#define SWIGVERSION 0x030012 
 #define SWIG_VERSION SWIGVERSION
 
 
@@ -3174,6 +3175,7 @@ namespace swig {
 #endif
 
 
+#include <typeinfo>
 #include <stdexcept>
 
 
@@ -3323,7 +3325,7 @@ SWIG_AsVal_double (PyObject *obj, double *val)
     return SWIG_OK;
 #if PY_VERSION_HEX < 0x03000000
   } else if (PyInt_Check(obj)) {
-    if (val) *val = PyInt_AsLong(obj);
+    if (val) *val = (double) PyInt_AsLong(obj);
     return SWIG_OK;
 #endif
   } else if (PyLong_Check(obj)) {
@@ -3444,23 +3446,109 @@ SWIG_AsVal_unsigned_SS_long (PyObject *obj, unsigned long *val)
 }
 
 
+#include <limits.h>
+#if !defined(SWIG_NO_LLONG_MAX)
+# if !defined(LLONG_MAX) && defined(__GNUC__) && defined (__LONG_LONG_MAX__)
+#   define LLONG_MAX __LONG_LONG_MAX__
+#   define LLONG_MIN (-LLONG_MAX - 1LL)
+#   define ULLONG_MAX (LLONG_MAX * 2ULL + 1ULL)
+# endif
+#endif
+
+
+#if defined(LLONG_MAX) && !defined(SWIG_LONG_LONG_AVAILABLE)
+#  define SWIG_LONG_LONG_AVAILABLE
+#endif
+
+
+#ifdef SWIG_LONG_LONG_AVAILABLE
+SWIGINTERN int
+SWIG_AsVal_unsigned_SS_long_SS_long (PyObject *obj, unsigned long long *val)
+{
+  int res = SWIG_TypeError;
+  if (PyLong_Check(obj)) {
+    unsigned long long v = PyLong_AsUnsignedLongLong(obj);
+    if (!PyErr_Occurred()) {
+      if (val) *val = v;
+      return SWIG_OK;
+    } else {
+      PyErr_Clear();
+      res = SWIG_OverflowError;
+    }
+  } else {
+    unsigned long v;
+    res = SWIG_AsVal_unsigned_SS_long (obj,&v);
+    if (SWIG_IsOK(res)) {
+      if (val) *val = v;
+      return res;
+    }
+  }
+#ifdef SWIG_PYTHON_CAST_MODE
+  {
+    const double mant_max = 1LL << DBL_MANT_DIG;
+    double d;
+    res = SWIG_AsVal_double (obj,&d);
+    if (SWIG_IsOK(res) && !SWIG_CanCastAsInteger(&d, 0, mant_max))
+      return SWIG_OverflowError;
+    if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, 0, mant_max)) {
+      if (val) *val = (unsigned long long)(d);
+      return SWIG_AddCast(res);
+    }
+    res = SWIG_TypeError;
+  }
+#endif
+  return res;
+}
+#endif
+
+
 SWIGINTERNINLINE int
 SWIG_AsVal_size_t (PyObject * obj, size_t *val)
 {
-  unsigned long v;
-  int res = SWIG_AsVal_unsigned_SS_long (obj, val ? &v : 0);
-  if (SWIG_IsOK(res) && val) *val = static_cast< size_t >(v);
+  int res = SWIG_TypeError;
+#ifdef SWIG_LONG_LONG_AVAILABLE
+  if (sizeof(size_t) <= sizeof(unsigned long)) {
+#endif
+    unsigned long v;
+    res = SWIG_AsVal_unsigned_SS_long (obj, val ? &v : 0);
+    if (SWIG_IsOK(res) && val) *val = static_cast< size_t >(v);
+#ifdef SWIG_LONG_LONG_AVAILABLE
+  } else if (sizeof(size_t) <= sizeof(unsigned long long)) {
+    unsigned long long v;
+    res = SWIG_AsVal_unsigned_SS_long_SS_long (obj, val ? &v : 0);
+    if (SWIG_IsOK(res) && val) *val = static_cast< size_t >(v);
+  }
+#endif
   return res;
 }
 
 
-  #define SWIG_From_long   PyLong_FromLong 
+  #define SWIG_From_long   PyInt_FromLong 
+
+
+#ifdef SWIG_LONG_LONG_AVAILABLE
+SWIGINTERNINLINE PyObject* 
+SWIG_From_long_SS_long  (long long value)
+{
+  return ((value < LONG_MIN) || (value > LONG_MAX)) ?
+    PyLong_FromLongLong(value) : PyInt_FromLong(static_cast< long >(value));
+}
+#endif
 
 
 SWIGINTERNINLINE PyObject *
 SWIG_From_ptrdiff_t  (ptrdiff_t value)
 {    
-  return SWIG_From_long  (static_cast< long >(value));
+#ifdef SWIG_LONG_LONG_AVAILABLE
+  if (sizeof(ptrdiff_t) <= sizeof(long)) {
+#endif
+    return SWIG_From_long  (static_cast< long >(value));
+#ifdef SWIG_LONG_LONG_AVAILABLE
+  } else {
+    /* assume sizeof(ptrdiff_t) <= sizeof(long long) */
+    return SWIG_From_long_SS_long  (static_cast< long long >(value));
+  }
+#endif
 }
 
 
@@ -3514,12 +3602,65 @@ SWIG_AsVal_long (PyObject *obj, long* val)
 }
 
 
+#ifdef SWIG_LONG_LONG_AVAILABLE
+SWIGINTERN int
+SWIG_AsVal_long_SS_long (PyObject *obj, long long *val)
+{
+  int res = SWIG_TypeError;
+  if (PyLong_Check(obj)) {
+    long long v = PyLong_AsLongLong(obj);
+    if (!PyErr_Occurred()) {
+      if (val) *val = v;
+      return SWIG_OK;
+    } else {
+      PyErr_Clear();
+      res = SWIG_OverflowError;
+    }
+  } else {
+    long v;
+    res = SWIG_AsVal_long (obj,&v);
+    if (SWIG_IsOK(res)) {
+      if (val) *val = v;
+      return res;
+    }
+  }
+#ifdef SWIG_PYTHON_CAST_MODE
+  {
+    const double mant_max = 1LL << DBL_MANT_DIG;
+    const double mant_min = -mant_max;
+    double d;
+    res = SWIG_AsVal_double (obj,&d);
+    if (SWIG_IsOK(res) && !SWIG_CanCastAsInteger(&d, mant_min, mant_max))
+      return SWIG_OverflowError;
+    if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, mant_min, mant_max)) {
+      if (val) *val = (long long)(d);
+      return SWIG_AddCast(res);
+    }
+    res = SWIG_TypeError;
+  }
+#endif
+  return res;
+}
+#endif
+
+
 SWIGINTERNINLINE int
 SWIG_AsVal_ptrdiff_t (PyObject * obj, ptrdiff_t *val)
 {
-  long v;
-  int res = SWIG_AsVal_long (obj, val ? &v : 0);
-  if (SWIG_IsOK(res) && val) *val = static_cast< ptrdiff_t >(v);
+  int res = SWIG_TypeError;
+#ifdef SWIG_LONG_LONG_AVAILABLE
+  if (sizeof(ptrdiff_t) <= sizeof(long)) {
+#endif
+    long v;
+    res = SWIG_AsVal_long (obj, val ? &v : 0);
+    if (SWIG_IsOK(res) && val) *val = static_cast< ptrdiff_t >(v);
+#ifdef SWIG_LONG_LONG_AVAILABLE
+  } else if (sizeof(ptrdiff_t) <= sizeof(long long)) {
+    long long v;
+    res = SWIG_AsVal_long_SS_long (obj, val ? &v : 0);
+    if (SWIG_IsOK(res) && val) *val = static_cast< ptrdiff_t >(v);
+  }
+#endif
   return res;
 }
 
@@ -3530,6 +3671,9 @@ SWIG_AsVal_ptrdiff_t (PyObject * obj, ptrdiff_t *val)
 #include <vector>
 
 
+#include <utility>
+
+
 namespace swig {
   template <class Type>
   struct noconst_traits {
@@ -3557,8 +3701,21 @@ namespace swig {
     return traits<typename noconst_traits<Type >::noconst_type >::type_name();
   }
 
-  template <class Type>
-  struct traits_info {
+  template <class Type> struct traits_info {
+    static swig_type_info *type_query(std::string name) {
+      name += " *";
+      return SWIG_TypeQuery(name.c_str());
+    }
+    static swig_type_info *type_info() {
+      static swig_type_info *info = type_query(type_name<Type>());
+      return info;
+    }
+  };
+
+  /*
+    Partial specialization for pointers (traits_info)
+  */
+  template <class Type> struct traits_info<Type *> {
     static swig_type_info *type_query(std::string name) {
       name += " *";
       return SWIG_TypeQuery(name.c_str());
@@ -3575,7 +3732,7 @@ namespace swig {
   }
 
   /*
-    Partial specialization for pointers
+    Partial specialization for pointers (traits)
   */
   template <class Type> struct traits <Type *> {
     typedef pointer_category category;
@@ -3645,7 +3802,8 @@ namespace swig {
   struct traits_asptr {   
     static int asptr(PyObject *obj, Type **val) {
       Type *p;
-      int res = SWIG_ConvertPtr(obj, (void**)&p, type_info<Type>(), 0);
+      swig_type_info *descriptor = type_info<Type>();
+      int res = descriptor ? SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0) : SWIG_ERROR;
       if (SWIG_IsOK(res)) {
 	if (val) *val = p;
       }
@@ -3793,7 +3951,7 @@ namespace swig {
 
 namespace std {
   template <>
-  struct less <PyObject *>: public binary_function<PyObject *, PyObject *, bool>
+  struct less <PyObject *>
   {
     bool
     operator()(PyObject * v, PyObject *w) const
@@ -3818,7 +3976,7 @@ namespace std {
   };
 
   template <>
-  struct less <swig::SwigPtr_PyObject>: public binary_function<swig::SwigPtr_PyObject, swig::SwigPtr_PyObject, bool>
+  struct less <swig::SwigPtr_PyObject>
   {
     bool
     operator()(const swig::SwigPtr_PyObject& v, const swig::SwigPtr_PyObject& w) const
@@ -3828,7 +3986,7 @@ namespace std {
   };
 
   template <>
-  struct less <swig::SwigVar_PyObject>: public binary_function<swig::SwigVar_PyObject, swig::SwigVar_PyObject, bool>
+  struct less <swig::SwigVar_PyObject>
   {
     bool
     operator()(const swig::SwigVar_PyObject& v, const swig::SwigVar_PyObject& w) const
@@ -3891,7 +4049,7 @@ namespace swig {
     if (step == 0) {
       throw std::invalid_argument("slice step cannot be zero");
     } else if (step > 0) {
-      // Required range: 0 <= i < size, 0 <= j < size
+      // Required range: 0 <= i < size, 0 <= j < size, i <= j
       if (i < 0) {
         ii = 0;
       } else if (i < (Difference)size) {
@@ -3899,13 +4057,15 @@ namespace swig {
       } else if (insert && (i >= (Difference)size)) {
         ii = (Difference)size;
       }
-      if ( j < 0 ) {
+      if (j < 0) {
         jj = 0;
       } else {
         jj = (j < (Difference)size) ? j : (Difference)size;
       }
+      if (jj < ii)
+        jj = ii;
     } else {
-      // Required range: -1 <= i < size-1, -1 <= j < size-1
+      // Required range: -1 <= i < size-1, -1 <= j < size-1, i >= j
       if (i < -1) {
         ii = -1;
       } else if (i < (Difference) size) {
@@ -3918,6 +4078,8 @@ namespace swig {
       } else {
         jj = (j < (Difference)size ) ? j : (Difference)(size-1);
       }
+      if (ii < jj)
+        ii = jj;
     }
   }
 
@@ -3943,6 +4105,13 @@ namespace swig {
     seq->erase(position);
   }
 
+  template <class Sequence>
+  struct traits_reserve {
+    static void reserve(Sequence & /*seq*/, typename Sequence::size_type /*n*/) {
+      // This should be specialized for types that support reserve
+    }
+  };
+
   template <class Sequence, class Difference>
   inline Sequence*
   getslice(const Sequence* self, Difference i, Difference j, Py_ssize_t step) {
@@ -3960,6 +4129,7 @@ namespace swig {
         return new Sequence(sb, se);
       } else {
         Sequence *sequence = new Sequence();
+        swig::traits_reserve<Sequence>::reserve(*sequence, (jj - ii + step - 1) / step);
         typename Sequence::const_iterator it = sb;
         while (it!=se) {
           sequence->push_back(*it);
@@ -3970,17 +4140,16 @@ namespace swig {
       } 
     } else {
       Sequence *sequence = new Sequence();
-      if (ii > jj) {
-        typename Sequence::const_reverse_iterator sb = self->rbegin();
-        typename Sequence::const_reverse_iterator se = self->rbegin();
-        std::advance(sb,size-ii-1);
-        std::advance(se,size-jj-1);
-        typename Sequence::const_reverse_iterator it = sb;
-        while (it!=se) {
-          sequence->push_back(*it);
-          for (Py_ssize_t c=0; c<-step && it!=se; ++c)
-            it++;
-        }
+      swig::traits_reserve<Sequence>::reserve(*sequence, (ii - jj - step - 1) / -step);
+      typename Sequence::const_reverse_iterator sb = self->rbegin();
+      typename Sequence::const_reverse_iterator se = self->rbegin();
+      std::advance(sb,size-ii-1);
+      std::advance(se,size-jj-1);
+      typename Sequence::const_reverse_iterator it = sb;
+      while (it!=se) {
+        sequence->push_back(*it);
+        for (Py_ssize_t c=0; c<-step && it!=se; ++c)
+          it++;
       }
       return sequence;
     }
@@ -3994,12 +4163,11 @@ namespace swig {
     Difference jj = 0;
     swig::slice_adjust(i, j, step, size, ii, jj, true);
     if (step > 0) {
-      if (jj < ii)
-        jj = ii;
       if (step == 1) {
         size_t ssize = jj - ii;
         if (ssize <= is.size()) {
           // expanding/staying the same size
+          swig::traits_reserve<Sequence>::reserve(*self, self->size() - ssize + is.size());
           typename Sequence::iterator sb = self->begin();
           typename InputSeq::const_iterator isit = is.begin();
           std::advance(sb,ii);
@@ -4033,8 +4201,6 @@ namespace swig {
         }
       }
     } else {
-      if (jj > ii)
-        jj = ii;
       size_t replacecount = (ii - jj - step - 1) / -step;
       if (is.size() != replacecount) {
         char msg[1024];
@@ -4060,37 +4226,33 @@ namespace swig {
     Difference jj = 0;
     swig::slice_adjust(i, j, step, size, ii, jj, true);
     if (step > 0) {
-      if (jj > ii) {
-        typename Sequence::iterator sb = self->begin();
-        std::advance(sb,ii);
-        if (step == 1) {
-          typename Sequence::iterator se = self->begin();
-          std::advance(se,jj);
-          self->erase(sb,se);
-        } else {
-          typename Sequence::iterator it = sb;
-          size_t delcount = (jj - ii + step - 1) / step;
-          while (delcount) {
-            it = self->erase(it);
-            for (Py_ssize_t c=0; c<(step-1) && it != self->end(); ++c)
-              it++;
-            delcount--;
-          }
-        }
-      }
-    } else {
-      if (ii > jj) {
-        typename Sequence::reverse_iterator sb = self->rbegin();
-        std::advance(sb,size-ii-1);
-        typename Sequence::reverse_iterator it = sb;
-        size_t delcount = (ii - jj - step - 1) / -step;
+      typename Sequence::iterator sb = self->begin();
+      std::advance(sb,ii);
+      if (step == 1) {
+        typename Sequence::iterator se = self->begin();
+        std::advance(se,jj);
+        self->erase(sb,se);
+      } else {
+        typename Sequence::iterator it = sb;
+        size_t delcount = (jj - ii + step - 1) / step;
         while (delcount) {
-          it = typename Sequence::reverse_iterator(self->erase((++it).base()));
-          for (Py_ssize_t c=0; c<(-step-1) && it != self->rend(); ++c)
+          it = self->erase(it);
+          for (Py_ssize_t c=0; c<(step-1) && it != self->end(); ++c)
             it++;
           delcount--;
         }
       }
+    } else {
+      typename Sequence::reverse_iterator sb = self->rbegin();
+      std::advance(sb,size-ii-1);
+      typename Sequence::reverse_iterator it = sb;
+      size_t delcount = (ii - jj - step - 1) / -step;
+      while (delcount) {
+        it = typename Sequence::reverse_iterator(self->erase((++it).base()));
+        for (Py_ssize_t c=0; c<(-step-1) && it != self->rend(); ++c)
+          it++;
+        delcount--;
+      }
     }
   }
 }
@@ -4546,16 +4708,6 @@ namespace swig
 }
 
 
-#include <limits.h>
-#if !defined(SWIG_NO_LLONG_MAX)
-# if !defined(LLONG_MAX) && defined(__GNUC__) && defined (__LONG_LONG_MAX__)
-#   define LLONG_MAX __LONG_LONG_MAX__
-#   define LLONG_MIN (-LLONG_MAX - 1LL)
-#   define ULLONG_MAX (LLONG_MAX * 2ULL + 1ULL)
-# endif
-#endif
-
-
 SWIGINTERN int
 SWIG_AsVal_int (PyObject * obj, int *val)
 {
@@ -4619,8 +4771,8 @@ namespace swig {
     static int asptr(PyObject *obj, sequence **seq) {
       if (obj == Py_None || SWIG_Python_GetSwigThis(obj)) {
 	sequence *p;
-	if (::SWIG_ConvertPtr(obj,(void**)&p,
-			      swig::type_info<sequence>(),0) == SWIG_OK) {
+	swig_type_info *descriptor = swig::type_info<sequence>();
+	if (descriptor && SWIG_IsOK(::SWIG_ConvertPtr(obj, (void **)&p, descriptor, 0))) {
 	  if (seq) *seq = p;
 	  return SWIG_OLDOBJ;
 	}
@@ -4659,7 +4811,7 @@ namespace swig {
 #ifdef SWIG_PYTHON_EXTRA_NATIVE_CONTAINERS
       swig_type_info *desc = swig::type_info<sequence>();
       if (desc && desc->clientdata) {
-	return SWIG_NewPointerObj(new sequence(seq), desc, SWIG_POINTER_OWN);
+	return SWIG_InternalNewPointerObj(new sequence(seq), desc, SWIG_POINTER_OWN);
       }
 #endif
       size_type size = seq.size();
@@ -4680,6 +4832,13 @@ namespace swig {
 
 
   namespace swig {
+    template <class T>
+    struct traits_reserve<std::vector<T> > {
+      static void reserve(std::vector<T> &seq, typename std::vector<T>::size_type n) {
+        seq.reserve(n);
+      }
+    };
+
     template <class T>
     struct traits_asptr<std::vector<T> >  {
       static int asptr(PyObject *obj, std::vector<T> **vec) {
@@ -4722,14 +4881,33 @@ SWIGINTERNINLINE PyObject*
 SWIG_From_unsigned_SS_long  (unsigned long value)
 {
   return (value > LONG_MAX) ?
-    PyLong_FromUnsignedLong(value) : PyLong_FromLong(static_cast< long >(value)); 
+    PyLong_FromUnsignedLong(value) : PyInt_FromLong(static_cast< long >(value));
+}
+
+
+#ifdef SWIG_LONG_LONG_AVAILABLE
+SWIGINTERNINLINE PyObject* 
+SWIG_From_unsigned_SS_long_SS_long  (unsigned long long value)
+{
+  return (value > LONG_MAX) ?
+    PyLong_FromUnsignedLongLong(value) : PyInt_FromLong(static_cast< long >(value));
 }
+#endif
 
 
 SWIGINTERNINLINE PyObject *
 SWIG_From_size_t  (size_t value)
 {    
-  return SWIG_From_unsigned_SS_long  (static_cast< unsigned long >(value));
+#ifdef SWIG_LONG_LONG_AVAILABLE
+  if (sizeof(size_t) <= sizeof(unsigned long)) {
+#endif
+    return SWIG_From_unsigned_SS_long  (static_cast< unsigned long >(value));
+#ifdef SWIG_LONG_LONG_AVAILABLE
+  } else {
+    /* assume sizeof(size_t) <= sizeof(unsigned long long) */
+    return SWIG_From_unsigned_SS_long_SS_long  (static_cast< unsigned long long >(value));
+  }
+#endif
 }
 
 SWIGINTERN std::vector< int,std::allocator< int > > *std_vector_Sl_int_Sg____getslice__(std::vector< int > *self,std::vector< int >::difference_type i,std::vector< int >::difference_type j){
@@ -4829,13 +5007,18 @@ SWIGINTERN int
 SWIG_AsCharPtrAndSize(PyObject *obj, char** cptr, size_t* psize, int *alloc)
 {
 #if PY_VERSION_HEX>=0x03000000
+#if defined(SWIG_PYTHON_STRICT_BYTE_CHAR)
+  if (PyBytes_Check(obj))
+#else
   if (PyUnicode_Check(obj))
+#endif
 #else  
   if (PyString_Check(obj))
 #endif
   {
     char *cstr; Py_ssize_t len;
 #if PY_VERSION_HEX>=0x03000000
+#if !defined(SWIG_PYTHON_STRICT_BYTE_CHAR)
     if (!alloc && cptr) {
         /* We can't allow converting without allocation, since the internal
            representation of string in Python 3 is UCS-2/UCS-4 but we require
@@ -4844,8 +5027,9 @@ SWIG_AsCharPtrAndSize(PyObject *obj, char** cptr, size_t* psize, int *alloc)
         return SWIG_RuntimeError;
     }
     obj = PyUnicode_AsUTF8String(obj);
-    PyBytes_AsStringAndSize(obj, &cstr, &len);
     if(alloc) *alloc = SWIG_NEWOBJ;
+#endif
+    PyBytes_AsStringAndSize(obj, &cstr, &len);
 #else
     PyString_AsStringAndSize(obj, &cstr, &len);
 #endif
@@ -4866,26 +5050,34 @@ SWIG_AsCharPtrAndSize(PyObject *obj, char** cptr, size_t* psize, int *alloc)
 	if (*alloc == SWIG_NEWOBJ) 
 #endif
 	{
-	  *cptr = reinterpret_cast< char* >(memcpy((new char[len + 1]), cstr, sizeof(char)*(len + 1)));
+	  *cptr = reinterpret_cast< char* >(memcpy(new char[len + 1], cstr, sizeof(char)*(len + 1)));
 	  *alloc = SWIG_NEWOBJ;
 	} else {
 	  *cptr = cstr;
 	  *alloc = SWIG_OLDOBJ;
 	}
       } else {
-	#if PY_VERSION_HEX>=0x03000000
-	assert(0); /* Should never reach here in Python 3 */
-	#endif
+#if PY_VERSION_HEX>=0x03000000
+#if defined(SWIG_PYTHON_STRICT_BYTE_CHAR)
+	*cptr = PyBytes_AsString(obj);
+#else
+	assert(0); /* Should never reach here with Unicode strings in Python 3 */
+#endif
+#else
 	*cptr = SWIG_Python_str_AsChar(obj);
+#endif
       }
     }
     if (psize) *psize = len + 1;
-#if PY_VERSION_HEX>=0x03000000
+#if PY_VERSION_HEX>=0x03000000 && !defined(SWIG_PYTHON_STRICT_BYTE_CHAR)
     Py_XDECREF(obj);
 #endif
     return SWIG_OK;
   } else {
 #if defined(SWIG_PYTHON_2_UNICODE)
+#if defined(SWIG_PYTHON_STRICT_BYTE_CHAR)
+#error "Cannot use both SWIG_PYTHON_2_UNICODE and SWIG_PYTHON_STRICT_BYTE_CHAR at once"
+#endif
 #if PY_VERSION_HEX<0x03000000
     if (PyUnicode_Check(obj)) {
       char *cstr; Py_ssize_t len;
@@ -4896,7 +5088,7 @@ SWIG_AsCharPtrAndSize(PyObject *obj, char** cptr, size_t* psize, int *alloc)
       if (PyString_AsStringAndSize(obj, &cstr, &len) != -1) {
         if (cptr) {
           if (alloc) *alloc = SWIG_NEWOBJ;
-          *cptr = reinterpret_cast< char* >(memcpy((new char[len + 1]), cstr, sizeof(char)*(len + 1)));
+          *cptr = reinterpret_cast< char* >(memcpy(new char[len + 1], cstr, sizeof(char)*(len + 1)));
         }
         if (psize) *psize = len + 1;
 
@@ -4983,11 +5175,15 @@ SWIG_FromCharPtrAndSize(const char* carray, size_t size)
 	SWIG_InternalNewPointerObj(const_cast< char * >(carray), pchar_descriptor, 0) : SWIG_Py_Void();
     } else {
 #if PY_VERSION_HEX >= 0x03000000
+#if defined(SWIG_PYTHON_STRICT_BYTE_CHAR)
+      return PyBytes_FromStringAndSize(carray, static_cast< Py_ssize_t >(size));
+#else
 #if PY_VERSION_HEX >= 0x03010000
       return PyUnicode_DecodeUTF8(carray, static_cast< Py_ssize_t >(size), "surrogateescape");
 #else
       return PyUnicode_FromStringAndSize(carray, static_cast< Py_ssize_t >(size));
 #endif
+#endif
 #else
       return PyString_FromStringAndSize(carray, static_cast< Py_ssize_t >(size));
 #endif
@@ -6257,7 +6453,7 @@ fail:
 
 SWIGINTERN PyObject *SwigPyIterator_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *obj;
-  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  if (!PyArg_ParseTuple(args,(char *)"O:swigregister", &obj)) return NULL;
   SWIG_TypeNewClientData(SWIGTYPE_p_swig__SwigPyIterator, SWIG_NewClientData(obj));
   return SWIG_Py_Void();
 }
@@ -8175,7 +8371,7 @@ fail:
 
 SWIGINTERN PyObject *IntVector_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *obj;
-  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  if (!PyArg_ParseTuple(args,(char *)"O:swigregister", &obj)) return NULL;
   SWIG_TypeNewClientData(SWIGTYPE_p_std__vectorT_int_std__allocatorT_int_t_t, SWIG_NewClientData(obj));
   return SWIG_Py_Void();
 }
@@ -10123,7 +10319,7 @@ fail:
 
 SWIGINTERN PyObject *StringVector_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *obj;
-  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  if (!PyArg_ParseTuple(args,(char *)"O:swigregister", &obj)) return NULL;
   SWIG_TypeNewClientData(SWIGTYPE_p_std__vectorT_std__string_std__allocatorT_std__string_t_t, SWIG_NewClientData(obj));
   return SWIG_Py_Void();
 }
@@ -12041,7 +12237,7 @@ fail:
 
 SWIGINTERN PyObject *DoubleVector_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *obj;
-  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  if (!PyArg_ParseTuple(args,(char *)"O:swigregister", &obj)) return NULL;
   SWIG_TypeNewClientData(SWIGTYPE_p_std__vectorT_double_std__allocatorT_double_t_t, SWIG_NewClientData(obj));
   return SWIG_Py_Void();
 }
@@ -13959,77 +14155,11 @@ fail:
 
 SWIGINTERN PyObject *UIntVector_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *obj;
-  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
+  if (!PyArg_ParseTuple(args,(char *)"O:swigregister", &obj)) return NULL;
   SWIG_TypeNewClientData(SWIGTYPE_p_std__vectorT_unsigned_int_std__allocatorT_unsigned_int_t_t, SWIG_NewClientData(obj));
   return SWIG_Py_Void();
 }
 
-SWIGINTERN PyObject *STATUS_SIZE_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *module;
-  PyObject *d;
-  if (!PyArg_ParseTuple(args,(char*)"O:swigconstant", &module)) return NULL;
-  d = PyModule_GetDict(module);
-  if (!d) return NULL;
-  SWIG_Python_SetConstant(d, "STATUS_SIZE",SWIG_From_int(static_cast< int >(64)));
-  return SWIG_Py_Void();
-}
-
-
-SWIGINTERN PyObject *SPECLEN_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *module;
-  PyObject *d;
-  if (!PyArg_ParseTuple(args,(char*)"O:swigconstant", &module)) return NULL;
-  d = PyModule_GetDict(module);
-  if (!d) return NULL;
-  SWIG_Python_SetConstant(d, "SPECLEN",SWIG_From_int(static_cast< int >(8192)));
-  return SWIG_Py_Void();
-}
-
-
-SWIGINTERN PyObject *NOT_CONNECTED_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *module;
-  PyObject *d;
-  if (!PyArg_ParseTuple(args,(char*)"O:swigconstant", &module)) return NULL;
-  d = PyModule_GetDict(module);
-  if (!d) return NULL;
-  SWIG_Python_SetConstant(d, "NOT_CONNECTED",SWIG_From_int(static_cast< int >(NOT_CONNECTED)));
-  return SWIG_Py_Void();
-}
-
-
-SWIGINTERN PyObject *ON_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *module;
-  PyObject *d;
-  if (!PyArg_ParseTuple(args,(char*)"O:swigconstant", &module)) return NULL;
-  d = PyModule_GetDict(module);
-  if (!d) return NULL;
-  SWIG_Python_SetConstant(d, "ON",SWIG_From_int(static_cast< int >(ON)));
-  return SWIG_Py_Void();
-}
-
-
-SWIGINTERN PyObject *RECORDING_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *module;
-  PyObject *d;
-  if (!PyArg_ParseTuple(args,(char*)"O:swigconstant", &module)) return NULL;
-  d = PyModule_GetDict(module);
-  if (!d) return NULL;
-  SWIG_Python_SetConstant(d, "RECORDING",SWIG_From_int(static_cast< int >(RECORDING)));
-  return SWIG_Py_Void();
-}
-
-
-SWIGINTERN PyObject *ERROR_swigconstant(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *module;
-  PyObject *d;
-  if (!PyArg_ParseTuple(args,(char*)"O:swigconstant", &module)) return NULL;
-  d = PyModule_GetDict(module);
-  if (!d) return NULL;
-  SWIG_Python_SetConstant(d, "ERROR",SWIG_From_int(static_cast< int >(ERROR)));
-  return SWIG_Py_Void();
-}
-
-
 SWIGINTERN PyObject *_wrap_new_AmptekHardwareInterface(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   AmptekHardwareInterface *result = 0 ;
@@ -14165,288 +14295,62 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_readSpectrum__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_Enable(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   AmptekHardwareInterface *arg1 = (AmptekHardwareInterface *) 0 ;
-  double arg2 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
-  double val2 ;
-  int ecode2 = 0 ;
   PyObject * obj0 = 0 ;
-  PyObject * obj1 = 0 ;
-  byte *result = 0 ;
+  bool result;
   
-  if (!PyArg_ParseTuple(args,(char *)"OO:AmptekHardwareInterface_readSpectrum",&obj0,&obj1)) SWIG_fail;
+  if (!PyArg_ParseTuple(args,(char *)"O:AmptekHardwareInterface_Enable",&obj0)) SWIG_fail;
   res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekHardwareInterface, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekHardwareInterface_readSpectrum" "', argument " "1"" of type '" "AmptekHardwareInterface *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekHardwareInterface_Enable" "', argument " "1"" of type '" "AmptekHardwareInterface *""'"); 
   }
   arg1 = reinterpret_cast< AmptekHardwareInterface * >(argp1);
-  ecode2 = SWIG_AsVal_double(obj1, &val2);
-  if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "AmptekHardwareInterface_readSpectrum" "', argument " "2"" of type '" "double""'");
-  } 
-  arg2 = static_cast< double >(val2);
-  result = (byte *)(arg1)->readSpectrum(arg2);
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_byte, 0 |  0 );
+  result = (bool)(arg1)->Enable();
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_readSpectrum__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_Disable(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   AmptekHardwareInterface *arg1 = (AmptekHardwareInterface *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject * obj0 = 0 ;
-  byte *result = 0 ;
+  bool result;
   
-  if (!PyArg_ParseTuple(args,(char *)"O:AmptekHardwareInterface_readSpectrum",&obj0)) SWIG_fail;
+  if (!PyArg_ParseTuple(args,(char *)"O:AmptekHardwareInterface_Disable",&obj0)) SWIG_fail;
   res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekHardwareInterface, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekHardwareInterface_readSpectrum" "', argument " "1"" of type '" "AmptekHardwareInterface *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekHardwareInterface_Disable" "', argument " "1"" of type '" "AmptekHardwareInterface *""'"); 
   }
   arg1 = reinterpret_cast< AmptekHardwareInterface * >(argp1);
-  result = (byte *)(arg1)->readSpectrum();
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_byte, 0 |  0 );
+  result = (bool)(arg1)->Disable();
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_readSpectrum(PyObject *self, PyObject *args) {
-  Py_ssize_t argc;
-  PyObject *argv[3] = {
-    0
-  };
-  Py_ssize_t ii;
+SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_Ping(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  AmptekHardwareInterface *arg1 = (AmptekHardwareInterface *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  bool result;
   
-  if (!PyTuple_Check(args)) SWIG_fail;
-  argc = args ? PyObject_Length(args) : 0;
-  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
-    argv[ii] = PyTuple_GET_ITEM(args,ii);
-  }
-  if (argc == 1) {
-    int _v;
-    void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_AmptekHardwareInterface, 0);
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      return _wrap_AmptekHardwareInterface_readSpectrum__SWIG_1(self, args);
-    }
-  }
-  if (argc == 2) {
-    int _v;
-    void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_AmptekHardwareInterface, 0);
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      {
-        int res = SWIG_AsVal_double(argv[1], NULL);
-        _v = SWIG_CheckState(res);
-      }
-      if (_v) {
-        return _wrap_AmptekHardwareInterface_readSpectrum__SWIG_0(self, args);
-      }
-    }
-  }
-  
-fail:
-  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'AmptekHardwareInterface_readSpectrum'.\n"
-    "  Possible C/C++ prototypes are:\n"
-    "    AmptekHardwareInterface::readSpectrum(double)\n"
-    "    AmptekHardwareInterface::readSpectrum()\n");
-  return 0;
-}
-
-
-SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_readSpectrumAndStatus__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  AmptekHardwareInterface *arg1 = (AmptekHardwareInterface *) 0 ;
-  byte *arg2 = (byte *) 0 ;
-  double arg3 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  void *argp2 = 0 ;
-  int res2 = 0 ;
-  double val3 ;
-  int ecode3 = 0 ;
-  PyObject * obj0 = 0 ;
-  PyObject * obj1 = 0 ;
-  PyObject * obj2 = 0 ;
-  byte *result = 0 ;
-  
-  if (!PyArg_ParseTuple(args,(char *)"OOO:AmptekHardwareInterface_readSpectrumAndStatus",&obj0,&obj1,&obj2)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekHardwareInterface, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekHardwareInterface_readSpectrumAndStatus" "', argument " "1"" of type '" "AmptekHardwareInterface *""'"); 
-  }
-  arg1 = reinterpret_cast< AmptekHardwareInterface * >(argp1);
-  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_byte, 0 |  0 );
-  if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "AmptekHardwareInterface_readSpectrumAndStatus" "', argument " "2"" of type '" "byte const *""'"); 
-  }
-  arg2 = reinterpret_cast< byte * >(argp2);
-  ecode3 = SWIG_AsVal_double(obj2, &val3);
-  if (!SWIG_IsOK(ecode3)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "AmptekHardwareInterface_readSpectrumAndStatus" "', argument " "3"" of type '" "double""'");
-  } 
-  arg3 = static_cast< double >(val3);
-  result = (byte *)(arg1)->readSpectrumAndStatus((byte const *)arg2,arg3);
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_byte, 0 |  0 );
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_readSpectrumAndStatus__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  AmptekHardwareInterface *arg1 = (AmptekHardwareInterface *) 0 ;
-  byte *arg2 = (byte *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  void *argp2 = 0 ;
-  int res2 = 0 ;
-  PyObject * obj0 = 0 ;
-  PyObject * obj1 = 0 ;
-  byte *result = 0 ;
-  
-  if (!PyArg_ParseTuple(args,(char *)"OO:AmptekHardwareInterface_readSpectrumAndStatus",&obj0,&obj1)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekHardwareInterface, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekHardwareInterface_readSpectrumAndStatus" "', argument " "1"" of type '" "AmptekHardwareInterface *""'"); 
-  }
-  arg1 = reinterpret_cast< AmptekHardwareInterface * >(argp1);
-  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_byte, 0 |  0 );
-  if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "AmptekHardwareInterface_readSpectrumAndStatus" "', argument " "2"" of type '" "byte const *""'"); 
-  }
-  arg2 = reinterpret_cast< byte * >(argp2);
-  result = (byte *)(arg1)->readSpectrumAndStatus((byte const *)arg2);
-  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_byte, 0 |  0 );
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_readSpectrumAndStatus(PyObject *self, PyObject *args) {
-  Py_ssize_t argc;
-  PyObject *argv[4] = {
-    0
-  };
-  Py_ssize_t ii;
-  
-  if (!PyTuple_Check(args)) SWIG_fail;
-  argc = args ? PyObject_Length(args) : 0;
-  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
-    argv[ii] = PyTuple_GET_ITEM(args,ii);
-  }
-  if (argc == 2) {
-    int _v;
-    void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_AmptekHardwareInterface, 0);
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      void *vptr = 0;
-      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_byte, 0);
-      _v = SWIG_CheckState(res);
-      if (_v) {
-        return _wrap_AmptekHardwareInterface_readSpectrumAndStatus__SWIG_1(self, args);
-      }
-    }
-  }
-  if (argc == 3) {
-    int _v;
-    void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_AmptekHardwareInterface, 0);
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      void *vptr = 0;
-      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_byte, 0);
-      _v = SWIG_CheckState(res);
-      if (_v) {
-        {
-          int res = SWIG_AsVal_double(argv[2], NULL);
-          _v = SWIG_CheckState(res);
-        }
-        if (_v) {
-          return _wrap_AmptekHardwareInterface_readSpectrumAndStatus__SWIG_0(self, args);
-        }
-      }
-    }
-  }
-  
-fail:
-  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'AmptekHardwareInterface_readSpectrumAndStatus'.\n"
-    "  Possible C/C++ prototypes are:\n"
-    "    AmptekHardwareInterface::readSpectrumAndStatus(byte const *,double)\n"
-    "    AmptekHardwareInterface::readSpectrumAndStatus(byte const *)\n");
-  return 0;
-}
-
-
-SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_Enable(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  AmptekHardwareInterface *arg1 = (AmptekHardwareInterface *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject * obj0 = 0 ;
-  bool result;
-  
-  if (!PyArg_ParseTuple(args,(char *)"O:AmptekHardwareInterface_Enable",&obj0)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekHardwareInterface, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekHardwareInterface_Enable" "', argument " "1"" of type '" "AmptekHardwareInterface *""'"); 
-  }
-  arg1 = reinterpret_cast< AmptekHardwareInterface * >(argp1);
-  result = (bool)(arg1)->Enable();
-  resultobj = SWIG_From_bool(static_cast< bool >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_Disable(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  AmptekHardwareInterface *arg1 = (AmptekHardwareInterface *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject * obj0 = 0 ;
-  bool result;
-  
-  if (!PyArg_ParseTuple(args,(char *)"O:AmptekHardwareInterface_Disable",&obj0)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekHardwareInterface, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekHardwareInterface_Disable" "', argument " "1"" of type '" "AmptekHardwareInterface *""'"); 
-  }
-  arg1 = reinterpret_cast< AmptekHardwareInterface * >(argp1);
-  result = (bool)(arg1)->Disable();
-  resultobj = SWIG_From_bool(static_cast< bool >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_Ping(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  AmptekHardwareInterface *arg1 = (AmptekHardwareInterface *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject * obj0 = 0 ;
-  bool result;
-  
-  if (!PyArg_ParseTuple(args,(char *)"O:AmptekHardwareInterface_Ping",&obj0)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekHardwareInterface, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekHardwareInterface_Ping" "', argument " "1"" of type '" "AmptekHardwareInterface *""'"); 
+  if (!PyArg_ParseTuple(args,(char *)"O:AmptekHardwareInterface_Ping",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekHardwareInterface, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekHardwareInterface_Ping" "', argument " "1"" of type '" "AmptekHardwareInterface *""'"); 
   }
   arg1 = reinterpret_cast< AmptekHardwareInterface * >(argp1);
   result = (bool)(arg1)->Ping();
@@ -14605,22 +14509,31 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_UpdateStatus(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_updateStatus(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   AmptekHardwareInterface *arg1 = (AmptekHardwareInterface *) 0 ;
+  double arg2 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
   PyObject * obj0 = 0 ;
-  bool result;
+  PyObject * obj1 = 0 ;
+  AmptekStatus *result = 0 ;
   
-  if (!PyArg_ParseTuple(args,(char *)"O:AmptekHardwareInterface_UpdateStatus",&obj0)) SWIG_fail;
+  if (!PyArg_ParseTuple(args,(char *)"OO:AmptekHardwareInterface_updateStatus",&obj0,&obj1)) SWIG_fail;
   res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekHardwareInterface, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekHardwareInterface_UpdateStatus" "', argument " "1"" of type '" "AmptekHardwareInterface *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekHardwareInterface_updateStatus" "', argument " "1"" of type '" "AmptekHardwareInterface *""'"); 
   }
   arg1 = reinterpret_cast< AmptekHardwareInterface * >(argp1);
-  result = (bool)(arg1)->UpdateStatus();
-  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "AmptekHardwareInterface_updateStatus" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  result = (AmptekStatus *) &(arg1)->updateStatus(arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_AmptekStatus, 0 |  0 );
   return resultobj;
 fail:
   return NULL;
@@ -14748,7 +14661,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_GetBuffered(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_GetBufferedSpectrum(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   AmptekHardwareInterface *arg1 = (AmptekHardwareInterface *) 0 ;
   size_t arg2 ;
@@ -14758,21 +14671,21 @@ SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_GetBuffered(PyObject *SWIGUNU
   int ecode2 = 0 ;
   PyObject * obj0 = 0 ;
   PyObject * obj1 = 0 ;
-  std::vector< unsigned int,std::allocator< unsigned int > > result;
+  SwigValueWrapper< std::pair< AmptekSpectrum,AmptekStatus > > result;
   
-  if (!PyArg_ParseTuple(args,(char *)"OO:AmptekHardwareInterface_GetBuffered",&obj0,&obj1)) SWIG_fail;
+  if (!PyArg_ParseTuple(args,(char *)"OO:AmptekHardwareInterface_GetBufferedSpectrum",&obj0,&obj1)) SWIG_fail;
   res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekHardwareInterface, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekHardwareInterface_GetBuffered" "', argument " "1"" of type '" "AmptekHardwareInterface *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekHardwareInterface_GetBufferedSpectrum" "', argument " "1"" of type '" "AmptekHardwareInterface *""'"); 
   }
   arg1 = reinterpret_cast< AmptekHardwareInterface * >(argp1);
   ecode2 = SWIG_AsVal_size_t(obj1, &val2);
   if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "AmptekHardwareInterface_GetBuffered" "', argument " "2"" of type '" "size_t""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "AmptekHardwareInterface_GetBufferedSpectrum" "', argument " "2"" of type '" "size_t""'");
   } 
   arg2 = static_cast< size_t >(val2);
-  result = (arg1)->GetBuffered(arg2);
-  resultobj = swig::from(static_cast< std::vector< unsigned int,std::allocator< unsigned int > > >(result));
+  result = (arg1)->GetBufferedSpectrum(arg2);
+  resultobj = SWIG_NewPointerObj((new std::pair< AmptekSpectrum,AmptekStatus >(static_cast< const std::pair< AmptekSpectrum,AmptekStatus >& >(result))), SWIGTYPE_p_std__pairT_AmptekSpectrum_AmptekStatus_t, SWIG_POINTER_OWN |  0 );
   return resultobj;
 fail:
   return NULL;
@@ -14859,7 +14772,7 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_FastCount__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_GetSpectrum__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   AmptekHardwareInterface *arg1 = (AmptekHardwareInterface *) 0 ;
   double arg2 ;
@@ -14869,50 +14782,50 @@ SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_FastCount__SWIG_0(PyObject *S
   int ecode2 = 0 ;
   PyObject * obj0 = 0 ;
   PyObject * obj1 = 0 ;
-  int result;
+  std::vector< unsigned int,std::allocator< unsigned int > > result;
   
-  if (!PyArg_ParseTuple(args,(char *)"OO:AmptekHardwareInterface_FastCount",&obj0,&obj1)) SWIG_fail;
+  if (!PyArg_ParseTuple(args,(char *)"OO:AmptekHardwareInterface_GetSpectrum",&obj0,&obj1)) SWIG_fail;
   res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekHardwareInterface, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekHardwareInterface_FastCount" "', argument " "1"" of type '" "AmptekHardwareInterface *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekHardwareInterface_GetSpectrum" "', argument " "1"" of type '" "AmptekHardwareInterface *""'"); 
   }
   arg1 = reinterpret_cast< AmptekHardwareInterface * >(argp1);
   ecode2 = SWIG_AsVal_double(obj1, &val2);
   if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "AmptekHardwareInterface_FastCount" "', argument " "2"" of type '" "double""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "AmptekHardwareInterface_GetSpectrum" "', argument " "2"" of type '" "double""'");
   } 
   arg2 = static_cast< double >(val2);
-  result = (int)(arg1)->FastCount(arg2);
-  resultobj = SWIG_From_int(static_cast< int >(result));
+  result = (arg1)->GetSpectrum(arg2);
+  resultobj = swig::from(static_cast< std::vector< unsigned int,std::allocator< unsigned int > > >(result));
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_FastCount__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_GetSpectrum__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   AmptekHardwareInterface *arg1 = (AmptekHardwareInterface *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject * obj0 = 0 ;
-  int result;
+  std::vector< unsigned int,std::allocator< unsigned int > > result;
   
-  if (!PyArg_ParseTuple(args,(char *)"O:AmptekHardwareInterface_FastCount",&obj0)) SWIG_fail;
+  if (!PyArg_ParseTuple(args,(char *)"O:AmptekHardwareInterface_GetSpectrum",&obj0)) SWIG_fail;
   res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekHardwareInterface, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekHardwareInterface_FastCount" "', argument " "1"" of type '" "AmptekHardwareInterface *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekHardwareInterface_GetSpectrum" "', argument " "1"" of type '" "AmptekHardwareInterface *""'"); 
   }
   arg1 = reinterpret_cast< AmptekHardwareInterface * >(argp1);
-  result = (int)(arg1)->FastCount();
-  resultobj = SWIG_From_int(static_cast< int >(result));
+  result = (arg1)->GetSpectrum();
+  resultobj = swig::from(static_cast< std::vector< unsigned int,std::allocator< unsigned int > > >(result));
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_FastCount(PyObject *self, PyObject *args) {
+SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_GetSpectrum(PyObject *self, PyObject *args) {
   Py_ssize_t argc;
   PyObject *argv[3] = {
     0
@@ -14930,7 +14843,7 @@ SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_FastCount(PyObject *self, PyO
     int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_AmptekHardwareInterface, 0);
     _v = SWIG_CheckState(res);
     if (_v) {
-      return _wrap_AmptekHardwareInterface_FastCount__SWIG_1(self, args);
+      return _wrap_AmptekHardwareInterface_GetSpectrum__SWIG_1(self, args);
     }
   }
   if (argc == 2) {
@@ -14944,66 +14857,68 @@ SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_FastCount(PyObject *self, PyO
         _v = SWIG_CheckState(res);
       }
       if (_v) {
-        return _wrap_AmptekHardwareInterface_FastCount__SWIG_0(self, args);
+        return _wrap_AmptekHardwareInterface_GetSpectrum__SWIG_0(self, args);
       }
     }
   }
   
 fail:
-  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'AmptekHardwareInterface_FastCount'.\n"
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'AmptekHardwareInterface_GetSpectrum'.\n"
     "  Possible C/C++ prototypes are:\n"
-    "    AmptekHardwareInterface::FastCount(double)\n"
-    "    AmptekHardwareInterface::FastCount()\n");
+    "    AmptekHardwareInterface::GetSpectrum(double)\n"
+    "    AmptekHardwareInterface::GetSpectrum()\n");
   return 0;
 }
 
 
-SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_SlowCount__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_GetTextConfiguration(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   AmptekHardwareInterface *arg1 = (AmptekHardwareInterface *) 0 ;
-  double arg2 ;
+  std::vector< std::string,std::allocator< std::string > > arg2 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
-  double val2 ;
-  int ecode2 = 0 ;
   PyObject * obj0 = 0 ;
   PyObject * obj1 = 0 ;
-  int result;
+  std::vector< std::string,std::allocator< std::string > > result;
   
-  if (!PyArg_ParseTuple(args,(char *)"OO:AmptekHardwareInterface_SlowCount",&obj0,&obj1)) SWIG_fail;
+  if (!PyArg_ParseTuple(args,(char *)"OO:AmptekHardwareInterface_GetTextConfiguration",&obj0,&obj1)) SWIG_fail;
   res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekHardwareInterface, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekHardwareInterface_SlowCount" "', argument " "1"" of type '" "AmptekHardwareInterface *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekHardwareInterface_GetTextConfiguration" "', argument " "1"" of type '" "AmptekHardwareInterface *""'"); 
   }
   arg1 = reinterpret_cast< AmptekHardwareInterface * >(argp1);
-  ecode2 = SWIG_AsVal_double(obj1, &val2);
-  if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "AmptekHardwareInterface_SlowCount" "', argument " "2"" of type '" "double""'");
-  } 
-  arg2 = static_cast< double >(val2);
-  result = (int)(arg1)->SlowCount(arg2);
-  resultobj = SWIG_From_int(static_cast< int >(result));
+  {
+    std::vector< std::string,std::allocator< std::string > > *ptr = (std::vector< std::string,std::allocator< std::string > > *)0;
+    int res = swig::asptr(obj1, &ptr);
+    if (!SWIG_IsOK(res) || !ptr) {
+      SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "AmptekHardwareInterface_GetTextConfiguration" "', argument " "2"" of type '" "std::vector< std::string,std::allocator< std::string > >""'"); 
+    }
+    arg2 = *ptr;
+    if (SWIG_IsNewObj(res)) delete ptr;
+  }
+  result = (arg1)->GetTextConfiguration(arg2);
+  resultobj = swig::from(static_cast< std::vector< std::string,std::allocator< std::string > > >(result));
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_SlowCount__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_GetState(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
   AmptekHardwareInterface *arg1 = (AmptekHardwareInterface *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject * obj0 = 0 ;
-  int result;
+  AmptekState result;
   
-  if (!PyArg_ParseTuple(args,(char *)"O:AmptekHardwareInterface_SlowCount",&obj0)) SWIG_fail;
+  if (!PyArg_ParseTuple(args,(char *)"O:AmptekHardwareInterface_GetState",&obj0)) SWIG_fail;
   res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekHardwareInterface, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekHardwareInterface_SlowCount" "', argument " "1"" of type '" "AmptekHardwareInterface *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekHardwareInterface_GetState" "', argument " "1"" of type '" "AmptekHardwareInterface const *""'"); 
   }
   arg1 = reinterpret_cast< AmptekHardwareInterface * >(argp1);
-  result = (int)(arg1)->SlowCount();
+  result = (AmptekState)((AmptekHardwareInterface const *)arg1)->GetState();
   resultobj = SWIG_From_int(static_cast< int >(result));
   return resultobj;
 fail:
@@ -15011,106 +14926,88 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_SlowCount(PyObject *self, PyObject *args) {
-  Py_ssize_t argc;
-  PyObject *argv[3] = {
-    0
-  };
-  Py_ssize_t ii;
+SWIGINTERN PyObject *AmptekHardwareInterface_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char *)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_AmptekHardwareInterface, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_new_AmptekStatus__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  byte *arg1 = (byte *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  AmptekStatus *result = 0 ;
   
-  if (!PyTuple_Check(args)) SWIG_fail;
-  argc = args ? PyObject_Length(args) : 0;
-  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
-    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  if (!PyArg_ParseTuple(args,(char *)"O:new_AmptekStatus",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_byte, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_AmptekStatus" "', argument " "1"" of type '" "byte const *""'"); 
   }
-  if (argc == 1) {
-    int _v;
-    void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_AmptekHardwareInterface, 0);
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      return _wrap_AmptekHardwareInterface_SlowCount__SWIG_1(self, args);
-    }
-  }
-  if (argc == 2) {
-    int _v;
-    void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_AmptekHardwareInterface, 0);
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      {
-        int res = SWIG_AsVal_double(argv[1], NULL);
-        _v = SWIG_CheckState(res);
-      }
-      if (_v) {
-        return _wrap_AmptekHardwareInterface_SlowCount__SWIG_0(self, args);
-      }
-    }
-  }
-  
+  arg1 = reinterpret_cast< byte * >(argp1);
+  result = (AmptekStatus *)new AmptekStatus((byte const *)arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_AmptekStatus, SWIG_POINTER_NEW |  0 );
+  return resultobj;
 fail:
-  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'AmptekHardwareInterface_SlowCount'.\n"
-    "  Possible C/C++ prototypes are:\n"
-    "    AmptekHardwareInterface::SlowCount(double)\n"
-    "    AmptekHardwareInterface::SlowCount()\n");
-  return 0;
+  return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_DeadTime__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_new_AmptekStatus__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  AmptekHardwareInterface *arg1 = (AmptekHardwareInterface *) 0 ;
-  double arg2 ;
+  byte *arg1 = (byte *) 0 ;
+  std::chrono::time_point< std::chrono::system_clock > arg2 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
-  double val2 ;
-  int ecode2 = 0 ;
+  void *argp2 ;
+  int res2 = 0 ;
   PyObject * obj0 = 0 ;
   PyObject * obj1 = 0 ;
-  double result;
+  AmptekStatus *result = 0 ;
   
-  if (!PyArg_ParseTuple(args,(char *)"OO:AmptekHardwareInterface_DeadTime",&obj0,&obj1)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekHardwareInterface, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"OO:new_AmptekStatus",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_byte, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekHardwareInterface_DeadTime" "', argument " "1"" of type '" "AmptekHardwareInterface *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_AmptekStatus" "', argument " "1"" of type '" "byte const *""'"); 
   }
-  arg1 = reinterpret_cast< AmptekHardwareInterface * >(argp1);
-  ecode2 = SWIG_AsVal_double(obj1, &val2);
-  if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "AmptekHardwareInterface_DeadTime" "', argument " "2"" of type '" "double""'");
-  } 
-  arg2 = static_cast< double >(val2);
-  result = (double)(arg1)->DeadTime(arg2);
-  resultobj = SWIG_From_double(static_cast< double >(result));
+  arg1 = reinterpret_cast< byte * >(argp1);
+  {
+    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_std__chrono__time_pointT_std__chrono__system_clock_t,  0  | 0);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new_AmptekStatus" "', argument " "2"" of type '" "std::chrono::time_point< std::chrono::system_clock >""'"); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_AmptekStatus" "', argument " "2"" of type '" "std::chrono::time_point< std::chrono::system_clock >""'");
+    } else {
+      std::chrono::time_point< std::chrono::system_clock > * temp = reinterpret_cast< std::chrono::time_point< std::chrono::system_clock > * >(argp2);
+      arg2 = *temp;
+      if (SWIG_IsNewObj(res2)) delete temp;
+    }
+  }
+  result = (AmptekStatus *)new AmptekStatus((byte const *)arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_AmptekStatus, SWIG_POINTER_NEW |  0 );
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_DeadTime__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_new_AmptekStatus__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  AmptekHardwareInterface *arg1 = (AmptekHardwareInterface *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject * obj0 = 0 ;
-  double result;
+  AmptekStatus *result = 0 ;
   
-  if (!PyArg_ParseTuple(args,(char *)"O:AmptekHardwareInterface_DeadTime",&obj0)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekHardwareInterface, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekHardwareInterface_DeadTime" "', argument " "1"" of type '" "AmptekHardwareInterface *""'"); 
-  }
-  arg1 = reinterpret_cast< AmptekHardwareInterface * >(argp1);
-  result = (double)(arg1)->DeadTime();
-  resultobj = SWIG_From_double(static_cast< double >(result));
+  if (!PyArg_ParseTuple(args,(char *)":new_AmptekStatus")) SWIG_fail;
+  result = (AmptekStatus *)new AmptekStatus();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_AmptekStatus, SWIG_POINTER_NEW |  0 );
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_DeadTime(PyObject *self, PyObject *args) {
+SWIGINTERN PyObject *_wrap_new_AmptekStatus(PyObject *self, PyObject *args) {
   Py_ssize_t argc;
   PyObject *argv[3] = {
     0
@@ -15122,163 +15019,122 @@ SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_DeadTime(PyObject *self, PyOb
   for (ii = 0; (ii < 2) && (ii < argc); ii++) {
     argv[ii] = PyTuple_GET_ITEM(args,ii);
   }
+  if (argc == 0) {
+    return _wrap_new_AmptekStatus__SWIG_2(self, args);
+  }
   if (argc == 1) {
     int _v;
     void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_AmptekHardwareInterface, 0);
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_byte, 0);
     _v = SWIG_CheckState(res);
     if (_v) {
-      return _wrap_AmptekHardwareInterface_DeadTime__SWIG_1(self, args);
+      return _wrap_new_AmptekStatus__SWIG_0(self, args);
     }
   }
   if (argc == 2) {
     int _v;
     void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_AmptekHardwareInterface, 0);
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_byte, 0);
     _v = SWIG_CheckState(res);
     if (_v) {
-      {
-        int res = SWIG_AsVal_double(argv[1], NULL);
-        _v = SWIG_CheckState(res);
-      }
+      int res = SWIG_ConvertPtr(argv[1], 0, SWIGTYPE_p_std__chrono__time_pointT_std__chrono__system_clock_t, 0);
+      _v = SWIG_CheckState(res);
       if (_v) {
-        return _wrap_AmptekHardwareInterface_DeadTime__SWIG_0(self, args);
+        return _wrap_new_AmptekStatus__SWIG_1(self, args);
       }
     }
   }
   
 fail:
-  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'AmptekHardwareInterface_DeadTime'.\n"
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new_AmptekStatus'.\n"
     "  Possible C/C++ prototypes are:\n"
-    "    AmptekHardwareInterface::DeadTime(double)\n"
-    "    AmptekHardwareInterface::DeadTime()\n");
+    "    AmptekStatus::AmptekStatus(byte const *)\n"
+    "    AmptekStatus::AmptekStatus(byte const *,std::chrono::time_point< std::chrono::system_clock >)\n"
+    "    AmptekStatus::AmptekStatus()\n");
   return 0;
 }
 
 
-SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_AccTime__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_delete_AmptekStatus(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  AmptekHardwareInterface *arg1 = (AmptekHardwareInterface *) 0 ;
-  double arg2 ;
+  AmptekStatus *arg1 = (AmptekStatus *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
-  double val2 ;
-  int ecode2 = 0 ;
   PyObject * obj0 = 0 ;
-  PyObject * obj1 = 0 ;
-  double result;
   
-  if (!PyArg_ParseTuple(args,(char *)"OO:AmptekHardwareInterface_AccTime",&obj0,&obj1)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekHardwareInterface, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_AmptekStatus",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekStatus, SWIG_POINTER_DISOWN |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekHardwareInterface_AccTime" "', argument " "1"" of type '" "AmptekHardwareInterface *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_AmptekStatus" "', argument " "1"" of type '" "AmptekStatus *""'"); 
   }
-  arg1 = reinterpret_cast< AmptekHardwareInterface * >(argp1);
-  ecode2 = SWIG_AsVal_double(obj1, &val2);
-  if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "AmptekHardwareInterface_AccTime" "', argument " "2"" of type '" "double""'");
-  } 
-  arg2 = static_cast< double >(val2);
-  result = (double)(arg1)->AccTime(arg2);
-  resultobj = SWIG_From_double(static_cast< double >(result));
+  arg1 = reinterpret_cast< AmptekStatus * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_AccTime__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_AmptekStatus_FastCount(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  AmptekHardwareInterface *arg1 = (AmptekHardwareInterface *) 0 ;
+  AmptekStatus *arg1 = (AmptekStatus *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject * obj0 = 0 ;
-  double result;
+  int result;
   
-  if (!PyArg_ParseTuple(args,(char *)"O:AmptekHardwareInterface_AccTime",&obj0)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekHardwareInterface, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"O:AmptekStatus_FastCount",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekStatus, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekHardwareInterface_AccTime" "', argument " "1"" of type '" "AmptekHardwareInterface *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekStatus_FastCount" "', argument " "1"" of type '" "AmptekStatus *""'"); 
   }
-  arg1 = reinterpret_cast< AmptekHardwareInterface * >(argp1);
-  result = (double)(arg1)->AccTime();
-  resultobj = SWIG_From_double(static_cast< double >(result));
+  arg1 = reinterpret_cast< AmptekStatus * >(argp1);
+  result = (int)(arg1)->FastCount();
+  resultobj = SWIG_From_int(static_cast< int >(result));
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_AccTime(PyObject *self, PyObject *args) {
-  Py_ssize_t argc;
-  PyObject *argv[3] = {
-    0
-  };
-  Py_ssize_t ii;
+SWIGINTERN PyObject *_wrap_AmptekStatus_SlowCount(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  AmptekStatus *arg1 = (AmptekStatus *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  int result;
   
-  if (!PyTuple_Check(args)) SWIG_fail;
-  argc = args ? PyObject_Length(args) : 0;
-  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
-    argv[ii] = PyTuple_GET_ITEM(args,ii);
-  }
-  if (argc == 1) {
-    int _v;
-    void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_AmptekHardwareInterface, 0);
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      return _wrap_AmptekHardwareInterface_AccTime__SWIG_1(self, args);
-    }
-  }
-  if (argc == 2) {
-    int _v;
-    void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_AmptekHardwareInterface, 0);
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      {
-        int res = SWIG_AsVal_double(argv[1], NULL);
-        _v = SWIG_CheckState(res);
-      }
-      if (_v) {
-        return _wrap_AmptekHardwareInterface_AccTime__SWIG_0(self, args);
-      }
-    }
+  if (!PyArg_ParseTuple(args,(char *)"O:AmptekStatus_SlowCount",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekStatus, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekStatus_SlowCount" "', argument " "1"" of type '" "AmptekStatus *""'"); 
   }
-  
+  arg1 = reinterpret_cast< AmptekStatus * >(argp1);
+  result = (int)(arg1)->SlowCount();
+  resultobj = SWIG_From_int(static_cast< int >(result));
+  return resultobj;
 fail:
-  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'AmptekHardwareInterface_AccTime'.\n"
-    "  Possible C/C++ prototypes are:\n"
-    "    AmptekHardwareInterface::AccTime(double)\n"
-    "    AmptekHardwareInterface::AccTime()\n");
-  return 0;
+  return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_RealTime__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_AmptekStatus_DeadTime(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  AmptekHardwareInterface *arg1 = (AmptekHardwareInterface *) 0 ;
-  double arg2 ;
+  AmptekStatus *arg1 = (AmptekStatus *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
-  double val2 ;
-  int ecode2 = 0 ;
   PyObject * obj0 = 0 ;
-  PyObject * obj1 = 0 ;
   double result;
   
-  if (!PyArg_ParseTuple(args,(char *)"OO:AmptekHardwareInterface_RealTime",&obj0,&obj1)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekHardwareInterface, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"O:AmptekStatus_DeadTime",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekStatus, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekHardwareInterface_RealTime" "', argument " "1"" of type '" "AmptekHardwareInterface *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekStatus_DeadTime" "', argument " "1"" of type '" "AmptekStatus *""'"); 
   }
-  arg1 = reinterpret_cast< AmptekHardwareInterface * >(argp1);
-  ecode2 = SWIG_AsVal_double(obj1, &val2);
-  if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "AmptekHardwareInterface_RealTime" "', argument " "2"" of type '" "double""'");
-  } 
-  arg2 = static_cast< double >(val2);
-  result = (double)(arg1)->RealTime(arg2);
+  arg1 = reinterpret_cast< AmptekStatus * >(argp1);
+  result = (double)(arg1)->DeadTime();
   resultobj = SWIG_From_double(static_cast< double >(result));
   return resultobj;
 fail:
@@ -15286,21 +15142,21 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_RealTime__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_AmptekStatus_AccTime(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  AmptekHardwareInterface *arg1 = (AmptekHardwareInterface *) 0 ;
+  AmptekStatus *arg1 = (AmptekStatus *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject * obj0 = 0 ;
   double result;
   
-  if (!PyArg_ParseTuple(args,(char *)"O:AmptekHardwareInterface_RealTime",&obj0)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekHardwareInterface, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"O:AmptekStatus_AccTime",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekStatus, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekHardwareInterface_RealTime" "', argument " "1"" of type '" "AmptekHardwareInterface *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekStatus_AccTime" "', argument " "1"" of type '" "AmptekStatus *""'"); 
   }
-  arg1 = reinterpret_cast< AmptekHardwareInterface * >(argp1);
-  result = (double)(arg1)->RealTime();
+  arg1 = reinterpret_cast< AmptekStatus * >(argp1);
+  result = (double)(arg1)->AccTime();
   resultobj = SWIG_From_double(static_cast< double >(result));
   return resultobj;
 fail:
@@ -15308,76 +15164,43 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_RealTime(PyObject *self, PyObject *args) {
-  Py_ssize_t argc;
-  PyObject *argv[3] = {
-    0
-  };
-  Py_ssize_t ii;
+SWIGINTERN PyObject *_wrap_AmptekStatus_RealTime(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  AmptekStatus *arg1 = (AmptekStatus *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
   
-  if (!PyTuple_Check(args)) SWIG_fail;
-  argc = args ? PyObject_Length(args) : 0;
-  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
-    argv[ii] = PyTuple_GET_ITEM(args,ii);
-  }
-  if (argc == 1) {
-    int _v;
-    void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_AmptekHardwareInterface, 0);
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      return _wrap_AmptekHardwareInterface_RealTime__SWIG_1(self, args);
-    }
-  }
-  if (argc == 2) {
-    int _v;
-    void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_AmptekHardwareInterface, 0);
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      {
-        int res = SWIG_AsVal_double(argv[1], NULL);
-        _v = SWIG_CheckState(res);
-      }
-      if (_v) {
-        return _wrap_AmptekHardwareInterface_RealTime__SWIG_0(self, args);
-      }
-    }
+  if (!PyArg_ParseTuple(args,(char *)"O:AmptekStatus_RealTime",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekStatus, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekStatus_RealTime" "', argument " "1"" of type '" "AmptekStatus *""'"); 
   }
-  
+  arg1 = reinterpret_cast< AmptekStatus * >(argp1);
+  result = (double)(arg1)->RealTime();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
 fail:
-  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'AmptekHardwareInterface_RealTime'.\n"
-    "  Possible C/C++ prototypes are:\n"
-    "    AmptekHardwareInterface::RealTime(double)\n"
-    "    AmptekHardwareInterface::RealTime()\n");
-  return 0;
+  return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_FirmwareMajor__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_AmptekStatus_FirmwareMajor(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  AmptekHardwareInterface *arg1 = (AmptekHardwareInterface *) 0 ;
-  double arg2 ;
+  AmptekStatus *arg1 = (AmptekStatus *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
-  double val2 ;
-  int ecode2 = 0 ;
   PyObject * obj0 = 0 ;
-  PyObject * obj1 = 0 ;
   int result;
   
-  if (!PyArg_ParseTuple(args,(char *)"OO:AmptekHardwareInterface_FirmwareMajor",&obj0,&obj1)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekHardwareInterface, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"O:AmptekStatus_FirmwareMajor",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekStatus, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekHardwareInterface_FirmwareMajor" "', argument " "1"" of type '" "AmptekHardwareInterface *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekStatus_FirmwareMajor" "', argument " "1"" of type '" "AmptekStatus *""'"); 
   }
-  arg1 = reinterpret_cast< AmptekHardwareInterface * >(argp1);
-  ecode2 = SWIG_AsVal_double(obj1, &val2);
-  if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "AmptekHardwareInterface_FirmwareMajor" "', argument " "2"" of type '" "double""'");
-  } 
-  arg2 = static_cast< double >(val2);
-  result = (int)(arg1)->FirmwareMajor(arg2);
+  arg1 = reinterpret_cast< AmptekStatus * >(argp1);
+  result = (int)(arg1)->FirmwareMajor();
   resultobj = SWIG_From_int(static_cast< int >(result));
   return resultobj;
 fail:
@@ -15385,21 +15208,21 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_FirmwareMajor__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_AmptekStatus_FirmwareMinor(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  AmptekHardwareInterface *arg1 = (AmptekHardwareInterface *) 0 ;
+  AmptekStatus *arg1 = (AmptekStatus *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject * obj0 = 0 ;
   int result;
   
-  if (!PyArg_ParseTuple(args,(char *)"O:AmptekHardwareInterface_FirmwareMajor",&obj0)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekHardwareInterface, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"O:AmptekStatus_FirmwareMinor",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekStatus, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekHardwareInterface_FirmwareMajor" "', argument " "1"" of type '" "AmptekHardwareInterface *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekStatus_FirmwareMinor" "', argument " "1"" of type '" "AmptekStatus *""'"); 
   }
-  arg1 = reinterpret_cast< AmptekHardwareInterface * >(argp1);
-  result = (int)(arg1)->FirmwareMajor();
+  arg1 = reinterpret_cast< AmptekStatus * >(argp1);
+  result = (int)(arg1)->FirmwareMinor();
   resultobj = SWIG_From_int(static_cast< int >(result));
   return resultobj;
 fail:
@@ -15407,98 +15230,43 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_FirmwareMajor(PyObject *self, PyObject *args) {
-  Py_ssize_t argc;
-  PyObject *argv[3] = {
-    0
-  };
-  Py_ssize_t ii;
+SWIGINTERN PyObject *_wrap_AmptekStatus_FirmwareBuild(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  AmptekStatus *arg1 = (AmptekStatus *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  int result;
   
-  if (!PyTuple_Check(args)) SWIG_fail;
-  argc = args ? PyObject_Length(args) : 0;
-  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
-    argv[ii] = PyTuple_GET_ITEM(args,ii);
-  }
-  if (argc == 1) {
-    int _v;
-    void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_AmptekHardwareInterface, 0);
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      return _wrap_AmptekHardwareInterface_FirmwareMajor__SWIG_1(self, args);
-    }
-  }
-  if (argc == 2) {
-    int _v;
-    void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_AmptekHardwareInterface, 0);
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      {
-        int res = SWIG_AsVal_double(argv[1], NULL);
-        _v = SWIG_CheckState(res);
-      }
-      if (_v) {
-        return _wrap_AmptekHardwareInterface_FirmwareMajor__SWIG_0(self, args);
-      }
-    }
+  if (!PyArg_ParseTuple(args,(char *)"O:AmptekStatus_FirmwareBuild",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekStatus, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekStatus_FirmwareBuild" "', argument " "1"" of type '" "AmptekStatus *""'"); 
   }
-  
+  arg1 = reinterpret_cast< AmptekStatus * >(argp1);
+  result = (int)(arg1)->FirmwareBuild();
+  resultobj = SWIG_From_int(static_cast< int >(result));
+  return resultobj;
 fail:
-  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'AmptekHardwareInterface_FirmwareMajor'.\n"
-    "  Possible C/C++ prototypes are:\n"
-    "    AmptekHardwareInterface::FirmwareMajor(double)\n"
-    "    AmptekHardwareInterface::FirmwareMajor()\n");
-  return 0;
+  return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_FirmwareMinor__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_AmptekStatus_FpgaMajor(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  AmptekHardwareInterface *arg1 = (AmptekHardwareInterface *) 0 ;
-  double arg2 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  double val2 ;
-  int ecode2 = 0 ;
-  PyObject * obj0 = 0 ;
-  PyObject * obj1 = 0 ;
-  int result;
-  
-  if (!PyArg_ParseTuple(args,(char *)"OO:AmptekHardwareInterface_FirmwareMinor",&obj0,&obj1)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekHardwareInterface, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekHardwareInterface_FirmwareMinor" "', argument " "1"" of type '" "AmptekHardwareInterface *""'"); 
-  }
-  arg1 = reinterpret_cast< AmptekHardwareInterface * >(argp1);
-  ecode2 = SWIG_AsVal_double(obj1, &val2);
-  if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "AmptekHardwareInterface_FirmwareMinor" "', argument " "2"" of type '" "double""'");
-  } 
-  arg2 = static_cast< double >(val2);
-  result = (int)(arg1)->FirmwareMinor(arg2);
-  resultobj = SWIG_From_int(static_cast< int >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_FirmwareMinor__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  AmptekHardwareInterface *arg1 = (AmptekHardwareInterface *) 0 ;
+  AmptekStatus *arg1 = (AmptekStatus *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject * obj0 = 0 ;
   int result;
   
-  if (!PyArg_ParseTuple(args,(char *)"O:AmptekHardwareInterface_FirmwareMinor",&obj0)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekHardwareInterface, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"O:AmptekStatus_FpgaMajor",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekStatus, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekHardwareInterface_FirmwareMinor" "', argument " "1"" of type '" "AmptekHardwareInterface *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekStatus_FpgaMajor" "', argument " "1"" of type '" "AmptekStatus *""'"); 
   }
-  arg1 = reinterpret_cast< AmptekHardwareInterface * >(argp1);
-  result = (int)(arg1)->FirmwareMinor();
+  arg1 = reinterpret_cast< AmptekStatus * >(argp1);
+  result = (int)(arg1)->FpgaMajor();
   resultobj = SWIG_From_int(static_cast< int >(result));
   return resultobj;
 fail:
@@ -15506,76 +15274,21 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_FirmwareMinor(PyObject *self, PyObject *args) {
-  Py_ssize_t argc;
-  PyObject *argv[3] = {
-    0
-  };
-  Py_ssize_t ii;
-  
-  if (!PyTuple_Check(args)) SWIG_fail;
-  argc = args ? PyObject_Length(args) : 0;
-  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
-    argv[ii] = PyTuple_GET_ITEM(args,ii);
-  }
-  if (argc == 1) {
-    int _v;
-    void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_AmptekHardwareInterface, 0);
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      return _wrap_AmptekHardwareInterface_FirmwareMinor__SWIG_1(self, args);
-    }
-  }
-  if (argc == 2) {
-    int _v;
-    void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_AmptekHardwareInterface, 0);
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      {
-        int res = SWIG_AsVal_double(argv[1], NULL);
-        _v = SWIG_CheckState(res);
-      }
-      if (_v) {
-        return _wrap_AmptekHardwareInterface_FirmwareMinor__SWIG_0(self, args);
-      }
-    }
-  }
-  
-fail:
-  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'AmptekHardwareInterface_FirmwareMinor'.\n"
-    "  Possible C/C++ prototypes are:\n"
-    "    AmptekHardwareInterface::FirmwareMinor(double)\n"
-    "    AmptekHardwareInterface::FirmwareMinor()\n");
-  return 0;
-}
-
-
-SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_FirmwareBuild__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_AmptekStatus_FpgaMinor(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  AmptekHardwareInterface *arg1 = (AmptekHardwareInterface *) 0 ;
-  double arg2 ;
+  AmptekStatus *arg1 = (AmptekStatus *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
-  double val2 ;
-  int ecode2 = 0 ;
   PyObject * obj0 = 0 ;
-  PyObject * obj1 = 0 ;
   int result;
   
-  if (!PyArg_ParseTuple(args,(char *)"OO:AmptekHardwareInterface_FirmwareBuild",&obj0,&obj1)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekHardwareInterface, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"O:AmptekStatus_FpgaMinor",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekStatus, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekHardwareInterface_FirmwareBuild" "', argument " "1"" of type '" "AmptekHardwareInterface *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekStatus_FpgaMinor" "', argument " "1"" of type '" "AmptekStatus *""'"); 
   }
-  arg1 = reinterpret_cast< AmptekHardwareInterface * >(argp1);
-  ecode2 = SWIG_AsVal_double(obj1, &val2);
-  if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "AmptekHardwareInterface_FirmwareBuild" "', argument " "2"" of type '" "double""'");
-  } 
-  arg2 = static_cast< double >(val2);
-  result = (int)(arg1)->FirmwareBuild(arg2);
+  arg1 = reinterpret_cast< AmptekStatus * >(argp1);
+  result = (int)(arg1)->FpgaMinor();
   resultobj = SWIG_From_int(static_cast< int >(result));
   return resultobj;
 fail:
@@ -15583,21 +15296,21 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_FirmwareBuild__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_AmptekStatus_SerialNb(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  AmptekHardwareInterface *arg1 = (AmptekHardwareInterface *) 0 ;
+  AmptekStatus *arg1 = (AmptekStatus *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject * obj0 = 0 ;
   int result;
   
-  if (!PyArg_ParseTuple(args,(char *)"O:AmptekHardwareInterface_FirmwareBuild",&obj0)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekHardwareInterface, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"O:AmptekStatus_SerialNb",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekStatus, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekHardwareInterface_FirmwareBuild" "', argument " "1"" of type '" "AmptekHardwareInterface *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekStatus_SerialNb" "', argument " "1"" of type '" "AmptekStatus *""'"); 
   }
-  arg1 = reinterpret_cast< AmptekHardwareInterface * >(argp1);
-  result = (int)(arg1)->FirmwareBuild();
+  arg1 = reinterpret_cast< AmptekStatus * >(argp1);
+  result = (int)(arg1)->SerialNb();
   resultobj = SWIG_From_int(static_cast< int >(result));
   return resultobj;
 fail:
@@ -15605,175 +15318,65 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_FirmwareBuild(PyObject *self, PyObject *args) {
-  Py_ssize_t argc;
-  PyObject *argv[3] = {
-    0
-  };
-  Py_ssize_t ii;
-  
-  if (!PyTuple_Check(args)) SWIG_fail;
-  argc = args ? PyObject_Length(args) : 0;
-  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
-    argv[ii] = PyTuple_GET_ITEM(args,ii);
-  }
-  if (argc == 1) {
-    int _v;
-    void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_AmptekHardwareInterface, 0);
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      return _wrap_AmptekHardwareInterface_FirmwareBuild__SWIG_1(self, args);
-    }
-  }
-  if (argc == 2) {
-    int _v;
-    void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_AmptekHardwareInterface, 0);
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      {
-        int res = SWIG_AsVal_double(argv[1], NULL);
-        _v = SWIG_CheckState(res);
-      }
-      if (_v) {
-        return _wrap_AmptekHardwareInterface_FirmwareBuild__SWIG_0(self, args);
-      }
-    }
-  }
-  
-fail:
-  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'AmptekHardwareInterface_FirmwareBuild'.\n"
-    "  Possible C/C++ prototypes are:\n"
-    "    AmptekHardwareInterface::FirmwareBuild(double)\n"
-    "    AmptekHardwareInterface::FirmwareBuild()\n");
-  return 0;
-}
-
-
-SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_FpgaMajor__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_AmptekStatus_HighVoltage(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  AmptekHardwareInterface *arg1 = (AmptekHardwareInterface *) 0 ;
-  double arg2 ;
+  AmptekStatus *arg1 = (AmptekStatus *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
-  double val2 ;
-  int ecode2 = 0 ;
   PyObject * obj0 = 0 ;
-  PyObject * obj1 = 0 ;
-  int result;
+  double result;
   
-  if (!PyArg_ParseTuple(args,(char *)"OO:AmptekHardwareInterface_FpgaMajor",&obj0,&obj1)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekHardwareInterface, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"O:AmptekStatus_HighVoltage",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekStatus, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekHardwareInterface_FpgaMajor" "', argument " "1"" of type '" "AmptekHardwareInterface *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekStatus_HighVoltage" "', argument " "1"" of type '" "AmptekStatus *""'"); 
   }
-  arg1 = reinterpret_cast< AmptekHardwareInterface * >(argp1);
-  ecode2 = SWIG_AsVal_double(obj1, &val2);
-  if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "AmptekHardwareInterface_FpgaMajor" "', argument " "2"" of type '" "double""'");
-  } 
-  arg2 = static_cast< double >(val2);
-  result = (int)(arg1)->FpgaMajor(arg2);
-  resultobj = SWIG_From_int(static_cast< int >(result));
+  arg1 = reinterpret_cast< AmptekStatus * >(argp1);
+  result = (double)(arg1)->HighVoltage();
+  resultobj = SWIG_From_double(static_cast< double >(result));
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_FpgaMajor__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_AmptekStatus_DetectorTemp(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  AmptekHardwareInterface *arg1 = (AmptekHardwareInterface *) 0 ;
+  AmptekStatus *arg1 = (AmptekStatus *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject * obj0 = 0 ;
-  int result;
+  double result;
   
-  if (!PyArg_ParseTuple(args,(char *)"O:AmptekHardwareInterface_FpgaMajor",&obj0)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekHardwareInterface, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"O:AmptekStatus_DetectorTemp",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekStatus, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekHardwareInterface_FpgaMajor" "', argument " "1"" of type '" "AmptekHardwareInterface *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekStatus_DetectorTemp" "', argument " "1"" of type '" "AmptekStatus *""'"); 
   }
-  arg1 = reinterpret_cast< AmptekHardwareInterface * >(argp1);
-  result = (int)(arg1)->FpgaMajor();
-  resultobj = SWIG_From_int(static_cast< int >(result));
+  arg1 = reinterpret_cast< AmptekStatus * >(argp1);
+  result = (double)(arg1)->DetectorTemp();
+  resultobj = SWIG_From_double(static_cast< double >(result));
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_FpgaMajor(PyObject *self, PyObject *args) {
-  Py_ssize_t argc;
-  PyObject *argv[3] = {
-    0
-  };
-  Py_ssize_t ii;
-  
-  if (!PyTuple_Check(args)) SWIG_fail;
-  argc = args ? PyObject_Length(args) : 0;
-  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
-    argv[ii] = PyTuple_GET_ITEM(args,ii);
-  }
-  if (argc == 1) {
-    int _v;
-    void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_AmptekHardwareInterface, 0);
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      return _wrap_AmptekHardwareInterface_FpgaMajor__SWIG_1(self, args);
-    }
-  }
-  if (argc == 2) {
-    int _v;
-    void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_AmptekHardwareInterface, 0);
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      {
-        int res = SWIG_AsVal_double(argv[1], NULL);
-        _v = SWIG_CheckState(res);
-      }
-      if (_v) {
-        return _wrap_AmptekHardwareInterface_FpgaMajor__SWIG_0(self, args);
-      }
-    }
-  }
-  
-fail:
-  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'AmptekHardwareInterface_FpgaMajor'.\n"
-    "  Possible C/C++ prototypes are:\n"
-    "    AmptekHardwareInterface::FpgaMajor(double)\n"
-    "    AmptekHardwareInterface::FpgaMajor()\n");
-  return 0;
-}
-
-
-SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_FpgaMinor__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_AmptekStatus_BoardTemp(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  AmptekHardwareInterface *arg1 = (AmptekHardwareInterface *) 0 ;
-  double arg2 ;
+  AmptekStatus *arg1 = (AmptekStatus *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
-  double val2 ;
-  int ecode2 = 0 ;
   PyObject * obj0 = 0 ;
-  PyObject * obj1 = 0 ;
   int result;
   
-  if (!PyArg_ParseTuple(args,(char *)"OO:AmptekHardwareInterface_FpgaMinor",&obj0,&obj1)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekHardwareInterface, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"O:AmptekStatus_BoardTemp",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekStatus, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekHardwareInterface_FpgaMinor" "', argument " "1"" of type '" "AmptekHardwareInterface *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekStatus_BoardTemp" "', argument " "1"" of type '" "AmptekStatus *""'"); 
   }
-  arg1 = reinterpret_cast< AmptekHardwareInterface * >(argp1);
-  ecode2 = SWIG_AsVal_double(obj1, &val2);
-  if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "AmptekHardwareInterface_FpgaMinor" "', argument " "2"" of type '" "double""'");
-  } 
-  arg2 = static_cast< double >(val2);
-  result = (int)(arg1)->FpgaMinor(arg2);
+  arg1 = reinterpret_cast< AmptekStatus * >(argp1);
+  result = (int)(arg1)->BoardTemp();
   resultobj = SWIG_From_int(static_cast< int >(result));
   return resultobj;
 fail:
@@ -15781,692 +15384,43 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_FpgaMinor__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_AmptekStatus_IsPresetTimeReached(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  AmptekHardwareInterface *arg1 = (AmptekHardwareInterface *) 0 ;
+  AmptekStatus *arg1 = (AmptekStatus *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject * obj0 = 0 ;
-  int result;
-  
-  if (!PyArg_ParseTuple(args,(char *)"O:AmptekHardwareInterface_FpgaMinor",&obj0)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekHardwareInterface, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekHardwareInterface_FpgaMinor" "', argument " "1"" of type '" "AmptekHardwareInterface *""'"); 
-  }
-  arg1 = reinterpret_cast< AmptekHardwareInterface * >(argp1);
-  result = (int)(arg1)->FpgaMinor();
-  resultobj = SWIG_From_int(static_cast< int >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_FpgaMinor(PyObject *self, PyObject *args) {
-  Py_ssize_t argc;
-  PyObject *argv[3] = {
-    0
-  };
-  Py_ssize_t ii;
-  
-  if (!PyTuple_Check(args)) SWIG_fail;
-  argc = args ? PyObject_Length(args) : 0;
-  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
-    argv[ii] = PyTuple_GET_ITEM(args,ii);
-  }
-  if (argc == 1) {
-    int _v;
-    void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_AmptekHardwareInterface, 0);
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      return _wrap_AmptekHardwareInterface_FpgaMinor__SWIG_1(self, args);
-    }
-  }
-  if (argc == 2) {
-    int _v;
-    void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_AmptekHardwareInterface, 0);
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      {
-        int res = SWIG_AsVal_double(argv[1], NULL);
-        _v = SWIG_CheckState(res);
-      }
-      if (_v) {
-        return _wrap_AmptekHardwareInterface_FpgaMinor__SWIG_0(self, args);
-      }
-    }
-  }
-  
-fail:
-  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'AmptekHardwareInterface_FpgaMinor'.\n"
-    "  Possible C/C++ prototypes are:\n"
-    "    AmptekHardwareInterface::FpgaMinor(double)\n"
-    "    AmptekHardwareInterface::FpgaMinor()\n");
-  return 0;
-}
-
-
-SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_SerialNb__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  AmptekHardwareInterface *arg1 = (AmptekHardwareInterface *) 0 ;
-  double arg2 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  double val2 ;
-  int ecode2 = 0 ;
-  PyObject * obj0 = 0 ;
-  PyObject * obj1 = 0 ;
-  int result;
-  
-  if (!PyArg_ParseTuple(args,(char *)"OO:AmptekHardwareInterface_SerialNb",&obj0,&obj1)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekHardwareInterface, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekHardwareInterface_SerialNb" "', argument " "1"" of type '" "AmptekHardwareInterface *""'"); 
-  }
-  arg1 = reinterpret_cast< AmptekHardwareInterface * >(argp1);
-  ecode2 = SWIG_AsVal_double(obj1, &val2);
-  if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "AmptekHardwareInterface_SerialNb" "', argument " "2"" of type '" "double""'");
-  } 
-  arg2 = static_cast< double >(val2);
-  result = (int)(arg1)->SerialNb(arg2);
-  resultobj = SWIG_From_int(static_cast< int >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_SerialNb__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  AmptekHardwareInterface *arg1 = (AmptekHardwareInterface *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject * obj0 = 0 ;
-  int result;
-  
-  if (!PyArg_ParseTuple(args,(char *)"O:AmptekHardwareInterface_SerialNb",&obj0)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekHardwareInterface, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekHardwareInterface_SerialNb" "', argument " "1"" of type '" "AmptekHardwareInterface *""'"); 
-  }
-  arg1 = reinterpret_cast< AmptekHardwareInterface * >(argp1);
-  result = (int)(arg1)->SerialNb();
-  resultobj = SWIG_From_int(static_cast< int >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_SerialNb(PyObject *self, PyObject *args) {
-  Py_ssize_t argc;
-  PyObject *argv[3] = {
-    0
-  };
-  Py_ssize_t ii;
-  
-  if (!PyTuple_Check(args)) SWIG_fail;
-  argc = args ? PyObject_Length(args) : 0;
-  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
-    argv[ii] = PyTuple_GET_ITEM(args,ii);
-  }
-  if (argc == 1) {
-    int _v;
-    void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_AmptekHardwareInterface, 0);
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      return _wrap_AmptekHardwareInterface_SerialNb__SWIG_1(self, args);
-    }
-  }
-  if (argc == 2) {
-    int _v;
-    void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_AmptekHardwareInterface, 0);
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      {
-        int res = SWIG_AsVal_double(argv[1], NULL);
-        _v = SWIG_CheckState(res);
-      }
-      if (_v) {
-        return _wrap_AmptekHardwareInterface_SerialNb__SWIG_0(self, args);
-      }
-    }
-  }
-  
-fail:
-  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'AmptekHardwareInterface_SerialNb'.\n"
-    "  Possible C/C++ prototypes are:\n"
-    "    AmptekHardwareInterface::SerialNb(double)\n"
-    "    AmptekHardwareInterface::SerialNb()\n");
-  return 0;
-}
-
-
-SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_HighVoltage__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  AmptekHardwareInterface *arg1 = (AmptekHardwareInterface *) 0 ;
-  double arg2 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  double val2 ;
-  int ecode2 = 0 ;
-  PyObject * obj0 = 0 ;
-  PyObject * obj1 = 0 ;
-  double result;
-  
-  if (!PyArg_ParseTuple(args,(char *)"OO:AmptekHardwareInterface_HighVoltage",&obj0,&obj1)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekHardwareInterface, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekHardwareInterface_HighVoltage" "', argument " "1"" of type '" "AmptekHardwareInterface *""'"); 
-  }
-  arg1 = reinterpret_cast< AmptekHardwareInterface * >(argp1);
-  ecode2 = SWIG_AsVal_double(obj1, &val2);
-  if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "AmptekHardwareInterface_HighVoltage" "', argument " "2"" of type '" "double""'");
-  } 
-  arg2 = static_cast< double >(val2);
-  result = (double)(arg1)->HighVoltage(arg2);
-  resultobj = SWIG_From_double(static_cast< double >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_HighVoltage__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  AmptekHardwareInterface *arg1 = (AmptekHardwareInterface *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject * obj0 = 0 ;
-  double result;
-  
-  if (!PyArg_ParseTuple(args,(char *)"O:AmptekHardwareInterface_HighVoltage",&obj0)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekHardwareInterface, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekHardwareInterface_HighVoltage" "', argument " "1"" of type '" "AmptekHardwareInterface *""'"); 
-  }
-  arg1 = reinterpret_cast< AmptekHardwareInterface * >(argp1);
-  result = (double)(arg1)->HighVoltage();
-  resultobj = SWIG_From_double(static_cast< double >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_HighVoltage(PyObject *self, PyObject *args) {
-  Py_ssize_t argc;
-  PyObject *argv[3] = {
-    0
-  };
-  Py_ssize_t ii;
-  
-  if (!PyTuple_Check(args)) SWIG_fail;
-  argc = args ? PyObject_Length(args) : 0;
-  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
-    argv[ii] = PyTuple_GET_ITEM(args,ii);
-  }
-  if (argc == 1) {
-    int _v;
-    void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_AmptekHardwareInterface, 0);
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      return _wrap_AmptekHardwareInterface_HighVoltage__SWIG_1(self, args);
-    }
-  }
-  if (argc == 2) {
-    int _v;
-    void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_AmptekHardwareInterface, 0);
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      {
-        int res = SWIG_AsVal_double(argv[1], NULL);
-        _v = SWIG_CheckState(res);
-      }
-      if (_v) {
-        return _wrap_AmptekHardwareInterface_HighVoltage__SWIG_0(self, args);
-      }
-    }
-  }
-  
-fail:
-  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'AmptekHardwareInterface_HighVoltage'.\n"
-    "  Possible C/C++ prototypes are:\n"
-    "    AmptekHardwareInterface::HighVoltage(double)\n"
-    "    AmptekHardwareInterface::HighVoltage()\n");
-  return 0;
-}
-
-
-SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_DetectorTemp__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  AmptekHardwareInterface *arg1 = (AmptekHardwareInterface *) 0 ;
-  double arg2 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  double val2 ;
-  int ecode2 = 0 ;
-  PyObject * obj0 = 0 ;
-  PyObject * obj1 = 0 ;
-  double result;
-  
-  if (!PyArg_ParseTuple(args,(char *)"OO:AmptekHardwareInterface_DetectorTemp",&obj0,&obj1)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekHardwareInterface, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekHardwareInterface_DetectorTemp" "', argument " "1"" of type '" "AmptekHardwareInterface *""'"); 
-  }
-  arg1 = reinterpret_cast< AmptekHardwareInterface * >(argp1);
-  ecode2 = SWIG_AsVal_double(obj1, &val2);
-  if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "AmptekHardwareInterface_DetectorTemp" "', argument " "2"" of type '" "double""'");
-  } 
-  arg2 = static_cast< double >(val2);
-  result = (double)(arg1)->DetectorTemp(arg2);
-  resultobj = SWIG_From_double(static_cast< double >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_DetectorTemp__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  AmptekHardwareInterface *arg1 = (AmptekHardwareInterface *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject * obj0 = 0 ;
-  double result;
-  
-  if (!PyArg_ParseTuple(args,(char *)"O:AmptekHardwareInterface_DetectorTemp",&obj0)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekHardwareInterface, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekHardwareInterface_DetectorTemp" "', argument " "1"" of type '" "AmptekHardwareInterface *""'"); 
-  }
-  arg1 = reinterpret_cast< AmptekHardwareInterface * >(argp1);
-  result = (double)(arg1)->DetectorTemp();
-  resultobj = SWIG_From_double(static_cast< double >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_DetectorTemp(PyObject *self, PyObject *args) {
-  Py_ssize_t argc;
-  PyObject *argv[3] = {
-    0
-  };
-  Py_ssize_t ii;
-  
-  if (!PyTuple_Check(args)) SWIG_fail;
-  argc = args ? PyObject_Length(args) : 0;
-  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
-    argv[ii] = PyTuple_GET_ITEM(args,ii);
-  }
-  if (argc == 1) {
-    int _v;
-    void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_AmptekHardwareInterface, 0);
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      return _wrap_AmptekHardwareInterface_DetectorTemp__SWIG_1(self, args);
-    }
-  }
-  if (argc == 2) {
-    int _v;
-    void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_AmptekHardwareInterface, 0);
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      {
-        int res = SWIG_AsVal_double(argv[1], NULL);
-        _v = SWIG_CheckState(res);
-      }
-      if (_v) {
-        return _wrap_AmptekHardwareInterface_DetectorTemp__SWIG_0(self, args);
-      }
-    }
-  }
-  
-fail:
-  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'AmptekHardwareInterface_DetectorTemp'.\n"
-    "  Possible C/C++ prototypes are:\n"
-    "    AmptekHardwareInterface::DetectorTemp(double)\n"
-    "    AmptekHardwareInterface::DetectorTemp()\n");
-  return 0;
-}
-
-
-SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_BoardTemp__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  AmptekHardwareInterface *arg1 = (AmptekHardwareInterface *) 0 ;
-  double arg2 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  double val2 ;
-  int ecode2 = 0 ;
-  PyObject * obj0 = 0 ;
-  PyObject * obj1 = 0 ;
-  int result;
-  
-  if (!PyArg_ParseTuple(args,(char *)"OO:AmptekHardwareInterface_BoardTemp",&obj0,&obj1)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekHardwareInterface, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekHardwareInterface_BoardTemp" "', argument " "1"" of type '" "AmptekHardwareInterface *""'"); 
-  }
-  arg1 = reinterpret_cast< AmptekHardwareInterface * >(argp1);
-  ecode2 = SWIG_AsVal_double(obj1, &val2);
-  if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "AmptekHardwareInterface_BoardTemp" "', argument " "2"" of type '" "double""'");
-  } 
-  arg2 = static_cast< double >(val2);
-  result = (int)(arg1)->BoardTemp(arg2);
-  resultobj = SWIG_From_int(static_cast< int >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_BoardTemp__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  AmptekHardwareInterface *arg1 = (AmptekHardwareInterface *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject * obj0 = 0 ;
-  int result;
-  
-  if (!PyArg_ParseTuple(args,(char *)"O:AmptekHardwareInterface_BoardTemp",&obj0)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekHardwareInterface, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekHardwareInterface_BoardTemp" "', argument " "1"" of type '" "AmptekHardwareInterface *""'"); 
-  }
-  arg1 = reinterpret_cast< AmptekHardwareInterface * >(argp1);
-  result = (int)(arg1)->BoardTemp();
-  resultobj = SWIG_From_int(static_cast< int >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_BoardTemp(PyObject *self, PyObject *args) {
-  Py_ssize_t argc;
-  PyObject *argv[3] = {
-    0
-  };
-  Py_ssize_t ii;
-  
-  if (!PyTuple_Check(args)) SWIG_fail;
-  argc = args ? PyObject_Length(args) : 0;
-  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
-    argv[ii] = PyTuple_GET_ITEM(args,ii);
-  }
-  if (argc == 1) {
-    int _v;
-    void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_AmptekHardwareInterface, 0);
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      return _wrap_AmptekHardwareInterface_BoardTemp__SWIG_1(self, args);
-    }
-  }
-  if (argc == 2) {
-    int _v;
-    void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_AmptekHardwareInterface, 0);
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      {
-        int res = SWIG_AsVal_double(argv[1], NULL);
-        _v = SWIG_CheckState(res);
-      }
-      if (_v) {
-        return _wrap_AmptekHardwareInterface_BoardTemp__SWIG_0(self, args);
-      }
-    }
-  }
-  
-fail:
-  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'AmptekHardwareInterface_BoardTemp'.\n"
-    "  Possible C/C++ prototypes are:\n"
-    "    AmptekHardwareInterface::BoardTemp(double)\n"
-    "    AmptekHardwareInterface::BoardTemp()\n");
-  return 0;
-}
-
-
-SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_IsPresetTimeReached__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  AmptekHardwareInterface *arg1 = (AmptekHardwareInterface *) 0 ;
-  double arg2 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  double val2 ;
-  int ecode2 = 0 ;
-  PyObject * obj0 = 0 ;
-  PyObject * obj1 = 0 ;
-  bool result;
-  
-  if (!PyArg_ParseTuple(args,(char *)"OO:AmptekHardwareInterface_IsPresetTimeReached",&obj0,&obj1)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekHardwareInterface, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekHardwareInterface_IsPresetTimeReached" "', argument " "1"" of type '" "AmptekHardwareInterface *""'"); 
-  }
-  arg1 = reinterpret_cast< AmptekHardwareInterface * >(argp1);
-  ecode2 = SWIG_AsVal_double(obj1, &val2);
-  if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "AmptekHardwareInterface_IsPresetTimeReached" "', argument " "2"" of type '" "double""'");
-  } 
-  arg2 = static_cast< double >(val2);
-  result = (bool)(arg1)->IsPresetTimeReached(arg2);
-  resultobj = SWIG_From_bool(static_cast< bool >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_IsPresetTimeReached__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  AmptekHardwareInterface *arg1 = (AmptekHardwareInterface *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject * obj0 = 0 ;
-  bool result;
-  
-  if (!PyArg_ParseTuple(args,(char *)"O:AmptekHardwareInterface_IsPresetTimeReached",&obj0)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekHardwareInterface, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekHardwareInterface_IsPresetTimeReached" "', argument " "1"" of type '" "AmptekHardwareInterface *""'"); 
-  }
-  arg1 = reinterpret_cast< AmptekHardwareInterface * >(argp1);
-  result = (bool)(arg1)->IsPresetTimeReached();
-  resultobj = SWIG_From_bool(static_cast< bool >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_IsPresetTimeReached(PyObject *self, PyObject *args) {
-  Py_ssize_t argc;
-  PyObject *argv[3] = {
-    0
-  };
-  Py_ssize_t ii;
-  
-  if (!PyTuple_Check(args)) SWIG_fail;
-  argc = args ? PyObject_Length(args) : 0;
-  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
-    argv[ii] = PyTuple_GET_ITEM(args,ii);
-  }
-  if (argc == 1) {
-    int _v;
-    void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_AmptekHardwareInterface, 0);
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      return _wrap_AmptekHardwareInterface_IsPresetTimeReached__SWIG_1(self, args);
-    }
-  }
-  if (argc == 2) {
-    int _v;
-    void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_AmptekHardwareInterface, 0);
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      {
-        int res = SWIG_AsVal_double(argv[1], NULL);
-        _v = SWIG_CheckState(res);
-      }
-      if (_v) {
-        return _wrap_AmptekHardwareInterface_IsPresetTimeReached__SWIG_0(self, args);
-      }
-    }
-  }
-  
-fail:
-  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'AmptekHardwareInterface_IsPresetTimeReached'.\n"
-    "  Possible C/C++ prototypes are:\n"
-    "    AmptekHardwareInterface::IsPresetTimeReached(double)\n"
-    "    AmptekHardwareInterface::IsPresetTimeReached()\n");
-  return 0;
-}
-
-
-SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_IsEnabled__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  AmptekHardwareInterface *arg1 = (AmptekHardwareInterface *) 0 ;
-  double arg2 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  double val2 ;
-  int ecode2 = 0 ;
-  PyObject * obj0 = 0 ;
-  PyObject * obj1 = 0 ;
-  bool result;
-  
-  if (!PyArg_ParseTuple(args,(char *)"OO:AmptekHardwareInterface_IsEnabled",&obj0,&obj1)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekHardwareInterface, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekHardwareInterface_IsEnabled" "', argument " "1"" of type '" "AmptekHardwareInterface *""'"); 
-  }
-  arg1 = reinterpret_cast< AmptekHardwareInterface * >(argp1);
-  ecode2 = SWIG_AsVal_double(obj1, &val2);
-  if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "AmptekHardwareInterface_IsEnabled" "', argument " "2"" of type '" "double""'");
-  } 
-  arg2 = static_cast< double >(val2);
-  result = (bool)(arg1)->IsEnabled(arg2);
-  resultobj = SWIG_From_bool(static_cast< bool >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_IsEnabled__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
-  PyObject *resultobj = 0;
-  AmptekHardwareInterface *arg1 = (AmptekHardwareInterface *) 0 ;
-  void *argp1 = 0 ;
-  int res1 = 0 ;
-  PyObject * obj0 = 0 ;
-  bool result;
-  
-  if (!PyArg_ParseTuple(args,(char *)"O:AmptekHardwareInterface_IsEnabled",&obj0)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekHardwareInterface, 0 |  0 );
-  if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekHardwareInterface_IsEnabled" "', argument " "1"" of type '" "AmptekHardwareInterface *""'"); 
-  }
-  arg1 = reinterpret_cast< AmptekHardwareInterface * >(argp1);
-  result = (bool)(arg1)->IsEnabled();
-  resultobj = SWIG_From_bool(static_cast< bool >(result));
-  return resultobj;
-fail:
-  return NULL;
-}
-
-
-SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_IsEnabled(PyObject *self, PyObject *args) {
-  Py_ssize_t argc;
-  PyObject *argv[3] = {
-    0
-  };
-  Py_ssize_t ii;
-  
-  if (!PyTuple_Check(args)) SWIG_fail;
-  argc = args ? PyObject_Length(args) : 0;
-  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
-    argv[ii] = PyTuple_GET_ITEM(args,ii);
-  }
-  if (argc == 1) {
-    int _v;
-    void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_AmptekHardwareInterface, 0);
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      return _wrap_AmptekHardwareInterface_IsEnabled__SWIG_1(self, args);
-    }
-  }
-  if (argc == 2) {
-    int _v;
-    void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_AmptekHardwareInterface, 0);
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      {
-        int res = SWIG_AsVal_double(argv[1], NULL);
-        _v = SWIG_CheckState(res);
-      }
-      if (_v) {
-        return _wrap_AmptekHardwareInterface_IsEnabled__SWIG_0(self, args);
-      }
-    }
-  }
+  bool result;
   
+  if (!PyArg_ParseTuple(args,(char *)"O:AmptekStatus_IsPresetTimeReached",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekStatus, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekStatus_IsPresetTimeReached" "', argument " "1"" of type '" "AmptekStatus *""'"); 
+  }
+  arg1 = reinterpret_cast< AmptekStatus * >(argp1);
+  result = (bool)(arg1)->IsPresetTimeReached();
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
 fail:
-  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'AmptekHardwareInterface_IsEnabled'.\n"
-    "  Possible C/C++ prototypes are:\n"
-    "    AmptekHardwareInterface::IsEnabled(double)\n"
-    "    AmptekHardwareInterface::IsEnabled()\n");
-  return 0;
+  return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_IsPresetCountReached__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_AmptekStatus_IsEnabled(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  AmptekHardwareInterface *arg1 = (AmptekHardwareInterface *) 0 ;
-  double arg2 ;
+  AmptekStatus *arg1 = (AmptekStatus *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
-  double val2 ;
-  int ecode2 = 0 ;
   PyObject * obj0 = 0 ;
-  PyObject * obj1 = 0 ;
   bool result;
   
-  if (!PyArg_ParseTuple(args,(char *)"OO:AmptekHardwareInterface_IsPresetCountReached",&obj0,&obj1)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekHardwareInterface, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"O:AmptekStatus_IsEnabled",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekStatus, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekHardwareInterface_IsPresetCountReached" "', argument " "1"" of type '" "AmptekHardwareInterface *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekStatus_IsEnabled" "', argument " "1"" of type '" "AmptekStatus *""'"); 
   }
-  arg1 = reinterpret_cast< AmptekHardwareInterface * >(argp1);
-  ecode2 = SWIG_AsVal_double(obj1, &val2);
-  if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "AmptekHardwareInterface_IsPresetCountReached" "', argument " "2"" of type '" "double""'");
-  } 
-  arg2 = static_cast< double >(val2);
-  result = (bool)(arg1)->IsPresetCountReached(arg2);
+  arg1 = reinterpret_cast< AmptekStatus * >(argp1);
+  result = (bool)(arg1)->IsEnabled();
   resultobj = SWIG_From_bool(static_cast< bool >(result));
   return resultobj;
 fail:
@@ -16474,20 +15428,20 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_IsPresetCountReached__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_AmptekStatus_IsPresetCountReached(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  AmptekHardwareInterface *arg1 = (AmptekHardwareInterface *) 0 ;
+  AmptekStatus *arg1 = (AmptekStatus *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject * obj0 = 0 ;
   bool result;
   
-  if (!PyArg_ParseTuple(args,(char *)"O:AmptekHardwareInterface_IsPresetCountReached",&obj0)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekHardwareInterface, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"O:AmptekStatus_IsPresetCountReached",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekStatus, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekHardwareInterface_IsPresetCountReached" "', argument " "1"" of type '" "AmptekHardwareInterface *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekStatus_IsPresetCountReached" "', argument " "1"" of type '" "AmptekStatus *""'"); 
   }
-  arg1 = reinterpret_cast< AmptekHardwareInterface * >(argp1);
+  arg1 = reinterpret_cast< AmptekStatus * >(argp1);
   result = (bool)(arg1)->IsPresetCountReached();
   resultobj = SWIG_From_bool(static_cast< bool >(result));
   return resultobj;
@@ -16496,197 +15450,131 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_IsPresetCountReached(PyObject *self, PyObject *args) {
-  Py_ssize_t argc;
-  PyObject *argv[3] = {
-    0
-  };
-  Py_ssize_t ii;
+SWIGINTERN PyObject *_wrap_AmptekStatus_IsGated(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  AmptekStatus *arg1 = (AmptekStatus *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  bool result;
   
-  if (!PyTuple_Check(args)) SWIG_fail;
-  argc = args ? PyObject_Length(args) : 0;
-  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
-    argv[ii] = PyTuple_GET_ITEM(args,ii);
-  }
-  if (argc == 1) {
-    int _v;
-    void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_AmptekHardwareInterface, 0);
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      return _wrap_AmptekHardwareInterface_IsPresetCountReached__SWIG_1(self, args);
-    }
-  }
-  if (argc == 2) {
-    int _v;
-    void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_AmptekHardwareInterface, 0);
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      {
-        int res = SWIG_AsVal_double(argv[1], NULL);
-        _v = SWIG_CheckState(res);
-      }
-      if (_v) {
-        return _wrap_AmptekHardwareInterface_IsPresetCountReached__SWIG_0(self, args);
-      }
-    }
+  if (!PyArg_ParseTuple(args,(char *)"O:AmptekStatus_IsGated",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekStatus, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekStatus_IsGated" "', argument " "1"" of type '" "AmptekStatus *""'"); 
   }
-  
+  arg1 = reinterpret_cast< AmptekStatus * >(argp1);
+  result = (bool)(arg1)->IsGated();
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
 fail:
-  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'AmptekHardwareInterface_IsPresetCountReached'.\n"
-    "  Possible C/C++ prototypes are:\n"
-    "    AmptekHardwareInterface::IsPresetCountReached(double)\n"
-    "    AmptekHardwareInterface::IsPresetCountReached()\n");
-  return 0;
+  return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_IsGated__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_AmptekStatus_FpgaClock(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  AmptekHardwareInterface *arg1 = (AmptekHardwareInterface *) 0 ;
-  double arg2 ;
+  AmptekStatus *arg1 = (AmptekStatus *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
-  double val2 ;
-  int ecode2 = 0 ;
   PyObject * obj0 = 0 ;
-  PyObject * obj1 = 0 ;
-  bool result;
+  int result;
   
-  if (!PyArg_ParseTuple(args,(char *)"OO:AmptekHardwareInterface_IsGated",&obj0,&obj1)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekHardwareInterface, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"O:AmptekStatus_FpgaClock",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekStatus, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekHardwareInterface_IsGated" "', argument " "1"" of type '" "AmptekHardwareInterface *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekStatus_FpgaClock" "', argument " "1"" of type '" "AmptekStatus *""'"); 
   }
-  arg1 = reinterpret_cast< AmptekHardwareInterface * >(argp1);
-  ecode2 = SWIG_AsVal_double(obj1, &val2);
-  if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "AmptekHardwareInterface_IsGated" "', argument " "2"" of type '" "double""'");
-  } 
-  arg2 = static_cast< double >(val2);
-  result = (bool)(arg1)->IsGated(arg2);
-  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  arg1 = reinterpret_cast< AmptekStatus * >(argp1);
+  result = (int)(arg1)->FpgaClock();
+  resultobj = SWIG_From_int(static_cast< int >(result));
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_IsGated__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_AmptekStatus_DeviceType(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  AmptekHardwareInterface *arg1 = (AmptekHardwareInterface *) 0 ;
+  AmptekStatus *arg1 = (AmptekStatus *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject * obj0 = 0 ;
-  bool result;
+  int result;
   
-  if (!PyArg_ParseTuple(args,(char *)"O:AmptekHardwareInterface_IsGated",&obj0)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekHardwareInterface, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"O:AmptekStatus_DeviceType",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekStatus, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekHardwareInterface_IsGated" "', argument " "1"" of type '" "AmptekHardwareInterface *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekStatus_DeviceType" "', argument " "1"" of type '" "AmptekStatus *""'"); 
   }
-  arg1 = reinterpret_cast< AmptekHardwareInterface * >(argp1);
-  result = (bool)(arg1)->IsGated();
-  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  arg1 = reinterpret_cast< AmptekStatus * >(argp1);
+  result = (int)(arg1)->DeviceType();
+  resultobj = SWIG_From_int(static_cast< int >(result));
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_IsGated(PyObject *self, PyObject *args) {
-  Py_ssize_t argc;
-  PyObject *argv[3] = {
-    0
-  };
-  Py_ssize_t ii;
+SWIGINTERN PyObject *_wrap_AmptekStatus_TecVoltage(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  AmptekStatus *arg1 = (AmptekStatus *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
   
-  if (!PyTuple_Check(args)) SWIG_fail;
-  argc = args ? PyObject_Length(args) : 0;
-  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
-    argv[ii] = PyTuple_GET_ITEM(args,ii);
-  }
-  if (argc == 1) {
-    int _v;
-    void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_AmptekHardwareInterface, 0);
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      return _wrap_AmptekHardwareInterface_IsGated__SWIG_1(self, args);
-    }
-  }
-  if (argc == 2) {
-    int _v;
-    void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_AmptekHardwareInterface, 0);
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      {
-        int res = SWIG_AsVal_double(argv[1], NULL);
-        _v = SWIG_CheckState(res);
-      }
-      if (_v) {
-        return _wrap_AmptekHardwareInterface_IsGated__SWIG_0(self, args);
-      }
-    }
+  if (!PyArg_ParseTuple(args,(char *)"O:AmptekStatus_TecVoltage",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekStatus, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekStatus_TecVoltage" "', argument " "1"" of type '" "AmptekStatus *""'"); 
   }
-  
+  arg1 = reinterpret_cast< AmptekStatus * >(argp1);
+  result = (double)(arg1)->TecVoltage();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
 fail:
-  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'AmptekHardwareInterface_IsGated'.\n"
-    "  Possible C/C++ prototypes are:\n"
-    "    AmptekHardwareInterface::IsGated(double)\n"
-    "    AmptekHardwareInterface::IsGated()\n");
-  return 0;
+  return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_FpgaClock__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_AmptekStatus_ListModeLMMO(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  AmptekHardwareInterface *arg1 = (AmptekHardwareInterface *) 0 ;
-  double arg2 ;
+  AmptekStatus *arg1 = (AmptekStatus *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
-  double val2 ;
-  int ecode2 = 0 ;
   PyObject * obj0 = 0 ;
-  PyObject * obj1 = 0 ;
-  int result;
+  bool result;
   
-  if (!PyArg_ParseTuple(args,(char *)"OO:AmptekHardwareInterface_FpgaClock",&obj0,&obj1)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekHardwareInterface, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"O:AmptekStatus_ListModeLMMO",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekStatus, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekHardwareInterface_FpgaClock" "', argument " "1"" of type '" "AmptekHardwareInterface *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekStatus_ListModeLMMO" "', argument " "1"" of type '" "AmptekStatus *""'"); 
   }
-  arg1 = reinterpret_cast< AmptekHardwareInterface * >(argp1);
-  ecode2 = SWIG_AsVal_double(obj1, &val2);
-  if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "AmptekHardwareInterface_FpgaClock" "', argument " "2"" of type '" "double""'");
-  } 
-  arg2 = static_cast< double >(val2);
-  result = (int)(arg1)->FpgaClock(arg2);
-  resultobj = SWIG_From_int(static_cast< int >(result));
+  arg1 = reinterpret_cast< AmptekStatus * >(argp1);
+  result = (bool)(arg1)->ListModeLMMO();
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_FpgaClock__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_AmptekStatus_ListModeClock(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  AmptekHardwareInterface *arg1 = (AmptekHardwareInterface *) 0 ;
+  AmptekStatus *arg1 = (AmptekStatus *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject * obj0 = 0 ;
   int result;
   
-  if (!PyArg_ParseTuple(args,(char *)"O:AmptekHardwareInterface_FpgaClock",&obj0)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekHardwareInterface, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"O:AmptekStatus_ListModeClock",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekStatus, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekHardwareInterface_FpgaClock" "', argument " "1"" of type '" "AmptekHardwareInterface *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekStatus_ListModeClock" "', argument " "1"" of type '" "AmptekStatus *""'"); 
   }
-  arg1 = reinterpret_cast< AmptekHardwareInterface * >(argp1);
-  result = (int)(arg1)->FpgaClock();
+  arg1 = reinterpret_cast< AmptekStatus * >(argp1);
+  result = (int)(arg1)->ListModeClock();
   resultobj = SWIG_From_int(static_cast< int >(result));
   return resultobj;
 fail:
@@ -16694,98 +15582,65 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_FpgaClock(PyObject *self, PyObject *args) {
-  Py_ssize_t argc;
-  PyObject *argv[3] = {
-    0
-  };
-  Py_ssize_t ii;
+SWIGINTERN PyObject *_wrap_AmptekStatus_ListModeSync(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  AmptekStatus *arg1 = (AmptekStatus *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  int result;
   
-  if (!PyTuple_Check(args)) SWIG_fail;
-  argc = args ? PyObject_Length(args) : 0;
-  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
-    argv[ii] = PyTuple_GET_ITEM(args,ii);
-  }
-  if (argc == 1) {
-    int _v;
-    void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_AmptekHardwareInterface, 0);
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      return _wrap_AmptekHardwareInterface_FpgaClock__SWIG_1(self, args);
-    }
-  }
-  if (argc == 2) {
-    int _v;
-    void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_AmptekHardwareInterface, 0);
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      {
-        int res = SWIG_AsVal_double(argv[1], NULL);
-        _v = SWIG_CheckState(res);
-      }
-      if (_v) {
-        return _wrap_AmptekHardwareInterface_FpgaClock__SWIG_0(self, args);
-      }
-    }
+  if (!PyArg_ParseTuple(args,(char *)"O:AmptekStatus_ListModeSync",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekStatus, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekStatus_ListModeSync" "', argument " "1"" of type '" "AmptekStatus *""'"); 
   }
-  
+  arg1 = reinterpret_cast< AmptekStatus * >(argp1);
+  result = (int)(arg1)->ListModeSync();
+  resultobj = SWIG_From_int(static_cast< int >(result));
+  return resultobj;
 fail:
-  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'AmptekHardwareInterface_FpgaClock'.\n"
-    "  Possible C/C++ prototypes are:\n"
-    "    AmptekHardwareInterface::FpgaClock(double)\n"
-    "    AmptekHardwareInterface::FpgaClock()\n");
-  return 0;
+  return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_DeviceType__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_AmptekStatus_SequentialBufferRunning(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  AmptekHardwareInterface *arg1 = (AmptekHardwareInterface *) 0 ;
-  double arg2 ;
+  AmptekStatus *arg1 = (AmptekStatus *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
-  double val2 ;
-  int ecode2 = 0 ;
   PyObject * obj0 = 0 ;
-  PyObject * obj1 = 0 ;
-  int result;
+  bool result;
   
-  if (!PyArg_ParseTuple(args,(char *)"OO:AmptekHardwareInterface_DeviceType",&obj0,&obj1)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekHardwareInterface, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"O:AmptekStatus_SequentialBufferRunning",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekStatus, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekHardwareInterface_DeviceType" "', argument " "1"" of type '" "AmptekHardwareInterface *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekStatus_SequentialBufferRunning" "', argument " "1"" of type '" "AmptekStatus *""'"); 
   }
-  arg1 = reinterpret_cast< AmptekHardwareInterface * >(argp1);
-  ecode2 = SWIG_AsVal_double(obj1, &val2);
-  if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "AmptekHardwareInterface_DeviceType" "', argument " "2"" of type '" "double""'");
-  } 
-  arg2 = static_cast< double >(val2);
-  result = (int)(arg1)->DeviceType(arg2);
-  resultobj = SWIG_From_int(static_cast< int >(result));
+  arg1 = reinterpret_cast< AmptekStatus * >(argp1);
+  result = (bool)(arg1)->SequentialBufferRunning();
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_DeviceType__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_AmptekStatus_SequentialBufferIndex(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  AmptekHardwareInterface *arg1 = (AmptekHardwareInterface *) 0 ;
+  AmptekStatus *arg1 = (AmptekStatus *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject * obj0 = 0 ;
   int result;
   
-  if (!PyArg_ParseTuple(args,(char *)"O:AmptekHardwareInterface_DeviceType",&obj0)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekHardwareInterface, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"O:AmptekStatus_SequentialBufferIndex",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekStatus, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekHardwareInterface_DeviceType" "', argument " "1"" of type '" "AmptekHardwareInterface *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekStatus_SequentialBufferIndex" "', argument " "1"" of type '" "AmptekStatus *""'"); 
   }
-  arg1 = reinterpret_cast< AmptekHardwareInterface * >(argp1);
-  result = (int)(arg1)->DeviceType();
+  arg1 = reinterpret_cast< AmptekStatus * >(argp1);
+  result = (int)(arg1)->SequentialBufferIndex();
   resultobj = SWIG_From_int(static_cast< int >(result));
   return resultobj;
 fail:
@@ -16793,276 +15648,292 @@ fail:
 }
 
 
-SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_DeviceType(PyObject *self, PyObject *args) {
-  Py_ssize_t argc;
-  PyObject *argv[3] = {
-    0
-  };
-  Py_ssize_t ii;
-  
-  if (!PyTuple_Check(args)) SWIG_fail;
-  argc = args ? PyObject_Length(args) : 0;
-  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
-    argv[ii] = PyTuple_GET_ITEM(args,ii);
-  }
-  if (argc == 1) {
-    int _v;
-    void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_AmptekHardwareInterface, 0);
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      return _wrap_AmptekHardwareInterface_DeviceType__SWIG_1(self, args);
-    }
-  }
-  if (argc == 2) {
-    int _v;
-    void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_AmptekHardwareInterface, 0);
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      {
-        int res = SWIG_AsVal_double(argv[1], NULL);
-        _v = SWIG_CheckState(res);
-      }
-      if (_v) {
-        return _wrap_AmptekHardwareInterface_DeviceType__SWIG_0(self, args);
-      }
-    }
-  }
+SWIGINTERN PyObject *_wrap_AmptekStatus_AgeMillis(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  AmptekStatus *arg1 = (AmptekStatus *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  double result;
   
+  if (!PyArg_ParseTuple(args,(char *)"O:AmptekStatus_AgeMillis",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekStatus, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekStatus_AgeMillis" "', argument " "1"" of type '" "AmptekStatus const *""'"); 
+  }
+  arg1 = reinterpret_cast< AmptekStatus * >(argp1);
+  result = (double)((AmptekStatus const *)arg1)->AgeMillis();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
 fail:
-  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'AmptekHardwareInterface_DeviceType'.\n"
-    "  Possible C/C++ prototypes are:\n"
-    "    AmptekHardwareInterface::DeviceType(double)\n"
-    "    AmptekHardwareInterface::DeviceType()\n");
-  return 0;
+  return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_TecVoltage__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *AmptekStatus_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *obj;
+  if (!PyArg_ParseTuple(args,(char *)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_AmptekStatus, SWIG_NewClientData(obj));
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject *_wrap_AmptekSpectrum_bins_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  AmptekHardwareInterface *arg1 = (AmptekHardwareInterface *) 0 ;
-  double arg2 ;
+  AmptekSpectrum *arg1 = (AmptekSpectrum *) 0 ;
+  std::vector< unsigned int,std::allocator< unsigned int > > *arg2 = (std::vector< unsigned int,std::allocator< unsigned int > > *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
-  double val2 ;
-  int ecode2 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
   PyObject * obj0 = 0 ;
   PyObject * obj1 = 0 ;
-  double result;
   
-  if (!PyArg_ParseTuple(args,(char *)"OO:AmptekHardwareInterface_TecVoltage",&obj0,&obj1)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekHardwareInterface, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"OO:AmptekSpectrum_bins_set",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekSpectrum, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekHardwareInterface_TecVoltage" "', argument " "1"" of type '" "AmptekHardwareInterface *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekSpectrum_bins_set" "', argument " "1"" of type '" "AmptekSpectrum *""'"); 
   }
-  arg1 = reinterpret_cast< AmptekHardwareInterface * >(argp1);
-  ecode2 = SWIG_AsVal_double(obj1, &val2);
-  if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "AmptekHardwareInterface_TecVoltage" "', argument " "2"" of type '" "double""'");
-  } 
-  arg2 = static_cast< double >(val2);
-  result = (double)(arg1)->TecVoltage(arg2);
-  resultobj = SWIG_From_double(static_cast< double >(result));
+  arg1 = reinterpret_cast< AmptekSpectrum * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_std__vectorT_unsigned_int_std__allocatorT_unsigned_int_t_t, 0 |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "AmptekSpectrum_bins_set" "', argument " "2"" of type '" "std::vector< unsigned int,std::allocator< unsigned int > > *""'"); 
+  }
+  arg2 = reinterpret_cast< std::vector< unsigned int,std::allocator< unsigned int > > * >(argp2);
+  if (arg1) (arg1)->bins = *arg2;
+  resultobj = SWIG_Py_Void();
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_TecVoltage__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_AmptekSpectrum_bins_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  AmptekHardwareInterface *arg1 = (AmptekHardwareInterface *) 0 ;
+  AmptekSpectrum *arg1 = (AmptekSpectrum *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject * obj0 = 0 ;
-  double result;
+  std::vector< unsigned int,std::allocator< unsigned int > > *result = 0 ;
   
-  if (!PyArg_ParseTuple(args,(char *)"O:AmptekHardwareInterface_TecVoltage",&obj0)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekHardwareInterface, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"O:AmptekSpectrum_bins_get",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekSpectrum, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekHardwareInterface_TecVoltage" "', argument " "1"" of type '" "AmptekHardwareInterface *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekSpectrum_bins_get" "', argument " "1"" of type '" "AmptekSpectrum *""'"); 
   }
-  arg1 = reinterpret_cast< AmptekHardwareInterface * >(argp1);
-  result = (double)(arg1)->TecVoltage();
-  resultobj = SWIG_From_double(static_cast< double >(result));
+  arg1 = reinterpret_cast< AmptekSpectrum * >(argp1);
+  result = (std::vector< unsigned int,std::allocator< unsigned int > > *)& ((arg1)->bins);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_std__vectorT_unsigned_int_std__allocatorT_unsigned_int_t_t, 0 |  0 );
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_TecVoltage(PyObject *self, PyObject *args) {
-  Py_ssize_t argc;
-  PyObject *argv[3] = {
-    0
-  };
-  Py_ssize_t ii;
+SWIGINTERN PyObject *_wrap_AmptekSpectrum_nbins_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  AmptekSpectrum *arg1 = (AmptekSpectrum *) 0 ;
+  size_t arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj0 = 0 ;
+  PyObject * obj1 = 0 ;
   
-  if (!PyTuple_Check(args)) SWIG_fail;
-  argc = args ? PyObject_Length(args) : 0;
-  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
-    argv[ii] = PyTuple_GET_ITEM(args,ii);
-  }
-  if (argc == 1) {
-    int _v;
-    void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_AmptekHardwareInterface, 0);
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      return _wrap_AmptekHardwareInterface_TecVoltage__SWIG_1(self, args);
-    }
-  }
-  if (argc == 2) {
-    int _v;
-    void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_AmptekHardwareInterface, 0);
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      {
-        int res = SWIG_AsVal_double(argv[1], NULL);
-        _v = SWIG_CheckState(res);
-      }
-      if (_v) {
-        return _wrap_AmptekHardwareInterface_TecVoltage__SWIG_0(self, args);
-      }
-    }
+  if (!PyArg_ParseTuple(args,(char *)"OO:AmptekSpectrum_nbins_set",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekSpectrum, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekSpectrum_nbins_set" "', argument " "1"" of type '" "AmptekSpectrum *""'"); 
   }
+  arg1 = reinterpret_cast< AmptekSpectrum * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "AmptekSpectrum_nbins_set" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  if (arg1) (arg1)->nbins = arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_AmptekSpectrum_nbins_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  AmptekSpectrum *arg1 = (AmptekSpectrum *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj0 = 0 ;
+  size_t result;
   
+  if (!PyArg_ParseTuple(args,(char *)"O:AmptekSpectrum_nbins_get",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekSpectrum, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekSpectrum_nbins_get" "', argument " "1"" of type '" "AmptekSpectrum *""'"); 
+  }
+  arg1 = reinterpret_cast< AmptekSpectrum * >(argp1);
+  result =  ((arg1)->nbins);
+  resultobj = SWIG_From_size_t(static_cast< size_t >(result));
+  return resultobj;
 fail:
-  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'AmptekHardwareInterface_TecVoltage'.\n"
-    "  Possible C/C++ prototypes are:\n"
-    "    AmptekHardwareInterface::TecVoltage(double)\n"
-    "    AmptekHardwareInterface::TecVoltage()\n");
-  return 0;
+  return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_GetSpectrum__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_AmptekSpectrum_timestamp_set(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  AmptekHardwareInterface *arg1 = (AmptekHardwareInterface *) 0 ;
-  unsigned int *arg2 = (unsigned int *) 0 ;
-  double arg3 ;
+  AmptekSpectrum *arg1 = (AmptekSpectrum *) 0 ;
+  std::chrono::time_point< std::chrono::system_clock > arg2 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
-  void *argp2 = 0 ;
+  void *argp2 ;
   int res2 = 0 ;
-  double val3 ;
-  int ecode3 = 0 ;
   PyObject * obj0 = 0 ;
   PyObject * obj1 = 0 ;
-  PyObject * obj2 = 0 ;
-  int result;
   
-  if (!PyArg_ParseTuple(args,(char *)"OOO:AmptekHardwareInterface_GetSpectrum",&obj0,&obj1,&obj2)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekHardwareInterface, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"OO:AmptekSpectrum_timestamp_set",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekSpectrum, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekHardwareInterface_GetSpectrum" "', argument " "1"" of type '" "AmptekHardwareInterface *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekSpectrum_timestamp_set" "', argument " "1"" of type '" "AmptekSpectrum *""'"); 
   }
-  arg1 = reinterpret_cast< AmptekHardwareInterface * >(argp1);
-  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_unsigned_int, 0 |  0 );
-  if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "AmptekHardwareInterface_GetSpectrum" "', argument " "2"" of type '" "unsigned int *""'"); 
+  arg1 = reinterpret_cast< AmptekSpectrum * >(argp1);
+  {
+    res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_std__chrono__time_pointT_std__chrono__system_clock_t,  0  | 0);
+    if (!SWIG_IsOK(res2)) {
+      SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "AmptekSpectrum_timestamp_set" "', argument " "2"" of type '" "std::chrono::time_point< std::chrono::system_clock >""'"); 
+    }  
+    if (!argp2) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "AmptekSpectrum_timestamp_set" "', argument " "2"" of type '" "std::chrono::time_point< std::chrono::system_clock >""'");
+    } else {
+      std::chrono::time_point< std::chrono::system_clock > * temp = reinterpret_cast< std::chrono::time_point< std::chrono::system_clock > * >(argp2);
+      arg2 = *temp;
+      if (SWIG_IsNewObj(res2)) delete temp;
+    }
   }
-  arg2 = reinterpret_cast< unsigned int * >(argp2);
-  ecode3 = SWIG_AsVal_double(obj2, &val3);
-  if (!SWIG_IsOK(ecode3)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "AmptekHardwareInterface_GetSpectrum" "', argument " "3"" of type '" "double""'");
-  } 
-  arg3 = static_cast< double >(val3);
-  result = (int)(arg1)->GetSpectrum(arg2,arg3);
-  resultobj = SWIG_From_int(static_cast< int >(result));
+  if (arg1) (arg1)->timestamp = arg2;
+  resultobj = SWIG_Py_Void();
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_GetSpectrum__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_AmptekSpectrum_timestamp_get(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  AmptekHardwareInterface *arg1 = (AmptekHardwareInterface *) 0 ;
-  unsigned int *arg2 = (unsigned int *) 0 ;
+  AmptekSpectrum *arg1 = (AmptekSpectrum *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
-  void *argp2 = 0 ;
-  int res2 = 0 ;
   PyObject * obj0 = 0 ;
-  PyObject * obj1 = 0 ;
-  int result;
+  std::chrono::time_point< std::chrono::system_clock > result;
   
-  if (!PyArg_ParseTuple(args,(char *)"OO:AmptekHardwareInterface_GetSpectrum",&obj0,&obj1)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekHardwareInterface, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"O:AmptekSpectrum_timestamp_get",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekSpectrum, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekHardwareInterface_GetSpectrum" "', argument " "1"" of type '" "AmptekHardwareInterface *""'"); 
-  }
-  arg1 = reinterpret_cast< AmptekHardwareInterface * >(argp1);
-  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_unsigned_int, 0 |  0 );
-  if (!SWIG_IsOK(res2)) {
-    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "AmptekHardwareInterface_GetSpectrum" "', argument " "2"" of type '" "unsigned int *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekSpectrum_timestamp_get" "', argument " "1"" of type '" "AmptekSpectrum *""'"); 
   }
-  arg2 = reinterpret_cast< unsigned int * >(argp2);
-  result = (int)(arg1)->GetSpectrum(arg2);
-  resultobj = SWIG_From_int(static_cast< int >(result));
+  arg1 = reinterpret_cast< AmptekSpectrum * >(argp1);
+  result =  ((arg1)->timestamp);
+  resultobj = SWIG_NewPointerObj((new std::chrono::time_point< std::chrono::system_clock >(static_cast< const std::chrono::time_point< std::chrono::system_clock >& >(result))), SWIGTYPE_p_std__chrono__time_pointT_std__chrono__system_clock_t, SWIG_POINTER_OWN |  0 );
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_GetSpectrum__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_new_AmptekSpectrum__SWIG_0(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  AmptekHardwareInterface *arg1 = (AmptekHardwareInterface *) 0 ;
-  double arg2 ;
+  byte *arg1 = (byte *) 0 ;
+  size_t arg2 ;
+  std::chrono::time_point< std::chrono::system_clock > arg3 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
-  double val2 ;
+  size_t val2 ;
   int ecode2 = 0 ;
+  void *argp3 ;
+  int res3 = 0 ;
   PyObject * obj0 = 0 ;
   PyObject * obj1 = 0 ;
-  std::vector< unsigned int,std::allocator< unsigned int > > result;
+  PyObject * obj2 = 0 ;
+  AmptekSpectrum *result = 0 ;
   
-  if (!PyArg_ParseTuple(args,(char *)"OO:AmptekHardwareInterface_GetSpectrum",&obj0,&obj1)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekHardwareInterface, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"OOO:new_AmptekSpectrum",&obj0,&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_byte, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekHardwareInterface_GetSpectrum" "', argument " "1"" of type '" "AmptekHardwareInterface *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_AmptekSpectrum" "', argument " "1"" of type '" "byte const *""'"); 
   }
-  arg1 = reinterpret_cast< AmptekHardwareInterface * >(argp1);
-  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  arg1 = reinterpret_cast< byte * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
   if (!SWIG_IsOK(ecode2)) {
-    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "AmptekHardwareInterface_GetSpectrum" "', argument " "2"" of type '" "double""'");
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_AmptekSpectrum" "', argument " "2"" of type '" "size_t""'");
   } 
-  arg2 = static_cast< double >(val2);
-  result = (arg1)->GetSpectrum(arg2);
-  resultobj = swig::from(static_cast< std::vector< unsigned int,std::allocator< unsigned int > > >(result));
+  arg2 = static_cast< size_t >(val2);
+  {
+    res3 = SWIG_ConvertPtr(obj2, &argp3, SWIGTYPE_p_std__chrono__time_pointT_std__chrono__system_clock_t,  0  | 0);
+    if (!SWIG_IsOK(res3)) {
+      SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "new_AmptekSpectrum" "', argument " "3"" of type '" "std::chrono::time_point< std::chrono::system_clock >""'"); 
+    }  
+    if (!argp3) {
+      SWIG_exception_fail(SWIG_ValueError, "invalid null reference " "in method '" "new_AmptekSpectrum" "', argument " "3"" of type '" "std::chrono::time_point< std::chrono::system_clock >""'");
+    } else {
+      std::chrono::time_point< std::chrono::system_clock > * temp = reinterpret_cast< std::chrono::time_point< std::chrono::system_clock > * >(argp3);
+      arg3 = *temp;
+      if (SWIG_IsNewObj(res3)) delete temp;
+    }
+  }
+  result = (AmptekSpectrum *)new AmptekSpectrum((byte const *)arg1,arg2,arg3);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_AmptekSpectrum, SWIG_POINTER_NEW |  0 );
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_GetSpectrum__SWIG_3(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_new_AmptekSpectrum__SWIG_1(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  AmptekHardwareInterface *arg1 = (AmptekHardwareInterface *) 0 ;
+  byte *arg1 = (byte *) 0 ;
+  size_t arg2 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
+  size_t val2 ;
+  int ecode2 = 0 ;
   PyObject * obj0 = 0 ;
-  std::vector< unsigned int,std::allocator< unsigned int > > result;
+  PyObject * obj1 = 0 ;
+  AmptekSpectrum *result = 0 ;
   
-  if (!PyArg_ParseTuple(args,(char *)"O:AmptekHardwareInterface_GetSpectrum",&obj0)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekHardwareInterface, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"OO:new_AmptekSpectrum",&obj0,&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_byte, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekHardwareInterface_GetSpectrum" "', argument " "1"" of type '" "AmptekHardwareInterface *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new_AmptekSpectrum" "', argument " "1"" of type '" "byte const *""'"); 
   }
-  arg1 = reinterpret_cast< AmptekHardwareInterface * >(argp1);
-  result = (arg1)->GetSpectrum();
-  resultobj = swig::from(static_cast< std::vector< unsigned int,std::allocator< unsigned int > > >(result));
+  arg1 = reinterpret_cast< byte * >(argp1);
+  ecode2 = SWIG_AsVal_size_t(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new_AmptekSpectrum" "', argument " "2"" of type '" "size_t""'");
+  } 
+  arg2 = static_cast< size_t >(val2);
+  result = (AmptekSpectrum *)new AmptekSpectrum((byte const *)arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_AmptekSpectrum, SWIG_POINTER_NEW |  0 );
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_GetSpectrum(PyObject *self, PyObject *args) {
+SWIGINTERN PyObject *_wrap_new_AmptekSpectrum__SWIG_2(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+  PyObject *resultobj = 0;
+  AmptekSpectrum *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)":new_AmptekSpectrum")) SWIG_fail;
+  result = (AmptekSpectrum *)new AmptekSpectrum();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_AmptekSpectrum, SWIG_POINTER_NEW |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_new_AmptekSpectrum(PyObject *self, PyObject *args) {
   Py_ssize_t argc;
   PyObject *argv[4] = {
     0
@@ -17074,135 +15945,101 @@ SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_GetSpectrum(PyObject *self, P
   for (ii = 0; (ii < 3) && (ii < argc); ii++) {
     argv[ii] = PyTuple_GET_ITEM(args,ii);
   }
-  if (argc == 1) {
-    int _v;
-    void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_AmptekHardwareInterface, 0);
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      return _wrap_AmptekHardwareInterface_GetSpectrum__SWIG_3(self, args);
-    }
-  }
-  if (argc == 2) {
-    int _v;
-    void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_AmptekHardwareInterface, 0);
-    _v = SWIG_CheckState(res);
-    if (_v) {
-      void *vptr = 0;
-      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_unsigned_int, 0);
-      _v = SWIG_CheckState(res);
-      if (_v) {
-        return _wrap_AmptekHardwareInterface_GetSpectrum__SWIG_1(self, args);
-      }
-    }
+  if (argc == 0) {
+    return _wrap_new_AmptekSpectrum__SWIG_2(self, args);
   }
   if (argc == 2) {
     int _v;
     void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_AmptekHardwareInterface, 0);
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_byte, 0);
     _v = SWIG_CheckState(res);
     if (_v) {
       {
-        int res = SWIG_AsVal_double(argv[1], NULL);
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
         _v = SWIG_CheckState(res);
       }
       if (_v) {
-        return _wrap_AmptekHardwareInterface_GetSpectrum__SWIG_2(self, args);
+        return _wrap_new_AmptekSpectrum__SWIG_1(self, args);
       }
     }
   }
   if (argc == 3) {
     int _v;
     void *vptr = 0;
-    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_AmptekHardwareInterface, 0);
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p_byte, 0);
     _v = SWIG_CheckState(res);
     if (_v) {
-      void *vptr = 0;
-      int res = SWIG_ConvertPtr(argv[1], &vptr, SWIGTYPE_p_unsigned_int, 0);
-      _v = SWIG_CheckState(res);
+      {
+        int res = SWIG_AsVal_size_t(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
       if (_v) {
-        {
-          int res = SWIG_AsVal_double(argv[2], NULL);
-          _v = SWIG_CheckState(res);
-        }
+        int res = SWIG_ConvertPtr(argv[2], 0, SWIGTYPE_p_std__chrono__time_pointT_std__chrono__system_clock_t, 0);
+        _v = SWIG_CheckState(res);
         if (_v) {
-          return _wrap_AmptekHardwareInterface_GetSpectrum__SWIG_0(self, args);
+          return _wrap_new_AmptekSpectrum__SWIG_0(self, args);
         }
       }
     }
   }
   
 fail:
-  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'AmptekHardwareInterface_GetSpectrum'.\n"
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new_AmptekSpectrum'.\n"
     "  Possible C/C++ prototypes are:\n"
-    "    AmptekHardwareInterface::GetSpectrum(unsigned int *,double)\n"
-    "    AmptekHardwareInterface::GetSpectrum(unsigned int *)\n"
-    "    AmptekHardwareInterface::GetSpectrum(double)\n"
-    "    AmptekHardwareInterface::GetSpectrum()\n");
+    "    AmptekSpectrum::AmptekSpectrum(byte const *,size_t,std::chrono::time_point< std::chrono::system_clock >)\n"
+    "    AmptekSpectrum::AmptekSpectrum(byte const *,size_t)\n"
+    "    AmptekSpectrum::AmptekSpectrum()\n");
   return 0;
 }
 
 
-SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_GetTextConfiguration(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_AmptekSpectrum_AgeMillis(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  AmptekHardwareInterface *arg1 = (AmptekHardwareInterface *) 0 ;
-  std::vector< std::string,std::allocator< std::string > > arg2 ;
+  AmptekSpectrum *arg1 = (AmptekSpectrum *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject * obj0 = 0 ;
-  PyObject * obj1 = 0 ;
-  std::vector< std::string,std::allocator< std::string > > result;
+  double result;
   
-  if (!PyArg_ParseTuple(args,(char *)"OO:AmptekHardwareInterface_GetTextConfiguration",&obj0,&obj1)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekHardwareInterface, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"O:AmptekSpectrum_AgeMillis",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekSpectrum, 0 |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekHardwareInterface_GetTextConfiguration" "', argument " "1"" of type '" "AmptekHardwareInterface *""'"); 
-  }
-  arg1 = reinterpret_cast< AmptekHardwareInterface * >(argp1);
-  {
-    std::vector< std::string,std::allocator< std::string > > *ptr = (std::vector< std::string,std::allocator< std::string > > *)0;
-    int res = swig::asptr(obj1, &ptr);
-    if (!SWIG_IsOK(res) || !ptr) {
-      SWIG_exception_fail(SWIG_ArgError((ptr ? res : SWIG_TypeError)), "in method '" "AmptekHardwareInterface_GetTextConfiguration" "', argument " "2"" of type '" "std::vector< std::string,std::allocator< std::string > >""'"); 
-    }
-    arg2 = *ptr;
-    if (SWIG_IsNewObj(res)) delete ptr;
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekSpectrum_AgeMillis" "', argument " "1"" of type '" "AmptekSpectrum const *""'"); 
   }
-  result = (arg1)->GetTextConfiguration(arg2);
-  resultobj = swig::from(static_cast< std::vector< std::string,std::allocator< std::string > > >(result));
+  arg1 = reinterpret_cast< AmptekSpectrum * >(argp1);
+  result = (double)((AmptekSpectrum const *)arg1)->AgeMillis();
+  resultobj = SWIG_From_double(static_cast< double >(result));
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *_wrap_AmptekHardwareInterface_GetState(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *_wrap_delete_AmptekSpectrum(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *resultobj = 0;
-  AmptekHardwareInterface *arg1 = (AmptekHardwareInterface *) 0 ;
+  AmptekSpectrum *arg1 = (AmptekSpectrum *) 0 ;
   void *argp1 = 0 ;
   int res1 = 0 ;
   PyObject * obj0 = 0 ;
-  AmptekState result;
   
-  if (!PyArg_ParseTuple(args,(char *)"O:AmptekHardwareInterface_GetState",&obj0)) SWIG_fail;
-  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekHardwareInterface, 0 |  0 );
+  if (!PyArg_ParseTuple(args,(char *)"O:delete_AmptekSpectrum",&obj0)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_AmptekSpectrum, SWIG_POINTER_DISOWN |  0 );
   if (!SWIG_IsOK(res1)) {
-    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "AmptekHardwareInterface_GetState" "', argument " "1"" of type '" "AmptekHardwareInterface const *""'"); 
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete_AmptekSpectrum" "', argument " "1"" of type '" "AmptekSpectrum *""'"); 
   }
-  arg1 = reinterpret_cast< AmptekHardwareInterface * >(argp1);
-  result = (AmptekState)((AmptekHardwareInterface const *)arg1)->GetState();
-  resultobj = SWIG_From_int(static_cast< int >(result));
+  arg1 = reinterpret_cast< AmptekSpectrum * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
   return resultobj;
 fail:
   return NULL;
 }
 
 
-SWIGINTERN PyObject *AmptekHardwareInterface_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
+SWIGINTERN PyObject *AmptekSpectrum_swigregister(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
   PyObject *obj;
-  if (!PyArg_ParseTuple(args,(char*)"O:swigregister", &obj)) return NULL;
-  SWIG_TypeNewClientData(SWIGTYPE_p_AmptekHardwareInterface, SWIG_NewClientData(obj));
+  if (!PyArg_ParseTuple(args,(char *)"O:swigregister", &obj)) return NULL;
+  SWIG_TypeNewClientData(SWIGTYPE_p_AmptekSpectrum, SWIG_NewClientData(obj));
   return SWIG_Py_Void();
 }
 
@@ -17362,19 +16199,11 @@ static PyMethodDef SwigMethods[] = {
 	 { (char *)"UIntVector_capacity", _wrap_UIntVector_capacity, METH_VARARGS, NULL},
 	 { (char *)"delete_UIntVector", _wrap_delete_UIntVector, METH_VARARGS, NULL},
 	 { (char *)"UIntVector_swigregister", UIntVector_swigregister, METH_VARARGS, NULL},
-	 { (char *)"STATUS_SIZE_swigconstant", STATUS_SIZE_swigconstant, METH_VARARGS, NULL},
-	 { (char *)"SPECLEN_swigconstant", SPECLEN_swigconstant, METH_VARARGS, NULL},
-	 { (char *)"NOT_CONNECTED_swigconstant", NOT_CONNECTED_swigconstant, METH_VARARGS, NULL},
-	 { (char *)"ON_swigconstant", ON_swigconstant, METH_VARARGS, NULL},
-	 { (char *)"RECORDING_swigconstant", RECORDING_swigconstant, METH_VARARGS, NULL},
-	 { (char *)"ERROR_swigconstant", ERROR_swigconstant, METH_VARARGS, NULL},
 	 { (char *)"new_AmptekHardwareInterface", _wrap_new_AmptekHardwareInterface, METH_VARARGS, NULL},
 	 { (char *)"delete_AmptekHardwareInterface", _wrap_delete_AmptekHardwareInterface, METH_VARARGS, NULL},
 	 { (char *)"AmptekHardwareInterface_connectUSB", _wrap_AmptekHardwareInterface_connectUSB, METH_VARARGS, NULL},
 	 { (char *)"AmptekHardwareInterface_connectSimulator", _wrap_AmptekHardwareInterface_connectSimulator, METH_VARARGS, NULL},
 	 { (char *)"AmptekHardwareInterface_connectUDP", _wrap_AmptekHardwareInterface_connectUDP, METH_VARARGS, NULL},
-	 { (char *)"AmptekHardwareInterface_readSpectrum", _wrap_AmptekHardwareInterface_readSpectrum, METH_VARARGS, NULL},
-	 { (char *)"AmptekHardwareInterface_readSpectrumAndStatus", _wrap_AmptekHardwareInterface_readSpectrumAndStatus, METH_VARARGS, NULL},
 	 { (char *)"AmptekHardwareInterface_Enable", _wrap_AmptekHardwareInterface_Enable, METH_VARARGS, NULL},
 	 { (char *)"AmptekHardwareInterface_Disable", _wrap_AmptekHardwareInterface_Disable, METH_VARARGS, NULL},
 	 { (char *)"AmptekHardwareInterface_Ping", _wrap_AmptekHardwareInterface_Ping, METH_VARARGS, NULL},
@@ -17383,40 +16212,59 @@ static PyMethodDef SwigMethods[] = {
 	 { (char *)"AmptekHardwareInterface_SetPresetRealTime", _wrap_AmptekHardwareInterface_SetPresetRealTime, METH_VARARGS, NULL},
 	 { (char *)"AmptekHardwareInterface_SetPresetCounts", _wrap_AmptekHardwareInterface_SetPresetCounts, METH_VARARGS, NULL},
 	 { (char *)"AmptekHardwareInterface_SetTextConfiguration", _wrap_AmptekHardwareInterface_SetTextConfiguration, METH_VARARGS, NULL},
-	 { (char *)"AmptekHardwareInterface_UpdateStatus", _wrap_AmptekHardwareInterface_UpdateStatus, METH_VARARGS, NULL},
+	 { (char *)"AmptekHardwareInterface_updateStatus", _wrap_AmptekHardwareInterface_updateStatus, METH_VARARGS, NULL},
 	 { (char *)"AmptekHardwareInterface_EnableListMode", _wrap_AmptekHardwareInterface_EnableListMode, METH_VARARGS, NULL},
 	 { (char *)"AmptekHardwareInterface_ResetListModeTimer", _wrap_AmptekHardwareInterface_ResetListModeTimer, METH_VARARGS, NULL},
 	 { (char *)"AmptekHardwareInterface_DisableListMode", _wrap_AmptekHardwareInterface_DisableListMode, METH_VARARGS, NULL},
 	 { (char *)"AmptekHardwareInterface_startBuffering", _wrap_AmptekHardwareInterface_startBuffering, METH_VARARGS, NULL},
 	 { (char *)"AmptekHardwareInterface_stopBuffering", _wrap_AmptekHardwareInterface_stopBuffering, METH_VARARGS, NULL},
-	 { (char *)"AmptekHardwareInterface_GetBuffered", _wrap_AmptekHardwareInterface_GetBuffered, METH_VARARGS, NULL},
+	 { (char *)"AmptekHardwareInterface_GetBufferedSpectrum", _wrap_AmptekHardwareInterface_GetBufferedSpectrum, METH_VARARGS, NULL},
 	 { (char *)"AmptekHardwareInterface_StartCommtestStreaming", _wrap_AmptekHardwareInterface_StartCommtestStreaming, METH_VARARGS, NULL},
 	 { (char *)"AmptekHardwareInterface_StopCommtestStreaming", _wrap_AmptekHardwareInterface_StopCommtestStreaming, METH_VARARGS, NULL},
-	 { (char *)"AmptekHardwareInterface_FastCount", _wrap_AmptekHardwareInterface_FastCount, METH_VARARGS, NULL},
-	 { (char *)"AmptekHardwareInterface_SlowCount", _wrap_AmptekHardwareInterface_SlowCount, METH_VARARGS, NULL},
-	 { (char *)"AmptekHardwareInterface_DeadTime", _wrap_AmptekHardwareInterface_DeadTime, METH_VARARGS, NULL},
-	 { (char *)"AmptekHardwareInterface_AccTime", _wrap_AmptekHardwareInterface_AccTime, METH_VARARGS, NULL},
-	 { (char *)"AmptekHardwareInterface_RealTime", _wrap_AmptekHardwareInterface_RealTime, METH_VARARGS, NULL},
-	 { (char *)"AmptekHardwareInterface_FirmwareMajor", _wrap_AmptekHardwareInterface_FirmwareMajor, METH_VARARGS, NULL},
-	 { (char *)"AmptekHardwareInterface_FirmwareMinor", _wrap_AmptekHardwareInterface_FirmwareMinor, METH_VARARGS, NULL},
-	 { (char *)"AmptekHardwareInterface_FirmwareBuild", _wrap_AmptekHardwareInterface_FirmwareBuild, METH_VARARGS, NULL},
-	 { (char *)"AmptekHardwareInterface_FpgaMajor", _wrap_AmptekHardwareInterface_FpgaMajor, METH_VARARGS, NULL},
-	 { (char *)"AmptekHardwareInterface_FpgaMinor", _wrap_AmptekHardwareInterface_FpgaMinor, METH_VARARGS, NULL},
-	 { (char *)"AmptekHardwareInterface_SerialNb", _wrap_AmptekHardwareInterface_SerialNb, METH_VARARGS, NULL},
-	 { (char *)"AmptekHardwareInterface_HighVoltage", _wrap_AmptekHardwareInterface_HighVoltage, METH_VARARGS, NULL},
-	 { (char *)"AmptekHardwareInterface_DetectorTemp", _wrap_AmptekHardwareInterface_DetectorTemp, METH_VARARGS, NULL},
-	 { (char *)"AmptekHardwareInterface_BoardTemp", _wrap_AmptekHardwareInterface_BoardTemp, METH_VARARGS, NULL},
-	 { (char *)"AmptekHardwareInterface_IsPresetTimeReached", _wrap_AmptekHardwareInterface_IsPresetTimeReached, METH_VARARGS, NULL},
-	 { (char *)"AmptekHardwareInterface_IsEnabled", _wrap_AmptekHardwareInterface_IsEnabled, METH_VARARGS, NULL},
-	 { (char *)"AmptekHardwareInterface_IsPresetCountReached", _wrap_AmptekHardwareInterface_IsPresetCountReached, METH_VARARGS, NULL},
-	 { (char *)"AmptekHardwareInterface_IsGated", _wrap_AmptekHardwareInterface_IsGated, METH_VARARGS, NULL},
-	 { (char *)"AmptekHardwareInterface_FpgaClock", _wrap_AmptekHardwareInterface_FpgaClock, METH_VARARGS, NULL},
-	 { (char *)"AmptekHardwareInterface_DeviceType", _wrap_AmptekHardwareInterface_DeviceType, METH_VARARGS, NULL},
-	 { (char *)"AmptekHardwareInterface_TecVoltage", _wrap_AmptekHardwareInterface_TecVoltage, METH_VARARGS, NULL},
 	 { (char *)"AmptekHardwareInterface_GetSpectrum", _wrap_AmptekHardwareInterface_GetSpectrum, METH_VARARGS, NULL},
 	 { (char *)"AmptekHardwareInterface_GetTextConfiguration", _wrap_AmptekHardwareInterface_GetTextConfiguration, METH_VARARGS, NULL},
 	 { (char *)"AmptekHardwareInterface_GetState", _wrap_AmptekHardwareInterface_GetState, METH_VARARGS, NULL},
 	 { (char *)"AmptekHardwareInterface_swigregister", AmptekHardwareInterface_swigregister, METH_VARARGS, NULL},
+	 { (char *)"new_AmptekStatus", _wrap_new_AmptekStatus, METH_VARARGS, NULL},
+	 { (char *)"delete_AmptekStatus", _wrap_delete_AmptekStatus, METH_VARARGS, NULL},
+	 { (char *)"AmptekStatus_FastCount", _wrap_AmptekStatus_FastCount, METH_VARARGS, NULL},
+	 { (char *)"AmptekStatus_SlowCount", _wrap_AmptekStatus_SlowCount, METH_VARARGS, NULL},
+	 { (char *)"AmptekStatus_DeadTime", _wrap_AmptekStatus_DeadTime, METH_VARARGS, NULL},
+	 { (char *)"AmptekStatus_AccTime", _wrap_AmptekStatus_AccTime, METH_VARARGS, NULL},
+	 { (char *)"AmptekStatus_RealTime", _wrap_AmptekStatus_RealTime, METH_VARARGS, NULL},
+	 { (char *)"AmptekStatus_FirmwareMajor", _wrap_AmptekStatus_FirmwareMajor, METH_VARARGS, NULL},
+	 { (char *)"AmptekStatus_FirmwareMinor", _wrap_AmptekStatus_FirmwareMinor, METH_VARARGS, NULL},
+	 { (char *)"AmptekStatus_FirmwareBuild", _wrap_AmptekStatus_FirmwareBuild, METH_VARARGS, NULL},
+	 { (char *)"AmptekStatus_FpgaMajor", _wrap_AmptekStatus_FpgaMajor, METH_VARARGS, NULL},
+	 { (char *)"AmptekStatus_FpgaMinor", _wrap_AmptekStatus_FpgaMinor, METH_VARARGS, NULL},
+	 { (char *)"AmptekStatus_SerialNb", _wrap_AmptekStatus_SerialNb, METH_VARARGS, NULL},
+	 { (char *)"AmptekStatus_HighVoltage", _wrap_AmptekStatus_HighVoltage, METH_VARARGS, NULL},
+	 { (char *)"AmptekStatus_DetectorTemp", _wrap_AmptekStatus_DetectorTemp, METH_VARARGS, NULL},
+	 { (char *)"AmptekStatus_BoardTemp", _wrap_AmptekStatus_BoardTemp, METH_VARARGS, NULL},
+	 { (char *)"AmptekStatus_IsPresetTimeReached", _wrap_AmptekStatus_IsPresetTimeReached, METH_VARARGS, NULL},
+	 { (char *)"AmptekStatus_IsEnabled", _wrap_AmptekStatus_IsEnabled, METH_VARARGS, NULL},
+	 { (char *)"AmptekStatus_IsPresetCountReached", _wrap_AmptekStatus_IsPresetCountReached, METH_VARARGS, NULL},
+	 { (char *)"AmptekStatus_IsGated", _wrap_AmptekStatus_IsGated, METH_VARARGS, NULL},
+	 { (char *)"AmptekStatus_FpgaClock", _wrap_AmptekStatus_FpgaClock, METH_VARARGS, NULL},
+	 { (char *)"AmptekStatus_DeviceType", _wrap_AmptekStatus_DeviceType, METH_VARARGS, NULL},
+	 { (char *)"AmptekStatus_TecVoltage", _wrap_AmptekStatus_TecVoltage, METH_VARARGS, NULL},
+	 { (char *)"AmptekStatus_ListModeLMMO", _wrap_AmptekStatus_ListModeLMMO, METH_VARARGS, NULL},
+	 { (char *)"AmptekStatus_ListModeClock", _wrap_AmptekStatus_ListModeClock, METH_VARARGS, NULL},
+	 { (char *)"AmptekStatus_ListModeSync", _wrap_AmptekStatus_ListModeSync, METH_VARARGS, NULL},
+	 { (char *)"AmptekStatus_SequentialBufferRunning", _wrap_AmptekStatus_SequentialBufferRunning, METH_VARARGS, NULL},
+	 { (char *)"AmptekStatus_SequentialBufferIndex", _wrap_AmptekStatus_SequentialBufferIndex, METH_VARARGS, NULL},
+	 { (char *)"AmptekStatus_AgeMillis", _wrap_AmptekStatus_AgeMillis, METH_VARARGS, NULL},
+	 { (char *)"AmptekStatus_swigregister", AmptekStatus_swigregister, METH_VARARGS, NULL},
+	 { (char *)"AmptekSpectrum_bins_set", _wrap_AmptekSpectrum_bins_set, METH_VARARGS, NULL},
+	 { (char *)"AmptekSpectrum_bins_get", _wrap_AmptekSpectrum_bins_get, METH_VARARGS, NULL},
+	 { (char *)"AmptekSpectrum_nbins_set", _wrap_AmptekSpectrum_nbins_set, METH_VARARGS, NULL},
+	 { (char *)"AmptekSpectrum_nbins_get", _wrap_AmptekSpectrum_nbins_get, METH_VARARGS, NULL},
+	 { (char *)"AmptekSpectrum_timestamp_set", _wrap_AmptekSpectrum_timestamp_set, METH_VARARGS, NULL},
+	 { (char *)"AmptekSpectrum_timestamp_get", _wrap_AmptekSpectrum_timestamp_get, METH_VARARGS, NULL},
+	 { (char *)"new_AmptekSpectrum", _wrap_new_AmptekSpectrum, METH_VARARGS, NULL},
+	 { (char *)"AmptekSpectrum_AgeMillis", _wrap_AmptekSpectrum_AgeMillis, METH_VARARGS, NULL},
+	 { (char *)"delete_AmptekSpectrum", _wrap_delete_AmptekSpectrum, METH_VARARGS, NULL},
+	 { (char *)"AmptekSpectrum_swigregister", AmptekSpectrum_swigregister, METH_VARARGS, NULL},
 	 { NULL, NULL, 0, NULL }
 };
 
@@ -17424,6 +16272,8 @@ static PyMethodDef SwigMethods[] = {
 /* -------- TYPE CONVERSION AND EQUIVALENCE RULES (BEGIN) -------- */
 
 static swig_type_info _swigt__p_AmptekHardwareInterface = {"_p_AmptekHardwareInterface", "AmptekHardwareInterface *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_AmptekSpectrum = {"_p_AmptekSpectrum", "AmptekSpectrum *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_AmptekStatus = {"_p_AmptekStatus", "AmptekStatus *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_allocator_type = {"_p_allocator_type", "allocator_type *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_byte = {"_p_byte", "byte *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_char = {"_p_char", "char *", 0, 0, (void*)0, 0};
@@ -17438,7 +16288,9 @@ static swig_type_info _swigt__p_std__allocatorT_double_t = {"_p_std__allocatorT_
 static swig_type_info _swigt__p_std__allocatorT_int_t = {"_p_std__allocatorT_int_t", "std::vector< int >::allocator_type *|std::allocator< int > *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_std__allocatorT_std__string_t = {"_p_std__allocatorT_std__string_t", "std::vector< std::string >::allocator_type *|std::allocator< std::string > *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_std__allocatorT_unsigned_int_t = {"_p_std__allocatorT_unsigned_int_t", "std::vector< unsigned int >::allocator_type *|std::allocator< unsigned int > *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__chrono__time_pointT_std__chrono__system_clock_t = {"_p_std__chrono__time_pointT_std__chrono__system_clock_t", "std::chrono::time_point< std::chrono::system_clock > *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_std__invalid_argument = {"_p_std__invalid_argument", "std::invalid_argument *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_std__pairT_AmptekSpectrum_AmptekStatus_t = {"_p_std__pairT_AmptekSpectrum_AmptekStatus_t", "std::pair< AmptekSpectrum,AmptekStatus > *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_std__vectorT_double_std__allocatorT_double_t_t = {"_p_std__vectorT_double_std__allocatorT_double_t_t", "std::vector< double,std::allocator< double > > *|std::vector< double > *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_std__vectorT_int_std__allocatorT_int_t_t = {"_p_std__vectorT_int_std__allocatorT_int_t_t", "std::vector< int,std::allocator< int > > *|std::vector< int > *", 0, 0, (void*)0, 0};
 static swig_type_info _swigt__p_std__vectorT_std__string_std__allocatorT_std__string_t_t = {"_p_std__vectorT_std__string_std__allocatorT_std__string_t_t", "std::vector< std::string,std::allocator< std::string > > *|std::vector< std::string > *", 0, 0, (void*)0, 0};
@@ -17452,6 +16304,8 @@ static swig_type_info _swigt__p_value_type = {"_p_value_type", "value_type *", 0
 
 static swig_type_info *swig_type_initial[] = {
   &_swigt__p_AmptekHardwareInterface,
+  &_swigt__p_AmptekSpectrum,
+  &_swigt__p_AmptekStatus,
   &_swigt__p_allocator_type,
   &_swigt__p_byte,
   &_swigt__p_char,
@@ -17466,7 +16320,9 @@ static swig_type_info *swig_type_initial[] = {
   &_swigt__p_std__allocatorT_int_t,
   &_swigt__p_std__allocatorT_std__string_t,
   &_swigt__p_std__allocatorT_unsigned_int_t,
+  &_swigt__p_std__chrono__time_pointT_std__chrono__system_clock_t,
   &_swigt__p_std__invalid_argument,
+  &_swigt__p_std__pairT_AmptekSpectrum_AmptekStatus_t,
   &_swigt__p_std__vectorT_double_std__allocatorT_double_t_t,
   &_swigt__p_std__vectorT_int_std__allocatorT_int_t_t,
   &_swigt__p_std__vectorT_std__string_std__allocatorT_std__string_t_t,
@@ -17480,6 +16336,8 @@ static swig_type_info *swig_type_initial[] = {
 };
 
 static swig_cast_info _swigc__p_AmptekHardwareInterface[] = {  {&_swigt__p_AmptekHardwareInterface, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_AmptekSpectrum[] = {  {&_swigt__p_AmptekSpectrum, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_AmptekStatus[] = {  {&_swigt__p_AmptekStatus, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_allocator_type[] = {  {&_swigt__p_allocator_type, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_byte[] = {  {&_swigt__p_byte, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_char[] = {  {&_swigt__p_char, 0, 0, 0},{0, 0, 0, 0}};
@@ -17494,7 +16352,9 @@ static swig_cast_info _swigc__p_std__allocatorT_double_t[] = {  {&_swigt__p_std_
 static swig_cast_info _swigc__p_std__allocatorT_int_t[] = {  {&_swigt__p_std__allocatorT_int_t, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_std__allocatorT_std__string_t[] = {  {&_swigt__p_std__allocatorT_std__string_t, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_std__allocatorT_unsigned_int_t[] = {  {&_swigt__p_std__allocatorT_unsigned_int_t, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__chrono__time_pointT_std__chrono__system_clock_t[] = {  {&_swigt__p_std__chrono__time_pointT_std__chrono__system_clock_t, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_std__invalid_argument[] = {  {&_swigt__p_std__invalid_argument, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_std__pairT_AmptekSpectrum_AmptekStatus_t[] = {  {&_swigt__p_std__pairT_AmptekSpectrum_AmptekStatus_t, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_std__vectorT_double_std__allocatorT_double_t_t[] = {  {&_swigt__p_std__vectorT_double_std__allocatorT_double_t_t, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_std__vectorT_int_std__allocatorT_int_t_t[] = {  {&_swigt__p_std__vectorT_int_std__allocatorT_int_t_t, 0, 0, 0},{0, 0, 0, 0}};
 static swig_cast_info _swigc__p_std__vectorT_std__string_std__allocatorT_std__string_t_t[] = {  {&_swigt__p_std__vectorT_std__string_std__allocatorT_std__string_t_t, 0, 0, 0},{0, 0, 0, 0}};
@@ -17508,6 +16368,8 @@ static swig_cast_info _swigc__p_value_type[] = {  {&_swigt__p_value_type, 0, 0,
 
 static swig_cast_info *swig_cast_initial[] = {
   _swigc__p_AmptekHardwareInterface,
+  _swigc__p_AmptekSpectrum,
+  _swigc__p_AmptekStatus,
   _swigc__p_allocator_type,
   _swigc__p_byte,
   _swigc__p_char,
@@ -17522,7 +16384,9 @@ static swig_cast_info *swig_cast_initial[] = {
   _swigc__p_std__allocatorT_int_t,
   _swigc__p_std__allocatorT_std__string_t,
   _swigc__p_std__allocatorT_unsigned_int_t,
+  _swigc__p_std__chrono__time_pointT_std__chrono__system_clock_t,
   _swigc__p_std__invalid_argument,
+  _swigc__p_std__pairT_AmptekSpectrum_AmptekStatus_t,
   _swigc__p_std__vectorT_double_std__allocatorT_double_t_t,
   _swigc__p_std__vectorT_int_std__allocatorT_int_t_t,
   _swigc__p_std__vectorT_std__string_std__allocatorT_std__string_t_t,
@@ -17912,7 +16776,6 @@ extern "C" {
     static int type_init = 0;
     if (!type_init) {
       const PyTypeObject tmp = {
-        /* PyObject header changed in Python 3 */
 #if PY_VERSION_HEX >= 0x03000000
         PyVarObject_HEAD_INIT(NULL, 0)
 #else
@@ -18144,13 +17007,13 @@ SWIG_init(void) {
   static PyGetSetDef thisown_getset_def = {
     (char *)"thisown", SwigPyBuiltin_GetterClosure, SwigPyBuiltin_SetterClosure, NULL, &thisown_getset_closure
   };
-  PyObject *metatype_args;
   PyTypeObject *builtin_pytype;
   int builtin_base_count;
   swig_type_info *builtin_basetype;
   PyObject *tuple;
   PyGetSetDescrObject *static_getset;
   PyTypeObject *metatype;
+  PyTypeObject *swigpyobject;
   SwigPyClientData *cd;
   PyObject *public_interface, *public_symbol;
   PyObject *this_descr;
@@ -18165,14 +17028,9 @@ SWIG_init(void) {
   (void)static_getset;
   (void)self;
   
-  /* metatype is used to implement static member variables. */
-  metatype_args = Py_BuildValue("(s(O){})", "SwigPyObjectType", &PyType_Type);
-  assert(metatype_args);
-  metatype = (PyTypeObject *) PyType_Type.tp_call((PyObject *) &PyType_Type, metatype_args, NULL);
+  /* Metaclass is used to implement static member variables */
+  metatype = SwigPyObjectType();
   assert(metatype);
-  Py_DECREF(metatype_args);
-  metatype->tp_setattro = (setattrofunc) &SwigPyObjectType_setattro;
-  assert(PyType_Ready(metatype) >= 0);
 #endif
   
   /* Fix SwigMethods to carry the callback ptrs when needed */
@@ -18190,13 +17048,15 @@ SWIG_init(void) {
   SWIG_InitializeModule(0);
   
 #ifdef SWIGPYTHON_BUILTIN
+  swigpyobject = SwigPyObject_TypeOnce();
+  
   SwigPyObject_stype = SWIG_MangledTypeQuery("_p_SwigPyObject");
   assert(SwigPyObject_stype);
   cd = (SwigPyClientData*) SwigPyObject_stype->clientdata;
   if (!cd) {
     SwigPyObject_stype->clientdata = &SwigPyObject_clientdata;
-    SwigPyObject_clientdata.pytype = SwigPyObject_TypeOnce();
-  } else if (SwigPyObject_TypeOnce()->tp_basicsize != cd->pytype->tp_basicsize) {
+    SwigPyObject_clientdata.pytype = swigpyobject;
+  } else if (swigpyobject->tp_basicsize != cd->pytype->tp_basicsize) {
     PyErr_SetString(PyExc_RuntimeError, "Import error: attempted to load two incompatible swig-generated modules.");
 # if PY_VERSION_HEX >= 0x03000000
     return NULL;
@@ -18230,6 +17090,12 @@ SWIG_init(void) {
   
   import_array();
   
+  SWIG_Python_SetConstant(d, "SPECLEN",SWIG_From_int(static_cast< int >(8192)));
+  SWIG_Python_SetConstant(d, "NOT_CONNECTED",SWIG_From_int(static_cast< int >(NOT_CONNECTED)));
+  SWIG_Python_SetConstant(d, "ON",SWIG_From_int(static_cast< int >(ON)));
+  SWIG_Python_SetConstant(d, "RECORDING",SWIG_From_int(static_cast< int >(RECORDING)));
+  SWIG_Python_SetConstant(d, "ERROR",SWIG_From_int(static_cast< int >(ERROR)));
+  SWIG_Python_SetConstant(d, "STATUS_SIZE",SWIG_From_int(static_cast< int >(64)));
 #if PY_VERSION_HEX >= 0x03000000
   return m;
 #else
diff --git a/python/show_list_data.py b/python/show_list_data.py
index e0a99dfcc48d9276d520ee3a21bd1cbbf129c955..95d6f2f674d4e2e2fa0c249f29a96f7e33db40cc 100644
--- a/python/show_list_data.py
+++ b/python/show_list_data.py
@@ -2,7 +2,7 @@
 
 import sys 
 import struct 
-
+import numpy as np 
 
 def read_records(f,datalength):
     records = []
@@ -113,12 +113,23 @@ t = [ r["full_ts"] for r in event_records if "full_ts" in r ]
 a = [ r["amplitude"] for r in event_records if "full_ts" in r ]
 ax2.plot(t,a)
 
+figWF, axesWF = plt.subplots(2,1,sharex=True)
+h2D, tedges, xedges = np.histogram2d( t,a,bins=(1000,1024), range=( (0,max(t)),(0,4096) ) )
+print(h2D.shape)
+axesWF[0].plot( h2D[-1] )
+axesWF[1].imshow(h2D, extent = (0,1024,tedges[0],tedges[-1]), aspect = "auto", origin = "lower" )
+
 fig3, ax3 = plt.subplots() 
 
 event_records = [r for r in records if r["type"] == "event"]
 t = [ r["full_ts"] for r in event_records if "full_ts" in r ]
 a = [ r["frame"] for r in event_records if "full_ts" in r ]
 ax3.plot(t,a)
+
+
+# for i in range(len(records)):
+#     if records[i]['type'] == 'frame':
+#         print( "{:03d}:{:06d}".format( records[i]["frame"],records[i]["ts_upper"] ) )
 plt.show()
 
 
diff --git a/src/AmptekHardwareInterface.cpp b/src/AmptekHardwareInterface.cpp
index 2d466248e54a91b427b4e47f24ff14b28f3391aa..ae68318553c79d0eaf84ae9ab0416f8183a369e6 100644
--- a/src/AmptekHardwareInterface.cpp
+++ b/src/AmptekHardwareInterface.cpp
@@ -20,7 +20,13 @@ AmptekHardwareInterface::~AmptekHardwareInterface(){
 }
 
 
-
+/**
+ * @brief Connect via UDP to the detector
+ * 
+ * @param hostname host of the detector, can be IP address
+ * @param port port on which the amptek is listening. Should be 10001
+ * @param timeout connection timeout in seconds
+ */
 void AmptekHardwareInterface::connectUDP(std::string hostname, int port, double timeout){
 
     if (connection_handler != nullptr){
@@ -32,6 +38,26 @@ void AmptekHardwareInterface::connectUDP(std::string hostname, int port, double
     }
 }
 
+/**
+ * @brief Connect via USB to the detector
+ * 
+ * @param serialNb the serial number of the detector to connect with
+ */
+void AmptekHardwareInterface::connectUSB(int serialNb){
+if (connection_handler != nullptr){
+        throw AmptekException("Amptek is already connected");
+    }
+    else{
+        connection_handler = new AmptekUsbConnectionHandler(serialNb);
+        current_state = ON;
+    }
+}
+
+/**
+ * @brief Connect to a simulator interface
+ * This allows debugging of interface logic without an available hardware to connect to
+ * 
+ */
 void AmptekHardwareInterface::connectSimulator(){
 
     if (connection_handler != nullptr){
@@ -43,23 +69,43 @@ void AmptekHardwareInterface::connectSimulator(){
     }
 }
 
+
+/**
+ * @brief Checks if the stored last spectrum is younger than the given maximum age
+ * 
+ * @param max_age_ms maximum allowed age in milliseconds
+ * @return true if spectrum is young enough
+ * @return false if it is too old
+ */
 bool AmptekHardwareInterface::spectrumAgeOk( double max_age_ms ) const {
     if (max_age_ms < 0){
         return false;
     }
-    auto now = std::chrono::system_clock::now();
-    return std::chrono::duration_cast<std::chrono::milliseconds>(now - last_spectrum_update_time).count() < max_age_ms;
+    return last_spectrum.AgeMillis() < max_age_ms;
 }
 
+
+/**
+ * @brief  Checks if the stored last status is younger than the given maximum age
+ * 
+ * @param max_age_ms maximum allowed age in milliseconds
+ * @return true true if status is young enough
+ * @return false false if it is too old
+ */
 bool AmptekHardwareInterface::statusAgeOk( double max_age_ms ) const {
     if (max_age_ms < 0){
         return false;
     }
-    auto now = std::chrono::system_clock::now();
-    return std::chrono::duration_cast<std::chrono::milliseconds>(now - last_status_update_time).count() < max_age_ms;
+    return last_status.AgeMillis() < max_age_ms;
 }
 
 
+/**
+ * @brief Enables the acquisition on the detector
+ * 
+ * @return true on success
+ * @return false on failure
+ */
 bool AmptekHardwareInterface::Enable(){
     try{
         expectAcknowledge( connection_handler->sendAndReceive( Packet::DP5_PKT_REQUEST_ENABLE ) );
@@ -73,7 +119,12 @@ bool AmptekHardwareInterface::Enable(){
 }
 
 
-
+/**
+ * @brief Disable the acquisition on the detector
+ * 
+ * @return true on success
+ * @return false on failure
+ */
 bool AmptekHardwareInterface::Disable(){
     try{
         expectAcknowledge( connection_handler->sendAndReceive( Packet::DP5_PKT_REQUEST_DISABLE ) );
@@ -85,6 +136,13 @@ bool AmptekHardwareInterface::Disable(){
     }
     return true;
 }
+
+/**
+ * @brief Send a test packet to the detector
+ * 
+ * @return true on success
+ * @return false on failure
+ */
 bool AmptekHardwareInterface::Ping(){
     try{
         expectAcknowledge( connection_handler->sendAndReceive( Packet::DP5_PKT_REQUEST_KEEP_ALIVE_NO_SHARING ) );
@@ -97,6 +155,12 @@ bool AmptekHardwareInterface::Ping(){
     return true;
 }
 
+/**
+ * @brief Clear the current spectrum buffer on the detector
+ * 
+ * @return true on success
+ * @return false on failure
+ */
 bool AmptekHardwareInterface::ClearSpectrum(){
     try{
         expectAcknowledge( connection_handler->sendAndReceive( Packet::DP5_PKT_REQUEST_CLEAR_SPECTRUM ) );
@@ -109,6 +173,18 @@ bool AmptekHardwareInterface::ClearSpectrum(){
     return true;
 }
 
+
+/**
+ * @brief Set the accumulation time for a measurement. The detector will stop automatically when the duration is reached
+ * 
+ * @note The Accumulation timer is stopped while the detector is gated, in transfer mode, reset lockout
+ * or any other mode that temporarily blockes the MCA. Therefore, accumulation time is larger than the real measurement duration
+ * 
+ * @see SetPresetAccumulationTime, SetPresetRealTime, SetPresetCounts
+ * @param t accumulation time in seconds. Minimum is 0.1. If below zero, the accumulation time is not part of the stop condition during acquisition
+ * @return true on success
+ * @return false on failure
+ */
 bool AmptekHardwareInterface::SetPresetAccumulationTime(double t){
     std::stringstream cmd_stream;
     cmd_stream << "PRET=";
@@ -121,6 +197,15 @@ bool AmptekHardwareInterface::SetPresetAccumulationTime(double t){
     return SetTextConfiguration( {cmd_stream.str()} );
 }
 
+
+/**
+ * @brief Set the real time for a measurement. The detector will stop automatically when the duration is reached
+ * 
+ * @see SetPresetAccumulationTime, SetPresetRealTime, SetPresetCounts
+ * @param t real time in seconds. If below zero, the real time is not part of the stop condition during acquisition
+ * @return true on success
+ * @return false on failure
+ */
 bool AmptekHardwareInterface::SetPresetRealTime(double t){
     std::stringstream cmd_stream;
     cmd_stream << "PRER=";
@@ -133,6 +218,15 @@ bool AmptekHardwareInterface::SetPresetRealTime(double t){
     return SetTextConfiguration( {cmd_stream.str()} );
 }
 
+
+/**
+ * @brief Set the count limit for a measurement. The detector will stop automatically when the slow count is reached
+ * 
+ * @see SetPresetAccumulationTime, SetPresetRealTime, SetPresetCounts
+ * @param c maximum slow counts. If below zero, the slow count is not part of the stop condition during acquisition
+ * @return true on success
+ * @return false on failure
+ */
 bool AmptekHardwareInterface::SetPresetCounts(int c){
     std::stringstream cmd_stream;
     cmd_stream << "PREC=";
@@ -145,7 +239,13 @@ bool AmptekHardwareInterface::SetPresetCounts(int c){
     return SetTextConfiguration( {cmd_stream.str()} );
 }
 
-
+/**
+ * @brief Send text configuration parameters to the detector. See DP5 Programmers Guide for available commands
+ * 
+ * @param commands vector of strings in the format "CMD=VAL", each entry in the vector being one config
+ * @return true on success
+ * @return false on failure
+ */
 bool AmptekHardwareInterface::SetTextConfiguration(std::vector<std::string> commands){
     try{
 
@@ -180,6 +280,13 @@ bool AmptekHardwareInterface::SetTextConfiguration(std::vector<std::string> comm
     return true;
 }
 
+
+/**
+ * @brief Configuration read back from the detector
+ * 
+ * @param commands  each element being one configuration parameter CMD
+ * @return std::vector<std::string> vector of strings in the format "CMD=VAL"
+ */
 std::vector<std::string> AmptekHardwareInterface::GetTextConfiguration(std::vector<std::string> commands){
     
         stringstream cmdstream;
@@ -218,25 +325,35 @@ std::vector<std::string> AmptekHardwareInterface::GetTextConfiguration(std::vect
         return configs;
 }
 
-bool AmptekHardwareInterface::updateStatus(double max_age_ms){
+
+/**
+ * @brief Update the detector status if too old
+ * 
+ * @param max_age_ms maximum age of status in milliseconds. If too old, the status will be read from the detector
+ * @return AmptekStatus& reference to the current status object
+ */
+AmptekStatus& AmptekHardwareInterface::updateStatus(double max_age_ms){
     if ( !statusAgeOk(max_age_ms)){
         Packet statusResponse = connection_handler->sendAndReceive( Packet::DP5_PKT_REQUEST_STATUS );
-        //std::cout << statusResponse.size() << std::endl;
         if (statusResponse.at(PID1) != DP5_P1_STATUS_RESPONSE
           || statusResponse.at(PID2) != DP5_P2_STATUS_RESPONSE_INFO)
         {
-              std::cerr<< "Response Packet did not match expected PIDs: " << statusResponse.toString() << std::endl;
-              return false;
+              throw AmptekException("Response Packet did not match expected PIDs: " + statusResponse.toString() );
+              return last_status;
         }
-
-        //std::cout << "copy from status response" << std::endl;
-        memcpy(last_status,&(statusResponse.at(DATA)), statusResponse.dataLength );
-        //std::cout << "done" << std::endl;
-        last_status_update_time = std::chrono::system_clock::now();
+        last_status = AmptekStatus(&(statusResponse.at(DATA)));
     }
-    return true;
+    return last_status;
 }
 
+
+/**
+ * @brief Update the spectrum data if too old
+ * 
+ * @param max_age_ms maximum age of spectrum in milliseconds. If too old, the spectrum will be read from the detector
+ * @return true on success
+ * @return false on failure
+ */
 bool AmptekHardwareInterface::updateSpectrum(double max_age_ms){
     if ( !spectrumAgeOk(max_age_ms)){
         Packet spectrumResponse = connection_handler->sendAndReceive( Packet::DP5_PKT_REQUEST_SPECTRUM_AND_STATUS );
@@ -247,6 +364,7 @@ bool AmptekHardwareInterface::updateSpectrum(double max_age_ms){
               return false;
         }
         bool with_status = true;
+        int spectrum_length;
         switch( spectrumResponse.at(PID2) ){
             case DP5_P2_SPECTRUM_RESPONSE_SPECTRUM256:
                 with_status = false;        // not break! use the respose with status setting the length
@@ -284,16 +402,14 @@ bool AmptekHardwareInterface::updateSpectrum(double max_age_ms){
             case DP5_P2_SPECTRUM_RESPONSE_SPECTRUM8192_STATUS:
                 spectrum_length=8192;
                 break;
+            default:
+                throw AmptekException("Unknown PID2. Cannot read Spectrum Response");
         }
         
         int spectrum_bytesize = 3*spectrum_length;
         try{
-            for (int i = 0; i < spectrum_length; ++i){
-                last_spectrum[i] = mergeBytes( spectrumResponse.at(DATA + 3*i + 2),
-                                            spectrumResponse.at(DATA + 3*i + 1),
-                                            spectrumResponse.at(DATA + 3*i    )
-                                            );
-            }
+            last_spectrum = AmptekSpectrum( &(spectrumResponse.at(DATA) ), spectrum_length );
+
         }
         catch(std::runtime_error& e){
             throw AmptekException(std::string("Failed in AmptekHardwareInterface::updateSpectrum \
@@ -301,10 +417,8 @@ bool AmptekHardwareInterface::updateSpectrum(double max_age_ms){
         }
 
         try{
-            last_spectrum_update_time = std::chrono::system_clock::now();
             if (with_status){
-                memcpy(last_status,&(spectrumResponse.at(DATA + spectrum_bytesize)), spectrumResponse.dataLength - spectrum_bytesize );
-                last_status_update_time = last_spectrum_update_time;
+                last_status = AmptekStatus(&(spectrumResponse.at(DATA + spectrum_bytesize)));
             }
         }
         catch(std::runtime_error& e){
@@ -316,26 +430,22 @@ bool AmptekHardwareInterface::updateSpectrum(double max_age_ms){
     return true;
 }
 
-const byte* AmptekHardwareInterface::readSpectrum(double max_age_ms){
-    throw AmptekException("AmptekHardwareInterface::readSpectrum not implemented");
-
-}
-const byte* AmptekHardwareInterface::readSpectrumAndStatus(const byte* statusbuffer, double max_age_ms){
-    throw AmptekException("AmptekHardwareInterface::readSpectrumAndStatus not implemented");
-
-}
-void AmptekHardwareInterface::connectUSB(int serialNb){
-if (connection_handler != nullptr){
-        throw AmptekException("Amptek is already connected");
-    }
-    else{
-        connection_handler = new AmptekUsbConnectionHandler(serialNb);
-        current_state = ON;
-    }
-}
-
-
 
+/**
+ * @brief Enables the list mode and streams the records into the targetfile 
+ * 
+ * The targetfile will be filled with the packet content of list data response messages
+ * The sync and checksum bytes are stripped from the response, but PIDs and LEN bytes will be written as well.
+ * This allows extending the output with other packet types later on if needed, 
+ * as well as having a clean way to find FIFO overflow packets during analysis
+ * 
+ * This function will invoke a continous loop in a worker thread and will result in 
+ * high load on the USB interface and possibly CPU
+ * 
+ * @param targetfile the path of the file to stream the responses
+ * @return true on success
+ * @return false on failure
+ */
 bool AmptekHardwareInterface::EnableListMode(std::string targetfile){
 
     streamfile.open( targetfile, ios::binary );
@@ -372,6 +482,65 @@ bool AmptekHardwareInterface::EnableListMode(std::string targetfile){
 }
 
 
+
+
+
+/**
+ * @brief Disable the list mode streaming.
+ * 
+ * This will close the target file and delete the worker thread
+ * 
+ * @return true on success
+ * @return false on failure
+ */
+bool AmptekHardwareInterface::DisableListMode(){
+    listmode_flag = false;
+    if (list_reader_thread != nullptr ){
+        list_reader_thread->join();
+        streamfile.close();
+        delete list_reader_thread;
+        list_reader_thread = nullptr;
+        return true;
+    }
+    return false;
+}
+
+
+/**
+ * @brief Reset the frame and counter registers of the list mode timer
+ * 
+ * This will create a 0 time record in the data stream. 
+ * 
+ * @note The list mode timer is free running! This does not stop the timer, only resets it!
+ * @return true on success
+ * @return false on failure
+ */
+bool AmptekHardwareInterface::ResetListModeTimer(){
+    try{
+        expectAcknowledge(connection_handler->sendAndReceive( Packet::DP5_PKT_REQUEST_CLEAR_LIST_TIMER) );
+    }
+    catch(AmptekException& e){
+    
+            std::cerr<< "Failed clearing list-mode timer: " << e.what() << std::endl;
+            return false;
+    }
+    return true;
+}
+
+
+/**
+ * @brief Starts the hardware sequential buffering mode. 
+ * 
+ * THe sequential buffering mode ends, when all buffers are full or the buffering is canceled using stopBuffering.
+ * The hardware channel for buffer triggers is AUX IN 2
+ * 
+ * @note Hardware signals have to be provided to buffer a spectrum
+ * @note On PX5, the Connector input has to be configured to the right AUX input
+ * @note While in buffering mode, spectrum requests will be blocked with an ACK BUSY response packet
+ * 
+ * @return true on success
+ * @return false on failure
+ */
 bool AmptekHardwareInterface::startBuffering(){
     try{
         expectAcknowledge(connection_handler->sendAndReceive( Packet::DP5_PKT_REQUEST_RESTART_SEQ_BUFFERING) );
@@ -381,7 +550,16 @@ bool AmptekHardwareInterface::startBuffering(){
             std::cerr<< "Failed clearing list-mode timer: " << e.what() << std::endl;
             return false;
     }
+    return true;
 }
+
+
+/**
+ * @brief Cancels the hardware sequential buffering mode. 
+ * 
+ * @return true on success
+ * @return false on failure
+ */
 bool AmptekHardwareInterface::stopBuffering(){
     try{
         expectAcknowledge(connection_handler->sendAndReceive( Packet::DP5_PKT_REQUEST_CANCEL_SEQ_BUFFERING) );
@@ -391,119 +569,83 @@ bool AmptekHardwareInterface::stopBuffering(){
             std::cerr<< "Failed clearing list-mode timer: " << e.what() << std::endl;
             return false;
     }
+    return true;
 }
-std::vector<unsigned int> AmptekHardwareInterface::GetBuffered(size_t id){
+
+/**
+ * @brief Get Status and spectrum stored in an hardware buffer on the detector
+ * 
+ * @note This will always return data. It as to be assured externally, that the buffer is really filled
+ * @param id index of the buffer to read from
+ * @return std::pair<AmptekSpectrum, AmptekStatus> spectrum and status stored in the buffer slot
+ */
+std::pair<AmptekSpectrum, AmptekStatus>  AmptekHardwareInterface::GetBufferedSpectrum(size_t id){
     Packet spectrumResponse = connection_handler->sendAndReceive( Packet::generateGetBufferRequest(id) );
     
     //std::cout << spectrumResponse.size() << std::endl;
     if (spectrumResponse.at(PID1) != DP5_P1_SPECTRUM_RESPONSE )
     {
-            std::cerr<< "Response Packet is not of type Spectrum: " << spectrumResponse.toString() << std::endl;
-            return std::vector<unsigned int>();
+            throw AmptekException( "Response Packet is not of type Spectrum: " + spectrumResponse.toString() );
+            
     }
-    bool with_status = true;
+    int spectrum_length;
     switch( spectrumResponse.at(PID2) ){
-        case DP5_P2_SPECTRUM_RESPONSE_SPECTRUM256:
-            with_status = false;        // not break! use the respose with status setting the length
         case DP5_P2_SPECTRUM_RESPONSE_SPECTRUM256_STATUS:
             spectrum_length=256;
             break;
 
-        case DP5_P2_SPECTRUM_RESPONSE_SPECTRUM512:
-            with_status = false;        // not break! use the respose with status setting the length
         case DP5_P2_SPECTRUM_RESPONSE_SPECTRUM512_STATUS:
             spectrum_length=512;
             break;
 
-        case DP5_P2_SPECTRUM_RESPONSE_SPECTRUM1024:
-            with_status = false;        // not break! use the respose with status setting the length
         case DP5_P2_SPECTRUM_RESPONSE_SPECTRUM1024_STATUS:
             spectrum_length=1024;
             break;
 
-        case DP5_P2_SPECTRUM_RESPONSE_SPECTRUM2048:
-            with_status = false;        // not break! use the respose with status setting the length
         case DP5_P2_SPECTRUM_RESPONSE_SPECTRUM2048_STATUS:
             spectrum_length=2048;
             break;
 
-        case DP5_P2_SPECTRUM_RESPONSE_SPECTRUM4096:
-            with_status = false;        // not break! use the respose with status setting the length
         case DP5_P2_SPECTRUM_RESPONSE_SPECTRUM4096_STATUS:
             spectrum_length=4096;
             break;
 
         
-        case DP5_P2_SPECTRUM_RESPONSE_SPECTRUM8192:
-            with_status = false;        // not break! use the respose with status setting the length
         case DP5_P2_SPECTRUM_RESPONSE_SPECTRUM8192_STATUS:
             spectrum_length=8192;
             break;
+        
+        default:
+            throw AmptekException("Invalid PID2. No Status Attached: " + spectrumResponse.toString() );
     }
     
     int spectrum_bytesize = 3*spectrum_length;
-    try{
-        for (int i = 0; i < spectrum_length; ++i){
-            last_spectrum[i] = mergeBytes( spectrumResponse.at(DATA + 3*i + 2),
-                                        spectrumResponse.at(DATA + 3*i + 1),
-                                        spectrumResponse.at(DATA + 3*i    )
-                                        );
-        }
-    }
-    catch(std::runtime_error& e){
-        throw AmptekException(std::string("Failed in AmptekHardwareInterface::updateSpectrum \
-                                during spectrum update: ") + e.what());
-    }
-
-    try{
-        last_spectrum_update_time = std::chrono::system_clock::now();
-        if (with_status){
-            memcpy(last_status,&(spectrumResponse.at(DATA + spectrum_bytesize)), spectrumResponse.dataLength - spectrum_bytesize );
-            last_status_update_time = last_spectrum_update_time;
-        }
-    }
-    catch(std::runtime_error& e){
-        throw AmptekException(std::string("Failed in AmptekHardwareInterface::updateSpectrum \
-                                during status update: ") + e.what());
-    }
-    
-    
-    std::vector<unsigned int> spec( last_spectrum, last_spectrum + spectrum_length );
-	return spec;
-}
-
-
-
-bool AmptekHardwareInterface::DisableListMode(){
-    listmode_flag = false;
-    if (list_reader_thread != nullptr ){
-        list_reader_thread->join();
-        streamfile.close();
-        delete list_reader_thread;
-        list_reader_thread = nullptr;
-        return true;
-    }
-    return false;
-}
-
-bool AmptekHardwareInterface::ResetListModeTimer(){
-    try{
-        expectAcknowledge(connection_handler->sendAndReceive( Packet::DP5_PKT_REQUEST_CLEAR_LIST_TIMER) );
-    }
-    catch(AmptekException& e){
-    
-            std::cerr<< "Failed clearing list-mode timer: " << e.what() << std::endl;
-            return false;
-    }
-}
-
-
-
+    AmptekSpectrum buffered_spectrum( &(spectrumResponse.at(DATA) ), spectrum_length );
+    AmptekStatus buffered_status(&(spectrumResponse.at(DATA + spectrum_bytesize)));
+    return  std::pair<AmptekSpectrum, AmptekStatus>( buffered_spectrum, buffered_status );
+}
+
+
+
+/**
+ * @brief This starts the streaming commtest allowing debugging without a signal source 
+ * 
+ * This will generate predictable counts in the digital backend of the detector, which can be used for MCA, MCS and List Mode.
+ * It will generate signals starting at amplitude min_channel, incrementing by increment until max_channel is reached. Then the generated 
+ * amplitude falls down to min_channel again.
+ * 
+ * @param min_channel lower amplitude limit for generated events
+ * @param max_channel upper amplitude limit for generated events
+ * @param increment amplitude increment between two generated events
+ * @param rate event rate in evt/sec
+ * @return true on success 
+ * @return false on failure
+ */
 bool AmptekHardwareInterface::StartCommtestStreaming(uint16_t min_channel,uint16_t max_channel, 
                                     uint16_t increment, uint32_t rate)
 {
     // convert from rate (cts/sec) to number of fpga clock cycles between two events
-    uint32_t period = std::max(8., FpgaClock()*1e6/rate );
+    uint32_t period = std::max(8., last_status.FpgaClock()*1e6/rate );
     std::cout << "Pulse Period: " << period << std::endl;
     try{
         Packet commtest_packet = Packet::generateCommtestStreamingRequest(min_channel, max_channel, increment, period);
@@ -517,6 +659,14 @@ bool AmptekHardwareInterface::StartCommtestStreaming(uint16_t min_channel,uint16
     }
     return true;
 }
+
+
+/**
+ * @brief Disables the commtest streaming mode 
+ * 
+ * @return true on success
+ * @return false on failure
+ */
 bool AmptekHardwareInterface::StopCommtestStreaming(){
     try{
         expectAcknowledge(connection_handler->sendAndReceive( Packet::DP5_PKT_REQUEST_STOP_STREAM_COMMTEST) );
@@ -538,131 +688,28 @@ bool AmptekHardwareInterface::StopCommtestStreaming(){
 
 std::vector<unsigned int> AmptekHardwareInterface::GetSpectrum(double max_age_ms){
     updateSpectrum(max_age_ms);
-    std::vector<unsigned int> spec( last_spectrum, last_spectrum + spectrum_length );
-	   return spec;
+	return last_spectrum.bins;
 }
 
 
-int AmptekHardwareInterface::GetSpectrum(unsigned int* spectrum, double max_age_ms) {
-    updateSpectrum(max_age_ms);
-    spectrum = last_spectrum;
-    return spectrum_length;
-}
-
+// int AmptekHardwareInterface::GetSpectrum(unsigned int* spectrum, double max_age_ms) {
+//     updateSpectrum(max_age_ms);
+//     spectrum = last_spectrum;
+//     return spectrum_length;
+// }
 
 
-int AmptekHardwareInterface::FastCount(double max_age_ms){
-    updateStatus(max_age_ms);
-    return mergeBytes(last_status[3],last_status[2],last_status[1],last_status[0]);
-}
-
-int AmptekHardwareInterface::SlowCount(double max_age_ms){
-    updateStatus(max_age_ms);
-    return mergeBytes(last_status[7],last_status[6],last_status[5],last_status[4]);
-}
-double AmptekHardwareInterface::DeadTime(double max_age_ms){
-    updateStatus(max_age_ms);
-    int sc = SlowCount(1e6);
-    int fc = FastCount(1e6);
-    if (fc ==0){
-        if (sc ==0){
-            return 0;
-        }else{
-            return 100.;
-        }
-    }
-    return 100. * (1. - 1.0 * sc/fc);
-}
-double AmptekHardwareInterface::AccTime(double max_age_ms){
-    updateStatus(max_age_ms);
-    return 0.001*last_status[12] + 0.1 *  mergeBytes(last_status[15],last_status[14],last_status[13]);
-}
-
-double AmptekHardwareInterface::RealTime(double max_age_ms){
-    updateStatus(max_age_ms);
-    return 0.001 *  mergeBytes(last_status[23],last_status[22],last_status[21],last_status[20]);
-}
-
-int AmptekHardwareInterface::FirmwareMajor(double max_age_ms){
-    updateStatus(max_age_ms);
-    return (last_status[24] >> 4);
-}
-
-int AmptekHardwareInterface::FirmwareMinor(double max_age_ms){
-    updateStatus(max_age_ms);
-    return(last_status[24] & ~(0x0F << 4));
-}
-
-int AmptekHardwareInterface::FirmwareBuild(double max_age_ms){
-    updateStatus(max_age_ms);
-    return(last_status[37] & ~(0x0F << 4));
-}
-
-int AmptekHardwareInterface::FpgaMajor(double max_age_ms){
-    updateStatus(max_age_ms);
-    return (last_status[25] >> 4);
-}
-
-int AmptekHardwareInterface::FpgaMinor(double max_age_ms){
-    updateStatus(max_age_ms);
-    return(last_status[25] & ~(0x0F << 4));
-}
-
-int AmptekHardwareInterface::SerialNb(double max_age_ms){
-    updateStatus(max_age_ms);
-    return mergeBytes(last_status[29],last_status[28],last_status[27],last_status[26]);
-}
-
-double AmptekHardwareInterface::HighVoltage(double max_age_ms){
-    updateStatus(max_age_ms);
-    return 0.5 * static_cast<signed_word16>( mergeBytes(last_status[30],last_status[31]) );
-}
-
-double AmptekHardwareInterface::DetectorTemp(double max_age_ms){
-    updateStatus(max_age_ms);
-    return 0.1 * mergeBytes(last_status[32] & ~(0x0F << 4),last_status[33]);
-}
-
-int AmptekHardwareInterface::BoardTemp(double max_age_ms){
-    updateStatus(max_age_ms);
-    return last_status[34];
-}
-
-bool AmptekHardwareInterface::IsPresetTimeReached(double max_age_ms){
-    updateStatus(max_age_ms);
-    return last_status[35] & (1 << 7);
-}
-
-bool AmptekHardwareInterface::IsEnabled(double max_age_ms){
-    updateStatus(max_age_ms);
-    return last_status[35] & (1 << 5);
-}
-bool AmptekHardwareInterface::IsPresetCountReached(double max_age_ms){
-    updateStatus(max_age_ms);
-    return last_status[35] & (1 << 4);
-}
-bool AmptekHardwareInterface::IsGated(double max_age_ms){
-    updateStatus(max_age_ms);
-    return !( last_status[35] & (1 << 3) );
-}
-int AmptekHardwareInterface::FpgaClock(double max_age_ms){
-    updateStatus(max_age_ms);
-    return last_status[36] & (1 << 1) ?  80 : 20;
-}
-int AmptekHardwareInterface::DeviceType(double max_age_ms){
-    updateStatus(max_age_ms);
-    return last_status[39];
-}
-
-
-double AmptekHardwareInterface::TecVoltage(double max_age_ms){
-    updateStatus(max_age_ms);
-    return 1./758.5 * mergeBytes(last_status[40],last_status[41]);
-}
-
 
 
 
+/**
+ * @brief Throws AmptekException if packet is not of type Acknowledge OK.
+ * 
+ * This function can be wrapped around sendAndReceive calls if the request package ony expects an acknowledge response
+ * 
+ * 
+ * @param packet 
+ */
 void AmptekHardwareInterface::expectAcknowledge(Packet packet){
     if (packet.at(PID1) != DP5_P1_ACK){
         throw AmptekException("Response Package was not an Acknowledge: " + packet.toString());
diff --git a/src/AmptekStatus.cpp b/src/AmptekStatus.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..3fac9e905b2371c94c0914be12bfdb251cb9f46f
--- /dev/null
+++ b/src/AmptekStatus.cpp
@@ -0,0 +1,317 @@
+#include "AmptekStatus.h"
+
+#include <cstring>
+
+AmptekStatus::AmptekStatus(const byte* raw) : AmptekStatus(raw, std::chrono::system_clock::now())
+{
+}
+
+
+
+AmptekStatus::AmptekStatus(const byte* raw, std::chrono::time_point<std::chrono::system_clock> timestamp)
+    : timestamp(timestamp)
+{
+    memcpy(raw_status,raw, STATUS_SIZE );
+}
+AmptekStatus::AmptekStatus(){
+    timestamp = std::chrono::system_clock::from_time_t(0);
+}
+AmptekStatus::~AmptekStatus(){
+    //delete[] raw_status;
+}
+
+
+double AmptekStatus::AgeMillis() const{
+    auto now = std::chrono::system_clock::now();
+    return std::chrono::duration_cast<std::chrono::milliseconds>(now - timestamp).count();
+}
+
+
+/**
+ * @brief Total fast counts of the current acqusition
+ * 
+ * @return int 
+ */
+int AmptekStatus::FastCount(){
+    
+    return mergeBytes(raw_status[3],raw_status[2],raw_status[1],raw_status[0]);
+}
+
+
+/**
+ * @brief Total slow counts of the current acqusition
+ * 
+ * @return int counts
+ */
+int AmptekStatus::SlowCount(){
+    
+    return mergeBytes(raw_status[7],raw_status[6],raw_status[5],raw_status[4]);
+}
+
+/**
+ * @brief Dead time of the current acquisition
+ * 
+ * @return double dead time in per cent
+ */
+double AmptekStatus::DeadTime(){
+    
+    int sc = SlowCount();
+    int fc = FastCount();
+    if (fc ==0){
+        if (sc ==0){
+            return 0;
+        }else{
+            return 100.;
+        }
+    }
+    return 100. * (1. - 1.0 * sc/fc);
+}
+
+/**
+ * @brief Accumulation time of the current acquisition
+ * 
+ * This timer is stopped during gateing, transfer or reset lockout
+ * 
+ * @return double time in seconds
+ */
+double AmptekStatus::AccTime(){
+    
+    return 0.001*raw_status[12] + 0.1 *  mergeBytes(raw_status[15],raw_status[14],raw_status[13]);
+}
+
+/**
+ * @brief Total real time of the current acquisition
+ * 
+ * @return double time in seconds
+ */
+double AmptekStatus::RealTime(){
+    
+    return 0.001 *  mergeBytes(raw_status[23],raw_status[22],raw_status[21],raw_status[20]);
+}
+
+
+/**
+ * @brief Firmware major version number
+ * 
+ * @return int 
+ */
+int AmptekStatus::FirmwareMajor(){
+    
+    return (raw_status[24] >> 4);
+}
+
+
+/**
+ * @brief Firmware minor version number
+ * 
+ * @return int 
+ */
+int AmptekStatus::FirmwareMinor(){
+    
+    return(raw_status[24] & ~(0x0F << 4));
+}
+
+
+/**
+ * @brief Firmware build version number
+ * 
+ * @return int 
+ */
+int AmptekStatus::FirmwareBuild(){
+    
+    return(raw_status[37] & ~(0x0F << 4));
+}
+
+/**
+ * @brief FPGA major version number
+ * 
+ * @return int 
+ */
+int AmptekStatus::FpgaMajor(){
+    
+    return (raw_status[25] >> 4);
+}
+
+
+/**
+ * @brief FPGA minor version number
+ * 
+ * @return int 
+ */
+int AmptekStatus::FpgaMinor(){
+    
+    return(raw_status[25] & ~(0x0F << 4));
+}
+
+
+/**
+ * @brief Device Serial Number
+ * 
+ * @return int 
+ */
+int AmptekStatus::SerialNb(){
+    
+    return mergeBytes(raw_status[29],raw_status[28],raw_status[27],raw_status[26]);
+}
+
+
+/**
+ * @brief Voltage applied accross the chip
+ * 
+ * @return double in volts
+ */
+double AmptekStatus::HighVoltage(){
+    
+    return 0.5 * static_cast<signed_word16>( mergeBytes(raw_status[30],raw_status[31]) );
+}
+
+
+/**
+ * @brief Detector Chip Temperature
+ * 
+ * @return double temperature in Kelvin
+ */
+double AmptekStatus::DetectorTemp(){
+    
+    return 0.1 * mergeBytes(raw_status[32] & ~(0x0F << 4),raw_status[33]);
+}
+
+/**
+ * @brief Amptek Board Temperature
+ * 
+ * @return int in deg Celsius
+ */
+int AmptekStatus::BoardTemp(){
+    
+    return raw_status[34];
+}
+
+/**
+ * @brief Preset time reached flag
+ * 
+ * @return true  if acquisition was stopped due to reaching the set preset time
+ * @return false  if not reached or not set
+ */
+bool AmptekStatus::IsPresetTimeReached(){
+    
+    return raw_status[35] & (1 << 7);
+}
+
+/**
+ * @brief MCA acquisition status
+ * 
+ * @return true if acquisition is running
+ * @return false otherwise
+ */
+bool AmptekStatus::IsEnabled(){
+    
+    return raw_status[35] & (1 << 5);
+}
+
+/**
+ * @brief preset count reached flag
+ * 
+ * @return true if acquisition was stopped due to reaching the set preset counts
+ * @return false if not reached or not set
+ */
+bool AmptekStatus::IsPresetCountReached(){
+    
+    return raw_status[35] & (1 << 4);
+}
+
+/**
+ * @brief Gating status
+ * 
+ * @return true if gate active (rejecting counts)
+ * @return false if disabled or deactivated (accepting counts)
+ */
+bool AmptekStatus::IsGated(){
+    
+    return !( raw_status[35] & (1 << 3) );
+}
+
+/**
+ * @brief FPGA clock speed
+ * 
+ * @return int clock speed in MHz
+ */
+int AmptekStatus::FpgaClock(){
+    
+    return raw_status[36] & (1 << 1) ?  80 : 20;
+}
+
+
+/**
+ * @brief DP5 device type
+ * 
+ * @return int 0: DP5, 1: PX5, 2: DP5G, 3: MCA8000D, 4: TB5, 5: DP5-X
+ */
+int AmptekStatus::DeviceType(){
+    
+    return raw_status[39];
+}
+
+
+/**
+ * @brief Voltage applied to the termoelectric cooler
+ * 
+ * @return double voltage in volts
+ */
+double AmptekStatus::TecVoltage(){
+    
+    return 1./758.5 * mergeBytes(raw_status[40],raw_status[41]);
+}
+
+
+/**
+ * @brief list mode deadtime correction feature
+ * 
+ * @return true deadtime correction feature enabled
+ * @return false normal list mode operation
+ */
+bool AmptekStatus::ListModeLMMO(){
+    return raw_status[43] & (1 << 3);
+}
+
+
+/**
+ * @brief list mode clock speed
+ * 
+ * @return int list mode clock speed in nanoseconds
+ */
+int AmptekStatus::ListModeClock(){
+    int multiplier  = ListModeSync() == 1 ? 1000 : 1;
+    return raw_status[43] & (1 << 2) ? multiplier * 1000 : multiplier * 100;
+}
+
+
+/**
+ * @brief List Mode sync source
+ * 
+ * @return int 0: internal, 1: no timetag, 2: external, 3: frame
+ */
+int AmptekStatus::ListModeSync(){
+    return raw_status[43] & 0b11;
+}
+
+
+/**
+ * @brief Checks if sequential buffering is running
+ * 
+ * @return true if running
+ * @return false if finished or disabled
+ */
+bool AmptekStatus::SequentialBufferRunning(){
+    return raw_status[46] & (1 << 1);
+}
+
+/**
+ * @brief Returns the buffer index of this status packet
+ * 
+ * @return int current buffer index
+ */
+int AmptekStatus::SequentialBufferIndex(){
+    return ( (raw_status[46] & (0b1)) << 8) + raw_status[47]; // 9 bit value
+}
+
+