KEY_ATY.c 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. /**
  2. * @file KEY_ATY.c
  3. *
  4. * @param Project DEVICE_GENERAL_ATY_LIB
  5. *
  6. * @author ATY
  7. *
  8. * @copyright
  9. * - Copyright 2017 - 2026 MZ-ATY
  10. * - This code follows:
  11. * - MZ-ATY Various Contents Joint Statement -
  12. * <a href="https://mengze.top/MZ-ATY_VCJS">
  13. * https://mengze.top/MZ-ATY_VCJS</a>
  14. * - CC 4.0 BY-NC-SA -
  15. * <a href="https://creativecommons.org/licenses/by-nc-sa/4.0/">
  16. * https://creativecommons.org/licenses/by-nc-sa/4.0/</a>
  17. * - Your use will be deemed to have accepted the terms of this statement.
  18. *
  19. * @brief functions of keys for C platform (Dev-style)
  20. *
  21. * @version
  22. * - 1_01_251112 > ATY
  23. * -# Refactor to Dev-style; remove legacy global interfaces
  24. ********************************************************************************
  25. */
  26. #ifndef __KEY_ATY_C
  27. #define __KEY_ATY_C
  28. #include "KEY_ATY.h"
  29. static inline uint16_t _margin_12_10(uint16_t v) { return (uint16_t)(v + v/5); }
  30. uint8_t KEY_ATY_InitDev(struct KEY_ATY_Dev* dev, uint8_t key_count)
  31. {
  32. if (!dev) return 1;
  33. if (key_count > KEY_ATY_MAX_KEYS) return 2;
  34. dev->key_count = key_count;
  35. if (dev->release_debounce_time == 0) dev->release_debounce_time = 20;
  36. if (dev->press_debounce_time == 0) dev->press_debounce_time = 100;
  37. if (dev->long_time == 0) dev->long_time = 800;
  38. if (dev->vlong_time == 0) dev->vlong_time = dev->long_time * 3;
  39. if (dev->ad_threshold == 0) dev->ad_threshold = 800;
  40. for (uint8_t i = 0; i < KEY_ATY_MAX_KEYS; ++i) {
  41. dev->lastKeyType[i] = 0;
  42. dev->keyExportType[i] = 0;
  43. dev->keyScanCount[i] = 0;
  44. dev->keyReleaseCount[i]= 0;
  45. }
  46. if (dev->debugEnable == 1 && dev->LOG) dev->LOG("\r\nKEY_ATY init done.");
  47. return 0;
  48. }
  49. static void _key_process_release(struct KEY_ATY_Dev* dev, uint8_t idx)
  50. {
  51. if (dev->keyReleaseCount[idx] > dev->release_debounce_time) {
  52. if (dev->keyScanCount[idx] >= dev->press_debounce_time && dev->keyScanCount[idx] < dev->long_time) {
  53. dev->keyExportType[idx] = KEY_TYPE_SINGLE;
  54. dev->keyScanCount[idx] = 0;
  55. dev->keyReleaseCount[idx] = 0;
  56. } else {
  57. if (dev->lastKeyType[idx] == KEY_TYPE_ACCESS_NEW) dev->lastKeyType[idx] = 0;
  58. dev->keyExportType[idx] = KEY_TYPE_RELASE;
  59. dev->keyScanCount[idx] = 0;
  60. }
  61. }
  62. if (dev->keyReleaseCount[idx] < dev->release_debounce_time * 2) dev->keyReleaseCount[idx]++;
  63. }
  64. static void _key_process_press(struct KEY_ATY_Dev* dev, uint8_t idx)
  65. {
  66. if (dev->keyScanCount[idx] < _margin_12_10(dev->vlong_time)) dev->keyScanCount[idx]++;
  67. if (dev->keyScanCount[idx] >= dev->long_time && dev->keyScanCount[idx] < dev->vlong_time) {
  68. dev->keyExportType[idx] = KEY_TYPE_LONG;
  69. } else if (dev->keyScanCount[idx] >= dev->vlong_time) {
  70. dev->keyExportType[idx] = KEY_TYPE_VLONG;
  71. }
  72. }
  73. static void _key_post_update(struct KEY_ATY_Dev* dev, uint8_t idx)
  74. {
  75. if (dev->keyExportType[idx] != KEY_TYPE_RELASE && dev->lastKeyType[idx] == 0) {
  76. dev->lastKeyType[idx] = dev->keyExportType[idx];
  77. }
  78. }
  79. void KEY_ATY_ScanDigitalDev(struct KEY_ATY_Dev* dev, uint8_t keyIndex)
  80. {
  81. __ATY_LOCK(dev);
  82. if (!dev || !dev->readDigital || keyIndex >= dev->key_count) { __ATY_UNLOCK(dev); return; }
  83. uint8_t pressed = dev->readDigital(keyIndex);
  84. if (!pressed) { _key_process_release(dev, keyIndex); }
  85. else { _key_process_press(dev, keyIndex); }
  86. _key_post_update(dev, keyIndex);
  87. __ATY_UNLOCK(dev);
  88. }
  89. float KEY_ATY_ScanAnalogDev(struct KEY_ATY_Dev* dev, uint8_t keyIndex)
  90. {
  91. __ATY_LOCK(dev);
  92. if (!dev || !dev->readAnalog || keyIndex >= dev->key_count) { __ATY_UNLOCK(dev); return 0.0f; }
  93. float val = dev->readAnalog(keyIndex);
  94. if (val < dev->ad_threshold) { _key_process_release(dev, keyIndex); }
  95. else { _key_process_press(dev, keyIndex); }
  96. _key_post_update(dev, keyIndex);
  97. __ATY_UNLOCK(dev);
  98. return val;
  99. }
  100. uint8_t KEY_ATY_GetTypeDev(struct KEY_ATY_Dev* dev, uint8_t keyIndex)
  101. {
  102. if (!dev || keyIndex >= dev->key_count) return KEY_TYPE_RELASE;
  103. return dev->lastKeyType[keyIndex];
  104. }
  105. void KEY_ATY_AccessNewDev(struct KEY_ATY_Dev* dev, uint8_t keyIndex)
  106. {
  107. if (!dev || keyIndex >= dev->key_count) return;
  108. if (dev->lastKeyType[keyIndex] != KEY_TYPE_RELASE) dev->lastKeyType[keyIndex] = KEY_TYPE_ACCESS_NEW;
  109. }
  110. #endif /* __KEY_ATY_C */
  111. /******************************** End Of File *********************************/