kos_sys/dc/
modem.rs

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
// Rust for KallistiOS/Dreamcast
// Copyright (C) 2024 Eric Fradella
// https://dreamcast.rs/

use crate::prelude::*;

pub const MODEM_SPEED_AUTO: c_uchar         = 0x0;
pub const MODEM_SPEED_1200: c_uchar         = 0x0;
pub const MODEM_SPEED_2400: c_uchar         = 0x1;
pub const MODEM_SPEED_4800: c_uchar         = 0x2;
pub const MODEM_SPEED_7200: c_uchar         = 0x3;
pub const MODEM_SPEED_9600: c_uchar         = 0x4;
pub const MODEM_SPEED_12000: c_uchar        = 0x5;
pub const MODEM_SPEED_14400: c_uchar        = 0x6;
pub const MODEM_SPEED_16800: c_uchar        = 0x7;
pub const MODEM_SPEED_19200: c_uchar        = 0x8;
pub const MODEM_SPEED_21600: c_uchar        = 0x9;
pub const MODEM_SPEED_24000: c_uchar        = 0xA;
pub const MODEM_SPEED_26400: c_uchar        = 0xB;
pub const MODEM_SPEED_28000: c_uchar        = 0xC;
pub const MODEM_SPEED_31200: c_uchar        = 0xD;
pub const MODEM_SPEED_33600: c_uchar        = 0xE;

pub const MODEM_PROTOCOL_V17: c_uchar       = 0x0;
pub const MODEM_PROTOCOL_V22: c_uchar       = 0x1;
pub const MODEM_PROTOCOL_V22BIS: c_uchar    = 0x2;
pub const MODEM_PROTOCOL_V32: c_uchar       = 0x3;
pub const MODEM_PROTOCOL_V32BIS: c_uchar    = 0x4;
pub const MODEM_PROTOCOL_V34: c_uchar       = 0x5;
pub const MODEM_PROTOCOL_V8: c_uchar        = 0x6;

#[inline]
pub const fn MODEM_SPEED_GET_PROTOCOL(x: modem_speed_t) -> c_uchar {
    x >> 4
}

#[inline]
pub const fn MODEM_SPEED_GET_SPEED(x: modem_speed_t) -> c_uchar {
    x & 0xF
}

#[inline]
pub const fn MODEM_MAKE_SPEED(p: c_uchar, s: c_uchar) -> modem_speed_t {
    ((p & 0xF) << 4) | (s & 0xF)
}

pub type modem_speed_t = c_uchar;

pub const MODEM_MODE_REMOTE: c_int          = 0;
pub const MODEM_MODE_ANSWER: c_int          = 1;
pub const MODEM_MODE_NULL: c_int            = 255;

