diff options
Diffstat (limited to 'embassy-net-esp-hosted/src/ioctl.rs')
| -rw-r--r-- | embassy-net-esp-hosted/src/ioctl.rs | 29 |
1 files changed, 24 insertions, 5 deletions
diff --git a/embassy-net-esp-hosted/src/ioctl.rs b/embassy-net-esp-hosted/src/ioctl.rs index 512023206..de0f867e8 100644 --- a/embassy-net-esp-hosted/src/ioctl.rs +++ b/embassy-net-esp-hosted/src/ioctl.rs | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | use core::cell::RefCell; | 1 | use core::cell::RefCell; |
| 2 | use core::future::{poll_fn, Future}; | 2 | use core::future::{Future, poll_fn}; |
| 3 | use core::task::Poll; | 3 | use core::task::Poll; |
| 4 | 4 | ||
| 5 | use embassy_sync::waitqueue::WakerRegistration; | 5 | use embassy_sync::waitqueue::WakerRegistration; |
| @@ -23,16 +23,23 @@ pub struct Shared(RefCell<SharedInner>); | |||
| 23 | 23 | ||
| 24 | struct SharedInner { | 24 | struct SharedInner { |
| 25 | ioctl: IoctlState, | 25 | ioctl: IoctlState, |
| 26 | is_init: bool, | 26 | state: ControlState, |
| 27 | control_waker: WakerRegistration, | 27 | control_waker: WakerRegistration, |
| 28 | runner_waker: WakerRegistration, | 28 | runner_waker: WakerRegistration, |
| 29 | } | 29 | } |
| 30 | 30 | ||
| 31 | #[derive(Clone, Copy)] | ||
| 32 | pub(crate) enum ControlState { | ||
| 33 | Init, | ||
| 34 | Reboot, | ||
| 35 | Ready, | ||
| 36 | } | ||
| 37 | |||
| 31 | impl Shared { | 38 | impl Shared { |
| 32 | pub fn new() -> Self { | 39 | pub fn new() -> Self { |
| 33 | Self(RefCell::new(SharedInner { | 40 | Self(RefCell::new(SharedInner { |
| 34 | ioctl: IoctlState::Done { resp_len: 0 }, | 41 | ioctl: IoctlState::Done { resp_len: 0 }, |
| 35 | is_init: false, | 42 | state: ControlState::Init, |
| 36 | control_waker: WakerRegistration::new(), | 43 | control_waker: WakerRegistration::new(), |
| 37 | runner_waker: WakerRegistration::new(), | 44 | runner_waker: WakerRegistration::new(), |
| 38 | })) | 45 | })) |
| @@ -99,18 +106,30 @@ impl Shared { | |||
| 99 | } | 106 | } |
| 100 | } | 107 | } |
| 101 | 108 | ||
| 109 | // ota | ||
| 110 | pub fn ota_done(&self) { | ||
| 111 | let mut this = self.0.borrow_mut(); | ||
| 112 | this.state = ControlState::Reboot; | ||
| 113 | } | ||
| 114 | |||
| 102 | // // // // // // // // // // // // // // // // // // // // | 115 | // // // // // // // // // // // // // // // // // // // // |
| 116 | // | ||
| 117 | // check if ota is in progress | ||
| 118 | pub(crate) fn state(&self) -> ControlState { | ||
| 119 | let this = self.0.borrow(); | ||
| 120 | this.state | ||
| 121 | } | ||
| 103 | 122 | ||
| 104 | pub fn init_done(&self) { | 123 | pub fn init_done(&self) { |
| 105 | let mut this = self.0.borrow_mut(); | 124 | let mut this = self.0.borrow_mut(); |
| 106 | this.is_init = true; | 125 | this.state = ControlState::Ready; |
| 107 | this.control_waker.wake(); | 126 | this.control_waker.wake(); |
| 108 | } | 127 | } |
| 109 | 128 | ||
| 110 | pub fn init_wait(&self) -> impl Future<Output = ()> + '_ { | 129 | pub fn init_wait(&self) -> impl Future<Output = ()> + '_ { |
| 111 | poll_fn(|cx| { | 130 | poll_fn(|cx| { |
| 112 | let mut this = self.0.borrow_mut(); | 131 | let mut this = self.0.borrow_mut(); |
| 113 | if this.is_init { | 132 | if let ControlState::Ready = this.state { |
| 114 | Poll::Ready(()) | 133 | Poll::Ready(()) |
| 115 | } else { | 134 | } else { |
| 116 | this.control_waker.register(cx.waker()); | 135 | this.control_waker.register(cx.waker()); |
