PikaStdDevice_PWM.c 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. #include "PikaStdDevice_PWM.h"
  2. #include "PikaStdDevice_common.h"
  3. static pika_dev* _get_dev(PikaObj* self) {
  4. pika_dev* dev = PIKA_HAL_OBJ2DEV(self);
  5. if (NULL != dev) {
  6. return dev;
  7. }
  8. dev = pika_hal_open(PIKA_HAL_PWM, obj_getStr(self, "pin"));
  9. if (NULL == dev) {
  10. __platform_printf("Error: open PWM '%s' failed.\r\n",
  11. obj_getStr(self, "pin"));
  12. }
  13. obj_setPtr(self, "pika_dev", dev);
  14. return dev;
  15. }
  16. void PikaStdDevice_PWM_init(PikaObj* self) {
  17. obj_setStr(self, "pin", "none");
  18. obj_setStr(self, "name", "none");
  19. obj_setInt(self, "freq", 1000);
  20. obj_setInt(self, "ch", 0);
  21. obj_setFloat(self, "duty", 0.5f);
  22. }
  23. void PikaStdDevice_PWM___init__(PikaObj* self) {
  24. PikaStdDevice_PWM_init(self);
  25. }
  26. void PikaStdDevice_PWM_setPin(PikaObj* self, char* pin) {
  27. obj_setStr(self, "pin", pin);
  28. }
  29. void PikaStdDevice_PWM_setFrequency(PikaObj* self, int freq) {
  30. obj_setInt(self, "freq", freq);
  31. pika_float duty = obj_getFloat(self, "duty"); // 0.0 ~ 1.0
  32. pika_hal_PWM_config cfg = {0};
  33. /* ns */
  34. cfg.period = (uint32_t)(1000000000.0f / freq);
  35. cfg.duty = (uint32_t)(1000000000.0f / freq * duty);
  36. pika_hal_ioctl(_get_dev(self), PIKA_HAL_IOCTL_CONFIG, &cfg);
  37. }
  38. void PikaStdDevice_PWM_setDuty(PikaObj* self, pika_float duty) {
  39. obj_setFloat(self, "duty", duty);
  40. uint32_t freq = obj_getInt(self, "freq"); // Hz
  41. pika_hal_PWM_config cfg = {0};
  42. /* ns */
  43. cfg.duty = (uint32_t)(1000000000.0f / freq * duty);
  44. pika_hal_ioctl(_get_dev(self), PIKA_HAL_IOCTL_CONFIG, &cfg);
  45. }
  46. void PikaStdDevice_PWM_enable(PikaObj* self) {
  47. pika_dev* dev = _get_dev(self);
  48. pika_hal_ioctl(dev, PIKA_HAL_IOCTL_ENABLE);
  49. }
  50. void PikaStdDevice_PWM_disable(PikaObj* self) {
  51. pika_dev* dev = _get_dev(self);
  52. pika_hal_ioctl(dev, PIKA_HAL_IOCTL_DISABLE);
  53. }
  54. pika_float PikaStdDevice_PWM_getDuty(PikaObj* self) {
  55. return obj_getFloat(self, "duty");
  56. }
  57. int PikaStdDevice_PWM_getFrequency(PikaObj* self) {
  58. return obj_getInt(self, "freq");
  59. }
  60. char* PikaStdDevice_PWM_getName(PikaObj* self) {
  61. return obj_getStr(self, "name");
  62. }
  63. void PikaStdDevice_PWM_setName(PikaObj* self, char* name) {
  64. obj_setStr(self, "name", name);
  65. }
  66. void PikaStdDevice_PWM_setChannel(PikaObj* self, int ch) {
  67. obj_setInt(self, "ch", ch);
  68. }
  69. int PikaStdDevice_PWM_getChannel(PikaObj* self) {
  70. return obj_getInt(self, "ch");
  71. }
  72. void PikaStdDevice_PWM_setFreq(PikaObj* self, int freq) {
  73. PikaStdDevice_PWM_setFrequency(self, freq);
  74. }
  75. void PikaStdDevice_PWM_close(PikaObj* self) {
  76. pika_dev* dev = _get_dev(self);
  77. pika_hal_close(dev);
  78. obj_setPtr(self, "pika_dev", NULL);
  79. }