random warning fixes
[fceu.git] / boards / __serial.c
1 \r
2 #include "__serial.h"\r
3 \r
4 HANDLE SerialPort = NULL;  // Handle of SerialPort itself.\r
5 \r
6 BOOL SerialOpen(int port, int baud)\r
7 {\r
8   HANDLE Comport;\r
9   DCB myDCB;\r
10   COMMTIMEOUTS CTout;\r
11   char str[100];\r
12 \r
13   if (port > 9)\r
14     sprintf(str, "\\\\.\\COM%d", port);\r
15   else\r
16     sprintf(str, "COM%d", port);\r
17 \r
18   // Open the serial port\r
19   if ((Comport = CreateFile(str, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL)) == INVALID_HANDLE_VALUE)\r
20     return FALSE;\r
21 \r
22   // Configure Serial port (Setup Comm)\r
23 \r
24   // Buffer sizes\r
25   if (!SetupComm(Comport, 128, 128))\r
26     return FALSE;\r
27 \r
28   // Setup DCB using current values\r
29   if (!GetCommState(Comport, &myDCB))\r
30     return FALSE;\r
31 \r
32   myDCB.fInX = FALSE;     // Turn off xon/xoff handler\r
33   myDCB.fOutX = FALSE;\r
34   myDCB.fOutxDsrFlow = FALSE;\r
35   myDCB.fOutxCtsFlow = FALSE;    // no hardware flow control.\r
36   myDCB.BaudRate = baud;\r
37   myDCB.DCBlength = sizeof(DCB);\r
38   myDCB.fBinary = 1;\r
39   myDCB.fParity = 0;\r
40   myDCB.fDtrControl = DTR_CONTROL_DISABLE;\r
41   myDCB.fDsrSensitivity = 0;\r
42   myDCB.fTXContinueOnXoff = 1;\r
43   myDCB.fNull = 0;\r
44   myDCB.fRtsControl = RTS_CONTROL_DISABLE;\r
45   myDCB.fDummy2 = 0;\r
46   myDCB.wReserved = 0;\r
47   myDCB.Parity = NOPARITY;\r
48   myDCB.StopBits = ONESTOPBIT;\r
49   myDCB.wReserved1 = 0;\r
50   myDCB.ByteSize = 8;\r
51 \r
52   if (!SetCommState(Comport, &myDCB))\r
53         return FALSE;\r
54 \r
55   // Set timeouts\r
56   CTout.ReadIntervalTimeout = 0xffffffff;\r
57   CTout.ReadTotalTimeoutMultiplier = 0;\r
58   CTout.ReadTotalTimeoutConstant = 0;\r
59   CTout.WriteTotalTimeoutMultiplier = 0;\r
60   CTout.WriteTotalTimeoutConstant = 5000;         // don't hang if CTS is locked, for example\r
61 \r
62   SetCommTimeouts(Comport, &CTout);\r
63   EscapeCommFunction(Comport, SETDTR);\r
64   PurgeComm(Comport, PURGE_TXCLEAR | PURGE_RXCLEAR);\r
65 \r
66   SerialPort = Comport;\r
67 \r
68   return TRUE;\r
69 }\r
70 \r
71 void SerialClose(void)\r
72 {\r
73   if (SerialPort == NULL) return;\r
74 \r
75   PurgeComm(SerialPort, PURGE_TXCLEAR | PURGE_RXCLEAR);\r
76   CloseHandle(SerialPort);\r
77 \r
78   SerialPort = NULL;\r
79 }\r
80 \r
81 BOOL SerialSendChar(int c)\r
82 {\r
83   DWORD cr;\r
84   if(WriteFile(SerialPort, &c, 1, (LPDWORD)&cr, NULL) && cr)\r
85     return TRUE;\r
86   else\r
87     return FALSE;\r
88 }\r
89 \r
90 int SerialIsOpen(void)\r
91 {\r
92   return (SerialPort != NULL);\r
93 }\r
94 \r
95 int SerialGetChar(void)\r
96 {\r
97   uint8 ch;\r
98   DWORD cr;\r
99   if (SerialPort != NULL) {\r
100     if (ReadFile(SerialPort, &ch, 1, (LPDWORD)&cr, NULL) && cr)\r
101       return (int)ch;\r
102   }\r
103   return EOF;\r
104 }\r
105 \r
106 void SendCmd(uint8 *cmd, int size)\r
107 {\r
108    int i;\r
109    for(i=0; i<size; i++) {\r
110      SerialSendChar(cmd[i]);\r
111    }\r
112 }\r
113 \r
114 int ReadResp(uint8 *resp, int size)\r
115 {\r
116    int i = 0, sum = 0, data;\r
117    while(i < size) {\r
118            while ((data = SerialGetChar()) == EOF) {}\r
119        resp[i] = data & 0xff;\r
120        sum += (data & 0xff);\r
121        i++;\r
122    }\r
123    return sum;\r
124 }\r