## API Reference (from API.py)

This section details the programmatic functions available in `API.py` for integrating smart card functionality into your own Python applications.

### Reader Management

#### `list_readers()`
Returns a list of available smart card reader objects.

**Returns:**
- `List`: List of reader objects. Returns an empty list if no readers are found or if an error occurs.

**Example:**
```python
from API import list_readers

readers = list_readers()
for reader in readers:
    print(reader)
```

### Command Processing

#### `parse_command_string(hex_string)`
Converts a hexadecimal string into a list of integers representing bytes.

**Parameters:**
- `hex_string` (str): Hexadecimal string with optional spaces (e.g., "FF CA 00 00" or "FFCA0000")

**Returns:**
- `List[int]`: List of integers representing bytes

**Raises:**
- `ValueError`: If string contains invalid characters or has odd length

**Example:**
```python
from API import parse_command_string

bytes_list = parse_command_string("FF CA 00 00")
# Returns: [255, 202, 0, 0]
```

### Connection Management

#### `connect_to_reader(reader, mode='share', protocol='auto')`
Establishes a connection to a specified smart card reader.

**Parameters:**
- `reader`: Reader object from `list_readers()` or reader name string
- `mode` (str): Connection mode
    - `'share'` (default): For APDU communication with a smart card
    - `'direct'`: For sending low-level escape commands directly to the reader hardware
- `protocol` (str): Communication protocol specification
    - `'auto'` (default): Automatically selects protocol based on platform
    - `'t0t1'`: T=0 or T=1 protocol
    - `'undefined'`: Undefined protocol

**Returns:**
- `tuple`: `(connection_object, error_message, context_handle)`
    - `connection_object`: CardConnection object (APDU mode) or card handle (escape mode), or `None` on failure
    - `error_message`: Error message string or `None` on success
    - `context_handle`: Context handle for direct connections, or `None` for shared connections

**Example:**
```python
from API import list_readers, connect_to_reader

readers = list_readers()
if readers:
    connection, error, context = connect_to_reader(readers[0], mode='share')
    if connection:
        print("Connected successfully")
    else:
        print(f"Connection failed: {error}")
```

#### `disconnect_reader(connection, hcontext=None)`
Disconnects from a smart card reader and releases context if applicable.

**Parameters:**
- `connection`: CardConnection object (APDU mode) or card handle (escape mode)
- `hcontext`: The established context handle for direct connections (optional, only needed for escape mode)

**Example:**
```python
from API import connect_to_reader, disconnect_reader

# For APDU mode
connection, error, _ = connect_to_reader(reader, mode='share')
# ... use connection ...
disconnect_reader(connection)

# For escape mode
hcard, error, hcontext = connect_to_reader(reader, mode='direct')
# ... use hcard ...
disconnect_reader(hcard, hcontext)
```

### Unified Command Interface

#### `send_command(connection, command, mode='apdu', ioctl_code=3500)`
Sends a command to a connected smart card or reader.

**Parameters:**
- `connection`: CardConnection object (APDU mode) or card handle (escape mode)
- `command`: 
    - For APDU mode: Hex string (e.g., "FF CA 00 00 00")
    - For escape mode: Byte array/list or hex string
- `mode` (str): Command mode
    - `'apdu'` (default): For sending APDU commands to a smart card
    - `'escape'`: For sending escape commands to a reader in direct mode
- `ioctl_code` (int): IOCTL code for escape commands (default: 3500 - CCID escape)

**Returns:**
- For APDU mode: `(success, response_data, SW1, SW2, error_message)`
    - `success` (bool): True if command was sent successfully
    - `response_data` (list): Response data bytes
    - `SW1` (int): Status word 1
    - `SW2` (int): Status word 2
    - `error_message` (str): Error message or None on success

- For escape mode: `(success, response_data, error_message)`
    - `success` (bool): True if command was sent successfully
    - `response_data` (list): Response data bytes
    - `error_message` (str): Error message or None on success

**Example - APDU Mode:**
```python
from API import list_readers, connect_to_reader, send_command, disconnect_reader

readers = list_readers()
if readers:
    connection, error, _ = connect_to_reader(readers[0], mode='share')
    if connection:
        success, response, sw1, sw2, error_msg = send_command(
            connection, 
            "FF CA 00 00 00", 
            mode='apdu'
        )
        if success:
            print(f"Response: {response}, SW1: {sw1:02X}, SW2: {sw2:02X}")
        disconnect_reader(connection)
```

**Example - Escape Mode:**
```python
from API import list_readers, connect_to_reader, send_command, disconnect_reader, parse_command_string

readers = list_readers()
if readers:
    hcard, error, hcontext = connect_to_reader(readers[0], mode='direct')
    if hcard:
        command_bytes = parse_command_string("E0 00 00 18 00")
        success, response, error_msg = send_command(
            hcard, 
            command_bytes, 
            mode='escape'
        )
        if success:
            print(f"Response: {response}")
        disconnect_reader(hcard, hcontext)
```
