Converter for Consul 262.5 terminal keyboard and VDX 52600 terminal.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

105 lines
1.9 KiB

  1. #include <TimerOne.h>
  2. // config:
  3. const int pinData = 6;
  4. const int pinStatus = 7;
  5. // fixed values
  6. const int timerDelay = 500;
  7. void setup(void)
  8. {
  9. pinMode(pinData, OUTPUT);
  10. digitalWrite(pinData, HIGH);
  11. Timer1.initialize(timerDelay);
  12. Timer1.attachInterrupt(clockCycle);
  13. Timer1.stop();
  14. pinMode(pinStatus, INPUT_PULLUP);
  15. attachInterrupt(digitalPinToInterrupt(pinStatus), statusCycle, CHANGE);
  16. Serial.begin(9600);
  17. }
  18. volatile long lastChange = 0;
  19. volatile int x = 0;
  20. volatile int dataWord = 0;
  21. volatile int dataState = 0;
  22. volatile int dataDelay = 0;
  23. volatile int packetDelay = 0;
  24. volatile int packetTail = 0;
  25. volatile int clkState = HIGH;
  26. volatile bool nextKeyReady = false;
  27. volatile byte nextKey = 0;
  28. void typeKey(byte key) {
  29. noInterrupts();
  30. nextKeyReady = true;
  31. nextKey = key;
  32. interrupts();
  33. }
  34. void sendKey(byte key) {
  35. noInterrupts();
  36. dataWord = key;
  37. dataState = 8;
  38. dataDelay = 0;
  39. packetDelay = 0;
  40. packetTail = 10;
  41. clkState = HIGH;
  42. interrupts();
  43. Timer1.initialize(timerDelay);
  44. Timer1.start();
  45. }
  46. void statusCycle() {
  47. long timeNow = millis();
  48. long changeDiff = timeNow - lastChange;
  49. lastChange = timeNow;
  50. if (changeDiff >= 10 && nextKeyReady) {
  51. sendKey(nextKey);
  52. nextKeyReady = false;
  53. }
  54. }
  55. void clockCycle(void)
  56. {
  57. int dataBit = HIGH;
  58. if (clkState == LOW) {
  59. clkState = HIGH;
  60. } else {
  61. clkState = LOW;
  62. }
  63. if (packetDelay > 0) {
  64. packetDelay--;
  65. } else if (dataDelay > 0) {
  66. dataDelay--;
  67. dataBit = LOW;
  68. } else if (dataState > 0) {
  69. int bitToSend = (dataWord >> (dataState - 1)) & 1;
  70. dataBit = !bitToSend ? LOW : HIGH;
  71. dataState--;
  72. } else if (packetTail > 0) {
  73. packetTail--;
  74. dataBit = LOW;
  75. } else {
  76. Timer1.stop();
  77. }
  78. digitalWrite(pinData, dataBit);
  79. }
  80. void loop(void)
  81. {
  82. delay(50);
  83. if (Serial.available() > 0) {
  84. long key = Serial.parseInt(SKIP_ALL);
  85. if (key != 0) {
  86. typeKey(key);
  87. }
  88. }
  89. }