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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
use addr::ReadableEEPAddr;
use addr::ReadableRamAddr;
use addr::WritableEEPAddr;
use addr::WritableRamAddr;

use arrayvec::ArrayVec;

pub enum RegisterRequest {
    EEPWrite(WritableEEPAddr),
    EEPRead(ReadableEEPAddr),
    RamWrite(WritableRamAddr),
    RamRead(ReadableRamAddr),
}

pub(crate) struct SJogRequest {
    pub(crate) data: ArrayVec<[SJogData; 10]>,
    pub(crate) playtime: u8,
}

pub(crate) type IJogRequest = ArrayVec<[IJogData; 10]>;

#[derive(Debug)]
pub enum SpecialRequest {
    Stat,
    Rollback { skip_id: u8, skip_baud: u8 },
    Reboot,
}

#[derive(Clone, Copy)]
pub enum Rollback {
    SkipId,
    SkipBaud,
    SkipBoth,
    SkipNone,
}

/// This represent the rotation sense of the servomotor while controlled in `Speed`.
#[derive(Debug)]
pub enum Rotation {
    /// CounterClockwise rotation, which is the default rotation sense.
    CounterClockwise,
    /// Clockwise rotation, representing the inverted rotation.
    Clockwise,
}

/// This represent the servomotor control mode.
/// The servomotor is either controlled in `Position` or `Speed`.
#[derive(Debug)]
pub enum JogMode {
    /// Control the servomotor by position.
    /// Make sure that the position is in range for your servomotor.
    Normal {
        /// The calibrated position.
        /// The value must be in the 0..1023 range
        position: u16,
    },
    /// Control the servomotor by speed.
    /// Make sur that you respect the maximum speed.
    /// The 14th bit represent the sign, if it set the servomotor will rotate the other way.
    Continuous {
        /// The desired PWM value.
        /// The value must be in the 0..1023 range
        speed: u16,
        /// Inverts the rotation sense of the servo by modifying the 14th bit.
        rotation: Rotation,
    },
}

impl JogMode {
    pub(crate) fn associated_data(&self) -> u16 {
        match *self {
            JogMode::Normal { position } => position,
            JogMode::Continuous { speed, rotation: Rotation::Clockwise } => 0x4000 | speed,
            JogMode::Continuous { speed, rotation: Rotation::CounterClockwise } => speed,
        }
    }
}

impl Default for JogMode {
    fn default() -> Self {
        JogMode::Normal { position: 0 }
    }
}

/// The color of the LED of the servomotor.
#[derive(Debug)]
pub enum JogColor {
    /// Red
    Red,
    /// Green
    Green,
    /// Blue
    Blue,
}

impl Default for JogColor {
    fn default() -> Self {
        JogColor::Green
    }
}

#[derive(Default, Debug)]
pub(crate) struct SJogData {
    pub mode: JogMode,
    pub color: JogColor,
    pub id: u8,
}

impl SJogData {
    pub(crate) fn new(mode: JogMode, color: JogColor, id: u8) -> Self {
        SJogData { mode, color, id }
    }
}

#[derive(Default, Debug)]
pub(crate) struct IJogData {
    pub mode: JogMode,
    pub color: JogColor,
    pub playtime: u8,
    pub id: u8,
}

impl IJogData {
    pub(crate) fn new(mode: JogMode, color: JogColor, playtime: u8, id: u8) -> Self {
        IJogData {
            mode,
            color,
            id,
            playtime,
        }
    }
}