Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit44cff8b

Browse files
authored
Merge pull request#69 from EliteTK/tokio-canfd-can
Support sending can frames over tokio canfd sockets (Resolves#57)
2 parents3c88cc2 +84ace4c commit44cff8b

File tree

1 file changed

+113
-17
lines changed

1 file changed

+113
-17
lines changed

‎src/tokio.rs

Lines changed: 113 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
//! }
2828
//! ```
2929
usecrate::{
30-
CanAddr,CanAnyFrame,CanFdFrame,CanFrame,Error,IoResult,Result,Socket,SocketOptions,
30+
frame::AsPtr,CanAddr,CanAnyFrame,CanFrame,Error,IoResult,Result,Socket,SocketOptions,
3131
};
3232
use futures::{prelude::*, ready, task::Context};
3333
use std::{
@@ -187,9 +187,12 @@ pub type CanFdSocket = AsyncCanSocket<crate::CanFdSocket>;
187187

188188
implCanFdSocket{
189189
/// Write a CAN FD frame to the socket asynchronously
190-
pubasyncfnwrite_frame(&self,frame:CanFdFrame) ->IoResult<()>{
190+
pubasyncfnwrite_frame<F>(&self,frame:&F) ->IoResult<()>
191+
where
192+
F:Into<CanAnyFrame> +AsPtr,
193+
{
191194
self.0
192-
.async_io(Interest::WRITABLE, |inner| inner.write_frame(&frame))
195+
.async_io(Interest::WRITABLE, |inner| inner.write_frame(frame))
193196
.await
194197
}
195198

@@ -215,7 +218,7 @@ impl Stream for CanFdSocket {
215218
}
216219
}
217220

218-
implSink<CanFdFrame>forCanFdSocket{
221+
implSink<CanAnyFrame>forCanFdSocket{
219222
typeError =Error;
220223

221224
fnpoll_ready(self:Pin<&mutSelf>,cx:&mutContext<'_>) ->Poll<Result<()>>{
@@ -233,7 +236,7 @@ impl Sink<CanFdFrame> for CanFdSocket {
233236
Poll::Ready(Ok(()))
234237
}
235238

236-
fnstart_send(self:Pin<&mutSelf>,item:CanFdFrame) ->Result<()>{
239+
fnstart_send(self:Pin<&mutSelf>,item:CanAnyFrame) ->Result<()>{
237240
self.0.get_ref().write_frame_insist(&item)?;
238241
Ok(())
239242
}
@@ -294,7 +297,7 @@ mod tests {
294297
usesuper::*;
295298
usecrate::{
296299
frame::{can_frame_default,AsPtr},
297-
CanFrame,Frame,IoErrorKind,StandardId,
300+
CanFdFrame,CanFrame,Frame,IoErrorKind,StandardId,
298301
};
299302
use embedded_can::FrameasEmbeddedFrame;
300303
use futures::{select, try_join};
@@ -369,11 +372,18 @@ mod tests {
369372
)
370373
}
371374

372-
/// Write a test frame to the CanSocket
373-
asyncfnwrite_frame_fd(socket:&CanFdSocket) ->Result<()>{
375+
/// Write a testCANFDframe to the CanSocket
376+
asyncfnwrite_frame_fd_canfd(socket:&CanFdSocket) ->Result<()>{
374377
let test_frame =
375378
CanFdFrame::new(StandardId::new(0x1).unwrap(),&[0,0,0,0,0,0,0,0,0]).unwrap();
376-
socket.write_frame(test_frame).await?;
379+
socket.write_frame(&test_frame).await?;
380+
Ok(())
381+
}
382+
383+
/// Write a test CAN frame to the CanSocket
384+
asyncfnwrite_frame_fd_can(socket:&CanFdSocket) ->Result<()>{
385+
let test_frame =CanFrame::new(StandardId::new(0x1).unwrap(),&[0]).unwrap();
386+
socket.write_frame(&test_frame).await?;
377387
Ok(())
378388
}
379389

@@ -442,11 +452,34 @@ mod tests {
442452

443453
#[serial]
444454
#[tokio::test]
445-
asyncfntest_receive_can_fd() ->Result<()>{
455+
asyncfntest_receive_can_fd_canfd() ->Result<()>{
456+
let socket1 =CanFdSocket::open("vcan0").unwrap();
457+
let socket2 =CanFdSocket::open("vcan0").unwrap();
458+
459+
let send_frames = future::try_join(
460+
write_frame_fd_canfd(&socket1),
461+
write_frame_fd_canfd(&socket1),
462+
);
463+
464+
let recv_frames =async{
465+
let socket2 =recv_frame_fd(socket2).await?;
466+
let _socket2 =recv_frame_fd(socket2).await;
467+
Ok(())
468+
};
469+
470+
try_join!(recv_frames, send_frames)?;
471+
472+
Ok(())
473+
}
474+
475+
#[serial]
476+
#[tokio::test]
477+
asyncfntest_receive_can_fd_can() ->Result<()>{
446478
let socket1 =CanFdSocket::open("vcan0").unwrap();
447479
let socket2 =CanFdSocket::open("vcan0").unwrap();
448480

449-
let send_frames = future::try_join(write_frame_fd(&socket1),write_frame_fd(&socket1));
481+
let send_frames =
482+
future::try_join(write_frame_fd_can(&socket1),write_frame_fd_can(&socket1));
450483

451484
let recv_frames =async{
452485
let socket2 =recv_frame_fd(socket2).await?;
@@ -461,11 +494,34 @@ mod tests {
461494

462495
#[serial]
463496
#[tokio::test]
464-
asyncfntest_receive_can_fd_with_stream() ->Result<()>{
497+
asyncfntest_receive_can_fd_canfd_with_stream() ->Result<()>{
465498
let socket1 =CanFdSocket::open("vcan0").unwrap();
466499
let socket2 =CanFdSocket::open("vcan0").unwrap();
467500

468-
let send_frames = future::try_join(write_frame_fd(&socket1),write_frame_fd(&socket1));
501+
let send_frames = future::try_join(
502+
write_frame_fd_canfd(&socket1),
503+
write_frame_fd_canfd(&socket1),
504+
);
505+
506+
let recv_frames =async{
507+
let socket2 =recv_frame_fd_with_stream(socket2).await?;
508+
let _socket2 =recv_frame_fd_with_stream(socket2).await;
509+
Ok(())
510+
};
511+
512+
try_join!(recv_frames, send_frames)?;
513+
514+
Ok(())
515+
}
516+
517+
#[serial]
518+
#[tokio::test]
519+
asyncfntest_receive_can_fd_can_with_stream() ->Result<()>{
520+
let socket1 =CanFdSocket::open("vcan0").unwrap();
521+
let socket2 =CanFdSocket::open("vcan0").unwrap();
522+
523+
let send_frames =
524+
future::try_join(write_frame_fd_can(&socket1),write_frame_fd_can(&socket1));
469525

470526
let recv_frames =async{
471527
let socket2 =recv_frame_fd_with_stream(socket2).await?;
@@ -532,7 +588,7 @@ mod tests {
532588

533589
#[serial]
534590
#[tokio::test]
535-
asyncfntest_sink_stream_fd() ->Result<()>{
591+
asyncfntest_sink_stream_fd_canfd() ->Result<()>{
536592
let socket1 =CanFdSocket::open("vcan0").unwrap();
537593
let socket2 =CanFdSocket::open("vcan0").unwrap();
538594

@@ -555,9 +611,49 @@ mod tests {
555611
.fold(0u8, |acc, _frame|asyncmove{ acc +1});
556612

557613
let send_frames =async{
558-
let _frame_1 = sink.send(frame_id_1).await?;
559-
let _frame_2 = sink.send(frame_id_2).await?;
560-
let _frame_3 = sink.send(frame_id_3).await?;
614+
let _frame_1 = sink.send(frame_id_1.into()).await?;
615+
let _frame_2 = sink.send(frame_id_2.into()).await?;
616+
let _frame_3 = sink.send(frame_id_3.into()).await?;
617+
println!("Sent 3 frames");
618+
Ok::<(),Error>(())
619+
};
620+
621+
let(x, frame_send_r) = future::join(count_ids_less_than_3, send_frames).await;
622+
frame_send_r?;
623+
624+
assert_eq!(x,2);
625+
626+
Ok(())
627+
}
628+
629+
#[serial]
630+
#[tokio::test]
631+
asyncfntest_sink_stream_fd_can() ->Result<()>{
632+
let socket1 =CanFdSocket::open("vcan0").unwrap();
633+
let socket2 =CanFdSocket::open("vcan0").unwrap();
634+
635+
let frame_id_1 =CanFrame::from_raw_id(0x01,&[0u8]).unwrap();
636+
let frame_id_2 =CanFrame::from_raw_id(0x02,&[0u8]).unwrap();
637+
let frame_id_3 =CanFrame::from_raw_id(0x03,&[0u8]).unwrap();
638+
639+
let(mut sink, _stream) = socket1.split();
640+
let(_sink, stream) = socket2.split();
641+
642+
let count_ids_less_than_3 = stream
643+
.map(|x| x.unwrap())
644+
.take_while(|frame|{
645+
ifletCanAnyFrame::Normal(frame) = frame{
646+
future::ready(frame.raw_id() <3)
647+
}else{
648+
future::ready(false)
649+
}
650+
})
651+
.fold(0u8, |acc, _frame|asyncmove{ acc +1});
652+
653+
let send_frames =async{
654+
let _frame_1 = sink.send(frame_id_1.into()).await?;
655+
let _frame_2 = sink.send(frame_id_2.into()).await?;
656+
let _frame_3 = sink.send(frame_id_3.into()).await?;
561657
println!("Sent 3 frames");
562658
Ok::<(),Error>(())
563659
};

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp