1#![no_std]
33#![allow(clippy::not_unsafe_ptr_arg_deref)]
34
35use core::ffi::c_void;
36
37#[cfg(feature = "posix-c-port")]
45#[doc(hidden)]
46#[inline(never)]
47pub extern "C" fn _nros_force_link_cffi() {}
48
49pub mod generated;
62pub use generated::*;
63
64pub mod log;
68
69pub type NrosPlatformLogWriterFn = unsafe extern "C" fn(
75 severity: u8,
76 name_ptr: *const u8,
77 name_len: usize,
78 msg_ptr: *const u8,
79 msg_len: usize,
80);
81
82pub type NrosPlatformLogFlushFn = unsafe extern "C" fn();
86
87pub use crate::generated::{
117 NROS_PLATFORM_RET_ERROR, NROS_PLATFORM_RET_INVALID, NROS_PLATFORM_RET_NOMEM,
118 NROS_PLATFORM_RET_OK, NROS_PLATFORM_RET_TIMEOUT, NROS_PLATFORM_RET_UNSUPPORTED,
119};
120
121pub type NrosPlatformRet = crate::generated::nros_platform_ret_t;
123
124pub struct CffiPlatform;
135
136impl nros_platform_api::PlatformClock for CffiPlatform {
137 #[inline]
138 fn clock_ns() -> u64 {
139 unsafe { nros_platform_clock_ns() }
140 }
141
142 #[inline]
143 fn clock_resolution_ns() -> u64 {
144 unsafe { nros_platform_clock_resolution_ns() }
145 }
146
147 #[inline]
152 fn epoch_us() -> u64 {
153 unsafe { nros_platform_epoch_us() }
154 }
155}
156
157impl nros_platform_api::PlatformAlloc for CffiPlatform {
158 #[inline]
159 fn alloc(size: usize) -> *mut c_void {
160 unsafe { nros_platform_alloc(size) }
161 }
162
163 #[inline]
164 fn realloc(ptr: *mut c_void, size: usize) -> *mut c_void {
165 unsafe { nros_platform_realloc(ptr, size) }
166 }
167
168 #[inline]
169 fn dealloc(ptr: *mut c_void) {
170 unsafe { nros_platform_dealloc(ptr) }
171 }
172
173 #[inline]
174 fn heap_used_bytes() -> usize {
175 unsafe { nros_platform_heap_used_bytes() }
176 }
177
178 #[inline]
179 fn heap_total_bytes() -> usize {
180 unsafe { nros_platform_heap_total_bytes() }
181 }
182}
183
184impl nros_platform_api::PlatformSleep for CffiPlatform {
185 #[inline]
186 fn sleep_us(us: usize) {
187 unsafe { nros_platform_sleep_us(us) }
188 }
189
190 #[inline]
191 fn sleep_ms(ms: usize) {
192 unsafe { nros_platform_sleep_ms(ms) }
193 }
194
195 #[inline]
196 fn sleep_s(s: usize) {
197 unsafe { nros_platform_sleep_s(s) }
198 }
199}
200
201impl nros_platform_api::PlatformYield for CffiPlatform {
202 #[inline]
203 fn yield_now() {
204 unsafe { nros_platform_yield_now() }
205 }
206}
207
208impl nros_platform_api::PlatformScheduler for CffiPlatform {
212 #[inline]
213 fn yield_now() {
214 unsafe { nros_platform_yield_now() }
215 }
216}
217
218#[derive(Debug)]
229pub struct CffiTimerHandle(*mut c_void);
230
231unsafe impl Send for CffiTimerHandle {}
238unsafe impl Sync for CffiTimerHandle {}
239
240impl nros_platform_api::PlatformTimer for CffiPlatform {
241 type TimerHandle = CffiTimerHandle;
242
243 fn create_periodic(
244 period_us: u32,
245 callback: extern "C" fn(*mut c_void),
246 user_data: *mut c_void,
247 ) -> Result<Self::TimerHandle, nros_platform_api::TimerError> {
248 let cb: unsafe extern "C" fn(*mut c_void) = callback;
252 let raw = unsafe { nros_platform_timer_create_periodic(period_us, Some(cb), user_data) };
253 if raw.is_null() {
254 return Err(nros_platform_api::TimerError::KernelError);
262 }
263 Ok(CffiTimerHandle(raw))
264 }
265
266 fn create_oneshot(
267 timeout_us: u32,
268 callback: extern "C" fn(*mut c_void),
269 user_data: *mut c_void,
270 ) -> Result<Self::TimerHandle, nros_platform_api::TimerError> {
271 let cb: unsafe extern "C" fn(*mut c_void) = callback;
272 let raw = unsafe { nros_platform_timer_create_oneshot(timeout_us, Some(cb), user_data) };
273 if raw.is_null() {
274 return Err(nros_platform_api::TimerError::KernelError);
275 }
276 Ok(CffiTimerHandle(raw))
277 }
278
279 fn destroy(handle: Self::TimerHandle) {
280 unsafe { nros_platform_timer_destroy(handle.0) }
281 }
282
283 fn cancel(handle: &mut Self::TimerHandle) -> bool {
284 let rc = unsafe { nros_platform_timer_cancel(handle.0) };
285 rc == 1
289 }
290}
291
292impl nros_platform_api::PlatformRandom for CffiPlatform {
293 #[inline]
294 fn random_u8() -> u8 {
295 unsafe { nros_platform_random_u8() }
296 }
297
298 #[inline]
299 fn random_u16() -> u16 {
300 unsafe { nros_platform_random_u16() }
301 }
302
303 #[inline]
304 fn random_u32() -> u32 {
305 unsafe { nros_platform_random_u32() }
306 }
307
308 #[inline]
309 fn random_u64() -> u64 {
310 unsafe { nros_platform_random_u64() }
311 }
312
313 #[inline]
314 fn random_fill(buf: *mut c_void, len: usize) {
315 unsafe { nros_platform_random_fill(buf, len) }
316 }
317}
318
319impl nros_platform_api::PlatformTime for CffiPlatform {
320 #[inline]
321 fn time_now_ns() -> u64 {
322 unsafe { nros_platform_time_now_ns() }
323 }
324}
325
326impl nros_platform_api::PlatformThreading for CffiPlatform {
327 fn task_init(
328 task: *mut c_void,
329 attr: *mut c_void,
330 entry: Option<unsafe extern "C" fn(*mut c_void) -> *mut c_void>,
331 arg: *mut c_void,
332 ) -> i8 {
333 unsafe { nros_platform_task_init(task, attr, entry, arg) }
334 }
335 fn task_join(task: *mut c_void) -> i8 {
336 unsafe { nros_platform_task_join(task) }
337 }
338 fn task_detach(task: *mut c_void) -> i8 {
339 unsafe { nros_platform_task_detach(task) }
340 }
341 fn task_cancel(task: *mut c_void) -> i8 {
342 unsafe { nros_platform_task_cancel(task) }
343 }
344 fn task_exit() {
345 unsafe { nros_platform_task_exit() }
346 }
347 fn task_free(task: *mut *mut c_void) {
348 unsafe { nros_platform_task_free(task) }
349 }
350 fn mutex_init(m: *mut c_void) -> i8 {
351 unsafe { nros_platform_mutex_init(m) }
352 }
353 fn mutex_drop(m: *mut c_void) -> i8 {
354 unsafe { nros_platform_mutex_drop(m) }
355 }
356 fn mutex_lock(m: *mut c_void) -> i8 {
357 unsafe { nros_platform_mutex_lock(m) }
358 }
359 fn mutex_try_lock(m: *mut c_void) -> i8 {
360 unsafe { nros_platform_mutex_try_lock(m) }
361 }
362 fn mutex_unlock(m: *mut c_void) -> i8 {
363 unsafe { nros_platform_mutex_unlock(m) }
364 }
365 fn mutex_rec_init(m: *mut c_void) -> i8 {
366 unsafe { nros_platform_mutex_rec_init(m) }
367 }
368 fn mutex_rec_drop(m: *mut c_void) -> i8 {
369 unsafe { nros_platform_mutex_rec_drop(m) }
370 }
371 fn mutex_rec_lock(m: *mut c_void) -> i8 {
372 unsafe { nros_platform_mutex_rec_lock(m) }
373 }
374 fn mutex_rec_try_lock(m: *mut c_void) -> i8 {
375 unsafe { nros_platform_mutex_rec_try_lock(m) }
376 }
377 fn mutex_rec_unlock(m: *mut c_void) -> i8 {
378 unsafe { nros_platform_mutex_rec_unlock(m) }
379 }
380 fn condvar_init(cv: *mut c_void) -> i8 {
381 unsafe { nros_platform_condvar_init(cv) }
382 }
383 fn condvar_drop(cv: *mut c_void) -> i8 {
384 unsafe { nros_platform_condvar_drop(cv) }
385 }
386 fn condvar_signal(cv: *mut c_void) -> i8 {
387 unsafe { nros_platform_condvar_signal(cv) }
388 }
389 fn condvar_signal_all(cv: *mut c_void) -> i8 {
390 unsafe { nros_platform_condvar_signal_all(cv) }
391 }
392 fn condvar_signal_from_isr(cv: *mut c_void) -> i8 {
393 unsafe { nros_platform_condvar_signal_from_isr(cv) }
394 }
395 fn condvar_wait_until(cv: *mut c_void, m: *mut c_void, abstime: u64) -> i8 {
396 unsafe { nros_platform_condvar_wait_until(cv, m, abstime) }
397 }
398 fn wake_init(w: *mut c_void) -> i8 {
399 unsafe { nros_platform_wake_init(w) }
400 }
401 fn wake_drop(w: *mut c_void) -> i8 {
402 unsafe { nros_platform_wake_drop(w) }
403 }
404 fn wake_wait_ms(w: *mut c_void, timeout_ms: u32) -> i8 {
405 unsafe { nros_platform_wake_wait_ms(w, timeout_ms) }
406 }
407 fn wake_signal(w: *mut c_void) -> i8 {
408 unsafe { nros_platform_wake_signal(w) }
409 }
410 fn wake_signal_from_isr(w: *mut c_void) -> i8 {
411 unsafe { nros_platform_wake_signal_from_isr(w) }
412 }
413 fn wake_storage_size() -> usize {
425 unsafe { nros_platform_wake_storage_size() }
426 }
427 fn wake_storage_align() -> usize {
428 unsafe { nros_platform_wake_storage_align() }
429 }
430 fn task_storage_size() -> usize {
431 unsafe { nros_platform_task_storage_size() }
432 }
433 fn task_storage_align() -> usize {
434 unsafe { nros_platform_task_storage_align() }
435 }
436}
437
438impl nros_platform_api::PlatformTcp for CffiPlatform {
449 fn create_endpoint(ep: *mut c_void, address: *const u8, port: *const u8) -> i8 {
450 unsafe { nros_platform_tcp_create_endpoint(ep, address, port) }
451 }
452 fn free_endpoint(ep: *mut c_void) {
453 unsafe { nros_platform_tcp_free_endpoint(ep) }
454 }
455 fn open(sock: *mut c_void, endpoint: *const c_void, timeout_ms: u32) -> i8 {
456 unsafe { nros_platform_tcp_open(sock, endpoint, timeout_ms) }
457 }
458 fn listen(sock: *mut c_void, endpoint: *const c_void) -> i8 {
459 unsafe { nros_platform_tcp_listen(sock, endpoint) }
460 }
461 fn close(sock: *mut c_void) {
462 unsafe { nros_platform_tcp_close(sock) }
463 }
464 fn read(sock: *const c_void, buf: *mut u8, len: usize) -> usize {
465 unsafe { nros_platform_tcp_read(sock, buf, len) }
466 }
467 fn read_exact(sock: *const c_void, buf: *mut u8, len: usize) -> usize {
468 unsafe { nros_platform_tcp_read_exact(sock, buf, len) }
469 }
470 fn send(sock: *const c_void, buf: *const u8, len: usize) -> usize {
471 unsafe { nros_platform_tcp_send(sock, buf, len) }
472 }
473 fn set_rx_notify(
474 sock: *const c_void,
475 notify: Option<unsafe extern "C" fn(*mut c_void)>,
476 ctx: *mut c_void,
477 ) -> i8 {
478 unsafe { nros_platform_tcp_set_rx_notify(sock, notify, ctx) }
479 }
480}
481
482impl nros_platform_api::PlatformUdp for CffiPlatform {
483 fn create_endpoint(ep: *mut c_void, address: *const u8, port: *const u8) -> i8 {
484 unsafe { nros_platform_udp_create_endpoint(ep, address, port) }
485 }
486 fn free_endpoint(ep: *mut c_void) {
487 unsafe { nros_platform_udp_free_endpoint(ep) }
488 }
489 fn open(sock: *mut c_void, endpoint: *const c_void, timeout_ms: u32) -> i8 {
490 unsafe { nros_platform_udp_open(sock, endpoint, timeout_ms) }
491 }
492 fn listen(sock: *mut c_void, endpoint: *const c_void, timeout_ms: u32) -> i8 {
493 unsafe { nros_platform_udp_listen(sock, endpoint, timeout_ms) }
494 }
495 fn close(sock: *mut c_void) {
496 unsafe { nros_platform_udp_close(sock) }
497 }
498 fn read(sock: *const c_void, buf: *mut u8, len: usize) -> usize {
499 unsafe { nros_platform_udp_read(sock, buf, len) }
500 }
501 fn read_exact(sock: *const c_void, buf: *mut u8, len: usize) -> usize {
502 unsafe { nros_platform_udp_read_exact(sock, buf, len) }
503 }
504 fn send(sock: *const c_void, buf: *const u8, len: usize, endpoint: *const c_void) -> usize {
505 unsafe { nros_platform_udp_send(sock, buf, len, endpoint) }
506 }
507 fn set_recv_timeout(sock: *const c_void, timeout_ms: u32) {
508 unsafe { nros_platform_udp_set_recv_timeout(sock, timeout_ms) }
509 }
510 fn readiness_handle(sock: *const c_void) -> i32 {
511 unsafe { nros_platform_udp_readiness_handle(sock) }
512 }
513 fn set_rx_notify(
514 sock: *const c_void,
515 notify: Option<unsafe extern "C" fn(*mut c_void)>,
516 ctx: *mut c_void,
517 ) -> i8 {
518 unsafe { nros_platform_udp_set_rx_notify(sock, notify, ctx) }
519 }
520}
521
522impl nros_platform_api::PlatformUdpMulticast for CffiPlatform {
523 fn mcast_open(
524 sock: *mut c_void,
525 endpoint: *const c_void,
526 lep: *mut c_void,
527 timeout_ms: u32,
528 iface: *const u8,
529 ) -> i8 {
530 unsafe { nros_platform_udp_mcast_open(sock, endpoint, lep, timeout_ms, iface) }
531 }
532 fn mcast_listen(
533 sock: *mut c_void,
534 endpoint: *const c_void,
535 timeout_ms: u32,
536 iface: *const u8,
537 join: *const u8,
538 ) -> i8 {
539 unsafe { nros_platform_udp_mcast_listen(sock, endpoint, timeout_ms, iface, join) }
540 }
541 fn mcast_close(
542 sockrecv: *mut c_void,
543 socksend: *mut c_void,
544 rep: *const c_void,
545 lep: *const c_void,
546 ) {
547 unsafe { nros_platform_udp_mcast_close(sockrecv, socksend, rep, lep) }
548 }
549 fn mcast_read(
550 sock: *const c_void,
551 buf: *mut u8,
552 len: usize,
553 lep: *const c_void,
554 addr: *mut c_void,
555 ) -> usize {
556 unsafe { nros_platform_udp_mcast_read(sock, buf, len, lep, addr) }
557 }
558 fn mcast_read_exact(
559 sock: *const c_void,
560 buf: *mut u8,
561 len: usize,
562 lep: *const c_void,
563 addr: *mut c_void,
564 ) -> usize {
565 unsafe { nros_platform_udp_mcast_read_exact(sock, buf, len, lep, addr) }
566 }
567 fn mcast_send(
568 sock: *const c_void,
569 buf: *const u8,
570 len: usize,
571 endpoint: *const c_void,
572 ) -> usize {
573 unsafe { nros_platform_udp_mcast_send(sock, buf, len, endpoint) }
574 }
575}
576
577impl nros_platform_api::PlatformSocketHelpers for CffiPlatform {
578 fn set_non_blocking(sock: *const c_void) -> i8 {
579 unsafe { nros_platform_socket_set_non_blocking(sock) }
580 }
581 fn accept(sock_in: *const c_void, sock_out: *mut c_void) -> i8 {
582 unsafe { nros_platform_socket_accept(sock_in, sock_out) }
583 }
584 fn close(sock: *mut c_void) {
585 unsafe { nros_platform_socket_close(sock) }
586 }
587 fn wait_event(peers: *mut c_void, mutex: *mut c_void) -> i8 {
588 unsafe { nros_platform_socket_wait_event(peers, mutex) }
589 }
590}
591
592impl nros_platform_api::PlatformNetworkPoll for CffiPlatform {
593 fn network_poll() {
594 unsafe { nros_platform_network_poll() }
595 }
596}
597
598impl nros_platform_api::PlatformCriticalSection for CffiPlatform {
599 fn acquire() -> u32 {
600 unsafe { nros_platform_critical_section_acquire() }
601 }
602 fn release(token: u32) {
603 unsafe { nros_platform_critical_section_release(token) }
604 }
605}
606
607impl nros_platform_api::PlatformLog for CffiPlatform {
608 fn write(severity: u8, name: &[u8], message: &[u8]) {
609 unsafe {
613 nros_platform_log_write(
614 severity,
615 name.as_ptr(),
616 name.len(),
617 message.as_ptr(),
618 message.len(),
619 );
620 }
621 }
622
623 fn flush() {
624 unsafe { nros_platform_log_flush() };
626 }
627}
628
629#[macro_export]
648macro_rules! nros_platform_export_clock {
649 ($ty:ty) => {
650 #[unsafe(no_mangle)]
651 pub extern "C" fn nros_platform_clock_ns() -> u64 {
652 <$ty as ::nros_platform_api::PlatformClock>::clock_ns()
653 }
654 #[unsafe(no_mangle)]
655 pub extern "C" fn nros_platform_clock_resolution_ns() -> u64 {
656 <$ty as ::nros_platform_api::PlatformClock>::clock_resolution_ns()
657 }
658 #[unsafe(no_mangle)]
662 pub extern "C" fn nros_platform_epoch_us() -> u64 {
663 <$ty as ::nros_platform_api::PlatformClock>::epoch_us()
664 }
665 };
666}
667
668#[macro_export]
676macro_rules! nros_platform_export_panic {
677 ($ty:ty) => {
678 #[unsafe(no_mangle)]
679 pub extern "C" fn nros_platform_panic(msg: *const u8, len: usize) -> ! {
680 <$ty as ::nros_platform_api::PlatformPanic>::panic(msg, len)
681 }
682 };
683}
684
685#[macro_export]
688macro_rules! nros_platform_export_alloc {
689 ($ty:ty) => {
690 #[unsafe(no_mangle)]
691 pub extern "C" fn nros_platform_alloc(size: usize) -> *mut ::core::ffi::c_void {
692 <$ty as ::nros_platform_api::PlatformAlloc>::alloc(size)
693 }
694 #[unsafe(no_mangle)]
695 pub extern "C" fn nros_platform_realloc(
696 ptr: *mut ::core::ffi::c_void,
697 size: usize,
698 ) -> *mut ::core::ffi::c_void {
699 <$ty as ::nros_platform_api::PlatformAlloc>::realloc(ptr, size)
700 }
701 #[unsafe(no_mangle)]
702 pub extern "C" fn nros_platform_dealloc(ptr: *mut ::core::ffi::c_void) {
703 <$ty as ::nros_platform_api::PlatformAlloc>::dealloc(ptr)
704 }
705 #[unsafe(no_mangle)]
706 pub extern "C" fn nros_platform_heap_used_bytes() -> usize {
707 <$ty as ::nros_platform_api::PlatformAlloc>::heap_used_bytes()
708 }
709 #[unsafe(no_mangle)]
710 pub extern "C" fn nros_platform_heap_total_bytes() -> usize {
711 <$ty as ::nros_platform_api::PlatformAlloc>::heap_total_bytes()
712 }
713 };
714}
715
716#[macro_export]
719macro_rules! nros_platform_export_sleep {
720 ($ty:ty) => {
721 #[unsafe(no_mangle)]
722 pub extern "C" fn nros_platform_sleep_us(us: usize) {
723 <$ty as ::nros_platform_api::PlatformSleep>::sleep_us(us)
724 }
725 #[unsafe(no_mangle)]
726 pub extern "C" fn nros_platform_sleep_ms(ms: usize) {
727 <$ty as ::nros_platform_api::PlatformSleep>::sleep_ms(ms)
728 }
729 #[unsafe(no_mangle)]
730 pub extern "C" fn nros_platform_sleep_s(s: usize) {
731 <$ty as ::nros_platform_api::PlatformSleep>::sleep_s(s)
732 }
733 };
734}
735
736#[macro_export]
739macro_rules! nros_platform_export_yield {
740 ($ty:ty) => {
741 #[unsafe(no_mangle)]
742 pub extern "C" fn nros_platform_yield_now() {
743 <$ty as ::nros_platform_api::PlatformYield>::yield_now()
744 }
745 };
746}
747
748#[macro_export]
750macro_rules! nros_platform_export_random {
751 ($ty:ty) => {
752 #[unsafe(no_mangle)]
753 pub extern "C" fn nros_platform_random_u8() -> u8 {
754 <$ty as ::nros_platform_api::PlatformRandom>::random_u8()
755 }
756 #[unsafe(no_mangle)]
757 pub extern "C" fn nros_platform_random_u16() -> u16 {
758 <$ty as ::nros_platform_api::PlatformRandom>::random_u16()
759 }
760 #[unsafe(no_mangle)]
761 pub extern "C" fn nros_platform_random_u32() -> u32 {
762 <$ty as ::nros_platform_api::PlatformRandom>::random_u32()
763 }
764 #[unsafe(no_mangle)]
765 pub extern "C" fn nros_platform_random_u64() -> u64 {
766 <$ty as ::nros_platform_api::PlatformRandom>::random_u64()
767 }
768 #[unsafe(no_mangle)]
769 pub extern "C" fn nros_platform_random_fill(buf: *mut ::core::ffi::c_void, len: usize) {
770 <$ty as ::nros_platform_api::PlatformRandom>::random_fill(buf, len)
771 }
772 };
773}
774
775#[macro_export]
777macro_rules! nros_platform_export_time {
778 ($ty:ty) => {
779 #[unsafe(no_mangle)]
780 pub extern "C" fn nros_platform_time_now_ns() -> u64 {
781 <$ty as ::nros_platform_api::PlatformTime>::time_now_ns()
782 }
783 };
784}
785
786#[macro_export]
791macro_rules! nros_platform_export_threading {
792 ($ty:ty) => {
793 #[unsafe(no_mangle)]
794 pub extern "C" fn nros_platform_task_init(
795 task: *mut ::core::ffi::c_void,
796 attr: *mut ::core::ffi::c_void,
797 entry: ::core::option::Option<
798 unsafe extern "C" fn(*mut ::core::ffi::c_void) -> *mut ::core::ffi::c_void,
799 >,
800 arg: *mut ::core::ffi::c_void,
801 ) -> i8 {
802 <$ty as ::nros_platform_api::PlatformThreading>::task_init(task, attr, entry, arg)
803 }
804 #[unsafe(no_mangle)]
805 pub extern "C" fn nros_platform_task_stack_unused_bytes() -> usize {
806 <$ty as ::nros_platform_api::PlatformThreading>::task_stack_unused_bytes()
807 }
808 #[unsafe(no_mangle)]
809 pub extern "C" fn nros_platform_task_stack_unused_bytes_upto(limit: usize) -> usize {
810 <$ty as ::nros_platform_api::PlatformThreading>::task_stack_unused_bytes_upto(limit)
811 }
812 #[unsafe(no_mangle)]
813 pub extern "C" fn nros_platform_task_join(task: *mut ::core::ffi::c_void) -> i8 {
814 <$ty as ::nros_platform_api::PlatformThreading>::task_join(task)
815 }
816 #[unsafe(no_mangle)]
817 pub extern "C" fn nros_platform_task_detach(task: *mut ::core::ffi::c_void) -> i8 {
818 <$ty as ::nros_platform_api::PlatformThreading>::task_detach(task)
819 }
820 #[unsafe(no_mangle)]
821 pub extern "C" fn nros_platform_task_cancel(task: *mut ::core::ffi::c_void) -> i8 {
822 <$ty as ::nros_platform_api::PlatformThreading>::task_cancel(task)
823 }
824 #[unsafe(no_mangle)]
825 pub extern "C" fn nros_platform_task_exit() {
826 <$ty as ::nros_platform_api::PlatformThreading>::task_exit()
827 }
828 #[unsafe(no_mangle)]
829 pub extern "C" fn nros_platform_task_free(task: *mut *mut ::core::ffi::c_void) {
830 <$ty as ::nros_platform_api::PlatformThreading>::task_free(task)
831 }
832 #[unsafe(no_mangle)]
833 pub extern "C" fn nros_platform_mutex_init(m: *mut ::core::ffi::c_void) -> i8 {
834 <$ty as ::nros_platform_api::PlatformThreading>::mutex_init(m)
835 }
836 #[unsafe(no_mangle)]
837 pub extern "C" fn nros_platform_mutex_drop(m: *mut ::core::ffi::c_void) -> i8 {
838 <$ty as ::nros_platform_api::PlatformThreading>::mutex_drop(m)
839 }
840 #[unsafe(no_mangle)]
841 pub extern "C" fn nros_platform_mutex_lock(m: *mut ::core::ffi::c_void) -> i8 {
842 <$ty as ::nros_platform_api::PlatformThreading>::mutex_lock(m)
843 }
844 #[unsafe(no_mangle)]
845 pub extern "C" fn nros_platform_mutex_try_lock(m: *mut ::core::ffi::c_void) -> i8 {
846 <$ty as ::nros_platform_api::PlatformThreading>::mutex_try_lock(m)
847 }
848 #[unsafe(no_mangle)]
849 pub extern "C" fn nros_platform_mutex_unlock(m: *mut ::core::ffi::c_void) -> i8 {
850 <$ty as ::nros_platform_api::PlatformThreading>::mutex_unlock(m)
851 }
852 #[unsafe(no_mangle)]
853 pub extern "C" fn nros_platform_mutex_rec_init(m: *mut ::core::ffi::c_void) -> i8 {
854 <$ty as ::nros_platform_api::PlatformThreading>::mutex_rec_init(m)
855 }
856 #[unsafe(no_mangle)]
857 pub extern "C" fn nros_platform_mutex_rec_drop(m: *mut ::core::ffi::c_void) -> i8 {
858 <$ty as ::nros_platform_api::PlatformThreading>::mutex_rec_drop(m)
859 }
860 #[unsafe(no_mangle)]
861 pub extern "C" fn nros_platform_mutex_rec_lock(m: *mut ::core::ffi::c_void) -> i8 {
862 <$ty as ::nros_platform_api::PlatformThreading>::mutex_rec_lock(m)
863 }
864 #[unsafe(no_mangle)]
865 pub extern "C" fn nros_platform_mutex_rec_try_lock(m: *mut ::core::ffi::c_void) -> i8 {
866 <$ty as ::nros_platform_api::PlatformThreading>::mutex_rec_try_lock(m)
867 }
868 #[unsafe(no_mangle)]
869 pub extern "C" fn nros_platform_mutex_rec_unlock(m: *mut ::core::ffi::c_void) -> i8 {
870 <$ty as ::nros_platform_api::PlatformThreading>::mutex_rec_unlock(m)
871 }
872 #[unsafe(no_mangle)]
873 pub extern "C" fn nros_platform_condvar_init(cv: *mut ::core::ffi::c_void) -> i8 {
874 <$ty as ::nros_platform_api::PlatformThreading>::condvar_init(cv)
875 }
876 #[unsafe(no_mangle)]
877 pub extern "C" fn nros_platform_condvar_drop(cv: *mut ::core::ffi::c_void) -> i8 {
878 <$ty as ::nros_platform_api::PlatformThreading>::condvar_drop(cv)
879 }
880 #[unsafe(no_mangle)]
881 pub extern "C" fn nros_platform_condvar_signal(cv: *mut ::core::ffi::c_void) -> i8 {
882 <$ty as ::nros_platform_api::PlatformThreading>::condvar_signal(cv)
883 }
884 #[unsafe(no_mangle)]
885 pub extern "C" fn nros_platform_condvar_signal_all(cv: *mut ::core::ffi::c_void) -> i8 {
886 <$ty as ::nros_platform_api::PlatformThreading>::condvar_signal_all(cv)
887 }
888 #[unsafe(no_mangle)]
889 pub extern "C" fn nros_platform_condvar_signal_from_isr(
890 cv: *mut ::core::ffi::c_void,
891 ) -> i8 {
892 <$ty as ::nros_platform_api::PlatformThreading>::condvar_signal_from_isr(cv)
893 }
894 #[unsafe(no_mangle)]
895 pub extern "C" fn nros_platform_condvar_wait_until(
896 cv: *mut ::core::ffi::c_void,
897 m: *mut ::core::ffi::c_void,
898 abstime: u64,
899 ) -> i8 {
900 <$ty as ::nros_platform_api::PlatformThreading>::condvar_wait_until(cv, m, abstime)
901 }
902 #[unsafe(no_mangle)]
904 pub extern "C" fn nros_platform_wake_init(w: *mut ::core::ffi::c_void) -> i8 {
905 <$ty as ::nros_platform_api::PlatformThreading>::wake_init(w)
906 }
907 #[unsafe(no_mangle)]
908 pub extern "C" fn nros_platform_wake_drop(w: *mut ::core::ffi::c_void) -> i8 {
909 <$ty as ::nros_platform_api::PlatformThreading>::wake_drop(w)
910 }
911 #[unsafe(no_mangle)]
912 pub extern "C" fn nros_platform_wake_wait_ms(
913 w: *mut ::core::ffi::c_void,
914 timeout_ms: u32,
915 ) -> i8 {
916 <$ty as ::nros_platform_api::PlatformThreading>::wake_wait_ms(w, timeout_ms)
917 }
918 #[unsafe(no_mangle)]
919 pub extern "C" fn nros_platform_wake_signal(w: *mut ::core::ffi::c_void) -> i8 {
920 <$ty as ::nros_platform_api::PlatformThreading>::wake_signal(w)
921 }
922 #[unsafe(no_mangle)]
923 pub extern "C" fn nros_platform_wake_signal_from_isr(w: *mut ::core::ffi::c_void) -> i8 {
924 <$ty as ::nros_platform_api::PlatformThreading>::wake_signal_from_isr(w)
925 }
926 #[unsafe(no_mangle)]
927 pub extern "C" fn nros_platform_wake_park_until_us(
928 w: *mut ::core::ffi::c_void,
929 deadline_us: u64,
930 ) -> i8 {
931 <$ty as ::nros_platform_api::PlatformThreading>::wake_park_until_us(w, deadline_us)
932 }
933 #[unsafe(no_mangle)]
934 pub extern "C" fn nros_platform_wake_park_granularity_us() -> u64 {
935 <$ty as ::nros_platform_api::PlatformThreading>::wake_park_granularity_us()
936 }
937 #[unsafe(no_mangle)]
938 pub extern "C" fn nros_platform_wake_park_handles_us(
939 w: *mut ::core::ffi::c_void,
940 handles: *const i32,
941 n: usize,
942 deadline_us: u64,
943 ) -> i8 {
944 <$ty as ::nros_platform_api::PlatformThreading>::wake_park_handles_us(
945 w,
946 handles,
947 n,
948 deadline_us,
949 )
950 }
951 #[unsafe(no_mangle)]
952 pub extern "C" fn nros_platform_task_storage_size() -> usize {
953 <$ty as ::nros_platform_api::PlatformThreading>::task_storage_size()
954 }
955 #[unsafe(no_mangle)]
956 pub extern "C" fn nros_platform_task_storage_align() -> usize {
957 <$ty as ::nros_platform_api::PlatformThreading>::task_storage_align()
958 }
959 #[unsafe(no_mangle)]
960 pub extern "C" fn nros_platform_wake_storage_size() -> usize {
961 <$ty as ::nros_platform_api::PlatformThreading>::wake_storage_size()
962 }
963 #[unsafe(no_mangle)]
964 pub extern "C" fn nros_platform_wake_storage_align() -> usize {
965 <$ty as ::nros_platform_api::PlatformThreading>::wake_storage_align()
966 }
967 #[unsafe(no_mangle)]
972 pub extern "C" fn nros_platform_task_attr_init(
973 attr: *mut $crate::generated::nros_platform_task_attr_t,
974 ) {
975 if attr.is_null() {
976 return;
977 }
978 unsafe {
981 (*attr).name = ::core::ptr::null();
982 (*attr).stack_bytes = 0;
983 (*attr).stack_mem = ::core::ptr::null_mut();
984 (*attr).priority = i32::MIN;
985 (*attr).core = -1;
986 (*attr).flags = 0;
987 }
988 }
989 #[unsafe(no_mangle)]
995 pub extern "C" fn nros_platform_mutex_storage_size() -> usize {
996 <$ty as ::nros_platform_api::PlatformThreading>::mutex_storage_size()
997 }
998 #[unsafe(no_mangle)]
999 pub extern "C" fn nros_platform_mutex_storage_align() -> usize {
1000 <$ty as ::nros_platform_api::PlatformThreading>::mutex_storage_align()
1001 }
1002 #[unsafe(no_mangle)]
1003 pub extern "C" fn nros_platform_mutex_rec_storage_size() -> usize {
1004 <$ty as ::nros_platform_api::PlatformThreading>::mutex_rec_storage_size()
1005 }
1006 #[unsafe(no_mangle)]
1007 pub extern "C" fn nros_platform_mutex_rec_storage_align() -> usize {
1008 <$ty as ::nros_platform_api::PlatformThreading>::mutex_rec_storage_align()
1009 }
1010 #[unsafe(no_mangle)]
1011 pub extern "C" fn nros_platform_condvar_storage_size() -> usize {
1012 <$ty as ::nros_platform_api::PlatformThreading>::condvar_storage_size()
1013 }
1014 #[unsafe(no_mangle)]
1015 pub extern "C" fn nros_platform_condvar_storage_align() -> usize {
1016 <$ty as ::nros_platform_api::PlatformThreading>::condvar_storage_align()
1017 }
1018 };
1019}
1020
1021#[macro_export]
1025macro_rules! nros_platform_export_critical_section {
1026 ($ty:ty) => {
1027 #[unsafe(no_mangle)]
1028 pub extern "C" fn nros_platform_critical_section_acquire() -> u32 {
1029 <$ty as ::nros_platform_api::PlatformCriticalSection>::acquire()
1030 }
1031 #[unsafe(no_mangle)]
1032 pub extern "C" fn nros_platform_critical_section_release(token: u32) {
1033 <$ty as ::nros_platform_api::PlatformCriticalSection>::release(token)
1034 }
1035 };
1036}
1037
1038#[macro_export]
1044macro_rules! nros_platform_export_log {
1045 ($ty:ty) => {
1046 #[unsafe(no_mangle)]
1047 pub extern "C" fn nros_platform_log_write(
1048 severity: u8,
1049 name_ptr: *const u8,
1050 name_len: usize,
1051 msg_ptr: *const u8,
1052 msg_len: usize,
1053 ) {
1054 let name: &[u8] = if name_ptr.is_null() || name_len == 0 {
1058 &[]
1059 } else {
1060 unsafe { ::core::slice::from_raw_parts(name_ptr, name_len) }
1061 };
1062 let msg: &[u8] = if msg_ptr.is_null() || msg_len == 0 {
1063 &[]
1064 } else {
1065 unsafe { ::core::slice::from_raw_parts(msg_ptr, msg_len) }
1066 };
1067 <$ty as ::nros_platform_api::PlatformLog>::write(severity, name, msg);
1068 }
1069 #[unsafe(no_mangle)]
1070 pub extern "C" fn nros_platform_log_flush() {
1071 <$ty as ::nros_platform_api::PlatformLog>::flush()
1072 }
1073 #[unsafe(no_mangle)]
1083 pub extern "C" fn nros_platform_register_log_writer(
1084 _writer: ::core::option::Option<
1085 unsafe extern "C" fn(
1086 severity: u8,
1087 name_ptr: *const u8,
1088 name_len: usize,
1089 msg_ptr: *const u8,
1090 msg_len: usize,
1091 ),
1092 >,
1093 _flusher: ::core::option::Option<unsafe extern "C" fn()>,
1094 ) {
1095 }
1096 };
1097}
1098
1099#[macro_export]
1110macro_rules! nros_platform_export {
1111 ($ty:ty) => {
1112 $crate::nros_platform_export_clock!($ty);
1113 $crate::nros_platform_export_alloc!($ty);
1114 $crate::nros_platform_export_sleep!($ty);
1115 $crate::nros_platform_export_yield!($ty);
1116 $crate::nros_platform_export_random!($ty);
1117 $crate::nros_platform_export_time!($ty);
1118 $crate::nros_platform_export_threading!($ty);
1119 $crate::nros_platform_export_critical_section!($ty);
1120 };
1121}
1122
1123#[macro_export]
1144macro_rules! nros_platform_export_timer {
1145 ($ty:ty) => {
1146 const _: () = {
1153 if ::core::mem::size_of::<<$ty as ::nros_platform_api::PlatformTimer>::TimerHandle>()
1154 != ::core::mem::size_of::<*mut ::core::ffi::c_void>()
1155 {
1156 panic!(
1157 "nros_platform_export_timer! requires \
1158 PlatformTimer::TimerHandle to be pointer-sized"
1159 );
1160 }
1161 };
1162
1163 #[unsafe(no_mangle)]
1164 pub extern "C" fn nros_platform_timer_create_periodic(
1165 period_us: u32,
1166 callback: extern "C" fn(*mut ::core::ffi::c_void),
1167 user_data: *mut ::core::ffi::c_void,
1168 ) -> *mut ::core::ffi::c_void {
1169 match <$ty as ::nros_platform_api::PlatformTimer>::create_periodic(
1170 period_us, callback, user_data,
1171 ) {
1172 Ok(h) => unsafe {
1173 ::core::mem::transmute_copy::<
1174 <$ty as ::nros_platform_api::PlatformTimer>::TimerHandle,
1175 *mut ::core::ffi::c_void,
1176 >(&::core::mem::ManuallyDrop::new(h))
1177 },
1178 Err(_) => ::core::ptr::null_mut(),
1179 }
1180 }
1181 #[unsafe(no_mangle)]
1182 pub extern "C" fn nros_platform_timer_create_oneshot(
1183 timeout_us: u32,
1184 callback: extern "C" fn(*mut ::core::ffi::c_void),
1185 user_data: *mut ::core::ffi::c_void,
1186 ) -> *mut ::core::ffi::c_void {
1187 match <$ty as ::nros_platform_api::PlatformTimer>::create_oneshot(
1188 timeout_us, callback, user_data,
1189 ) {
1190 Ok(h) => unsafe {
1191 ::core::mem::transmute_copy::<
1192 <$ty as ::nros_platform_api::PlatformTimer>::TimerHandle,
1193 *mut ::core::ffi::c_void,
1194 >(&::core::mem::ManuallyDrop::new(h))
1195 },
1196 Err(_) => ::core::ptr::null_mut(),
1197 }
1198 }
1199 #[unsafe(no_mangle)]
1200 pub extern "C" fn nros_platform_timer_destroy(handle: *mut ::core::ffi::c_void) {
1201 let h: <$ty as ::nros_platform_api::PlatformTimer>::TimerHandle = unsafe {
1202 ::core::mem::transmute_copy::<
1203 *mut ::core::ffi::c_void,
1204 <$ty as ::nros_platform_api::PlatformTimer>::TimerHandle,
1205 >(&handle)
1206 };
1207 <$ty as ::nros_platform_api::PlatformTimer>::destroy(h)
1208 }
1209 #[unsafe(no_mangle)]
1210 pub extern "C" fn nros_platform_timer_cancel(handle: *mut ::core::ffi::c_void) -> i8 {
1211 let mut h: <$ty as ::nros_platform_api::PlatformTimer>::TimerHandle = unsafe {
1212 ::core::mem::transmute_copy::<
1213 *mut ::core::ffi::c_void,
1214 <$ty as ::nros_platform_api::PlatformTimer>::TimerHandle,
1215 >(&handle)
1216 };
1217 if <$ty as ::nros_platform_api::PlatformTimer>::cancel(&mut h) {
1218 1
1219 } else {
1220 0
1221 }
1222 }
1223 };
1224}
1225
1226#[macro_export]
1234macro_rules! nros_platform_export_net {
1235 ($ty:ty) => {
1236 #[unsafe(no_mangle)]
1238 pub extern "C" fn nros_platform_tcp_create_endpoint(
1239 ep: *mut ::core::ffi::c_void,
1240 address: *const u8,
1241 port: *const u8,
1242 ) -> i8 {
1243 <$ty as ::nros_platform_api::PlatformTcp>::create_endpoint(ep, address, port)
1244 }
1245 #[unsafe(no_mangle)]
1246 pub extern "C" fn nros_platform_tcp_free_endpoint(ep: *mut ::core::ffi::c_void) {
1247 <$ty as ::nros_platform_api::PlatformTcp>::free_endpoint(ep)
1248 }
1249 #[unsafe(no_mangle)]
1250 pub extern "C" fn nros_platform_tcp_open(
1251 sock: *mut ::core::ffi::c_void,
1252 endpoint: *const ::core::ffi::c_void,
1253 timeout_ms: u32,
1254 ) -> i8 {
1255 <$ty as ::nros_platform_api::PlatformTcp>::open(sock, endpoint, timeout_ms)
1256 }
1257 #[unsafe(no_mangle)]
1258 pub extern "C" fn nros_platform_tcp_listen(
1259 sock: *mut ::core::ffi::c_void,
1260 endpoint: *const ::core::ffi::c_void,
1261 ) -> i8 {
1262 <$ty as ::nros_platform_api::PlatformTcp>::listen(sock, endpoint)
1263 }
1264 #[unsafe(no_mangle)]
1265 pub extern "C" fn nros_platform_tcp_close(sock: *mut ::core::ffi::c_void) {
1266 <$ty as ::nros_platform_api::PlatformTcp>::close(sock)
1267 }
1268 #[unsafe(no_mangle)]
1269 pub extern "C" fn nros_platform_tcp_read(
1270 sock: *const ::core::ffi::c_void,
1271 buf: *mut u8,
1272 len: usize,
1273 ) -> usize {
1274 <$ty as ::nros_platform_api::PlatformTcp>::read(sock, buf, len)
1275 }
1276 #[unsafe(no_mangle)]
1277 pub extern "C" fn nros_platform_tcp_read_exact(
1278 sock: *const ::core::ffi::c_void,
1279 buf: *mut u8,
1280 len: usize,
1281 ) -> usize {
1282 <$ty as ::nros_platform_api::PlatformTcp>::read_exact(sock, buf, len)
1283 }
1284 #[unsafe(no_mangle)]
1285 pub extern "C" fn nros_platform_tcp_send(
1286 sock: *const ::core::ffi::c_void,
1287 buf: *const u8,
1288 len: usize,
1289 ) -> usize {
1290 <$ty as ::nros_platform_api::PlatformTcp>::send(sock, buf, len)
1291 }
1292 #[unsafe(no_mangle)]
1293 pub extern "C" fn nros_platform_tcp_set_rx_notify(
1294 sock: *const ::core::ffi::c_void,
1295 notify: ::core::option::Option<unsafe extern "C" fn(*mut ::core::ffi::c_void)>,
1296 ctx: *mut ::core::ffi::c_void,
1297 ) -> i8 {
1298 <$ty as ::nros_platform_api::PlatformTcp>::set_rx_notify(sock, notify, ctx)
1299 }
1300
1301 #[unsafe(no_mangle)]
1303 pub extern "C" fn nros_platform_udp_create_endpoint(
1304 ep: *mut ::core::ffi::c_void,
1305 address: *const u8,
1306 port: *const u8,
1307 ) -> i8 {
1308 <$ty as ::nros_platform_api::PlatformUdp>::create_endpoint(ep, address, port)
1309 }
1310 #[unsafe(no_mangle)]
1311 pub extern "C" fn nros_platform_udp_free_endpoint(ep: *mut ::core::ffi::c_void) {
1312 <$ty as ::nros_platform_api::PlatformUdp>::free_endpoint(ep)
1313 }
1314 #[unsafe(no_mangle)]
1315 pub extern "C" fn nros_platform_udp_open(
1316 sock: *mut ::core::ffi::c_void,
1317 endpoint: *const ::core::ffi::c_void,
1318 timeout_ms: u32,
1319 ) -> i8 {
1320 <$ty as ::nros_platform_api::PlatformUdp>::open(sock, endpoint, timeout_ms)
1321 }
1322 #[unsafe(no_mangle)]
1323 pub extern "C" fn nros_platform_udp_listen(
1324 sock: *mut ::core::ffi::c_void,
1325 endpoint: *const ::core::ffi::c_void,
1326 timeout_ms: u32,
1327 ) -> i8 {
1328 <$ty as ::nros_platform_api::PlatformUdp>::listen(sock, endpoint, timeout_ms)
1329 }
1330 #[unsafe(no_mangle)]
1331 pub extern "C" fn nros_platform_udp_close(sock: *mut ::core::ffi::c_void) {
1332 <$ty as ::nros_platform_api::PlatformUdp>::close(sock)
1333 }
1334 #[unsafe(no_mangle)]
1335 pub extern "C" fn nros_platform_udp_read(
1336 sock: *const ::core::ffi::c_void,
1337 buf: *mut u8,
1338 len: usize,
1339 ) -> usize {
1340 <$ty as ::nros_platform_api::PlatformUdp>::read(sock, buf, len)
1341 }
1342 #[unsafe(no_mangle)]
1343 pub extern "C" fn nros_platform_udp_read_exact(
1344 sock: *const ::core::ffi::c_void,
1345 buf: *mut u8,
1346 len: usize,
1347 ) -> usize {
1348 <$ty as ::nros_platform_api::PlatformUdp>::read_exact(sock, buf, len)
1349 }
1350 #[unsafe(no_mangle)]
1351 pub extern "C" fn nros_platform_udp_send(
1352 sock: *const ::core::ffi::c_void,
1353 buf: *const u8,
1354 len: usize,
1355 endpoint: *const ::core::ffi::c_void,
1356 ) -> usize {
1357 <$ty as ::nros_platform_api::PlatformUdp>::send(sock, buf, len, endpoint)
1358 }
1359 #[unsafe(no_mangle)]
1360 pub extern "C" fn nros_platform_udp_set_recv_timeout(
1361 sock: *const ::core::ffi::c_void,
1362 timeout_ms: u32,
1363 ) {
1364 <$ty as ::nros_platform_api::PlatformUdp>::set_recv_timeout(sock, timeout_ms)
1365 }
1366 #[unsafe(no_mangle)]
1367 pub extern "C" fn nros_platform_udp_readiness_handle(
1368 sock: *const ::core::ffi::c_void,
1369 ) -> i32 {
1370 <$ty as ::nros_platform_api::PlatformUdp>::readiness_handle(sock)
1371 }
1372 #[unsafe(no_mangle)]
1373 pub extern "C" fn nros_platform_udp_set_rx_notify(
1374 sock: *const ::core::ffi::c_void,
1375 notify: ::core::option::Option<unsafe extern "C" fn(*mut ::core::ffi::c_void)>,
1376 ctx: *mut ::core::ffi::c_void,
1377 ) -> i8 {
1378 <$ty as ::nros_platform_api::PlatformUdp>::set_rx_notify(sock, notify, ctx)
1379 }
1380
1381 #[unsafe(no_mangle)]
1383 pub extern "C" fn nros_platform_udp_mcast_open(
1384 sock: *mut ::core::ffi::c_void,
1385 endpoint: *const ::core::ffi::c_void,
1386 lep: *mut ::core::ffi::c_void,
1387 timeout_ms: u32,
1388 iface: *const u8,
1389 ) -> i8 {
1390 <$ty as ::nros_platform_api::PlatformUdpMulticast>::mcast_open(
1391 sock, endpoint, lep, timeout_ms, iface,
1392 )
1393 }
1394 #[unsafe(no_mangle)]
1395 pub extern "C" fn nros_platform_udp_mcast_listen(
1396 sock: *mut ::core::ffi::c_void,
1397 endpoint: *const ::core::ffi::c_void,
1398 timeout_ms: u32,
1399 iface: *const u8,
1400 join: *const u8,
1401 ) -> i8 {
1402 <$ty as ::nros_platform_api::PlatformUdpMulticast>::mcast_listen(
1403 sock, endpoint, timeout_ms, iface, join,
1404 )
1405 }
1406 #[unsafe(no_mangle)]
1407 pub extern "C" fn nros_platform_udp_mcast_close(
1408 sockrecv: *mut ::core::ffi::c_void,
1409 socksend: *mut ::core::ffi::c_void,
1410 rep: *const ::core::ffi::c_void,
1411 lep: *const ::core::ffi::c_void,
1412 ) {
1413 <$ty as ::nros_platform_api::PlatformUdpMulticast>::mcast_close(
1414 sockrecv, socksend, rep, lep,
1415 )
1416 }
1417 #[unsafe(no_mangle)]
1418 pub extern "C" fn nros_platform_udp_mcast_read(
1419 sock: *const ::core::ffi::c_void,
1420 buf: *mut u8,
1421 len: usize,
1422 lep: *const ::core::ffi::c_void,
1423 addr: *mut ::core::ffi::c_void,
1424 ) -> usize {
1425 <$ty as ::nros_platform_api::PlatformUdpMulticast>::mcast_read(
1426 sock, buf, len, lep, addr,
1427 )
1428 }
1429 #[unsafe(no_mangle)]
1430 pub extern "C" fn nros_platform_udp_mcast_read_exact(
1431 sock: *const ::core::ffi::c_void,
1432 buf: *mut u8,
1433 len: usize,
1434 lep: *const ::core::ffi::c_void,
1435 addr: *mut ::core::ffi::c_void,
1436 ) -> usize {
1437 <$ty as ::nros_platform_api::PlatformUdpMulticast>::mcast_read_exact(
1438 sock, buf, len, lep, addr,
1439 )
1440 }
1441 #[unsafe(no_mangle)]
1442 pub extern "C" fn nros_platform_udp_mcast_send(
1443 sock: *const ::core::ffi::c_void,
1444 buf: *const u8,
1445 len: usize,
1446 endpoint: *const ::core::ffi::c_void,
1447 ) -> usize {
1448 <$ty as ::nros_platform_api::PlatformUdpMulticast>::mcast_send(sock, buf, len, endpoint)
1449 }
1450
1451 #[unsafe(no_mangle)]
1453 pub extern "C" fn nros_platform_socket_set_non_blocking(
1454 sock: *const ::core::ffi::c_void,
1455 ) -> i8 {
1456 <$ty as ::nros_platform_api::PlatformSocketHelpers>::set_non_blocking(sock)
1457 }
1458 #[unsafe(no_mangle)]
1459 pub extern "C" fn nros_platform_socket_accept(
1460 sock_in: *const ::core::ffi::c_void,
1461 sock_out: *mut ::core::ffi::c_void,
1462 ) -> i8 {
1463 <$ty as ::nros_platform_api::PlatformSocketHelpers>::accept(sock_in, sock_out)
1464 }
1465 #[unsafe(no_mangle)]
1466 pub extern "C" fn nros_platform_socket_close(sock: *mut ::core::ffi::c_void) {
1467 <$ty as ::nros_platform_api::PlatformSocketHelpers>::close(sock)
1468 }
1469 #[unsafe(no_mangle)]
1470 pub extern "C" fn nros_platform_socket_wait_event(
1471 peers: *mut ::core::ffi::c_void,
1472 mutex: *mut ::core::ffi::c_void,
1473 ) -> i8 {
1474 <$ty as ::nros_platform_api::PlatformSocketHelpers>::wait_event(peers, mutex)
1475 }
1476
1477 #[unsafe(no_mangle)]
1479 pub extern "C" fn nros_platform_network_poll() {
1480 <$ty as ::nros_platform_api::PlatformNetworkPoll>::network_poll()
1481 }
1482 };
1483}
1484
1485#[cfg(all(test, not(feature = "c-stub-test"), not(feature = "posix-c-port")))]
1499mod test_self_export {
1500 use core::ffi::c_void;
1501 use nros_platform_api::{
1502 PlatformAlloc, PlatformClock, PlatformRandom, PlatformSleep, PlatformThreading,
1503 PlatformTime, PlatformYield,
1504 };
1505
1506 pub struct TestPlatform;
1507
1508 impl PlatformClock for TestPlatform {
1509 fn clock_ns() -> u64 {
1510 0
1511 }
1512 fn clock_resolution_ns() -> u64 {
1513 1
1514 }
1515 }
1516 impl PlatformAlloc for TestPlatform {
1517 fn alloc(_: usize) -> *mut c_void {
1518 core::ptr::null_mut()
1519 }
1520 fn realloc(_: *mut c_void, _: usize) -> *mut c_void {
1521 core::ptr::null_mut()
1522 }
1523 fn dealloc(_: *mut c_void) {}
1524 }
1525 impl PlatformSleep for TestPlatform {
1526 fn sleep_us(_: usize) {}
1527 fn sleep_ms(_: usize) {}
1528 fn sleep_s(_: usize) {}
1529 }
1530 impl PlatformYield for TestPlatform {
1531 fn yield_now() {}
1532 }
1533 impl PlatformRandom for TestPlatform {
1534 fn random_u8() -> u8 {
1535 0
1536 }
1537 fn random_u16() -> u16 {
1538 0
1539 }
1540 fn random_u32() -> u32 {
1541 0
1542 }
1543 fn random_u64() -> u64 {
1544 0
1545 }
1546 fn random_fill(_: *mut c_void, _: usize) {}
1547 }
1548 impl PlatformTime for TestPlatform {
1549 fn time_now_ns() -> u64 {
1550 0
1551 }
1552 }
1553 impl PlatformThreading for TestPlatform {
1554 fn task_init(
1555 _: *mut c_void,
1556 _: *mut c_void,
1557 _: Option<unsafe extern "C" fn(*mut c_void) -> *mut c_void>,
1558 _: *mut c_void,
1559 ) -> i8 {
1560 -1
1561 }
1562 fn task_join(_: *mut c_void) -> i8 {
1563 -1
1564 }
1565 fn task_detach(_: *mut c_void) -> i8 {
1566 -1
1567 }
1568 fn task_cancel(_: *mut c_void) -> i8 {
1569 -1
1570 }
1571 fn task_exit() {}
1572 fn task_free(_: *mut *mut c_void) {}
1573 fn mutex_init(_: *mut c_void) -> i8 {
1574 0
1575 }
1576 fn mutex_drop(_: *mut c_void) -> i8 {
1577 0
1578 }
1579 fn mutex_lock(_: *mut c_void) -> i8 {
1580 0
1581 }
1582 fn mutex_try_lock(_: *mut c_void) -> i8 {
1583 0
1584 }
1585 fn mutex_unlock(_: *mut c_void) -> i8 {
1586 0
1587 }
1588 fn mutex_rec_init(_: *mut c_void) -> i8 {
1589 0
1590 }
1591 fn mutex_rec_drop(_: *mut c_void) -> i8 {
1592 0
1593 }
1594 fn mutex_rec_lock(_: *mut c_void) -> i8 {
1595 0
1596 }
1597 fn mutex_rec_try_lock(_: *mut c_void) -> i8 {
1598 0
1599 }
1600 fn mutex_rec_unlock(_: *mut c_void) -> i8 {
1601 0
1602 }
1603 fn condvar_init(_: *mut c_void) -> i8 {
1604 0
1605 }
1606 fn condvar_drop(_: *mut c_void) -> i8 {
1607 0
1608 }
1609 fn condvar_signal(_: *mut c_void) -> i8 {
1610 0
1611 }
1612 fn condvar_signal_all(_: *mut c_void) -> i8 {
1613 0
1614 }
1615 fn condvar_wait_until(_: *mut c_void, _: *mut c_void, _: u64) -> i8 {
1616 0
1617 }
1618 }
1619 impl ::nros_platform_api::PlatformCriticalSection for TestPlatform {
1620 fn acquire() -> u32 {
1621 0
1622 }
1623 fn release(_: u32) {}
1624 }
1625
1626 #[repr(transparent)]
1631 #[derive(Clone, Copy)]
1632 pub struct TestTimerHandle(pub *mut c_void);
1633 unsafe impl Send for TestTimerHandle {}
1634 unsafe impl Sync for TestTimerHandle {}
1635
1636 impl ::nros_platform_api::PlatformTimer for TestPlatform {
1637 type TimerHandle = TestTimerHandle;
1638 }
1643
1644 crate::nros_platform_export!(TestPlatform);
1645 crate::nros_platform_export_timer!(TestPlatform);
1646
1647 #[test]
1648 fn macro_expansion_dispatches() {
1649 assert_eq!(super::CffiPlatform::clock_ns(), 0);
1652 assert_eq!(
1653 <super::CffiPlatform as ::nros_platform_api::PlatformAlloc>::alloc(0),
1654 core::ptr::null_mut(),
1655 );
1656 <super::CffiPlatform as ::nros_platform_api::PlatformYield>::yield_now();
1657 }
1658
1659 #[test]
1660 fn timer_macro_emits() {
1661 let h = unsafe {
1663 super::nros_platform_timer_create_periodic(
1664 1000,
1665 Some(noop_callback),
1666 core::ptr::null_mut(),
1667 )
1668 };
1669 assert!(h.is_null(), "default Unsupported impl must surface as NULL");
1670 }
1671
1672 unsafe extern "C" fn noop_callback(_: *mut c_void) {}
1675}