sega-controller 0.1.0

Embedded driver for reading Sega controller input
Documentation
# Sega Controller Driver
![crates.io](https://img.shields.io/crates/v/sega-controller.svg)

Embedded driver for reading input from Sega controllers in Rust.

This library utilizes [`embedded-hal`](https://github.com/rust-embedded/embedded-hal) traits as a platform-agnostic driver.

## Features

- `mega-drive` - includes Sega Mega Drive controllers
- `all` - includes all available features

## Example

```rust
use sega_controller::mega_drive::{MegaDriveButton, MegaDriveController};
use sega_controller::Error;

// Using some kind of hal like `arduino_hal`
// NOTE: You should have pull-up resistors on these pins (10k ohm)
let controller = MegaDriveController::from_pins(
    pins.d8.into_output(),          // select pin
    pins.d2.into_floating_input(),  // data pin 0
    pins.d3.into_floating_input(),  // data pin 1
    pins.d4.into_floating_input(),  // data pin 2
    pins.d5.into_floating_input(),  // data pin 3
    pins.d6.into_floating_input(),  // data pin 4
    pins.d7.into_floating_input(),  // data pin 5
);

// Only do this once every frame (16ms)
match controller.read_state() {
    Ok(state) => {
        if state.is_six_button {
            // do something special for six-button controllers if you like
        }
        
        if state.is_pressed(MegaDriveButton::Start) {
            // start button is currently held down
        }
    }
    Err(Error:NotPresent) => {} // controller is not connected
    _ => {}
}

```

## Hardware Reference

The Sega Mega Drive uses a standard DB9 serial port connector for controllers.

### Controller Connectors

```
      CONSOLE PORT (MALE)
 ,---------------------------,
 \  (1)  (2)  (3)  (4)  (5)  /
  \   (6)  (7)  (8)  (9)    /
   `-----------------------'

   CONTROLLER CABLE (FEMALE)
 ,---------------------------,
 \  (5)  (4)  (3)  (2)  (1)  /
  \   (9)  (8)  (7)  (6)    /
   `-----------------------'
```

**NOTE:** The controller cable uses a **female** connector, where the console has **male** connectors.

### Pin Mapping

| Pin | Description |    Mode    |
|:---:|:------------|:----------:|
|  1  | Data Bit 0  |   Input    |
|  2  | Data Bit 1  |   Input    | 
|  3  | Data Bit 2  |   Input    | 
|  4  | Data Bit 3  |   Input    | 
|  5  | **+5V VDC** |     --     | 
|  6  | Data Bit 4  |   Input    | 
|  7  | **Select**  | **Output** |
|  8  | **Ground**  |     --     | 
|  9  | Data Bit 5  |   Input    |

**NOTE:** The `Mode` is from the perspective of the console or microcontroller reading the controller.

## Credits

Thanks to [PlutieDev](https://plutiedev.com/controllers) documentation on how the Mega Drive controller works.
Especially useful for polling six-button controllers.

## TODO:

- [ ] Library Documentation via `mdbook` + GitHub Actions
- [ ] Hardware Documentation via `mdbook` + GitHub Actions
- [ ] Shift Register Support (Parallel-In)
- [ ] Sega Mouse Support
- [ ] Sega Multi-Tap Support
- [ ] Master System Support
- [ ] Unit Tests