summaryrefslogtreecommitdiff
path: root/wpd/WpdBasicHardwareDriver/RS232Connection.h
blob: cd7f10b7688426294fdbfabfe5324147c204fdac (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
#pragma once

//
// Sensor device structures and definitions
//

// 
// Format of the 9-byte receive packet (device to PC):
// 
// ORIGINAL TEMP_SENSOR PACKET FORMAT: [ VALUE (4 bytes) | INTERVAL (5 bytes) ]
//
// Format of the multi-byte receive packet (device to PC):
//
// NEW PACKET FORMAT:      [ SENSOR_ID (1 byte) | ELEMENT_COUNT (1 byte) | ELEMENT_SIZE (1 byte) | ELEMENTS (size bytes) | INTERVAL (5 bytes) ]
// COMPASS PACKET FORMAT:  [ SENSOR_ID = 1      | ELEMENT_COUNT = 1      | ELEMENT_SIZE = 3      | HEADING 3-bytes   | INTERVAL (5 bytes) ]
// SENSIRON PACKET FORMAT: [ SENSOR_ID = 2      | ELEMENT_COUNT = 1      | ELEMENT_SIZE = 7      | TEMP 4-bytes | HUMIDITY 3-bytes    | INTERVAL (5 bytes) ]
// FLEX PACKET FORMAT:     [ SENSOR_ID = 3      | ELEMENT_COUNT = 1      | ELEMENT_SIZE = 5      | PRESSURE 5-bytes   | INTERVAL (5 bytes) ]
// PING PACKET FORMAT:     [ SENSOR_ID = 4      | ELEMENT_COUNT = 1      | ELEMENT_SIZE = 5      | PRESSURE 5-bytes   | INTERVAL (5 bytes) ]
// PIR PACKET FORMAT:      [ SENSOR_ID = 5      | ELEMENT_COUNT = 1      | ELEMENT_SIZE = 1      | STATE 1-byte      | INTERVAL (5 bytes) ]
// MEMSIC PACKET FORMAT:   [ SENSOR_ID = 6      | ELEMENT_COUNT = 1      | ELEMENT_SIZE = 6      | X-Axis Gs 3-bytes |  Y-Axis Gs 3-bytes | INTERVAL (5 bytes) ]
// QTI PACKET FORMAT:      [ SENSOR_ID = 7      | ELEMENT_COUNT = 1      | ELEMENT_SIZE = 4      | PRESSURE 4-bytes   | INTERVAL (5 bytes) ]
// PIEZO PACKET FORMAT:    [ SENSOR_ID = 8      | ELEMENT_COUNT = 1      | ELEMENT_SIZE = 1      | STATE 1-byte        | INTERVAL (5 bytes)
// HITACHI PACKET FORMAT:  [ SENSOR_ID = 9      | ELEMENT_COUNT = 3      | ELEMENT_SIZE = 4      | X-Axis Gs 4-bytes |  Y-Axis Gs 4-bytes | Z-Axis Gs 4-bytes | INTERVAL (5 bytes) ]
//
//
// Format of the 6-byte send packet (PC to device):
// The final NULL byte signals the SERIN DEC formatter to stop reading
//
// [ INTERVAL (5 bytes) | 0 (1 byte) ]
//
#define INTERVAL_DATA_LENGTH        6   // count of bytes for interval
#define MIN_DATA_LENGTH             4   // minimum count of bytes for any sensor
#define MAX_DATA_LENGTH             21  // maximum count of bytes for any sensor
#define MAX_AMOUNT_TO_READ          (MAX_DATA_LENGTH+INTERVAL_DATA_LENGTH)  // maximum total bytes to read

#define MEMSIC_DATA_LENGTH          9  // count of data bytes for Memsic dual-axis accelerometer
#define HITACHI_DATA_LENGTH         15  // count of data bytes for Hitachi tri-axis accelerometer
#define COMPASS_DATA_LENGTH         6   // count of data bytes for Compass
#define SENSIRON_DATA_LENGTH        10  // count of data bytes for Sensiron temp/humidity sensor
#define PING_DATA_LENGTH            8   // count of data bytes for Ping distance sensor
#define FLEX_DATA_LENGTH            8   // count of data bytes for Flexiforce pressure sensor
#define PIR_DATA_LENGTH             4   // count of data bytes for PIR
#define QTI_DATA_LENGTH             7   // count of data bytes for QTI
#define PIEZO_DATA_LENGTH           4   // count of data bytes for Piezo

#define MEMSIC_AMOUNT_TO_READ       (MEMSIC_DATA_LENGTH+INTERVAL_DATA_LENGTH)   // total Memsic byte count
#define HITACHI_AMOUNT_TO_READ      (HITACHI_DATA_LENGTH+INTERVAL_DATA_LENGTH)  // total Hitachi byte count
#define COMPASS_AMOUNT_TO_READ      (COMPASS_DATA_LENGTH+INTERVAL_DATA_LENGTH)  // total Compass byte count
#define SENSIRON_AMOUNT_TO_READ     (SENSIRON_DATA_LENGTH+INTERVAL_DATA_LENGTH) // total Sensiron byte count
#define PING_AMOUNT_TO_READ         (PING_DATA_LENGTH+INTERVAL_DATA_LENGTH)     // total Ping byte count
#define FLEX_AMOUNT_TO_READ         (FLEX_DATA_LENGTH+INTERVAL_DATA_LENGTH)     // total Flexiforce byte count
#define PIR_AMOUNT_TO_READ          (PIR_DATA_LENGTH+INTERVAL_DATA_LENGTH)      // total PIR byte count
#define QTI_AMOUNT_TO_READ          (QTI_DATA_LENGTH+INTERVAL_DATA_LENGTH)      // total QTI byte count
#define PIEZO_AMOUNT_TO_READ        (PIEZO_DATA_LENGTH+INTERVAL_DATA_LENGTH)    // total Piezo byte count

#define DEVICE_ID                   0   // byte 0 contains the Device ID
#define ELEMENT_SIZE                1   // byte 1 contains the Element Size
#define ELEMENT_COUNT               2   // byte 2 contains the Element Count

// Update interval range in milliseconds
#define SENSOR_UPDATE_INTERVAL_MIN  10      // milliseconds
#define SENSOR_UPDATE_INTERVAL_MAX  60000   // milliseconds
#define SENSOR_UPDATE_INTERVAL_STEP 1       // milliseconds

// TODO: Change these range values to match your sensor hardware
#define SENSOR_READING_MIN          1   // ?Units
#define SENSOR_READING_MAX          378 // ?Units
#define SENSOR_READING_STEP         1   // ?Units

// TODO: Change this to match the default COM port to use
#define COM_PORT_NAME               L"COM1"
#define NUM_READSTAT_HANDLES        4
#define MAX_STATUS_LENGTH           100

// Ascii definitions
#define ASCII_BEL                   0x07
#define ASCII_BS                    0x08
#define ASCII_LF                    0x0A
#define ASCII_CR                    0x0D
#define ASCII_XON                   0x11
#define ASCII_XOFF                  0x13

// Miscellaneous definitions
#define MAX_READ_BUFFER             2048
#define MAX_WRITE_BUFFER            1024
#define EVENTFLAGS_DEFAULT          EV_BREAK | EV_CTS | EV_DSR | EV_ERR | EV_RING | EV_RLSD
#define FLAGCHAR_DEFAULT            '\n'

// Read states
#define RECEIVE_TTY                 0x01
#define RECEIVE_CAPTURED            0x02

class RS232Connection
{

public:
    RS232Connection();

    ~RS232Connection()
    {
        Disconnect();
    }

    HRESULT Connect(_In_ LPCWSTR wszPortName, _Out_ HANDLE *phCommPort);
    void Disconnect();

private:
    HRESULT SetPortState();

private:

    //
    // Required for the RS232 initialization and communication.
    //

    // TTY member variables and defines
    HANDLE       m_hCommPort;
    DWORD        m_dwEventFlags;
    CHAR         m_chFlag;
    CHAR         m_chXON;
    CHAR         m_chXOFF;
    WORD         m_wXONLimit;
    WORD         m_wXOFFLimit;
    DWORD        m_fRtsControl;
    DWORD        m_fDtrControl;
    BOOL         m_fConnected; 
    BOOL         m_fTransferring; 
    BOOL         m_fRepeating;
    BOOL         m_fLocalEcho;
    BOOL         m_fNewLine;
    BOOL         m_fDisplayErrors; 
    BOOL         m_fAutowrap;
    BOOL         m_fCTSOutFlow;
    BOOL         m_fDSROutFlow;
    BOOL         m_fDSRInFlow;
    BOOL         m_fXonXoffOutFlow;
    BOOL         m_fXonXoffInFlow;
    BOOL         m_fTXafterXoffSent;
    BOOL         m_fNoReading;
    BOOL         m_fNoWriting;
    BOOL         m_fNoEvents;
    BOOL         m_fNoStatus;
    BOOL         m_fDisplayTimeouts;
    BYTE         m_bPort;
    BYTE         m_bByteSize;
    BYTE         m_bParity;
    BYTE         m_bStopBits;
    DWORD        m_dwBaudRate;
    COMMTIMEOUTS m_timeoutsorig;
    COMMTIMEOUTS m_timeoutsnew;
    COMMTIMEOUTS m_TimeoutsDefault;
    DWORD        m_dwReceiveState;
};