Skip to content

Commit bd0b393

Browse files
committed
get build-date, structure a bunch of stuff to get device info
1 parent 0cff179 commit bd0b393

File tree

3 files changed

+79
-30
lines changed

3 files changed

+79
-30
lines changed

rust/libmultisense-ambarella/src/lib.rs

Lines changed: 70 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,15 @@ use str0m::{change::SdpOffer, Candidate, Rtc};
33
use systemstat::{Platform, System};
44

55
pub struct MswebrtcImpl {
6+
host: String,
67
pc: Rtc,
78
sockets: Vec<UdpSocket>,
89
}
910

11+
struct Info {
12+
builddate: String,
13+
}
14+
1015
#[allow(dead_code)]
1116
#[derive(Debug)]
1217
pub struct MswebrtcError {
@@ -15,14 +20,14 @@ pub struct MswebrtcError {
1520
}
1621

1722
impl MswebrtcImpl {
18-
fn connect_internal(&mut self, host: String) -> Result<(), MswebrtcError> {
23+
fn connect(&mut self) -> Result<(), MswebrtcError> {
1924
let client = reqwest::blocking::Client::builder()
2025
.danger_accept_invalid_certs(true)
2126
.build()
2227
.unwrap();
2328
let offer = SdpOffer::from_sdp_string(
2429
client
25-
.get(host.clone() + "/offer")
30+
.get(self.host.clone() + "/offer")
2631
.send()
2732
.map_err(|e| MswebrtcError {
2833
what: "Failed to request offer".to_owned(),
@@ -98,7 +103,7 @@ impl MswebrtcImpl {
98103
err: Some(Box::new(e)),
99104
})?;
100105
client
101-
.post(host + "/answer")
106+
.post(self.host.clone() + "/answer")
102107
.header("content-type", "application/json")
103108
.body(answer)
104109
.send()
@@ -108,45 +113,85 @@ impl MswebrtcImpl {
108113
err: Some(Box::new(e)),
109114
})?
110115
}
111-
fn connect(&mut self, host: String) -> bool {
112-
match self.connect_internal(host) {
113-
Ok(_) => true,
114-
Err(e) => {
115-
println!("ERROR CONNECTING: {:?}", e);
116-
false
117-
}
118-
}
119-
}
120116
fn disconnect(&self) {
121117
println!("DISCONNECT");
122118
}
119+
120+
fn get_info(&self) -> Result<Info, MswebrtcError> {
121+
let client = reqwest::blocking::Client::builder()
122+
.danger_accept_invalid_certs(true)
123+
.build()
124+
.unwrap();
125+
let j = client
126+
.get(self.host.clone() + "/info.json")
127+
.send()
128+
.map_err(|e| MswebrtcError {
129+
what: "Failed to request offer".to_owned(),
130+
err: Some(Box::new(e)),
131+
})?;
132+
let j = j.text().map_err(|e| MswebrtcError {
133+
what: "Failed to extract offer from HTTP response".to_owned(),
134+
err: Some(Box::new(e)),
135+
})?;
136+
let j: serde_json::Value = serde_json::from_str(j.as_str()).map_err(|e| MswebrtcError {
137+
what: "Failed to parse info.json".to_owned(),
138+
err: Some(Box::new(e)),
139+
})?;
140+
Ok(Info {
141+
builddate: j["build-time"].to_string(),
142+
})
143+
}
123144
}
124145

125146
#[no_mangle]
126-
pub extern "C" fn create_mswebrtc_impl() -> *mut MswebrtcImpl {
147+
pub extern "C" fn create_mswebrtc_impl(host: *const std::ffi::c_char) -> *mut MswebrtcImpl {
127148
let pc = Rtc::new();
128149
let out = Box::new(MswebrtcImpl {
150+
host: unsafe { std::ffi::CStr::from_ptr(host) }
151+
.to_str()
152+
.unwrap()
153+
.to_string(),
129154
pc: pc,
130155
sockets: Vec::new(),
131156
});
132157
Box::into_raw(out)
133158
}
134159

135160
#[no_mangle]
136-
pub extern "C" fn connect_mswebrtc_impl(
161+
pub extern "C" fn connect_mswebrtc_impl(obj: *mut MswebrtcImpl) -> bool {
162+
let r = unsafe { &mut *obj };
163+
match r.connect() {
164+
Ok(_) => true,
165+
Err(e) => {
166+
println!("ERROR CONNECTING: {:?}", e);
167+
false
168+
}
169+
}
170+
}
171+
172+
#[no_mangle]
173+
pub extern "C" fn get_info_mswebrtc_impl(
137174
obj: *mut MswebrtcImpl,
138-
addr: *const std::ffi::c_char,
175+
mut buildtime: *mut std::ffi::c_char,
139176
) -> bool {
140-
let (r, addr) = unsafe {
141-
(
142-
&mut *obj,
143-
std::ffi::CStr::from_ptr(addr as *const i8)
144-
.to_str()
145-
.unwrap()
146-
.to_string(),
147-
)
148-
};
149-
r.connect(addr)
177+
let r = unsafe { &*obj };
178+
let i = r.get_info();
179+
match i {
180+
Ok(i) => {
181+
for (i, c) in i.builddate.chars().enumerate() {
182+
unsafe { *buildtime = c as std::ffi::c_char };
183+
buildtime = buildtime.wrapping_add(1);
184+
if i >= 31 {
185+
break;
186+
}
187+
}
188+
true
189+
}
190+
Err(e) => {
191+
println!("ERROR Getting Info: {:?}", e);
192+
false
193+
}
194+
}
150195
}
151196

152197
#[no_mangle]

source/LibMultiSense/details/mswebrtc/channel.cc

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040
namespace multisense {
4141
namespace mswebrtc {
4242

43-
MswebrtcChannel::MswebrtcChannel(const Config &):impl(create_mswebrtc_impl())
43+
MswebrtcChannel::MswebrtcChannel(const Config &c):impl(create_mswebrtc_impl(c.ip_address.c_str()))
4444
{
4545
}
4646

@@ -70,9 +70,9 @@ void MswebrtcChannel::add_imu_frame_callback(std::function<void(const ImuFrame&)
7070
CRL_EXCEPTION("NOT IMPLEMENTED");
7171
}
7272

73-
Status MswebrtcChannel::connect(const Config &conf)
73+
Status MswebrtcChannel::connect(const Config &)
7474
{
75-
if (connect_mswebrtc_impl(impl, conf.ip_address.c_str())) {
75+
if (connect_mswebrtc_impl(impl)) {
7676
return Status::OK;
7777
}
7878
else {
@@ -117,7 +117,11 @@ Status MswebrtcChannel::set_calibration(const StereoCalibration &)
117117

118118
MultiSenseInfo MswebrtcChannel::get_info()
119119
{
120-
CRL_EXCEPTION("NOT IMPLEMENTED");
120+
char builddate[32] = {};
121+
MultiSenseInfo out = {};
122+
get_info_mswebrtc_impl(impl, builddate);
123+
out.version.firmware_build_date = std::string(builddate);
124+
return out;
121125
}
122126

123127
Status MswebrtcChannel::set_device_info(const MultiSenseInfo::DeviceInfo &, const std::string &)

source/LibMultiSense/include/MultiSense/MultiSenseTypes.hh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1622,7 +1622,7 @@ struct MultiSenseInfo
16221622
///
16231623
MultiSenseInfo::Version firmware_version{};
16241624

1625-
///
1625+
///1
16261626
/// @brief ID for the version of hardware
16271627
///
16281628
uint64_t hardware_version = 0;

0 commit comments

Comments
 (0)