jspin.c 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. /*
  2. * This file is part of Espruino, a JavaScript interpreter for Microcontrollers
  3. *
  4. * Copyright (C) 2013 Gordon Williams <gw@pur3.co.uk>
  5. *
  6. * This Source Code Form is subject to the terms of the Mozilla Public
  7. * License, v. 2.0. If a copy of the MPL was not distributed with this
  8. * file, You can obtain one at http://mozilla.org/MPL/2.0/.
  9. *
  10. * ----------------------------------------------------------------------------
  11. * Utilities and definitions for handling Pins
  12. * ----------------------------------------------------------------------------
  13. */
  14. #include "jspin.h"
  15. #include "jspininfo.h" // auto-generated
  16. bool jshIsPinValid(Pin pin) {
  17. // Note, PIN_UNDEFINED is always > JSH_PIN_COUNT
  18. return pin < JSH_PIN_COUNT && pinInfo[pin].port!=JSH_PORT_NONE;
  19. }
  20. Pin jshGetPinFromString(const char *s) {
  21. // built in constants
  22. if (s[0]=='B' && s[1]=='T' && s[2]=='N') {
  23. #ifdef BTN1_PININDEX
  24. if (!s[3]) return BTN1_PININDEX;
  25. if (s[3]=='1' && !s[4]) return BTN1_PININDEX;
  26. #endif
  27. #ifdef BTN2_PININDEX
  28. if (s[3]=='2' && !s[4]) return BTN2_PININDEX;
  29. #endif
  30. #ifdef BTN3_PININDEX
  31. if (s[3]=='3' && !s[4]) return BTN3_PININDEX;
  32. #endif
  33. #ifdef BTN4_PININDEX
  34. if (s[3]=='4' && !s[4]) return BTN4_PININDEX;
  35. #endif
  36. }
  37. if (s[0]=='L' && s[1]=='E' && s[2]=='D') {
  38. #ifdef LED1_PININDEX
  39. if (!s[3]) return LED1_PININDEX;
  40. if (s[3]=='1' && !s[4]) return LED1_PININDEX;
  41. #endif
  42. #ifdef LED2_PININDEX
  43. if (s[3]=='2' && !s[4]) return LED2_PININDEX;
  44. #endif
  45. #ifdef LED3_PININDEX
  46. if (s[3]=='3' && !s[4]) return LED3_PININDEX;
  47. #endif
  48. #ifdef LED4_PININDEX
  49. if (s[3]=='4' && !s[4]) return LED4_PININDEX;
  50. #endif
  51. #ifdef LED5_PININDEX
  52. if (s[3]=='5' && !s[4]) return LED5_PININDEX;
  53. #endif
  54. #ifdef LED6_PININDEX
  55. if (s[3]=='6' && !s[4]) return LED6_PININDEX;
  56. #endif
  57. #ifdef LED7_PININDEX
  58. if (s[3]=='7' && !s[4]) return LED7_PININDEX;
  59. #endif
  60. #ifdef LED8_PININDEX
  61. if (s[3]=='8' && !s[4]) return LED8_PININDEX;
  62. #endif
  63. }
  64. if ((s[0]>='A' && s[0]<='H') && s[1]) { // first 6 are analogs
  65. int port = JSH_PORTA+s[0]-'A';
  66. Pin pin = 127;
  67. if (!s[2] && (s[1]>='0' && s[1]<='9')) { // D0-D9
  68. pin = (Pin)(s[1]-'0');
  69. } else if (!s[3] && (s[1]>='1' && s[1]<='3' && s[2]>='0' && s[2]<='9')) { // D1X-D3X
  70. pin = (Pin)((s[1]-'0')*10 + (s[2]-'0'));
  71. }
  72. if (port == JSH_PORTA) {
  73. if (pin<JSH_PORTA_COUNT) return (Pin)(JSH_PORTA_OFFSET + pin);
  74. } else if (port == JSH_PORTB) {
  75. if (pin<JSH_PORTB_COUNT) return (Pin)(JSH_PORTB_OFFSET + pin);
  76. } else if (port == JSH_PORTC) {
  77. if (pin<JSH_PORTC_COUNT) return (Pin)(JSH_PORTC_OFFSET + pin);
  78. } else if (port == JSH_PORTD) {
  79. if (pin<JSH_PORTD_COUNT) return (Pin)(JSH_PORTD_OFFSET + pin);
  80. #if JSH_PORTE_OFFSET!=-1
  81. } else if (port == JSH_PORTE) {
  82. if (pin<JSH_PORTE_COUNT) return (Pin)(JSH_PORTE_OFFSET + pin);
  83. #endif
  84. #if JSH_PORTF_OFFSET!=-1
  85. } else if (port == JSH_PORTF) {
  86. if (pin<JSH_PORTF_COUNT) return (Pin)(JSH_PORTF_OFFSET + pin);
  87. #endif
  88. #if JSH_PORTG_OFFSET!=-1
  89. } else if (port == JSH_PORTG) {
  90. if (pin<JSH_PORTG_COUNT) return (Pin)(JSH_PORTG_OFFSET + pin);
  91. #endif
  92. #if JSH_PORTH_OFFSET!=-1
  93. } else if (port == JSH_PORTH) {
  94. if (pin<JSH_PORTH_COUNT) return (Pin)(JSH_PORTH_OFFSET + pin);
  95. #endif
  96. }
  97. }
  98. return PIN_UNDEFINED;
  99. }
  100. /** Write the pin name to a string. String must have at least 8 characters (to be safe) */
  101. void jshGetPinString(char *result, Pin pin) {
  102. result[0] = 0; // just in case
  103. if (
  104. #if JSH_PORTA_OFFSET!=0
  105. pin>=JSH_PORTA_OFFSET &&
  106. #endif
  107. pin<JSH_PORTA_OFFSET+JSH_PORTA_COUNT) {
  108. result[0]='A';
  109. itoa(pin-JSH_PORTA_OFFSET,&result[1],10);
  110. } else if (pin>=JSH_PORTB_OFFSET && pin<JSH_PORTB_OFFSET+JSH_PORTB_COUNT) {
  111. result[0]='B';
  112. itoa(pin-JSH_PORTB_OFFSET,&result[1],10);
  113. } else if (pin>=JSH_PORTC_OFFSET && pin<JSH_PORTC_OFFSET+JSH_PORTC_COUNT) {
  114. result[0]='C';
  115. itoa(pin-JSH_PORTC_OFFSET,&result[1],10);
  116. } else if (pin>=JSH_PORTD_OFFSET && pin<JSH_PORTD_OFFSET+JSH_PORTD_COUNT) {
  117. result[0]='D';
  118. itoa(pin-JSH_PORTD_OFFSET,&result[1],10);
  119. #if JSH_PORTE_OFFSET!=-1
  120. } else if (pin>=JSH_PORTE_OFFSET && pin<JSH_PORTE_OFFSET+JSH_PORTE_COUNT) {
  121. result[0]='E';
  122. itoa(pin-JSH_PORTE_OFFSET,&result[1],10);
  123. #endif
  124. #if JSH_PORTF_OFFSET!=-1
  125. } else if (pin>=JSH_PORTF_OFFSET && pin<JSH_PORTF_OFFSET+JSH_PORTF_COUNT) {
  126. result[0]='F';
  127. itoa(pin-JSH_PORTF_OFFSET,&result[1],10);
  128. #endif
  129. #if JSH_PORTG_OFFSET!=-1
  130. } else if (pin>=JSH_PORTG_OFFSET && pin<JSH_PORTG_OFFSET+JSH_PORTG_COUNT) {
  131. result[0]='G';
  132. itoa(pin-JSH_PORTG_OFFSET,&result[1],10);
  133. #endif
  134. #if JSH_PORTH_OFFSET!=-1
  135. } else if (pin>=JSH_PORTH_OFFSET && pin<JSH_PORTH_OFFSET+JSH_PORTH_COUNT) {
  136. result[0]='H';
  137. itoa(pin-JSH_PORTH_OFFSET,&result[1],10);
  138. #endif
  139. } else {
  140. strncpy(result, "UNKNOWN", 8);
  141. }
  142. }