Function write_i16

Source
pub fn write_i16<T: Write>(file: &mut T, num: i16) -> Result<usize>
Expand description

Write two bytes int to a file/serial port. It returns the number of bytes written

ยงExample

use std::io::Cursor;
use robust_arduino_serial::*;

let mut buffer = Cursor::new(Vec::new());
let number: i16 = 366;

// write 16 bits (two bytes) to the buffer
write_i16(&mut buffer, number).unwrap();
Examples found in repository?
examples/arduino_serial.rs (line 58)
21fn main() {
22
23    let args: Vec<String> = env::args().skip(1).collect();
24
25    if args.len() < 1
26    {
27        panic!("Please provide a serial port as argument (ex: /dev/ttyACM0)");
28    }
29    let serial_port = &args[0];
30
31    println!("Opening port: {:?}", serial_port);
32    let mut port = serial::open(&serial_port).unwrap();
33    port.configure(&SETTINGS).unwrap();
34    // timeout of 30s
35    port.set_timeout(Duration::from_secs(30)).unwrap();
36
37    loop
38    {
39        println!("Waiting for Arduino...");
40        let order = Order::HELLO as i8;
41        write_i8(&mut port, order).unwrap();
42        let received_order = Order::from_i8(read_i8(&mut port).unwrap()).unwrap();
43        if received_order == Order::ALREADY_CONNECTED
44        {
45            break;
46        }
47        thread::sleep(Duration::from_secs(1));
48    }
49
50    println!("Connected to Arduino");
51
52    let motor_order = Order::MOTOR as i8;
53    let motor_speed: i8 = -56;
54    write_i8(&mut port, motor_order).unwrap();
55    write_i8(&mut port, motor_speed).unwrap();
56
57    write_i8(&mut port, Order::SERVO as i8).unwrap();
58    write_i16(&mut port, 120_i16).unwrap();
59
60    for _ in 0..10 {
61        let order = read_i8(&mut port).unwrap();
62        println!("Order received: {:?}", order);
63
64        if let Some(received_order) = Order::from_i8(order)
65        {
66            println!("Known order: {:?}", received_order);
67        }
68        else
69        {
70            println!("Unknown order: {:?}", order);
71        }
72    }
73}
More examples
Hide additional examples
examples/file_read_write.rs (line 30)
10fn main() {
11    let args: Vec<String> = env::args().skip(1).collect();
12    if args.len() < 1
13    {
14        panic!("Please provide a filename as argument");
15    }
16    let filename = &args[0];
17    // Open file and create it if it does not exist
18    let mut file = match OpenOptions::new().read(true).write(true).create(true).open(filename)
19                    {
20                        Err(why) => panic!("Could not open file {}: {}", filename, why),
21                        Ok(file) => file
22                    };
23
24    // write_order is equivalent to write_i8
25    write_order(&mut file, Order::HELLO).unwrap();
26
27    let motor_order = Order::MOTOR as i8;
28    let motor_speed: i16 = -56;
29    write_i8(&mut file, motor_order).unwrap();
30    write_i16(&mut file, motor_speed).unwrap();
31    write_i32(&mut file, 131072).unwrap();
32
33    // Go to the beginning of the file
34    file.seek(SeekFrom::Start(0)).unwrap();
35
36    for _ in 0..2 {
37        // We could have also use read_order(&mut file).unwrap()
38        let order = read_i8(&mut file).unwrap();
39        println!("Ordered received: {:?}", order);
40
41        if let Some(received_order) = Order::from_i8(order)
42        {
43            println!("Known order: {:?}", received_order);
44            match received_order
45            {
46                Order::MOTOR => {
47                    let motor_speed = read_i16(&mut file).unwrap();
48                    println!("Motor Speed = {}", motor_speed);
49                    let test = read_i32(&mut file).unwrap();
50                    println!("test = {}", test);
51                },
52                _ => ()
53            }
54        }
55        else
56        {
57            println!("Unknown order: {:?}", order);
58        }
59    }
60}
examples/arduino_threads.rs (line 110)
25fn main() {
26
27    let args: Vec<String> = env::args().skip(1).collect();
28
29    if args.len() < 1
30    {
31        panic!("Please provide a serial port as argument (ex: /dev/ttyACM0)");
32    }
33    let serial_port = &args[0];
34
35    println!("Opening port: {:?}", serial_port);
36    let mut port = serial::open(&serial_port).unwrap();
37    port.configure(&SETTINGS).unwrap();
38    // timeout of 1ms
39    port.set_timeout(Duration::from_millis(1)).unwrap();
40
41    loop
42    {
43        println!("Waiting for Arduino...");
44        write_order(&mut port, Order::HELLO).unwrap();
45        let received_order = match read_i8(&mut port) {
46            Ok(order) => Order::from_i8(order).unwrap(),
47            Err(ref e) if e.kind() == ErrorKind::TimedOut => {
48                // If we have a read timeout, wait a bit
49                thread::sleep(Duration::from_secs(2));
50                continue
51                }
52            Err(e) => {
53                    panic!("An error occured reading serial port: {}", e)
54                }
55
56        };
57
58        if received_order == Order::ALREADY_CONNECTED
59        {
60            break;
61        }
62        thread::sleep(Duration::from_secs(1));
63    }
64
65    println!("Connected to Arduino");
66
67    // Channel to send and receive commands
68    let (command_sender, command_receiver) = mpsc::channel();
69    let command_queue = mpsc::Sender::clone(&command_sender);
70
71    // Wrap the serial to use it in the threads
72    let serial_arc = Arc::new(Mutex::new(port));
73    let serial_command = serial_arc.clone();
74
75    // Exit event to notify thread when they should exit
76    let exit_event = false;
77    // Wrap the boolean to use it in the threads
78    let exit_arc = Arc::new(Mutex::new(exit_event));
79    let exit_listener = exit_arc.clone();
80    let exit_command = exit_arc.clone();
81
82    // Semaphore to avoid Arduino buffer overflow:
83    // Do not send new order if the Arduino did not aknowledge
84    // the previous message
85    let n_allowed_messages = 2;
86    let semaphore = Arc::new(Semaphore::new(n_allowed_messages));
87    let semaphore_command = semaphore.clone();
88
89    let mut threads = vec![];
90
91    // Command thread listen to the command Channel
92    // and send orders to the Arduino
93    let command_thread = thread::spawn(move || {
94        let mut exit = false;
95        while !exit
96        {
97            // Decrement the semaphore counter
98            // each time we send an order
99            semaphore.acquire();
100            let (order, num) = command_receiver.recv().unwrap();
101
102            println!("Sending: {:?}, {}", order, num);
103
104            // Acquire lock on the buffer
105            let mut buffer = serial_command.lock().unwrap();
106
107            write_order(&mut *buffer, order).unwrap();
108            match order {
109                Order::MOTOR => write_i8(&mut *buffer, num as i8).unwrap(),
110                Order::SERVO => write_i16(&mut *buffer, num as i16).unwrap(),
111                _ => 0  // Write 0 bytes
112            };
113            exit = *exit_command.lock().unwrap();
114        }
115        println!("Command Thread exiting...");
116    });
117
118    threads.push(command_thread);
119
120    // Listener thread listens to the Arduino
121    // it release the semaphore when an aknowledgement is received
122    let listener_thread = thread::spawn(move || {
123
124        let mut exit = false;
125        let mut wait = false;
126        while !exit
127        {
128            // Wait a bit so the command thread can acquire the lock
129            if wait
130            {
131                thread::sleep(Duration::from_millis(100));
132            }
133
134            // Acquire lock on the serial object
135            let mut buffer = serial_arc.lock().unwrap();
136
137            // Receive order from arduino
138            let received_order = match read_i8(&mut *buffer) {
139                Ok(order) => Order::from_i8(order).unwrap(),
140                Err(_) => {
141                        wait = true;
142                        continue
143                    }
144
145            };
146            wait = false;
147
148            println!("Received: {:?}", received_order);
149
150            match received_order {
151                Order::RECEIVED => semaphore_command.release(),
152                _ => ()
153            }
154
155            exit = *exit_listener.lock().unwrap();
156        }
157        println!("Listener Thread exiting...");
158    });
159
160    threads.push(listener_thread);
161
162    thread::sleep(Duration::from_secs(1));
163    // Send Orders to the Arduino
164    command_queue.send((Order::MOTOR, 42_i32)).unwrap();
165    command_queue.send((Order::SERVO, 120_i32)).unwrap();
166
167    // Wait a bit before shutting down the threads
168    thread::sleep(Duration::from_secs(2));
169
170    // Stop the motor
171    command_queue.send((Order::MOTOR, 0_i32)).unwrap();
172
173
174    // Notify the threads that they should exit
175    {
176        *exit_arc.lock().unwrap() = true;
177    }
178
179    // Send dummy orders to exit the command thread
180    command_queue.send((Order::HELLO, 0_i32)).unwrap();
181
182    for t in threads
183    {
184        t.join().unwrap();
185    }
186}