Advertisement
Guest User

Untitled

a guest
Oct 21st, 2016
702
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 9.20 KB | None | 0 0
  1. // DIY H-Shifter by modelleicher
  2. // Version 3.10
  3. // new:
  4. // completely new sketch easier to read and edit later with uniform variable names
  5. //different modes for the onOff, HighLow, Group lever
  6.  
  7.  
  8. // initialize Joystick
  9. JoyState_t joySt;
  10.  
  11. // input pins
  12. int inp_gear1 = 3;
  13. int inp_gear2 = 4;
  14. int inp_gear3 = 5;
  15. int inp_gear4 = 6;
  16. int inp_gear5 = 7;
  17. int inp_gear6 = 8;
  18. int inp_gear7 = 9;
  19. int inp_onOff = 15;
  20. int inp_highLow = 2;
  21. int inp_groupFW = A0;
  22. int inp_groupBW = A1;
  23.  
  24. // raw state variables
  25. int raw_gear1, raw_gear2, raw_gear3, raw_gear4, raw_gear5, raw_gear6, raw_gear7, raw_onOff, raw_highLow, raw_groupFW, raw_groupBW = LOW;
  26. // final state variables
  27. int final_onOff, final_highLow, final_highLow2, final_groupFW, final_groupBW = LOW;
  28.  
  29. // variables needed to detect state changes for the times buttons
  30. int listener_onOff, listener_highLow, listener_groupFW, listener_groupBW = LOW;
  31. int timer_onOff, timer_highLow, timer_groupFW, timer_groupBW = 0;
  32. int timerState_onOff, timerState_highLow, timerState_groupFW, timerState_groupBW = false;
  33.  
  34. // variables needed for the timer and debounce on the group buttons
  35. int temp_groupFW, temp_groupBW = LOW;
  36. int debTimer_groupFW, debTimer_groupBW = 0;
  37. int finalTemp_groupFW, finalTemp_groupBW = LOW;
  38.  
  39. // setup mode variables
  40. int setupMode = false;
  41. int onOffMode = 0;
  42. int highLowMode = 1;
  43. int groupMode = 0;
  44. int setupModeTimerOn = false;
  45. int setupModeTimer = 0;
  46. int setupModeCnt = 0;
  47. int initiated = false;
  48.  
  49. byte incoming = 0;
  50.  
  51. // constant time variables
  52. byte highTimer = 100;
  53.  
  54. void setup()
  55. {
  56.   // pin Mode, all Input
  57.   pinMode(inp_gear1, INPUT);
  58.   pinMode(inp_gear2, INPUT);
  59.   pinMode(inp_gear3, INPUT);
  60.   pinMode(inp_gear4, INPUT);
  61.   pinMode(inp_gear5, INPUT);
  62.   pinMode(inp_gear6, INPUT);
  63.   pinMode(inp_gear7, INPUT);
  64.   pinMode(inp_onOff, INPUT);
  65.   pinMode(inp_highLow, INPUT);
  66.   pinMode(inp_groupFW, INPUT);
  67.   pinMode(inp_groupBW, INPUT);
  68.  
  69.  
  70.   // Variables for the joystick values, we only use buttons
  71.   joySt.xAxis = 128;
  72.   joySt.yAxis = 128;
  73.   joySt.zAxis = 128;
  74.   joySt.xRotAxis = 128;
  75.   joySt.yRotAxis = 128;
  76.   joySt.zRotAxis = 128;
  77.   joySt.throttle = 128;
  78.   joySt.rudder = 128;
  79.   joySt.hatSw1 = 8;
  80.   joySt.hatSw2 = 8;
  81.   joySt.buttons = 0;
  82. }
  83.  
  84.  
  85. void loop()
  86. {
  87.     if (setupMode == false)
  88.     {
  89.         // get the raw input values first
  90.         raw_gear1 = digitalRead(inp_gear1);
  91.         raw_gear2 = digitalRead(inp_gear2);
  92.         raw_gear3 = digitalRead(inp_gear3);
  93.         raw_gear4 = digitalRead(inp_gear4);
  94.         raw_gear5 = digitalRead(inp_gear5);
  95.         raw_gear6 = digitalRead(inp_gear6);
  96.         raw_gear7 = digitalRead(inp_gear7);
  97.         raw_onOff = digitalRead(inp_onOff);
  98.         raw_highLow = digitalRead(inp_highLow);
  99.         raw_groupFW = digitalRead(inp_groupFW);
  100.         raw_groupBW = digitalRead(inp_groupBW);
  101.        
  102.         // different modes for the onOff Switch
  103.         if (onOffMode == 0) // switch acts as switch, on/off
  104.         {
  105.             final_onOff = raw_onOff;
  106.         }
  107.         else if (onOffMode == 1) // switch acts as buttons, each time switched the button goes on for 100ms
  108.         {
  109.             if (raw_onOff != listener_onOff) // check listener if state has changed
  110.             {
  111.                 if (timerState_onOff == false) //timer isn't active, start the button press
  112.                 {
  113.                     timerState_onOff = true;
  114.                     timer_onOff = millis();
  115.                     final_onOff = HIGH;
  116.                     listener_onOff = raw_onOff;
  117.                 }
  118.             }
  119.             if (timerState_onOff == true) // if timer is active
  120.             {
  121.                 if (timer_onOff + highTimer < millis()) // check if 100ms are up, if so, stop the button press
  122.                 {                                       // and reset all timer related variables
  123.                     timerState_onOff = false;
  124.                     timer_onOff = 0;
  125.                     final_onOff = LOW;
  126.                 }
  127.             }
  128.         }
  129.         // onOff switch modes end
  130.        
  131.         // different modes for the highLow switch
  132.         if (highLowMode == 0) // switch acts as switch, on/off
  133.         {
  134.             final_highLow = raw_highLow;
  135.         }
  136.         else if (highLowMode == 1) // switch acts as buttons, each time switched the button goes on for 100ms
  137.         {
  138.             if (raw_highLow != listener_highLow) // check listener if state has changed
  139.             {
  140.                 if (timerState_highLow == false) //timer isn't active, start the button press
  141.                 {
  142.                     timerState_highLow = true;
  143.                     timer_highLow = millis();
  144.                     final_highLow = HIGH;
  145.                     listener_highLow = raw_highLow;
  146.                 }
  147.             }
  148.             if (timerState_highLow == true) // if timer is active
  149.             {
  150.                 if (timer_highLow + highTimer < millis()) // check if 100ms are up, if so, stop the button press
  151.                 {                                       // and reset all timer related variables
  152.                     timerState_highLow = false;
  153.                     timer_highLow = 0;
  154.                     final_highLow = LOW;
  155.                 }
  156.             }
  157.         }
  158.         else if (highLowMode == 2) // switch acts as a two way switch sets a different button high on each state
  159.         {
  160.             final_highLow = raw_highLow;
  161.             final_highLow2 = !raw_highLow;
  162.         }
  163.         // high low switch modes end
  164.        
  165.  
  166.        
  167.        
  168.        
  169.         // group button stuff..
  170.         // with debounce and things :)
  171.         // also, different modes... (why do i do that to myself?!)
  172.         if (groupMode == 0) // the easy one first.. just simple 1:1 input to output
  173.         {
  174.             final_groupFW = LOW;
  175.                         final_groupBW = LOW;
  176.                         if (raw_groupFW == HIGH && raw_groupBW == HIGH)
  177.                         {
  178.                           final_groupBW = LOW;
  179.                           final_groupFW = HIGH;
  180.                         }
  181.                         else if (raw_groupBW == HIGH && raw_groupFW == LOW)
  182.                         {
  183.                           final_groupBW = HIGH;
  184.                           final_groupFW = LOW;
  185.                         }
  186.         }
  187.         else if (groupMode == 1 || groupMode == 2) // now the difficult one.. with debounce and stuff
  188.         {  
  189.             // since the debounce is needed in mode 1 and 2, only needed once.
  190.             // first button
  191.             if (raw_groupBW == HIGH && raw_groupFW == LOW) // button 2 is pressed
  192.             {
  193.                 if (temp_groupFW == LOW) // timer starts
  194.                 {
  195.                     temp_groupFW = HIGH;
  196.                     debTimer_groupFW = millis();
  197.                 }
  198.                 else if (temp_groupFW == HIGH)
  199.                 {
  200.                     if (debTimer_groupFW + 60 < millis())
  201.                     {
  202.                         finalTemp_groupFW = HIGH;
  203.                     }
  204.                 }
  205.             }
  206.             else if (raw_groupBW == LOW) // reset all as soon as button gets low
  207.             {
  208.                 temp_groupFW = LOW;
  209.                 debTimer_groupFW = 0;
  210.                 finalTemp_groupFW = LOW;
  211.             }
  212.             // second button
  213.             if (raw_groupBW == HIGH && raw_groupFW == HIGH) // button 1 is pressed
  214.             {
  215.                 if (temp_groupBW == LOW) // timer starts
  216.                 {
  217.                     temp_groupBW = HIGH;
  218.                     debTimer_groupBW = millis();
  219.                 }
  220.                 else if (temp_groupBW == HIGH)
  221.                 {
  222.                     if (debTimer_groupBW + 60 < millis())
  223.                     {
  224.                         finalTemp_groupBW = HIGH;
  225.                     }
  226.                 }
  227.             }
  228.             else if (raw_groupFW == LOW) // reset all as soon as button gets low
  229.             {
  230.                 temp_groupBW = LOW;
  231.                 debTimer_groupBW = 0;
  232.                 finalTemp_groupBW = LOW;
  233.             }
  234.             // debounce end
  235.             // now the modes....
  236.             if (groupMode == 1) // each button has its own relative button that gets pressed for 100ms
  237.             {
  238.                 if (finalTemp_groupFW == HIGH) // timer stuff, same as with the other switches
  239.                 {
  240.                     if (timerState_groupFW == false)
  241.                     {
  242.                         timerState_groupFW = true;
  243.                         timer_groupFW = millis();
  244.                         final_groupFW = HIGH;
  245.                     }
  246.                     if (timerState_groupFW == true)
  247.                     {
  248.                         if (timer_groupFW + highTimer < millis()) {final_groupFW = LOW;}
  249.                     }
  250.                 }
  251.                 else if (finalTemp_groupFW == LOW)
  252.                 {
  253.                     timerState_groupFW = false;
  254.                     timer_groupFW = 0;
  255.                 }
  256.                 if (finalTemp_groupBW == HIGH) // timer stuff for the other button
  257.                 {
  258.                     if (timerState_groupBW == false)
  259.                     {
  260.                         timerState_groupBW = true;
  261.                         timer_groupBW = millis();
  262.                         final_groupBW = HIGH;
  263.                     }
  264.                     if (timerState_groupBW == true)
  265.                     {
  266.                         if (timer_groupBW + highTimer < millis()) {final_groupBW = LOW;}
  267.                     }
  268.                 }
  269.                 else if (finalTemp_groupBW == LOW)
  270.                 {
  271.                     timerState_groupBW = false;
  272.                     timer_groupBW = 0;
  273.                 }
  274.             }
  275.             if (groupMode == 2) // both buttons mapped to one button
  276.             {
  277.                 if (finalTemp_groupFW == HIGH || finalTemp_groupBW == HIGH) // timer stuff, same as with the other switches
  278.                 {
  279.                     if (timerState_groupFW == false)
  280.                     {
  281.                         timerState_groupFW = true;
  282.                         timer_groupFW = millis();
  283.                         final_groupFW = HIGH;
  284.                     }
  285.                     if (timerState_groupFW == true)
  286.                     {
  287.                         if (timer_groupFW + highTimer < millis()) {final_groupFW = LOW;}
  288.                     }
  289.                 }
  290.                 else if (finalTemp_groupFW == LOW && finalTemp_groupBW == LOW)
  291.                 {
  292.                     timerState_groupFW = false;
  293.                     timer_groupFW = 0;
  294.                 }
  295.             }
  296.         }
  297.        
  298.         // now that all this stuff is done...   send the data to the pc
  299.        
  300.         // first the gears.. here we send raw data
  301.         bitWrite(joySt.buttons, 0, raw_gear1);
  302.         bitWrite(joySt.buttons, 1, raw_gear2);
  303.         bitWrite(joySt.buttons, 2, raw_gear3);
  304.         bitWrite(joySt.buttons, 3, raw_gear4);
  305.         bitWrite(joySt.buttons, 4, raw_gear5);
  306.         bitWrite(joySt.buttons, 5, raw_gear6);
  307.         bitWrite(joySt.buttons, 6, raw_gear7);
  308.        
  309.         // now the switches, here we use final data
  310.         bitWrite(joySt.buttons, 8, final_onOff);
  311.         bitWrite(joySt.buttons, 9, final_highLow);
  312.         bitWrite(joySt.buttons, 10, final_highLow2);
  313.         bitWrite(joySt.buttons, 11, final_groupBW);
  314.         bitWrite(joySt.buttons, 12, final_groupFW);
  315.        
  316.        
  317.         // and send the stuff...
  318.         Joystick.setState(&joySt);
  319.     }    
  320.     else if (setupMode == true)
  321.     {
  322.        
  323.  
  324.        
  325.        
  326.     }
  327. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement