onoff_server.ncdi 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. include_guard "onoff_server"
  2. template onoff_server_main {
  3. alias("_arg0") socket_path;
  4. depend_scope() depsc;
  5. process_manager() mgr;
  6. sys.request_server({"unix", socket_path}, "onoff_server__request_handler", {});
  7. }
  8. template onoff_server_onoff {
  9. alias(_arg0) main;
  10. alias("_arg1") onoff_id;
  11. alias("_arg2") default_state;
  12. main.mgr->start(onoff_id, "onoff_server__id_proc", {onoff_id, default_state});
  13. main.depsc->depend({onoff_id}) id_proc;
  14. id_proc.blk->use();
  15. }
  16. template onoff_server__id_proc {
  17. alias("_caller") main;
  18. alias("_arg0") onoff_id;
  19. alias("_arg1") default_state;
  20. blocker() blk;
  21. If (default_state) {
  22. blk->up();
  23. };
  24. main.depsc->provide(onoff_id);
  25. }
  26. template onoff_server__request_handler {
  27. alias("_caller") main;
  28. try("onoff_server__try_request", {});
  29. _request->reply({"error", "Bad request."});
  30. _request->finish();
  31. }
  32. template onoff_server__try_request {
  33. alias("_caller.main") main;
  34. alias("_caller._request") request;
  35. value(request.data) data;
  36. val_equal(data.type, "list") a;
  37. _try->assert(a);
  38. num_greater_equal(data.length, "1") a;
  39. _try->assert(a);
  40. data->get("0") request_cmd;
  41. val_equal(request_cmd, "set_onoff") is_set_onoff;
  42. If (is_set_onoff) {
  43. num_equal(data.length, "3") a;
  44. _try->assert(a);
  45. data->get("1") onoff_id;
  46. data->get("2") new_state;
  47. main.mgr->start(onoff_id, "onoff_server__id_proc", {onoff_id, new_state});
  48. main.depsc->depend({onoff_id}) id_proc;
  49. val_equal(new_state, "true") is_on;
  50. If (is_on) {
  51. id_proc.blk->up();
  52. } Else {
  53. id_proc.blk->down();
  54. };
  55. }
  56. Else {
  57. _try->assert("false");
  58. };
  59. request->reply({"OK", "state has been set"});
  60. request->finish();
  61. }