1use crate::internal::*;
2
3mod mapping;
4mod model;
5
6pub use mapping::AxesMapping;
7pub use model::{for_model, full_axis_tracking};
8
9#[derive(Debug, Clone, PartialEq, Eq, Default, Hash)]
10pub struct Axis {
11 pub inputs: TVec<TVec<usize>>,
12 pub outputs: TVec<TVec<usize>>,
13 pub repr: char,
14}
15
16impl Axis {
17 pub fn new(repr: char, inputs: usize, outputs: usize) -> Axis {
18 Axis { repr, inputs: tvec!(tvec!(); inputs), outputs: tvec!(tvec!(); outputs) }
19 }
20
21 pub fn natural(inputs: usize, outputs: usize, repr: char, axis_id: usize) -> Axis {
22 let inputs = tvec!(tvec!(axis_id); inputs);
23 let outputs = tvec!(tvec!(axis_id); outputs);
24 Axis { inputs, outputs, repr }
25 }
26
27 #[allow(dead_code)]
28 pub fn input(mut self, input_id: usize, axis: usize) -> Axis {
29 self.add_input(input_id, axis);
30 self
31 }
32
33 pub fn output(mut self, output_id: usize, axis: usize) -> Axis {
34 self.add_output(output_id, axis);
35 self
36 }
37
38 pub fn inputs_count(mut self, inputs: usize) -> Axis {
39 self.inputs.resize(inputs, tvec!());
40 self
41 }
42
43 pub fn outputs_count(mut self, outputs: usize) -> Axis {
44 self.outputs.resize(outputs, tvec!());
45 self
46 }
47
48 pub fn ensure_inputs_count(&mut self, inputs: usize) {
49 if self.inputs.len() < inputs {
50 self.inputs.resize(inputs, tvec!())
51 }
52 }
53
54 pub fn ensure_outputs_count(&mut self, outputs: usize) {
55 if self.outputs.len() < outputs {
56 self.outputs.resize(outputs, tvec!())
57 }
58 }
59
60 pub fn add_input(&mut self, input_id: usize, axis: usize) {
61 self.ensure_inputs_count(input_id + 1);
62 self.inputs[input_id].push(axis);
63 }
64
65 pub fn add_output(&mut self, output_id: usize, axis: usize) {
66 self.ensure_outputs_count(output_id + 1);
67 self.outputs[output_id].push(axis);
68 }
69
70 pub fn interface(&self, io: InOut) -> &[usize] {
71 match io {
72 InOut::In(ix) => &self.inputs[ix],
73 InOut::Out(ix) => &self.outputs[ix],
74 }
75 }
76}