/*
Whip mechanics robot: 
uses tethered mouse feedback via motor impulse, and cord length to generate pseudo-random motion continuing from an initial motion. 
Possible improvements:
dont use delay, or dont interupt mouse feedback, or dont stop after initial start at 0,0 crossing.
   Initial start up is at 0,0, x,y +/-
works ok as is.
*/

#include "USBHost_t36.h"
//Built on a teensy 4.M1
//analog io 
const int LF = 0;
const int LR = 1;
const int RF = 2;
const int RR = 3;

USBHost myusb;
MouseController mouse1(myusb);
USBHub hub1(myusb);
USBHIDParser hid1(myusb);
//X:lft,rgt Y;fwd,rev
void fwd(int y);
void rev(int y);
void lft(int x);
void rgt(int x);
void stp();
int dtime =200; //Run Time
int n=100;  //multiplyer for runtime (speed)
void setup(){
 //while (!Serial) ; // wait for Arduino Serial Monitor:dubug use onlu
  myusb.begin();    //on board USB input
  pinMode(LF,OUTPUT);
  pinMode(LR,OUTPUT);
  pinMode(RF,OUTPUT);
  pinMode(RR,OUTPUT);
}

void loop(){
  myusb.Task();

  
  if (mouse1.available()) {
    int x = n * mouse1.getMouseX(); //X==right
    int y = n * mouse1.getMouseY(); //Y==left
    //gt 0=fwd
    //lt 0=rverse
    
    if(x==0 && y==0){
      stp();
        //all pins ==0== stoped       
      }
      if(y>0){ //fwd
        fwd(y);
       }
      if(y<0){
        rev(y);
        }
      if(x>0){ //right?
        rgt(x);
        }     
      if(x<0){
        lft(x);
        }
    
   /*
    //Serial.print("Mouse: buttons = ");
    //Serial.print(mouse1.getButtons());
    Serial.print(",  mouseX = ");
    Serial.print(mouse1.getMouseX());
    Serial.print(",  mouseY = ");
    Serial.print(mouse1.getMouseY());
    //Serial.print(",  wheel = ");
    //Serial.print(mouse1.getWheel());
    //Serial.print(",  wheelH = ");
    //Serial.print(mouse1.getWheelH());
    Serial.println();
 */
    mouse1.mouseDataClear();
  }

}
//X:lft,rgt Y;fwd,rev
void fwd(int y){ //pos Y
Serial.println("Forward");    
       analogWrite(LF,y);
       analogWrite(LR,0);
       analogWrite(RF,y);
       analogWrite(RR,0);
       delay(dtime);
       stp();  
  }
void rev(int y){  //neg Y
Serial.println("Reverse");
       analogWrite(LF,0);
       analogWrite(LR,y);
       analogWrite(RF,0);
       analogWrite(RR,y);
       delay(dtime);
       stp();
       }
void lft(int x){ //neg X
Serial.println("Left");
       analogWrite(LF,0);
       analogWrite(LR,x);
       analogWrite(RF,x);
       analogWrite(RR,0);
       delay(dtime);
       stp();
  }
void rgt(int x){ //pos X
Serial.println("Right");
       analogWrite(LF,x);
       analogWrite(LR,0);
       analogWrite(RF,0);
       analogWrite(RR,x);
       delay(dtime);
       stp();
       }
void stp(){
Serial.println("Stop");
       analogWrite(LF,0);
       analogWrite(LR,0);
       analogWrite(RF,0);
       analogWrite(RR,0);
       }