lighting_dev.c 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. /******************************************************************
  2. *
  3. * uEcho for C
  4. *
  5. * Copyright (C) Satoshi Konno 2015
  6. *
  7. * This is licensed under BSD-style license, see file COPYING.
  8. *
  9. ******************************************************************/
  10. #include <stdlib.h>
  11. #include <uecho/device.h>
  12. #include <uecho/node.h>
  13. // See : APPENDIX Detailed Requirements for ECHONET Device objects
  14. // 3.3.29 Requirements for mono functional lighting class
  15. #define LIGHT_OBJECT_CODE 0x029101
  16. #define LIGHT_PROPERTY_POWER_CODE 0x80
  17. #define LIGHT_PROPERTY_POWER_ON 0x30
  18. #define LIGHT_PROPERTY_POWER_OFF 0x31
  19. #undef UECHO_PLATFORM_RASPBIAN
  20. #define RASPBERRY_PI_LIGHT_GPIO_NO "3"
  21. /****************************************
  22. * uecho_light_printrequest
  23. ****************************************/
  24. void uecho_light_printrequest(uEchoMessage* msg)
  25. {
  26. uEchoProperty* prop;
  27. size_t opc, n;
  28. opc = uecho_message_getopc(msg);
  29. printf("%s %1X %1X %02X %03X %03X %02X %ld ",
  30. uecho_message_getsourceaddress(msg),
  31. uecho_message_getehd1(msg),
  32. uecho_message_getehd2(msg),
  33. uecho_message_gettid(msg),
  34. uecho_message_getsourceobjectcode(msg),
  35. uecho_message_getdestinationobjectcode(msg),
  36. uecho_message_getesv(msg),
  37. opc);
  38. for (n = 0; n < opc; n++) {
  39. prop = uecho_message_getproperty(msg, n);
  40. printf("%02X", uecho_property_getcode(prop));
  41. }
  42. printf("\n");
  43. }
  44. /****************************************
  45. * uecho_lighting_object_messagelitener
  46. ****************************************/
  47. void uecho_lighting_object_messagelitener(uEchoObject* obj, uEchoMessage* msg)
  48. {
  49. uecho_light_printrequest(msg);
  50. }
  51. /****************************************
  52. * uecho_lighting_propertyrequesthandler
  53. ****************************************/
  54. bool uecho_lighting_propertyrequesthandler(uEchoObject* obj, uEchoProperty* prop, uEchoEsv esv, size_t pdc, byte* edt)
  55. {
  56. byte status;
  57. printf("ESV = %02X : %02X (%ld), ", esv, uecho_property_getcode(prop), pdc);
  58. if ((pdc != 1) || !edt) {
  59. printf("Bad Request\n");
  60. return false;
  61. }
  62. status = edt[0];
  63. // TODO : Set the status to hardware
  64. switch (status) {
  65. case LIGHT_PROPERTY_POWER_ON:
  66. printf("POWER = ON\n");
  67. #if defined(UECHO_PLATFORM_RASPBIAN)
  68. system("echo \"1\" > /sys/class/gpio/gpio" RASPBERRY_PI_LIGHT_GPIO_NO "/value");
  69. #endif
  70. break;
  71. case LIGHT_PROPERTY_POWER_OFF:
  72. printf("POWER = OFF\n");
  73. #if defined(UECHO_PLATFORM_RASPBIAN)
  74. system("echo \"0\" > /sys/class/gpio/gpio" RASPBERRY_PI_LIGHT_GPIO_NO "/value");
  75. #endif
  76. break;
  77. default:
  78. printf("POWER = %02X\n", status);
  79. break;
  80. }
  81. return true;
  82. }
  83. /****************************************
  84. * uecho_light_new
  85. ****************************************/
  86. uEchoObject* uecho_light_new(void)
  87. {
  88. uEchoObject* obj;
  89. byte prop[32];
  90. obj = uecho_device_new();
  91. // TODO : Set your manufacture code
  92. uecho_object_setmanufacturercode(obj, 0xFFFFF0);
  93. // Mono functional lighting class
  94. uecho_object_setcode(obj, LIGHT_OBJECT_CODE);
  95. // Operation status property
  96. uecho_object_setproperty(obj, LIGHT_PROPERTY_POWER_CODE, uEchoPropertyAttrReadWrite);
  97. prop[0] = LIGHT_PROPERTY_POWER_ON;
  98. uecho_object_setpropertydata(obj, LIGHT_PROPERTY_POWER_CODE, prop, 1);
  99. // Set property observer
  100. uecho_object_setpropertywriterequesthandler(obj, LIGHT_PROPERTY_POWER_CODE, uecho_lighting_propertyrequesthandler);
  101. // Set Raspbian GPIO
  102. #if defined(UECHO_PLATFORM_RASPBIAN)
  103. system("echo \"" RASPBERRY_PI_LIGHT_GPIO_NO "\" > /sys/class/gpio/export");
  104. system("echo \"out\" > /sys/class/gpio/gpio" RASPBERRY_PI_LIGHT_GPIO_NO "/direction");
  105. #endif
  106. return obj;
  107. }
  108. /****************************************
  109. * uecho_light_delete
  110. ****************************************/
  111. bool uecho_light_delete(uEchoObject* obj)
  112. {
  113. #if defined(UECHO_PLATFORM_RASPBIAN)
  114. system("echo \"" RASPBERRY_PI_LIGHT_GPIO_NO "\" > /sys/class/gpio/unexport");
  115. #endif
  116. return uecho_object_delete(obj);
  117. }