Skip to content

Commit 598b8a3

Browse files
committed
#8 Added support for I_TIME requests from sensors
1 parent a56d181 commit 598b8a3

File tree

3 files changed

+85
-31
lines changed

3 files changed

+85
-31
lines changed

src/core/message/internal.rs

+10
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,16 @@ impl InternalMessage {
6565
payload: String::from(payload),
6666
})
6767
}
68+
69+
pub fn as_response(&mut self, response: String) -> String {
70+
self.sub_type = match self.sub_type {
71+
InternalType::IdRequest => InternalType::IdResponse,
72+
_other_type => _other_type,
73+
};
74+
75+
self.payload = response;
76+
self.to_string()
77+
}
6878
}
6979

7080
impl fmt::Display for InternalMessage {

src/core/message_handler/internal.rs

+69-31
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
use crate::channel::{Receiver, Sender};
22
use crate::core::message::internal::*;
3+
use crate::model::node::nodes::dsl;
4+
use crate::model::node::Node;
35
use diesel;
46
use diesel::prelude::*;
57
use diesel::r2d2::ConnectionManager;
6-
use crate::model::node::nodes::dsl;
7-
use crate::model::node::Node;
88
use r2d2::*;
9+
use std::time::{SystemTime, UNIX_EPOCH};
910

1011
const MIN_NODE_ID: u8 = 1;
1112
const MAX_NODE_ID: u8 = 254;
@@ -18,42 +19,75 @@ pub fn handle(
1819
) {
1920
loop {
2021
match receiver.recv() {
21-
Ok(internal_message_request) => match internal_message_request {
22-
InternalMessage {node_id: 255, child_sensor_id: 255, ack: 0, sub_type: InternalType::IdRequest, ref payload } if payload == "0"
23-
=> match get_next_node_id(&db_connection) {
24-
Some(new_node_id) => {
25-
let mut node_id_response = internal_message_request.clone();
26-
node_id_response.sub_type = InternalType::IdResponse;
27-
node_id_response.payload = new_node_id.to_string();
28-
match create_node(&db_connection, new_node_id as i32) {
29-
Ok(_) => match response_sender.send(node_id_response.to_string()) {
30-
Ok(_) => continue,
31-
Err(_) => error!("Error while sending to node_handler"),
32-
},
33-
Err(_) => error!("Error while creating node with new id"),
34-
}
35-
},
36-
None => error!("There is no free node id! All 254 id's are already reserved!"),
37-
},
38-
InternalMessage {node_id, child_sensor_id: 255, ack: _, sub_type: InternalType::DiscoverResponse, ref payload } => {
39-
let parent_node_id = payload.parse::<u8>().unwrap();
40-
match update_network_topology(&db_connection, node_id as i32, parent_node_id as i32) {
41-
Ok(_) => info!("Updated network topology"),
42-
Err(e) => error!("Update network topology failed {:?}", e),
43-
}
44-
forward_to_controller(controller_forward_sender, internal_message_request)
45-
},
46-
_ => forward_to_controller(controller_forward_sender, internal_message_request),
22+
Ok(message) => match message.sub_type {
23+
InternalType::IdRequest => send_node_id(&db_connection, response_sender, message),
24+
InternalType::Time => send_current_time(response_sender, message),
25+
InternalType::DiscoverResponse => {
26+
send_discover_response(&db_connection, &message);
27+
forward_to_controller(controller_forward_sender, message)
28+
}
29+
_ => forward_to_controller(controller_forward_sender, message),
4730
},
4831
_ => (),
4932
}
5033
}
5134
}
5235

36+
fn send_node_id(
37+
db_connection: &PooledConnection<ConnectionManager<SqliteConnection>>,
38+
response_sender: &Sender<String>,
39+
mut message: InternalMessage,
40+
) -> () {
41+
match get_next_node_id(db_connection) {
42+
Some(new_node_id) => match create_node(db_connection, new_node_id as i32) {
43+
Ok(_) => match response_sender.send(message.as_response(new_node_id.to_string())) {
44+
Ok(_) => (),
45+
Err(_) => error!("Error while sending to node_handler"),
46+
},
47+
Err(_) => error!("Error while creating node with new id"),
48+
},
49+
None => error!("There is no free node id! All 254 id's are already reserved!"),
50+
}
51+
}
52+
53+
fn send_current_time(response_sender: &Sender<String>, mut message: InternalMessage) {
54+
let start = SystemTime::now();
55+
let since_the_epoch = start
56+
.duration_since(UNIX_EPOCH)
57+
.expect("Time went backwards");
58+
match response_sender.send(message.as_response(since_the_epoch.as_secs().to_string())) {
59+
Ok(_) => (),
60+
Err(_) => error!("Error while sending to node_handler"),
61+
}
62+
}
63+
64+
fn send_discover_response(
65+
db_connection: &PooledConnection<ConnectionManager<SqliteConnection>>,
66+
message: &InternalMessage,
67+
) {
68+
match message.payload.parse::<u8>() {
69+
Ok(parent_node_id) => match update_network_topology(
70+
&db_connection,
71+
message.node_id as i32,
72+
parent_node_id as i32,
73+
) {
74+
Ok(_) => info!("Updated network topology"),
75+
Err(e) => error!("Update network topology failed {:?}", e),
76+
},
77+
Err(e) => error!(
78+
"Error {:?} while parsing discover message payload {:?}",
79+
e, &message.payload
80+
),
81+
}
82+
}
83+
5384
fn forward_to_controller(controller_sender: &Sender<String>, message: InternalMessage) {
5485
match controller_sender.send(message.to_string()) {
5586
Ok(_) => (),
56-
Err(error) => error!("Error while forwarding internal message to controller {:?}", error),
87+
Err(error) => error!(
88+
"Error while forwarding internal message to controller {:?}",
89+
error
90+
),
5791
}
5892
}
5993

@@ -75,12 +109,16 @@ pub fn create_node(conn: &SqliteConnection, id: i32) -> Result<usize, diesel::re
75109
.execute(conn)
76110
}
77111

78-
pub fn update_network_topology(conn: &SqliteConnection, _node_id: i32, _parent_node_id: i32) -> Result<usize, diesel::result::Error> {
112+
pub fn update_network_topology(
113+
conn: &SqliteConnection,
114+
_node_id: i32,
115+
_parent_node_id: i32,
116+
) -> Result<usize, diesel::result::Error> {
79117
use crate::model::node::nodes::dsl::*;
80118
diesel::update(nodes)
81119
.filter(node_id.eq(_node_id))
82120
.set(parent_node_id.eq(_parent_node_id))
83-
.execute(conn)
121+
.execute(conn)
84122
}
85123

86124
pub fn get_next_node_id(conn: &SqliteConnection) -> Option<u8> {

src/core/server.rs

+6
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,12 @@ pub fn start(
9292
gateway_out_sender,
9393
controller_out_receiver,
9494
);
95+
} else {
96+
loop {
97+
match controller_out_receiver.recv() {
98+
_ => debug!("Ignoring messages to controller, as no controller is configured"),
99+
}
100+
}
95101
}
96102
});
97103

0 commit comments

Comments
 (0)