+40
-131
@@ -2,28 +2,13 @@ use crate::{
|
||||
common::errors::ProtocolError,
|
||||
dsp408::{
|
||||
protocol::{
|
||||
constants::{
|
||||
METERS_HIGH_STEP,
|
||||
METERS_LOW_STEP,
|
||||
METERS_SPLIT,
|
||||
METERS_SPLIT_LEVEL_DB,
|
||||
},
|
||||
constants::{METERS_HIGH_STEP, METERS_LOW_STEP, METERS_SPLIT, METERS_SPLIT_LEVEL_DB},
|
||||
frame::Frame,
|
||||
},
|
||||
types::{
|
||||
Acknowledgement,
|
||||
AuthenticationResult,
|
||||
ConfigChunk,
|
||||
CurrentPreset,
|
||||
DeviceFlags,
|
||||
DeviceInfo,
|
||||
DeviceResponseType,
|
||||
HandshakeAck,
|
||||
Meters,
|
||||
ModifiedPreset,
|
||||
NotImplemented,
|
||||
PresetName,
|
||||
UnknownResponse,
|
||||
Acknowledgement, AuthenticationResult, ConfigChunk, CurrentPreset, DeviceFlags,
|
||||
DeviceInfo, DeviceResponseType, HandshakeAck, Meters, ModifiedPreset, NotImplemented,
|
||||
PresetName, UnknownResponse,
|
||||
},
|
||||
},
|
||||
};
|
||||
@@ -66,8 +51,7 @@ pub fn map_response(frame: &Frame) -> Result<DeviceResponseType, ProtocolError>
|
||||
return Err(ProtocolError::new("Missing device name payload"));
|
||||
}
|
||||
|
||||
let name = decode_ascii(payload, false)
|
||||
.map_err(|e| ProtocolError::new(e.0))?;
|
||||
let name = decode_ascii(payload, false).map_err(|e| ProtocolError::new(e.0))?;
|
||||
|
||||
return Ok(DeviceResponseType::DeviceInfo(DeviceInfo { name }));
|
||||
}
|
||||
@@ -131,8 +115,7 @@ pub fn map_response(frame: &Frame) -> Result<DeviceResponseType, ProtocolError>
|
||||
return Err(ProtocolError::new("Missing preset index"));
|
||||
}
|
||||
|
||||
let name = decode_ascii(&payload[1..], false)
|
||||
.map_err(|e| ProtocolError::new(e.0))?;
|
||||
let name = decode_ascii(&payload[1..], false).map_err(|e| ProtocolError::new(e.0))?;
|
||||
|
||||
return Ok(DeviceResponseType::PresetName(PresetName {
|
||||
index: payload[0],
|
||||
@@ -174,9 +157,11 @@ pub fn map_response(frame: &Frame) -> Result<DeviceResponseType, ProtocolError>
|
||||
)));
|
||||
}
|
||||
|
||||
return Ok(DeviceResponseType::AuthenticationResult(AuthenticationResult {
|
||||
success: payload[1] == 0x01,
|
||||
}));
|
||||
return Ok(DeviceResponseType::AuthenticationResult(
|
||||
AuthenticationResult {
|
||||
success: payload[1] == 0x01,
|
||||
},
|
||||
));
|
||||
}
|
||||
|
||||
// Command `0x40` (Get Level Meters)
|
||||
@@ -224,9 +209,7 @@ mod tests {
|
||||
|
||||
assert_eq!(
|
||||
result,
|
||||
DeviceResponseType::Acknowledgement(Acknowledgement {
|
||||
success: true
|
||||
})
|
||||
DeviceResponseType::Acknowledgement(Acknowledgement { success: true })
|
||||
);
|
||||
}
|
||||
|
||||
@@ -234,10 +217,7 @@ mod tests {
|
||||
fn not_implemented() {
|
||||
let result = map_response(&frame(0x02, vec![])).unwrap();
|
||||
|
||||
assert_eq!(
|
||||
result,
|
||||
DeviceResponseType::NotImplemented(NotImplemented)
|
||||
);
|
||||
assert_eq!(result, DeviceResponseType::NotImplemented(NotImplemented));
|
||||
}
|
||||
|
||||
#[test]
|
||||
@@ -246,9 +226,7 @@ mod tests {
|
||||
|
||||
assert_eq!(
|
||||
result,
|
||||
DeviceResponseType::HandshakeAck(HandshakeAck {
|
||||
ack: Some(1)
|
||||
})
|
||||
DeviceResponseType::HandshakeAck(HandshakeAck { ack: Some(1) })
|
||||
);
|
||||
}
|
||||
|
||||
@@ -261,8 +239,7 @@ mod tests {
|
||||
|
||||
#[test]
|
||||
fn device_name() {
|
||||
let result = map_response(&frame(0x13, b"TestDevice".to_vec()))
|
||||
.unwrap();
|
||||
let result = map_response(&frame(0x13, b"TestDevice".to_vec())).unwrap();
|
||||
|
||||
assert_eq!(
|
||||
result,
|
||||
@@ -274,47 +251,34 @@ mod tests {
|
||||
|
||||
#[test]
|
||||
fn device_name_missing_payload() {
|
||||
assert!(
|
||||
map_response(&frame(0x13, vec![]))
|
||||
.is_err()
|
||||
);
|
||||
assert!(map_response(&frame(0x13, vec![])).is_err());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn device_name_invalid_ascii() {
|
||||
assert!(
|
||||
map_response(&frame(0x13, vec![0xff]))
|
||||
.is_err()
|
||||
);
|
||||
assert!(map_response(&frame(0x13, vec![0xff])).is_err());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn current_preset() {
|
||||
let result = map_response(&frame(0x14, vec![5]))
|
||||
.unwrap();
|
||||
let result = map_response(&frame(0x14, vec![5])).unwrap();
|
||||
|
||||
assert_eq!(
|
||||
result,
|
||||
DeviceResponseType::CurrentPreset(CurrentPreset {
|
||||
index: 5
|
||||
})
|
||||
DeviceResponseType::CurrentPreset(CurrentPreset { index: 5 })
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn current_preset_wrong_length_errors() {
|
||||
assert!(
|
||||
map_response(&frame(0x14, vec![1, 2]))
|
||||
.is_err()
|
||||
);
|
||||
assert!(map_response(&frame(0x14, vec![1, 2])).is_err());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn modified_preset() {
|
||||
let payload = vec![0xff; 20];
|
||||
|
||||
let result = map_response(&frame(0x22, payload))
|
||||
.unwrap();
|
||||
let result = map_response(&frame(0x22, payload)).unwrap();
|
||||
|
||||
match result {
|
||||
DeviceResponseType::ModifiedPreset(p) => {
|
||||
@@ -327,19 +291,12 @@ mod tests {
|
||||
|
||||
#[test]
|
||||
fn modified_preset_invalid_length() {
|
||||
assert!(
|
||||
map_response(&frame(0x22, vec![0; 19]))
|
||||
.is_err()
|
||||
);
|
||||
assert!(map_response(&frame(0x22, vec![0; 19])).is_err());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn config_chunk() {
|
||||
let result = map_response(&frame(
|
||||
0x24,
|
||||
vec![3, 0xaa, 0xbb],
|
||||
))
|
||||
.unwrap();
|
||||
let result = map_response(&frame(0x24, vec![3, 0xaa, 0xbb])).unwrap();
|
||||
|
||||
assert_eq!(
|
||||
result,
|
||||
@@ -352,8 +309,7 @@ mod tests {
|
||||
|
||||
#[test]
|
||||
fn config_chunk_empty_payload_defaults_to_zero() {
|
||||
let result = map_response(&frame(0x24, vec![]))
|
||||
.unwrap();
|
||||
let result = map_response(&frame(0x24, vec![])).unwrap();
|
||||
|
||||
assert_eq!(
|
||||
result,
|
||||
@@ -366,19 +322,12 @@ mod tests {
|
||||
|
||||
#[test]
|
||||
fn config_chunk_invalid_index() {
|
||||
assert!(
|
||||
map_response(&frame(0x24, vec![0x1d]))
|
||||
.is_err()
|
||||
);
|
||||
assert!(map_response(&frame(0x24, vec![0x1d])).is_err());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn preset_name() {
|
||||
let result = map_response(&frame(
|
||||
0x29,
|
||||
vec![2, b'A', b'm', b'p'],
|
||||
))
|
||||
.unwrap();
|
||||
let result = map_response(&frame(0x29, vec![2, b'A', b'm', b'p'])).unwrap();
|
||||
|
||||
assert_eq!(
|
||||
result,
|
||||
@@ -391,18 +340,12 @@ mod tests {
|
||||
|
||||
#[test]
|
||||
fn preset_name_missing_index() {
|
||||
assert!(
|
||||
map_response(&frame(0x29, vec![]))
|
||||
.is_err()
|
||||
);
|
||||
assert!(map_response(&frame(0x29, vec![])).is_err());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn preset_name_invalid_ascii() {
|
||||
assert!(
|
||||
map_response(&frame(0x29, vec![1, 0xff]))
|
||||
.is_err()
|
||||
);
|
||||
assert!(map_response(&frame(0x29, vec![1, 0xff])).is_err());
|
||||
}
|
||||
|
||||
#[test]
|
||||
@@ -410,23 +353,17 @@ mod tests {
|
||||
let mut payload = vec![0; 6];
|
||||
payload[5] = 1;
|
||||
|
||||
let result = map_response(&frame(0x2c, payload))
|
||||
.unwrap();
|
||||
let result = map_response(&frame(0x2c, payload)).unwrap();
|
||||
|
||||
assert_eq!(
|
||||
result,
|
||||
DeviceResponseType::DeviceFlags(DeviceFlags {
|
||||
is_locked: true
|
||||
})
|
||||
DeviceResponseType::DeviceFlags(DeviceFlags { is_locked: true })
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn device_flags_invalid_length() {
|
||||
assert!(
|
||||
map_response(&frame(0x2c, vec![0; 5]))
|
||||
.is_err()
|
||||
);
|
||||
assert!(map_response(&frame(0x2c, vec![0; 5])).is_err());
|
||||
}
|
||||
|
||||
#[test]
|
||||
@@ -434,52 +371,32 @@ mod tests {
|
||||
let mut payload = vec![0; 6];
|
||||
payload[5] = 2;
|
||||
|
||||
assert!(
|
||||
map_response(&frame(0x2c, payload))
|
||||
.is_err()
|
||||
);
|
||||
assert!(map_response(&frame(0x2c, payload)).is_err());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn authentication_success() {
|
||||
let result = map_response(&frame(
|
||||
0x2d,
|
||||
vec![0, 1],
|
||||
))
|
||||
.unwrap();
|
||||
let result = map_response(&frame(0x2d, vec![0, 1])).unwrap();
|
||||
|
||||
assert_eq!(
|
||||
result,
|
||||
DeviceResponseType::AuthenticationResult(
|
||||
AuthenticationResult {
|
||||
success: true
|
||||
}
|
||||
)
|
||||
DeviceResponseType::AuthenticationResult(AuthenticationResult { success: true })
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn authentication_missing_result() {
|
||||
assert!(
|
||||
map_response(&frame(0x2d, vec![0]))
|
||||
.is_err()
|
||||
);
|
||||
assert!(map_response(&frame(0x2d, vec![0])).is_err());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn authentication_invalid_flag() {
|
||||
assert!(
|
||||
map_response(&frame(0x2d, vec![0, 2]))
|
||||
.is_err()
|
||||
);
|
||||
assert!(map_response(&frame(0x2d, vec![0, 2])).is_err());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn meters_invalid_length() {
|
||||
assert!(
|
||||
map_response(&frame(0x40, vec![0; 10]))
|
||||
.is_err()
|
||||
);
|
||||
assert!(map_response(&frame(0x40, vec![0; 10])).is_err());
|
||||
}
|
||||
|
||||
#[test]
|
||||
@@ -494,8 +411,7 @@ mod tests {
|
||||
payload[i + 1] = 0x3c;
|
||||
}
|
||||
|
||||
let result = map_response(&frame(0x40, payload))
|
||||
.unwrap();
|
||||
let result = map_response(&frame(0x40, payload)).unwrap();
|
||||
|
||||
match result {
|
||||
DeviceResponseType::Meters(m) => {
|
||||
@@ -511,21 +427,14 @@ mod tests {
|
||||
|
||||
#[test]
|
||||
fn unknown_command_falls_through() {
|
||||
let result = map_response(&frame(
|
||||
0x99,
|
||||
vec![0xaa],
|
||||
))
|
||||
.unwrap();
|
||||
let result = map_response(&frame(0x99, vec![0xaa])).unwrap();
|
||||
|
||||
match result {
|
||||
DeviceResponseType::UnknownResponse(r) => {
|
||||
assert_eq!(r.cmd, "0x99");
|
||||
assert_eq!(r.raw, vec![0xaa]);
|
||||
}
|
||||
other => panic!(
|
||||
"expected UnknownResponse, got {:?}",
|
||||
other
|
||||
),
|
||||
other => panic!("expected UnknownResponse, got {:?}", other),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user