lib.rs 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. use wasm_bindgen::prelude::*;
  2. use sccd::controller;
  3. use sccd::statechart;
  4. // Traits
  5. use sccd::statechart::SC;
  6. use sccd::statechart::Scheduler;
  7. #[wasm_bindgen]
  8. extern "C" {
  9. #[wasm_bindgen(js_namespace = console)]
  10. fn log(s: &str);
  11. }
  12. #[wasm_bindgen(module = "/outputhandler.js")]
  13. extern "C" {
  14. pub type OutputHandler;
  15. #[wasm_bindgen(method)]
  16. fn handle_output(this: &OutputHandler, e: digitalwatch::OutEvent);
  17. }
  18. #[wasm_bindgen]
  19. extern {
  20. fn alert(s: &str);
  21. }
  22. #[wasm_bindgen]
  23. #[derive(Default)]
  24. pub struct Handle {
  25. controller: controller::Controller<digitalwatch::InEvent>,
  26. statechart: digitalwatch::Statechart<controller::Controller<digitalwatch::InEvent>>,
  27. }
  28. #[wasm_bindgen]
  29. pub fn setup(out: &OutputHandler) -> Handle {
  30. let mut handle = Handle::default();
  31. handle.statechart.init(&mut handle.controller, &mut |e|{ out.handle_output(e) });
  32. handle
  33. }
  34. #[wasm_bindgen]
  35. pub fn add_event(h: &mut Handle, delay: statechart::Timestamp, i: digitalwatch::InEvent) -> RunUntilResult {
  36. h.controller.set_timeout(delay, i);
  37. RunUntilResult::from_controller(&h.controller)
  38. }
  39. #[wasm_bindgen]
  40. pub struct RunUntilResult {
  41. pub simtime: statechart::Timestamp,
  42. pub reschedule: bool,
  43. pub at: statechart::Timestamp,
  44. }
  45. impl RunUntilResult {
  46. fn from_controller(c: &controller::Controller::<digitalwatch::InEvent>) -> Self {
  47. let mut result = match c.get_earliest() {
  48. controller::Until::Timestamp(t) => RunUntilResult{reschedule: true, at: t, simtime: 0},
  49. controller::Until::Eternity => RunUntilResult{reschedule: false, at: 0, simtime: 0},
  50. };
  51. result.simtime = c.get_simtime();
  52. result
  53. }
  54. }
  55. #[wasm_bindgen]
  56. pub fn run_until(h: &mut Handle, t: statechart::Timestamp, out: &OutputHandler) -> RunUntilResult {
  57. h.controller.run_until(&mut h.statechart, controller::Until::Timestamp(t), &mut |e|{ out.handle_output(e) });
  58. RunUntilResult::from_controller(&h.controller)
  59. }