1use crate::prelude::v1::*;
2use crate::shim::*;
3use crate::base::*;
4
5#[derive(Debug, Copy, Clone)]
6pub struct TypeSizeError {
7 id: usize,
8 c_size: usize,
9 rust_size: usize
10}
11
12pub fn shim_sanity_check() -> Result<(), TypeSizeError> {
14
15 let checks = [(0, mem::size_of::<FreeRtosVoidPtr>()),
16 (1, mem::size_of::<FreeRtosCharPtr>()),
17 (2, mem::size_of::<FreeRtosChar>()),
18
19 (10, mem::size_of::<FreeRtosBaseType>()),
20 (11, mem::size_of::<FreeRtosUBaseType>()),
21 (12, mem::size_of::<FreeRtosTickType>()),
22
23 (20, mem::size_of::<FreeRtosTaskHandle>()),
24 (21, mem::size_of::<FreeRtosQueueHandle>()),
25 (22, mem::size_of::<FreeRtosSemaphoreHandle>()),
26 (23, mem::size_of::<FreeRtosTaskFunction>()),
27 (24, mem::size_of::<FreeRtosTimerHandle>()),
28 (25, mem::size_of::<FreeRtosTimerCallback>()),
29
30 (30, mem::size_of::<FreeRtosTaskStatusFfi>()),
31 (31, mem::size_of::<FreeRtosTaskState>()),
32 (32, mem::size_of::<FreeRtosUnsignedLong>()),
33 (33, mem::size_of::<FreeRtosUnsignedShort>())
34 ];
35
36 for check in &checks {
37 let c_size = unsafe { freertos_rs_sizeof(check.0) };
38
39 if c_size != check.1 as u8 {
40 return Err(TypeSizeError {
41 id: check.0 as usize,
42 c_size: c_size as usize,
43 rust_size: check.1
44 });
45 }
46 }
47
48 Ok(())
49}
50
51pub unsafe fn str_from_c_string(str: *const u8) -> Result<String, FreeRtosError> {
52 let mut buf = Vec::new();
53
54 let mut p = str;
55 loop {
56 if *p == 0 {
57 break;
58 }
59 buf.push(*p);
60 p = p.offset(1);
61 }
62
63 match String::from_utf8(buf) {
64 Ok(s) => Ok(s),
65 Err(_) => Err(FreeRtosError::StringConversionError),
66 }
67}