PikaStdDevice_ADC.c 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. #include "PikaStdDevice_ADC.h"
  2. #include "PikaStdDevice_common.h"
  3. void PikaStdDevice_ADC_init(PikaObj* self) {
  4. obj_setStr(self, "pin", "PA0");
  5. }
  6. void PikaStdDevice_ADC___init__(PikaObj* self) {
  7. PikaStdDevice_ADC_init(self);
  8. }
  9. static pika_dev* _get_dev(PikaObj* self) {
  10. pika_dev* dev = PIKA_HAL_OBJ2DEV(self);
  11. if (NULL != dev) {
  12. return dev;
  13. }
  14. dev = pika_hal_open(PIKA_HAL_ADC, obj_getStr(self, "pin"));
  15. if (NULL == dev) {
  16. __platform_printf("Error: open ADC '%s' failed.\r\n",
  17. obj_getStr(self, "pin"));
  18. }
  19. obj_setPtr(self, "pika_dev", dev);
  20. return dev;
  21. }
  22. pika_float PikaStdDevice_ADC_read(PikaObj* self) {
  23. pika_dev* dev = _get_dev(self);
  24. pika_hal_ADC_config* cfg = (pika_hal_ADC_config*)dev->ioctl_config;
  25. uint32_t val_i = 0;
  26. pika_hal_read(dev, &val_i, sizeof(val_i));
  27. pika_float val = (pika_float)val_i / (pika_float)cfg->max * cfg->vref;
  28. val = val_i * obj_setFloat(self, "val", val);
  29. return obj_getFloat(self, "val");
  30. }
  31. void PikaStdDevice_ADC_setPin(PikaObj* self, char* pin) {
  32. obj_setStr(self, "pin", pin);
  33. }
  34. void PikaStdDevice_ADC_enable(PikaObj* self) {
  35. pika_dev* dev = _get_dev(self);
  36. if (NULL == dev) {
  37. __platform_printf("Error: open ADC '%s' failed.\r\n",
  38. obj_getStr(self, "pin"));
  39. return;
  40. }
  41. pika_hal_ADC_config cfg = {0};
  42. cfg.continue_or_single = PIKA_HAL_ADC_SINGLE;
  43. pika_hal_ioctl(dev, PIKA_HAL_IOCTL_CONFIG, &cfg);
  44. pika_hal_ioctl(dev, PIKA_HAL_IOCTL_ENABLE);
  45. }
  46. void PikaStdDevice_ADC_disable(PikaObj* self) {
  47. pika_dev* dev = _get_dev(self);
  48. pika_hal_ioctl(dev, PIKA_HAL_IOCTL_DISABLE);
  49. }
  50. void PikaStdDevice_ADC_close(PikaObj* self) {
  51. pika_dev* dev = _get_dev(self);
  52. pika_hal_close(dev);
  53. }