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.

100 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 = 530;
  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 bool nextKeyReady = false;
  26. volatile byte nextKey = 0;
  27. void typeKey(byte key) {
  28. //noInterrupts();
  29. nextKey = key;
  30. nextKeyReady = true;
  31. //interrupts();
  32. }
  33. void sendKey(byte key) {
  34. //noInterrupts();
  35. dataWord = key;
  36. dataState = 8;
  37. dataDelay = 0;
  38. packetDelay = 0;
  39. packetTail = 15;
  40. //interrupts();
  41. Timer1.initialize(timerDelay);
  42. Timer1.start();
  43. }
  44. void statusCycle() {
  45. long timeNow = millis();
  46. long changeDiff = timeNow - lastChange;
  47. lastChange = timeNow;
  48. if (changeDiff >= 10 && nextKeyReady) {
  49. nextKeyReady = false;
  50. sendKey(nextKey);
  51. }
  52. }
  53. void clockCycle(void)
  54. {
  55. int dataBit = HIGH;
  56. if (packetDelay > 0) {
  57. packetDelay--;
  58. } else if (dataDelay > 0) {
  59. dataDelay--;
  60. dataBit = LOW;
  61. } else if (dataState > 0) {
  62. int bitToSend = (dataWord >> (dataState - 1)) & 1;
  63. dataBit = !bitToSend ? LOW : HIGH;
  64. dataState--;
  65. } else if (packetTail > 0) {
  66. packetTail--;
  67. dataBit = LOW;
  68. } else {
  69. Timer1.stop();
  70. }
  71. digitalWrite(pinData, dataBit);
  72. }
  73. int xx = 0;
  74. void loop(void)
  75. {
  76. delay(500);
  77. typeKey(44 + xx);
  78. xx = (xx+1) % 20;
  79. /*if (!nextKeyReady && Serial.available() > 0) {
  80. long key = Serial.parseInt(SKIP_ALL);
  81. if (key != 0) {
  82. typeKey(key);
  83. }
  84. }*/
  85. }