Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 6 additions & 12 deletions rust/src/common.rs
Original file line number Diff line number Diff line change
Expand Up @@ -85,9 +85,8 @@ pub fn dev_addr_with_mac_flag(params: &[u8]) -> bool {
/// par_rsp[4..10] - 6-byte MAC address
/// ```
#[cfg_attr(test, mry::mry)]
pub fn dev_addr_with_mac_rsp(par_rsp: &mut [u8]) -> bool {
pub fn dev_addr_with_mac_rsp(par_rsp: &mut [u8]) {
par_rsp[4..10].copy_from_slice(&*MAC_ID.lock());
true
}

/// Validates device address parameters against local MAC address.
Expand Down Expand Up @@ -550,15 +549,15 @@ pub fn pair_flash_clean() {
/// * Sets FLASH_CONFIGURATION_INDEX to last valid slot offset or -1
/// * May trigger sector erase if at wrap threshold
#[cfg_attr(test, mry::mry)]
pub fn pair_flash_config_init() -> bool {
pub fn pair_flash_config_init() {
// STEP 1: Check if any configuration exists
let mut first_buffer = [0u8; 0x40];
flash_read_page(FLASH_ADR_PAIRING, 0x40, first_buffer.as_mut_ptr());

if first_buffer[0] != PAIR_CONFIG_VALID_FLAG {
// No configuration has ever been written
FLASH_CONFIGURATION_INDEX.set(-1);
return false;
return;
}

// STEP 2: Linear scan to find last valid configuration
Expand All @@ -583,7 +582,6 @@ pub fn pair_flash_config_init() -> bool {
// STEP 3: Update global index and handle wraparound if needed
FLASH_CONFIGURATION_INDEX.set(last_valid_index);
pair_flash_clean(); // Check for sector wraparound condition
true
}

/// Generates a Bluetooth LE access code from mesh name and password.
Expand Down Expand Up @@ -1058,10 +1056,9 @@ mod tests {
let mut par_rsp = [0u8; 16];

// Call function
let result = dev_addr_with_mac_rsp(&mut par_rsp);
dev_addr_with_mac_rsp(&mut par_rsp);

// Verify result
assert!(result, "Should return true");
assert_eq!(
&par_rsp[4..10],
&test_mac,
Expand Down Expand Up @@ -1652,10 +1649,9 @@ mod tests {
mock_flash_write_page(Any, Any, Any).returns(());

// Call function
let result = pair_flash_config_init();
pair_flash_config_init();

// Verify result
assert!(!result, "Should return false when no valid config");
assert_eq!(FLASH_CONFIGURATION_INDEX.get(), -1);
}

Expand All @@ -1682,10 +1678,9 @@ mod tests {
mock_flash_write_page(Any, Any, Any).returns(());

// Call function
let result = pair_flash_config_init();
pair_flash_config_init();

// Verify result
assert!(result, "Should return true when valid config found");
assert_eq!(
FLASH_CONFIGURATION_INDEX.get(),
0x80,
Expand Down Expand Up @@ -1905,7 +1900,6 @@ mod tests {
// Mock pair_flash_config_init to set a valid index
mock_pair_flash_config_init().returns_with(|| {
FLASH_CONFIGURATION_INDEX.set(0x1000);
true
});

// Mock flash reads to return custom configuration
Expand Down
2 changes: 1 addition & 1 deletion rust/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ pub fn app<'a>() -> &'a mut App {
pub fn reset_app_uart_for_test() {
#[allow(static_mut_refs)]
unsafe {
(*APP).uart_manager = crate::uart_manager::UartManager::default();
APP.uart_manager = crate::uart_manager::UartManager::default();
}
}

Expand Down
80 changes: 57 additions & 23 deletions rust/src/main_light.rs
Original file line number Diff line number Diff line change
Expand Up @@ -256,7 +256,10 @@ pub async fn main_loop() {
Called to handle messages that require a response to be returned
*/
#[cfg_attr(test, mry::mry)]
pub fn rf_link_response_callback(ppp: &mut PacketAttValue, p_req: &PacketAttValue) -> bool {
pub fn rf_link_response_callback(
ppp: &mut PacketAttValue,
p_req: &PacketAttValue,
) -> Result<(), ()> {
// mac-app[5] low 2 bytes used as ttc && hop-count
// let dst_unicast = is_unicast_addr(&p_req.dst);
ppp.dst = p_req.src;
Expand Down Expand Up @@ -324,7 +327,8 @@ pub fn rf_link_response_callback(ppp: &mut PacketAttValue, p_req: &PacketAttValu
}
GET_DEV_ADDR => {
ppp.val[0] = LGT_CMD_DEV_ADDR_RSP | 0xc0;
return dev_addr_with_mac_rsp(&mut ppp.val);
dev_addr_with_mac_rsp(&mut ppp.val);
return Ok(());
}
GET_USER_NOTIFY => {
/*user can get parameters from APP.
Expand Down Expand Up @@ -373,10 +377,10 @@ pub fn rf_link_response_callback(ppp: &mut PacketAttValue, p_req: &PacketAttValu
ppp.val[1] = idx as u8;
ppp.val[2] = (idx >> 8) as u8;
}
_ => return false,
_ => return Err(()),
}

true
Ok(())
}

/*@brief: This function is called in IRQ state, use IRQ stack.
Expand Down Expand Up @@ -406,10 +410,10 @@ pub fn rf_link_data_callback(p: &Packet) {
LGT_CMD_LIGHT_CONFIG_GRP => {
let val = params[1] as u16 | ((params[2] as u16) << 8);
match params[0] {
LIGHT_DEL_GRP_PARAM if remove_group(val) => {
LIGHT_DEL_GRP_PARAM if remove_group(val).is_ok() => {
cfg_led_event(LED_EVENT_FLASH_1HZ_4S);
}
LIGHT_ADD_GRP_PARAM if add_group(val) => {
LIGHT_ADD_GRP_PARAM if add_group(val).is_ok() => {
cfg_led_event(LED_EVENT_FLASH_1HZ_4S);
}
_ => (),
Expand All @@ -418,7 +422,7 @@ pub fn rf_link_data_callback(p: &Packet) {
LGT_CMD_CONFIG_DEV_ADDR => {
let val = params[0] as u16 | ((params[1] as u16) << 8);
if (!dev_addr_with_mac_flag(&params) || dev_addr_with_mac_match(&params))
&& add_device_address(val)
&& add_device_address(val).is_ok()
{
app()
.mesh_manager
Expand Down Expand Up @@ -1078,7 +1082,10 @@ mod tests {
let result = rf_link_response_callback(&mut response, &request);

// Verify
assert!(result, "Callback should return true for GET_STATUS");
assert!(
result.is_ok(),
"Callback should return Ok(()) for GET_STATUS"
);
assert_eq!(
response.dst, request.src,
"Destination should be request source"
Expand Down Expand Up @@ -1111,7 +1118,10 @@ mod tests {
let result = rf_link_response_callback(&mut response, &request);

// Verify
assert!(result, "Callback should return true for GET_GROUP1");
assert!(
result.is_ok(),
"Callback should return Ok(()) for GET_GROUP1"
);
assert_eq!(response.val[0], LGT_CMD_LIGHT_GRP_RSP1 | 0xc0);
assert_eq!(response.val[3], 0x11, "First group address");
assert_eq!(response.val[4], 0x22, "Second group address");
Expand Down Expand Up @@ -1142,7 +1152,10 @@ mod tests {
let result = rf_link_response_callback(&mut response, &request);

// Verify
assert!(result, "Callback should return true for GET_GROUP2");
assert!(
result.is_ok(),
"Callback should return Ok(()) for GET_GROUP2"
);
assert_eq!(response.val[0], LGT_CMD_LIGHT_GRP_RSP2 | 0xc0);
assert_eq!(response.val[3], 0xBB, "First group low byte");
assert_eq!(response.val[4], 0xAA, "First group high byte");
Expand Down Expand Up @@ -1177,7 +1190,10 @@ mod tests {
let result = rf_link_response_callback(&mut response, &request);

// Verify
assert!(result, "Callback should return true for GET_GROUP3");
assert!(
result.is_ok(),
"Callback should return Ok(()) for GET_GROUP3"
);
assert_eq!(response.val[0], LGT_CMD_LIGHT_GRP_RSP3 | 0xc0);
assert_eq!(response.val[3], 0x22, "Fifth group low byte");
assert_eq!(response.val[4], 0x11, "Fifth group high byte");
Expand All @@ -1190,7 +1206,7 @@ mod tests {

// Setup
DEVICE_ADDRESS.set(0x1234);
mock_dev_addr_with_mac_rsp(Any).returns(true);
mock_dev_addr_with_mac_rsp(Any).returns(());

let mut request = create_test_packet_att_value();
request.src = [0x56, 0x78];
Expand All @@ -1202,7 +1218,10 @@ mod tests {
let result = rf_link_response_callback(&mut response, &request);

// Verify
assert!(result, "Callback should return true for GET_DEV_ADDR");
assert!(
result.is_ok(),
"Callback should return Ok(()) for GET_DEV_ADDR"
);
assert_eq!(response.val[0], LGT_CMD_DEV_ADDR_RSP | 0xc0);
mock_dev_addr_with_mac_rsp(Any).assert_called(1);
}
Expand All @@ -1224,7 +1243,10 @@ mod tests {
let result = rf_link_response_callback(&mut response, &request);

// Verify
assert!(result, "Callback should return true for GET_USER_NOTIFY");
assert!(
result.is_ok(),
"Callback should return Ok(()) for GET_USER_NOTIFY"
);
assert_eq!(response.val[0], LGT_CMD_USER_NOTIFY_RSP | 0xc0);
assert_eq!(response.val[3], 0xCD); // Device address low byte
assert_eq!(response.val[4], 0xAB); // Device address high byte
Expand Down Expand Up @@ -1256,7 +1278,10 @@ mod tests {
let result = rf_link_response_callback(&mut response, &request);

// Verify
assert!(result, "Callback should return true for CMD_START_OTA");
assert!(
result.is_ok(),
"Callback should return Ok(()) for CMD_START_OTA"
);
assert_eq!(response.val[0], LGT_CMD_START_OTA_RSP | 0xc0);
assert_eq!(response.val[3], (BUILD_VERSION & 0xFF) as u8);
assert_eq!(response.val[4], ((BUILD_VERSION >> 8) & 0xFF) as u8);
Expand Down Expand Up @@ -1292,7 +1317,10 @@ mod tests {
let result = rf_link_response_callback(&mut response, &request);

// Verify
assert!(result, "Callback should return true for CMD_OTA_DATA");
assert!(
result.is_ok(),
"Callback should return Ok(()) for CMD_OTA_DATA"
);
assert_eq!(response.val[0], LGT_CMD_OTA_DATA_RSP | 0xc0);
assert_eq!(response.val[1], 0x34); // idx low byte
assert_eq!(response.val[2], 0x12); // idx high byte
Expand Down Expand Up @@ -1325,7 +1353,10 @@ mod tests {
let result = rf_link_response_callback(&mut response, &request);

// Verify
assert!(result, "Callback should return true for CMD_END_OTA");
assert!(
result.is_ok(),
"Callback should return Ok(()) for CMD_END_OTA"
);
assert_eq!(response.val[0], LGT_CMD_END_OTA_RSP | 0xc0);
assert_eq!(response.val[1], 0xCD); // idx low byte
assert_eq!(response.val[2], 0xAB); // idx high byte
Expand All @@ -1341,7 +1372,7 @@ mod tests {
// Setup
DEVICE_ADDRESS.set(0x1234);

let mut request = create_test_packet_att_value();
let request = create_test_packet_att_value();

let mut response = create_test_packet_att_value();
response.val[15] = 0xFF; // Invalid command
Expand All @@ -1350,7 +1381,10 @@ mod tests {
let result = rf_link_response_callback(&mut response, &request);

// Verify
assert!(!result, "Callback should return false for invalid command");
assert!(
result.is_err(),
"Callback should return Err(()) for invalid command"
);
}

// --- Tests for rf_link_data_callback ---
Expand Down Expand Up @@ -1428,7 +1462,7 @@ mod tests {
params,
0,
));
mock_remove_group(Any).returns(true);
mock_remove_group(Any).returns(Ok(()));

// Execute
rf_link_data_callback(&packet);
Expand Down Expand Up @@ -1475,7 +1509,7 @@ mod tests {
params,
0,
));
mock_remove_group(Any).returns(false);
mock_remove_group(Any).returns(Err(()));

// Clear LED event before test
LED_CONTROLLER.event_pending.set(0);
Expand Down Expand Up @@ -1528,7 +1562,7 @@ mod tests {
params,
0,
));
mock_add_group(Any).returns(true);
mock_add_group(Any).returns(Ok(()));

// Execute
rf_link_data_callback(&packet);
Expand Down Expand Up @@ -1572,7 +1606,7 @@ mod tests {
));
mock_dev_addr_with_mac_flag(Any).returns(false);
mock_dev_addr_with_mac_match(Any).returns(true);
mock_add_device_address(Any).returns(true);
mock_add_device_address(Any).returns(Ok(()));

// Execute
rf_link_data_callback(&packet);
Expand Down
15 changes: 8 additions & 7 deletions rust/src/mesh.rs
Original file line number Diff line number Diff line change
Expand Up @@ -319,6 +319,7 @@ impl MeshManager {
&& rf_link_add_tx_packet(&Packet {
att_cmd: pkt_notify,
})
.is_ok()
{
err = 0;
}
Expand Down Expand Up @@ -932,7 +933,7 @@ mod tests {
mock_sleep_us(1000).returns(());
mock_write_reg_rf_irq_status(Any).returns(());
mock_is_add_packet_buf_ready().returns(true);
mock_rf_link_add_tx_packet(Any).returns(true);
mock_rf_link_add_tx_packet(Any).returns(Ok(()));

// Execute
app.mesh_manager.mesh_pair_proc_effect();
Expand Down Expand Up @@ -975,7 +976,7 @@ mod tests {
mock_pair_load_key().returns(());
mock_pair_save_key().returns(());
mock_is_add_packet_buf_ready().returns(true);
mock_rf_link_add_tx_packet(Any).returns(true);
mock_rf_link_add_tx_packet(Any).returns(Ok(()));
mock_rf_set_ble_access_code(Any).returns(());
mock_rf_link_light_event_callback(Any).returns(());
mock_write_reg_rf_irq_status(Any).returns(());
Expand Down Expand Up @@ -1305,7 +1306,7 @@ mod tests {
let params: Vec<u8, 10> = Vec::from_slice(&[1, 2, 3]).unwrap();

mock_is_add_packet_buf_ready().returns(true);
mock_rf_link_add_tx_packet(Any).returns(true);
mock_rf_link_add_tx_packet(Any).returns(Ok(()));

// Execute
let result = mesh_manager.mesh_cmd_notify(0x10, &params, 0x1234);
Expand Down Expand Up @@ -1352,7 +1353,7 @@ mod tests {
let mesh_manager = MeshManager::default();

mock_is_add_packet_buf_ready().returns(true);
mock_rf_link_add_tx_packet(Any).returns(true);
mock_rf_link_add_tx_packet(Any).returns(Ok(()));

// Execute
let result = mesh_manager.mesh_pair_complete_notify();
Expand Down Expand Up @@ -1414,7 +1415,7 @@ mod tests {
mock_app_mocker().returns(&mut app);

mock_is_add_packet_buf_ready().returns(true);
mock_rf_link_add_tx_packet(Any).returns(true);
mock_rf_link_add_tx_packet(Any).returns(Ok(()));
mock_sleep_us(1000).returns(());
mock_pair_load_key().returns(());
mock_mesh_node_init().returns(());
Expand Down Expand Up @@ -1454,7 +1455,7 @@ mod tests {
mock_app_mocker().returns(&mut app);

mock_is_add_packet_buf_ready().returns(true);
mock_rf_link_add_tx_packet(Any).returns(true);
mock_rf_link_add_tx_packet(Any).returns(Ok(()));
mock_sleep_us(1000).returns(());
mock_pair_load_key().returns(());
mock_mesh_node_init().returns(());
Expand Down Expand Up @@ -1494,7 +1495,7 @@ mod tests {
mesh_manager.new_mesh_ltk = [3; 16];

mock_is_add_packet_buf_ready().returns(true);
mock_rf_link_add_tx_packet(Any).returns(true);
mock_rf_link_add_tx_packet(Any).returns(Ok(()));
mock_pair_save_key().returns(());
mock_rf_set_ble_access_code(0xABCDEF12).returns(());
mock_rf_link_light_event_callback(LGT_CMD_SET_MESH_INFO).returns(());
Expand Down
Loading
Loading