MNE-CPP  beta 1.0
eego.h
1 #pragma once
2 
3 // To hinder min/max defines to clash with <limits>
4 #define NOMINMAX
5 #include <windows.h>
6 #undef NOMINMAX
7 
8 #include <wtypes.h>
9 
10 #include <string>
11 
12 
13 namespace EEGoSportsPlugin
14 {
15 
16 
18 // TYPE DEFINITIONS
20 
21 
23 // ENUMERATIONS
25 
31 typedef enum
32 {
33  EEGO_CHANNEL_VPWR33 = 64,
34  EEGO_CHANNEL_VPWR50 = 65,
35  EEGO_CHANNEL_VPWR55 = 66,
36  EEGO_CHANNEL_IPWO = 67,
37  EEGO_CHANNEL_VREF = 68,
38  EEGO_CHANNEL_VGND = 69,
39  EEGO_CHANNEL_VDRV = 70,
40  EEGO_CHANNEL_IDRV = 71,
41 
42  EEGO_CHANNEL_FRAME_INDEX = 72,
43  EEGO_CHANNEL_STATUS = 73,
44  EEGO_CHANNEL_CONTROL = 74,
45  EEGO_CHANNEL_PGND_DRIVER = 75,
46  EEGO_CHANNEL_RTC_CTR = 76,
47  EEGO_CHANNEL_RDY_CTR = 77,
48  EEGO_CHANNEL_TRG = 79,
49 } EEGO_CHANNEL;
50 
51 
52 //-----------------------------------------------------------------------
53 // EEGO_STATUS
54 //-----------------------------------------------------------------------
55 typedef enum
56 {
57  EEGO_STATUS_OK = 0x00,
58  EEGO_STATUS_BUSY = 0x01,
59  EEGO_STATUS_E_UNKNOWN = 0x80,
60  EEGO_STATUS_E_NOT_AVAIL = 0xFF,
61 } EEGO_STATUS;
62 
63 
64 //-----------------------------------------------------------------------
65 // EEGO_COMMAND
66 //-----------------------------------------------------------------------
67 typedef enum
68 {
69  // commands
70  EEGO_COMMAND_RESET = 0x01,
71 
72  // set values
73  EEGO_COMMAND_SET_MODE = 0x10,
74  EEGO_COMMAND_SET_CONFIG = 0x11,
75  EEGO_COMMAND_SET_DRIVER_AMP = 0x12,
76  EEGO_COMMAND_SET_DRIVER_PERIOD = 0x13,
77  EEGO_COMMAND_SET_RATE = 0x14,
78  EEGO_COMMAND_SET_GAIN = 0x15,
79  EEGO_COMMAND_SET_MUX = 0x16,
80  // EEGO_COMMAND_SET_TRIGGER_CONFIG = 0x17, // as in 2011-04-01_EEGO64-Firmware-Lot4.4-release\IMO-USB2_Lot4.4\common.h
81  // EEGO_COMMAND_SET_TRIGGER_PERIOD = 0x18, // as in 2011-04-01_EEGO64-Firmware-Lot4.4-release\IMO-USB2_Lot4.4\common.h
82 
83  // EEGO_COMMAND_GET_STATUS = 0x80, // as in 2011-04-01_EEGO64-Firmware-Lot4.4-release\IMO-USB2_Lot4.4\common.h
84  EEGO_COMMAND_GET_BATTERY_LEVEL = 0x81,
85  EEGO_COMMAND_GET_FIRMWARE_NUMBER = 0x82,
86  EEGO_COMMAND_GET_BATTERY_CHARGING = 0x83,
87 
88  // get values
89  EEGO_COMMAND_GET_MODE = 0x90,
90  EEGO_COMMAND_GET_CONFIG = 0x91,
91  EEGO_COMMAND_GET_DRIVER_AMP = 0x92,
92  EEGO_COMMAND_GET_DRIVER_PERIOD = 0x93,
93  EEGO_COMMAND_GET_RATE = 0x94,
94  EEGO_COMMAND_GET_GAIN = 0x95,
95  EEGO_COMMAND_GET_MUX = 0x96
96  // EEGO_COMMAND_GET_TRIGGER_CONFIG = 0x97, // as in 2011-04-01_EEGO64-Firmware-Lot4.4-release\IMO-USB2_Lot4.4\common.h
97  // EEGO_COMMAND_GET_TRIGGER_PERIOD = 0x98, // as in 2011-04-01_EEGO64-Firmware-Lot4.4-release\IMO-USB2_Lot4.4\common.h
98 
99  // note to self: do not define command with value of 0x100
100  // because the commands are represented as one byte of type
101  // uint8_t. 0x100 overflows the unsigned byte and very nasty
102  // nastiness happens.
103 } EEGO_COMMAND;
104 
105 
106 //-----------------------------------------------------------------------
107 // EEGO_CONFIG
108 //-----------------------------------------------------------------------
109 typedef union
110 {
111  USHORT VALUE;
112  struct {
113  USHORT bEnableDAC : 1;
114  USHORT bEnablePWO : 1;
115  USHORT bUnlockOCP : 1;
116  USHORT bRawValues : 1;
117  USHORT uDebugEEGO : 2;
118  USHORT uDebugDACQ : 2;
119  USHORT reserved : 8;
120  } BITS;
121 } EEGO_CONFIG;
122 
123 
124 //-----------------------------------------------------------------------
125 // EEGO_MODE
126 //-----------------------------------------------------------------------
127 typedef enum
128 {
129  EEGO_MODE_IDLE = 1,
130  EEGO_MODE_STREAMING = 2,
131  EEGO_MODE_CALIBRATION = 3,
132  EEGO_MODE_IMPEDANCE_CHA = 4,
133  EEGO_MODE_IMPEDANCE_REF = 5,
134 } EEGO_MODE;
135 
136 
137 //-----------------------------------------------------------------------
138 // EEGO_RATE
139 //-----------------------------------------------------------------------
140 typedef enum
141 {
142  EEGO_RATE_500HZ = 500,
143  EEGO_RATE_512HZ = 512,
144  EEGO_RATE_1000HZ = 1000,
145  EEGO_RATE_1024HZ = 1024,
146  EEGO_RATE_2000HZ = 2000,
147  EEGO_RATE_2048HZ = 2048,
148  EEGO_RATE_4000HZ = 4000,
149  EEGO_RATE_4096HZ = 4096,
150  EEGO_RATE_8000HZ = 8000,
151  EEGO_RATE_8192HZ = 8192,
152  EEGO_RATE_16000HZ = 16000,
153  EEGO_RATE_16384HZ = 16384
154 } EEGO_RATE;
155 
156 
157 //-----------------------------------------------------------------------
158 // EEGO_GAIN
159 //-----------------------------------------------------------------------
160 typedef enum
161 {
162  EEGO_GAIN_1X = 1,
163  EEGO_GAIN_2X = 2,
164  EEGO_GAIN_3X = 3,
165  EEGO_GAIN_4X = 4,
166  EEGO_GAIN_6X = 6,
167  EEGO_GAIN_8X = 8,
168  EEGO_GAIN_12X = 12,
169 } EEGO_GAIN;
170 
171 
172 //-----------------------------------------------------------------------
173 // EEGO_MUX
174 //-----------------------------------------------------------------------
175 typedef enum
176 {
177  EEGO_MUX_NORMAL = 1,
178  EEGO_MUX_SHORTED = 2,
179  EEGO_MUX_RLD_CONJ = 3,
180  EEGO_MUX_MVDD = 4,
181  EEGO_MUX_TEMP = 5,
182  EEGO_MUX_TEST = 6,
183  EEGO_MUX_RLD_DRP = 7,
184  EEGO_MUX_RLD_DRN = 8,
185 } EEGO_MUX;
186 
187 
188 //-----------------------------------------------------------------------
189 // EEGO_ADC
190 //-----------------------------------------------------------------------
191 typedef enum
192 {
193  EEGO_ADC_A = 0x00,
194  EEGO_ADC_B = 0x01,
195  EEGO_ADC_C = 0x02,
196  EEGO_ADC_D = 0x03,
197  EEGO_ADC_E = 0x04,
198  EEGO_ADC_F = 0x05,
199  EEGO_ADC_G = 0x06,
200  EEGO_ADC_H = 0x07,
201  EEGO_ADC_S = 0x08,
202 } EEGO_ADC;
203 
204 
205 //-----------------------------------------------------------------------
206 // EEGO_DEBUG_EEGO
207 //-----------------------------------------------------------------------
208 typedef enum
209 {
210  EEGO_DEBUG_EEGO_NONE = 0,
211  EEGO_DEBUG_EEGO_STREAMER = 1,
212  EEGO_DEBUG_EEGO_RESERVED = 2,
213  EEGO_DEBUG_EEGO_TOGGLE = 3,
214 } EEGO_DEBUG_EEGO;
215 
216 
217 //-----------------------------------------------------------------------
218 // EEGO_DEBUG_DACQ
219 //-----------------------------------------------------------------------
220 typedef enum
221 {
222  EEGO_DEBUG_DACQ_NONE = 0,
223  EEGO_DEBUG_DACQ_INDICES = 1,
224  EEGO_DEBUG_DACQ_SAMPLES = 2,
225  EEGO_DEBUG_DACQ_TOGGLE = 3,
226 } EEGO_DEBUG_DACQ;
227 
228 
229 //-----------------------------------------------------------------------
230 // EEGO_REQUEST
231 //-----------------------------------------------------------------------
232 typedef SHORT EEGO_REQVAL;
233 typedef BYTE EEGO_REQRESV;
234 typedef BYTE EEGO_REQLEN;
235 typedef BYTE EEGO_REQDATA;
236 
237 typedef struct
238 {
239  EEGO_COMMAND eCommand; // 1 byte
240  EEGO_REQRESV uRerserved; // 1 byte
241  EEGO_REQVAL uValue; // 2 bytes
242  EEGO_ADC eAdc; // 1 byte
243  EEGO_REQLEN uLength; // 1 bytes
244  EEGO_REQDATA uData[48];
245 } EEGO_REQUEST;
246 
247 
249 // STRUCTURES
252 {
253  BYTE buffer[6];
254 };
255 
256 
258 //
259 // Forward declarations
260 //
262 class IAmplifier;
263 class IBuffer;
264 
265 
267 //
268 // class IAmplifier
269 //
271 
277 {
278 public:
279  virtual ULONG AddRef( )=NULL;
280  virtual ULONG Release( )=NULL;
281 
282 public:
283  //-------------------------------------------------------------------
284  // PUBLISHED METHODS
285  //-------------------------------------------------------------------
286 
290  virtual HRESULT EnumDevices( UINT* puiDeviceCount )=NULL;
291  virtual HRESULT EnumDevices( UINT uiDeviceIndex, LPTSTR* pszDeviceName )=NULL;
292 
296  virtual HRESULT Connect( UINT uiDeviceIndex=0 )=NULL;
297  virtual HRESULT Connect( LPCTSTR szSerial )=NULL;
298 
302  virtual HRESULT Disconnect( )=NULL;
303 
307  virtual HRESULT Reset( )=NULL;
308 
312  virtual HRESULT GetData( IBuffer** ppBuffer )=NULL;
313 
314  //-------------------------------------------------------------------
315  // PUBLISHED PROPERTIES
316  //-------------------------------------------------------------------
317 
321  virtual BOOL Connected( )=NULL;
322 
326  virtual HRESULT GetMode( EEGO_MODE* peMode )=NULL;
327  virtual HRESULT SetMode( EEGO_MODE eMode )=NULL;
328 
332  virtual HRESULT GetConfig( EEGO_CONFIG* psConfig )=NULL;
333  virtual HRESULT SetConfig( EEGO_CONFIG sConfig )=NULL;
334 
339  virtual HRESULT GetDriverAmplitude( SHORT* pnAmplitude )=NULL;
340  virtual HRESULT SetDriverAmplitude( SHORT nAmplitude )=NULL;
341 
345  virtual HRESULT GetDriverPeriod( USHORT* puPeriod )=NULL;
346  virtual HRESULT SetDriverPeriod( USHORT uPeriod )=NULL;
347 
351  virtual HRESULT GetSamplingRate( EEGO_RATE* peSamplingRate )=NULL;
352  virtual HRESULT SetSamplingRate( EEGO_RATE eSamplingRate )=NULL;
353 
357  virtual HRESULT GetSignalGain( EEGO_GAIN* peSignalGain, EEGO_ADC eAdc )=NULL;
358  virtual HRESULT SetSignalGain( EEGO_GAIN eSignalGain, EEGO_ADC eAdc )=NULL;
359 
363  virtual HRESULT GetSignalMux( EEGO_MUX* peSignalMux, EEGO_ADC eAdc )=NULL;
364  virtual HRESULT SetSignalMux( EEGO_MUX eSignalMux, EEGO_ADC eAdc )=NULL;
365 
369  virtual HRESULT GetBatteryLevel( USHORT* puLevel )=NULL;
370 
374  virtual HRESULT GetFirmwareVersion( USHORT* puVersion )=NULL;
375 
379  virtual HRESULT GetBatteryCharging( USHORT* puVersion )=NULL;
380 
381  virtual void DumpData(const std::string& fileName, bool bDump)=NULL;
382 };
383 
384 
385 
387 //
388 // class IBuffer
389 //
391 
395 class IBuffer
396 {
397 public:
398  enum ErrorStates : int
399  {
400  NoError = 0,
401  BadPacketStatus = 1,
402  InternalError = 2,
403  UnknownPacket = 4,
404  UnknownReport = 8,
405  ErrorBits = 16,
406  SkippedReport = 32
407  };
408 
409  virtual ULONG AddRef( )=NULL;
410  virtual ULONG Release( )=NULL;
411 
412 public:
413  //-------------------------------------------------------------------
414  // PUBLISHED PROPERTIES
415  //-------------------------------------------------------------------
416 
420  virtual LONG* GetBuffer( )=NULL;
421  virtual LONG GetBuffer( UINT i )=NULL;
422  virtual LONG GetBuffer( UINT ci, UINT si )=NULL;
423 
427  virtual UINT GetChannelCount( )=NULL;
428 
432  virtual UINT GetSampleCount( )=NULL;
433 
434  virtual int GetErrors() const = NULL;
435  virtual void ClearErrors() = NULL;
436 };
437 
439 // GLOBAL FUNCTIONS
441 HRESULT CreateAmplifierObject( IAmplifier** ppAmplifier );
442 
443 
444 } // namespaces