use core::ffi::*;
use crate::error::PROS_ERR;
pub const INTERNAL_ADI_PORT: c_int = 22;
pub const NUM_ADI_PORTS: c_int = 8;
pub const HIGH: c_int = 1;
pub const LOW: c_int = 0;
pub const INPUT: c_int = 0x00;
pub const OUTPUT: c_int = 0x01;
pub const INPUT_ANALOG: c_int = 0x02;
pub const OUTPUT_ANALOG: c_int = 0x03;
pub type adi_encoder_t = i32;
pub type adi_ultrasonic_t = i32;
pub type adi_gyro_t = i32;
pub type adi_potentiometer_t = i32;
pub type adi_led_t = i32;
pub const E_ADI_ANALOG_IN: c_int = 0;
pub const E_ADI_ANALOG_OUT: c_int = 1;
pub const E_ADI_DIGITAL_IN: c_int = 2;
pub const E_ADI_DIGITAL_OUT: c_int = 3;
pub const E_ADI_LEGACY_GYRO: c_int = 10;
pub const E_ADI_LEGACY_SERVO: c_int = 12;
pub const E_ADI_LEGACY_PWM: c_int = 13;
pub const E_ADI_LEGACY_ENCODER: c_int = 14;
pub const E_ADI_LEGACY_ULTRASONIC: c_int = 15;
pub const E_ADI_TYPE_UNDEFINED: c_int = 255;
pub const E_ADI_ERR: c_int = PROS_ERR;
pub type adi_port_config_e_t = c_int;
pub const E_ADI_POT_EDR: c_int = 0;
pub const E_ADI_POT_V2: c_int = 1;
pub type adi_potentiometer_type_e_t = c_int;
extern "C" {
pub fn adi_port_get_config(port: u8) -> adi_port_config_e_t;
pub fn adi_port_get_value(port: u8) -> i32;
pub fn adi_port_set_config(port: u8, config: adi_port_config_e_t) -> i32;
pub fn adi_port_set_value(port: u8, value: i32) -> i32;
pub fn adi_analog_calibrate(port: u8) -> i32;
pub fn adi_analog_read(port: u8) -> i32;
pub fn adi_analog_read_calibrated(port: u8) -> i32;
pub fn adi_analog_read_calibrated_HR(port: u8) -> i32;
pub fn adi_digital_read(port: u8) -> i32;
pub fn adi_digital_get_new_press(port: u8) -> i32;
pub fn adi_digital_write(port: u8, value: bool) -> i32;
pub fn adi_pin_mode(port: u8, mode: u8) -> i32;
pub fn adi_motor_set(port: u8, speed: i8) -> i32;
pub fn adi_motor_get(port: u8) -> i32;
pub fn adi_motor_stop(port: u8) -> i32;
pub fn adi_encoder_get(enc: adi_encoder_t) -> i32;
pub fn adi_encoder_init(port_top: u8, port_bottom: u8, reverse: bool) -> i32;
pub fn adi_encoder_reset(enc: adi_encoder_t) -> i32;
pub fn adi_encoder_shutdown(enc: adi_encoder_t) -> i32;
pub fn adi_ultrasonic_get(ult: adi_ultrasonic_t) -> i32;
pub fn adi_ultrasonic_init(port_ping: u8, port_echo: u8) -> adi_ultrasonic_t;
pub fn adi_ultrasonic_shutdown(ult: adi_ultrasonic_t) -> i32;
pub fn adi_gyro_get(gyro: adi_gyro_t) -> c_double;
pub fn adi_gyro_init(port: u8, multiplier: c_double) -> adi_gyro_t;
pub fn adi_gyro_reset(gyro: adi_gyro_t) -> i32;
pub fn adi_gyro_shutdown(gyro: adi_gyro_t) -> i32;
pub fn adi_potentiometer_init(port: u8) -> adi_potentiometer_t;
pub fn adi_potentiometer_type_init(
port: u8,
pot_type: adi_potentiometer_type_e_t,
) -> adi_potentiometer_t;
pub fn adi_potentiometer_get_angle(potentiometer: adi_potentiometer_t) -> c_double;
pub fn adi_led_init(port: u8) -> adi_led_t;
pub fn adi_led_clear_all(led: adi_led_t, buffer: *const u32, buffer_length: u32) -> i32;
pub fn adi_led_set(led: adi_led_t, buffer: *const u32, buffer_length: u32) -> i32;
pub fn adi_led_set_all(
led: adi_led_t,
buffer: *const u32,
buffer_length: u32,
color: u32,
) -> i32;
pub fn adi_led_set_pixel(
led: adi_led_t,
buffer: *const u32,
buffer_length: u32,
color: u32,
pixel_position: u32,
) -> i32;
pub fn adi_led_clear_pixel(
led: adi_led_t,
buffer: *const u32,
buffer_length: u32,
pixel_position: u32,
) -> i32;
}