pub const MODEM_SPEED_V22BIS_1200: modem_speed_t  = MODEM_MAKE_SPEED(MODEM_PROTOCOL_V22BIS, MODEM_SPEED_1200);
pub const MODEM_SPEED_V22BIS_2400: modem_speed_t  = MODEM_MAKE_SPEED(MODEM_PROTOCOL_V22BIS, MODEM_SPEED_2400);
pub const MODEM_SPEED_V22_1200: modem_speed_t     = MODEM_MAKE_SPEED(MODEM_PROTOCOL_V22, MODEM_SPEED_1200);
pub const MODEM_SPEED_V32_4800: modem_speed_t     = MODEM_MAKE_SPEED(MODEM_PROTOCOL_V32, MODEM_SPEED_4800);
pub const MODEM_SPEED_V32_9600: modem_speed_t     = MODEM_MAKE_SPEED(MODEM_PROTOCOL_V32, MODEM_SPEED_9600);
pub const MODEM_SPEED_V32BIS_7200: modem_speed_t  = MODEM_MAKE_SPEED(MODEM_PROTOCOL_V32BIS, MODEM_SPEED_7200);
pub const MODEM_SPEED_V32BIS_12000: modem_speed_t = MODEM_MAKE_SPEED(MODEM_PROTOCOL_V32BIS, MODEM_SPEED_12000);
pub const MODEM_SPEED_V32BIS_14400: modem_speed_t = MODEM_MAKE_SPEED(MODEM_PROTOCOL_V32BIS, MODEM_SPEED_14400);
pub const MODEM_SPEED_V8_2400: modem_speed_t      = MODEM_MAKE_SPEED(MODEM_PROTOCOL_V8, MODEM_SPEED_2400);
pub const MODEM_SPEED_V8_4800: modem_speed_t      = MODEM_MAKE_SPEED(MODEM_PROTOCOL_V8, MODEM_SPEED_4800);
pub const MODEM_SPEED_V8_7200: modem_speed_t      = MODEM_MAKE_SPEED(MODEM_PROTOCOL_V8, MODEM_SPEED_7200);
pub const MODEM_SPEED_V8_9600: modem_speed_t      = MODEM_MAKE_SPEED(MODEM_PROTOCOL_V8, MODEM_SPEED_9600);
pub const MODEM_SPEED_V8_12000: modem_speed_t     = MODEM_MAKE_SPEED(MODEM_PROTOCOL_V8, MODEM_SPEED_12000);
pub const MODEM_SPEED_V8_14400: modem_speed_t     = MODEM_MAKE_SPEED(MODEM_PROTOCOL_V8, MODEM_SPEED_14400);
pub const MODEM_SPEED_V8_16800: modem_speed_t     = MODEM_MAKE_SPEED(MODEM_PROTOCOL_V8, MODEM_SPEED_16800);
pub const MODEM_SPEED_V8_19200: modem_speed_t     = MODEM_MAKE_SPEED(MODEM_PROTOCOL_V8, MODEM_SPEED_19200);
pub const MODEM_SPEED_V8_21600: modem_speed_t     = MODEM_MAKE_SPEED(MODEM_PROTOCOL_V8, MODEM_SPEED_21600);
pub const MODEM_SPEED_V8_24000: modem_speed_t     = MODEM_MAKE_SPEED(MODEM_PROTOCOL_V8, MODEM_SPEED_24000);
pub const MODEM_SPEED_V8_26400: modem_speed_t     = MODEM_MAKE_SPEED(MODEM_PROTOCOL_V8, MODEM_SPEED_26400);
pub const MODEM_SPEED_V8_28000: modem_speed_t     = MODEM_MAKE_SPEED(MODEM_PROTOCOL_V8, MODEM_SPEED_28000);
pub const MODEM_SPEED_V8_31200: modem_speed_t     = MODEM_MAKE_SPEED(MODEM_PROTOCOL_V8, MODEM_SPEED_31200);
pub const MODEM_SPEED_V8_33600: modem_speed_t     = MODEM_MAKE_SPEED(MODEM_PROTOCOL_V8, MODEM_SPEED_33600);
pub const MODEM_SPEED_V8_AUTO: modem_speed_t      = MODEM_MAKE_SPEED(MODEM_PROTOCOL_V8, MODEM_SPEED_1200);

#[repr(C)]
pub enum modemEvent_t {
    MODEM_EVENT_CONNECTION_FAILED = 0,
    MODEM_EVENT_CONNECTED,
    MODEM_EVENT_DISCONNECTED,
    MODEM_EVENT_RX_NOT_EMPTY,
    MODEM_EVENT_OVERFLOW,
    MODEM_EVENT_TX_EMPTY
}

pub type MODEMEVENTHANDLERPROC = Option<unsafe extern "C" fn(event: modemEvent_t)>;

#[link(name = "kallisti")]
extern "C" {
    pub fn modem_init() -> c_int;
    pub fn modem_shutdown();
    pub fn modem_set_mode(mode: c_int, speed: modem_speed_t) -> c_int;
    pub fn modem_wait_dialtone(ms_timeout: c_int) -> c_int;
    pub fn modem_dial(digits: *const c_char) -> c_int;
    pub fn modem_set_event_handler(eventHandler: MODEMEVENTHANDLERPROC);
    pub fn modem_disconnect();
    pub fn modem_is_connecting() -> c_int;
    pub fn modem_is_connected() -> c_int;
    pub fn modem_get_connection_rate() -> c_ulong;
    pub fn modem_read_data(data: *mut c_uchar, size: c_int) -> c_int;
    pub fn modem_write_data(data: *mut c_uchar, size: c_int) -> c_int;
    pub fn modem_has_data() -> c_int;
}