mirror of
https://github.com/Ed94/Odin.git
synced 2026-08-06 15:48:51 +00:00
Merge pull request #3787 from jasonKercher/more-windows-comm
Add more bindings for comm ports and console events
This commit is contained in:
@@ -38,16 +38,30 @@ foreign kernel32 {
|
|||||||
lpNumberOfCharsWritten: LPDWORD,
|
lpNumberOfCharsWritten: LPDWORD,
|
||||||
lpReserved: LPVOID) -> BOOL ---
|
lpReserved: LPVOID) -> BOOL ---
|
||||||
|
|
||||||
|
PeekConsoleInputW :: proc(hConsoleInput: HANDLE,
|
||||||
|
lpBuffer: ^INPUT_RECORD,
|
||||||
|
nLength: DWORD,
|
||||||
|
lpNumberOfEventsRead: LPDWORD) -> BOOL ---
|
||||||
|
|
||||||
|
ReadConsoleInputW :: proc(hConsoleInput: HANDLE,
|
||||||
|
lpBuffer: ^INPUT_RECORD,
|
||||||
|
nLength: DWORD,
|
||||||
|
lpNumberOfEventsRead: LPDWORD) -> BOOL ---
|
||||||
|
|
||||||
GetConsoleMode :: proc(hConsoleHandle: HANDLE,
|
GetConsoleMode :: proc(hConsoleHandle: HANDLE,
|
||||||
lpMode: LPDWORD) -> BOOL ---
|
lpMode: LPDWORD) -> BOOL ---
|
||||||
SetConsoleMode :: proc(hConsoleHandle: HANDLE,
|
SetConsoleMode :: proc(hConsoleHandle: HANDLE,
|
||||||
dwMode: DWORD) -> BOOL ---
|
dwMode: DWORD) -> BOOL ---
|
||||||
SetConsoleCursorPosition :: proc(hConsoleHandle: HANDLE,
|
SetConsoleCursorPosition :: proc(hConsoleHandle: HANDLE,
|
||||||
dwCursorPosition: COORD) -> BOOL ---
|
dwCursorPosition: COORD) -> BOOL ---
|
||||||
SetConsoleTextAttribute :: proc(hConsoleOutput: HANDLE,
|
SetConsoleTextAttribute :: proc(hConsoleOutput: HANDLE,
|
||||||
wAttributes: WORD) -> BOOL ---
|
wAttributes: WORD) -> BOOL ---
|
||||||
|
GetConsoleCP :: proc() -> UINT ---
|
||||||
|
SetConsoleCP :: proc(wCodePageID: UINT) -> BOOL ---
|
||||||
|
GetConsoleOutputCP :: proc() -> UINT ---
|
||||||
SetConsoleOutputCP :: proc(wCodePageID: UINT) -> BOOL ---
|
SetConsoleOutputCP :: proc(wCodePageID: UINT) -> BOOL ---
|
||||||
|
FlushConsoleInputBuffer :: proc(hConsoleInput: HANDLE) -> BOOL ---
|
||||||
|
|
||||||
GetFileInformationByHandle :: proc(hFile: HANDLE, lpFileInformation: LPBY_HANDLE_FILE_INFORMATION) -> BOOL ---
|
GetFileInformationByHandle :: proc(hFile: HANDLE, lpFileInformation: LPBY_HANDLE_FILE_INFORMATION) -> BOOL ---
|
||||||
SetHandleInformation :: proc(hObject: HANDLE,
|
SetHandleInformation :: proc(hObject: HANDLE,
|
||||||
dwMask: DWORD,
|
dwMask: DWORD,
|
||||||
@@ -85,6 +99,12 @@ foreign kernel32 {
|
|||||||
RemoveDirectoryW :: proc(lpPathName: LPCWSTR) -> BOOL ---
|
RemoveDirectoryW :: proc(lpPathName: LPCWSTR) -> BOOL ---
|
||||||
SetFileAttributesW :: proc(lpFileName: LPCWSTR, dwFileAttributes: DWORD) -> BOOL ---
|
SetFileAttributesW :: proc(lpFileName: LPCWSTR, dwFileAttributes: DWORD) -> BOOL ---
|
||||||
SetLastError :: proc(dwErrCode: DWORD) ---
|
SetLastError :: proc(dwErrCode: DWORD) ---
|
||||||
|
GetCommTimeouts :: proc(handle: HANDLE, timeouts: ^COMMTIMEOUTS) -> BOOL ---
|
||||||
|
SetCommTimeouts :: proc(handle: HANDLE, timeouts: ^COMMTIMEOUTS) -> BOOL ---
|
||||||
|
ClearCommError :: proc(hFile: HANDLE, lpErrors: ^Com_Error, lpStat: ^COMSTAT) -> BOOL ---
|
||||||
|
GetCommState :: proc(handle: HANDLE, dcb: ^DCB) -> BOOL ---
|
||||||
|
SetCommState :: proc(handle: HANDLE, dcb: ^DCB) -> BOOL ---
|
||||||
|
GetCommPorts :: proc(lpPortNumbers: PULONG, uPortNumbersCount: ULONG, puPortNumbersFound: PULONG) -> ULONG ---
|
||||||
GetCommandLineW :: proc() -> LPCWSTR ---
|
GetCommandLineW :: proc() -> LPCWSTR ---
|
||||||
GetTempPathW :: proc(nBufferLength: DWORD, lpBuffer: LPCWSTR) -> DWORD ---
|
GetTempPathW :: proc(nBufferLength: DWORD, lpBuffer: LPCWSTR) -> DWORD ---
|
||||||
GetCurrentProcess :: proc() -> HANDLE ---
|
GetCurrentProcess :: proc() -> HANDLE ---
|
||||||
@@ -1016,82 +1036,6 @@ PHANDLER_ROUTINE :: HandlerRoutine
|
|||||||
// NOTE(Jeroen, 2024-06-13): As Odin now supports bit_fields, we no longer need
|
// NOTE(Jeroen, 2024-06-13): As Odin now supports bit_fields, we no longer need
|
||||||
// a helper procedure. `init_dcb_with_config` and `get_dcb_config` have been removed.
|
// a helper procedure. `init_dcb_with_config` and `get_dcb_config` have been removed.
|
||||||
|
|
||||||
DTR_Control :: enum byte {
|
|
||||||
Disable = 0,
|
|
||||||
Enable = 1,
|
|
||||||
Handshake = 2,
|
|
||||||
}
|
|
||||||
RTS_Control :: enum byte {
|
|
||||||
Disable = 0,
|
|
||||||
Enable = 1,
|
|
||||||
Handshake = 2,
|
|
||||||
Toggle = 3,
|
|
||||||
}
|
|
||||||
Parity :: enum byte {
|
|
||||||
None = 0,
|
|
||||||
Odd = 1,
|
|
||||||
Even = 2,
|
|
||||||
Mark = 3,
|
|
||||||
Space = 4,
|
|
||||||
}
|
|
||||||
Stop_Bits :: enum byte {
|
|
||||||
One = 0,
|
|
||||||
One_And_A_Half = 1,
|
|
||||||
Two = 2,
|
|
||||||
}
|
|
||||||
|
|
||||||
DCB :: struct {
|
|
||||||
DCBlength: DWORD,
|
|
||||||
BaudRate: DWORD,
|
|
||||||
using _: bit_field DWORD {
|
|
||||||
fBinary: bool | 1,
|
|
||||||
fParity: bool | 1,
|
|
||||||
fOutxCtsFlow: bool | 1,
|
|
||||||
fOutxDsrFlow: bool | 1,
|
|
||||||
fDtrControl: DTR_Control | 2,
|
|
||||||
fDsrSensitivity: bool | 1,
|
|
||||||
fTXContinueOnXoff: bool | 1,
|
|
||||||
fOutX: bool | 1,
|
|
||||||
fInX: bool | 1,
|
|
||||||
fErrorChar: bool | 1,
|
|
||||||
fNull: bool | 1,
|
|
||||||
fRtsControl: RTS_Control | 2,
|
|
||||||
fAbortOnError: bool | 1,
|
|
||||||
},
|
|
||||||
wReserved: WORD,
|
|
||||||
XOnLim: WORD,
|
|
||||||
XOffLim: WORD,
|
|
||||||
ByteSize: BYTE,
|
|
||||||
Parity: Parity,
|
|
||||||
StopBits: Stop_Bits,
|
|
||||||
XonChar: byte,
|
|
||||||
XoffChar: byte,
|
|
||||||
ErrorChar: byte,
|
|
||||||
EofChar: byte,
|
|
||||||
EvtChar: byte,
|
|
||||||
wReserved1: WORD,
|
|
||||||
}
|
|
||||||
|
|
||||||
@(default_calling_convention="system")
|
|
||||||
foreign kernel32 {
|
|
||||||
GetCommState :: proc(handle: HANDLE, dcb: ^DCB) -> BOOL ---
|
|
||||||
SetCommState :: proc(handle: HANDLE, dcb: ^DCB) -> BOOL ---
|
|
||||||
}
|
|
||||||
|
|
||||||
COMMTIMEOUTS :: struct {
|
|
||||||
ReadIntervalTimeout: DWORD,
|
|
||||||
ReadTotalTimeoutMultiplier: DWORD,
|
|
||||||
ReadTotalTimeoutConstant: DWORD,
|
|
||||||
WriteTotalTimeoutMultiplier: DWORD,
|
|
||||||
WriteTotalTimeoutConstant: DWORD,
|
|
||||||
}
|
|
||||||
|
|
||||||
@(default_calling_convention="system")
|
|
||||||
foreign kernel32 {
|
|
||||||
GetCommTimeouts :: proc(handle: HANDLE, timeouts: ^COMMTIMEOUTS) -> BOOL ---
|
|
||||||
SetCommTimeouts :: proc(handle: HANDLE, timeouts: ^COMMTIMEOUTS) -> BOOL ---
|
|
||||||
}
|
|
||||||
|
|
||||||
LPFIBER_START_ROUTINE :: #type proc "system" (lpFiberParameter: LPVOID)
|
LPFIBER_START_ROUTINE :: #type proc "system" (lpFiberParameter: LPVOID)
|
||||||
|
|
||||||
@(default_calling_convention = "system")
|
@(default_calling_convention = "system")
|
||||||
@@ -1168,9 +1112,9 @@ Battery_Flag :: enum BYTE {
|
|||||||
Low = 1,
|
Low = 1,
|
||||||
Critical = 2,
|
Critical = 2,
|
||||||
Charging = 3,
|
Charging = 3,
|
||||||
No_Battery = 7,
|
No_Battery = 7,
|
||||||
}
|
}
|
||||||
Battery_Flags :: bit_set[Battery_Flag; BYTE]
|
Battery_Flags :: bit_set[Battery_Flag; BYTE]
|
||||||
|
|
||||||
/* Global Memory Flags */
|
/* Global Memory Flags */
|
||||||
GMEM_FIXED :: 0x0000
|
GMEM_FIXED :: 0x0000
|
||||||
|
|||||||
@@ -3999,6 +3999,70 @@ CONSOLE_CURSOR_INFO :: struct {
|
|||||||
PCONSOLE_SCREEN_BUFFER_INFO :: ^CONSOLE_SCREEN_BUFFER_INFO
|
PCONSOLE_SCREEN_BUFFER_INFO :: ^CONSOLE_SCREEN_BUFFER_INFO
|
||||||
PCONSOLE_CURSOR_INFO :: ^CONSOLE_CURSOR_INFO
|
PCONSOLE_CURSOR_INFO :: ^CONSOLE_CURSOR_INFO
|
||||||
|
|
||||||
|
Event_Type :: enum WORD {
|
||||||
|
KEY_EVENT = 0x0001,
|
||||||
|
MOUSE_EVENT = 0x0002,
|
||||||
|
WINDOW_BUFFER_SIZE_EVENT = 0x0004,
|
||||||
|
MENU_EVENT = 0x0008,
|
||||||
|
FOCUS_EVENT = 0x0010,
|
||||||
|
}
|
||||||
|
|
||||||
|
INPUT_RECORD :: struct {
|
||||||
|
EventType: Event_Type,
|
||||||
|
Event: struct #raw_union {
|
||||||
|
KeyEvent: KEY_EVENT_RECORD,
|
||||||
|
MouseEvent: MOUSE_EVENT_RECORD,
|
||||||
|
WindowBufferSizeEvent: WINDOW_BUFFER_SIZE_RECORD,
|
||||||
|
MenuEvent: MENU_EVENT_RECORD,
|
||||||
|
FocusEvent: FOCUS_EVENT_RECORD,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
Control_Key_State_Bits :: enum {
|
||||||
|
RIGHT_ALT_PRESSED,
|
||||||
|
LEFT_ALT_PRESSED,
|
||||||
|
RIGHT_CTRL_PRESSED,
|
||||||
|
LEFT_CTRL_PRESSED,
|
||||||
|
SHIFT_PRESSED,
|
||||||
|
NUMLOCK_ON,
|
||||||
|
SCROLLLOCK_ON,
|
||||||
|
CAPSLOCK_ON,
|
||||||
|
ENHANCED_KEY,
|
||||||
|
}
|
||||||
|
Control_Key_State :: bit_set[Control_Key_State_Bits; DWORD]
|
||||||
|
|
||||||
|
KEY_EVENT_RECORD :: struct {
|
||||||
|
bKeyDown: BOOL,
|
||||||
|
wRepeatCount: WORD,
|
||||||
|
wVirtualKeyCode: WORD,
|
||||||
|
wVirtualScanCode: WORD,
|
||||||
|
uChar: struct #raw_union {
|
||||||
|
UnicodeChar: WCHAR,
|
||||||
|
AsciiChar: CHAR,
|
||||||
|
},
|
||||||
|
dwControlKeyState: Control_Key_State,
|
||||||
|
}
|
||||||
|
|
||||||
|
MOUSE_EVENT_RECORD :: struct {
|
||||||
|
dwMousePosition: COORD,
|
||||||
|
dwButtonState: DWORD,
|
||||||
|
dwControlKeyState: DWORD,
|
||||||
|
dwEventFlags: DWORD,
|
||||||
|
}
|
||||||
|
|
||||||
|
WINDOW_BUFFER_SIZE_RECORD :: struct {
|
||||||
|
dwSize: COORD,
|
||||||
|
}
|
||||||
|
|
||||||
|
MENU_EVENT_RECORD :: struct {
|
||||||
|
dwCommandId: UINT,
|
||||||
|
}
|
||||||
|
|
||||||
|
FOCUS_EVENT_RECORD :: struct {
|
||||||
|
bSetFocus: BOOL,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Networking
|
// Networking
|
||||||
//
|
//
|
||||||
@@ -4233,3 +4297,92 @@ SOCKADDR :: struct {
|
|||||||
sa_family: ADDRESS_FAMILY,
|
sa_family: ADDRESS_FAMILY,
|
||||||
sa_data: [14]CHAR,
|
sa_data: [14]CHAR,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DTR_Control :: enum byte {
|
||||||
|
Disable = 0,
|
||||||
|
Enable = 1,
|
||||||
|
Handshake = 2,
|
||||||
|
}
|
||||||
|
RTS_Control :: enum byte {
|
||||||
|
Disable = 0,
|
||||||
|
Enable = 1,
|
||||||
|
Handshake = 2,
|
||||||
|
Toggle = 3,
|
||||||
|
}
|
||||||
|
Parity :: enum byte {
|
||||||
|
None = 0,
|
||||||
|
Odd = 1,
|
||||||
|
Even = 2,
|
||||||
|
Mark = 3,
|
||||||
|
Space = 4,
|
||||||
|
}
|
||||||
|
Stop_Bits :: enum byte {
|
||||||
|
One = 0,
|
||||||
|
One_And_A_Half = 1,
|
||||||
|
Two = 2,
|
||||||
|
}
|
||||||
|
|
||||||
|
DCB :: struct {
|
||||||
|
DCBlength: DWORD,
|
||||||
|
BaudRate: DWORD,
|
||||||
|
using _: bit_field DWORD {
|
||||||
|
fBinary: bool | 1,
|
||||||
|
fParity: bool | 1,
|
||||||
|
fOutxCtsFlow: bool | 1,
|
||||||
|
fOutxDsrFlow: bool | 1,
|
||||||
|
fDtrControl: DTR_Control | 2,
|
||||||
|
fDsrSensitivity: bool | 1,
|
||||||
|
fTXContinueOnXoff: bool | 1,
|
||||||
|
fOutX: bool | 1,
|
||||||
|
fInX: bool | 1,
|
||||||
|
fErrorChar: bool | 1,
|
||||||
|
fNull: bool | 1,
|
||||||
|
fRtsControl: RTS_Control | 2,
|
||||||
|
fAbortOnError: bool | 1,
|
||||||
|
},
|
||||||
|
wReserved: WORD,
|
||||||
|
XOnLim: WORD,
|
||||||
|
XOffLim: WORD,
|
||||||
|
ByteSize: BYTE,
|
||||||
|
Parity: Parity,
|
||||||
|
StopBits: Stop_Bits,
|
||||||
|
XonChar: byte,
|
||||||
|
XoffChar: byte,
|
||||||
|
ErrorChar: byte,
|
||||||
|
EofChar: byte,
|
||||||
|
EvtChar: byte,
|
||||||
|
wReserved1: WORD,
|
||||||
|
}
|
||||||
|
|
||||||
|
COMMTIMEOUTS :: struct {
|
||||||
|
ReadIntervalTimeout: DWORD,
|
||||||
|
ReadTotalTimeoutMultiplier: DWORD,
|
||||||
|
ReadTotalTimeoutConstant: DWORD,
|
||||||
|
WriteTotalTimeoutMultiplier: DWORD,
|
||||||
|
WriteTotalTimeoutConstant: DWORD,
|
||||||
|
}
|
||||||
|
|
||||||
|
Com_Stat_Bits :: enum {
|
||||||
|
fCtsHold,
|
||||||
|
fDsrHold,
|
||||||
|
fRlsdHold,
|
||||||
|
fXoffHold,
|
||||||
|
fXoffSent,
|
||||||
|
fEof,
|
||||||
|
fTxim,
|
||||||
|
}
|
||||||
|
COMSTAT :: struct {
|
||||||
|
bits: bit_set[Com_Stat_Bits; DWORD],
|
||||||
|
cbInQue: DWORD,
|
||||||
|
cbOutQue: DWORD,
|
||||||
|
}
|
||||||
|
|
||||||
|
Com_Error_Bits :: enum {
|
||||||
|
RXOVER,
|
||||||
|
OVERRUN,
|
||||||
|
RXPARITY,
|
||||||
|
FRAME,
|
||||||
|
BREAK,
|
||||||
|
}
|
||||||
|
Com_Error :: bit_set[Com_Error_Bits; DWORD]
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user