'''
///////////////////////////////////////////////////////////////////////////
// Programa desenvolvido por Cristiano Teixeira                          //
// Sob Licença Apache 2.0                                                //
// https://github.com/ProfessorCristiano                                 //
// Hexapod com MicroPython e ESP32                                       //
// Programa utiliza ESP32 e Servo motores SG90 para controlar um quadpod //
// MePed V2.0, com 8 servos, para 4 patas                                //
// Sendo 4 para movimentos de 'ombro' e 4 para movimentos de 'joelho'.   //
// https://meped.io/mepedv2                                              //
// programa exemplo em:                                                  //
// https://www.meped.io/sites/default/files/2017-06/mePed_IR_Starter_Program_0.ino //
//  e                                                                    //
// https://github.com/keaoli/SPARX/blob/master/CoreMovement.py           //
// As posições iniciais são definidas e os movimentos são sincronizados  //
// com base nessas posições.                                             //
// Veja os comentários para entender como o código funciona.             //
///////////////////////////////////////////////////////////////////////////
'''
from adafruit_servokit import ServoKit
import time
 #import the servokit library (from circuitpython0 If you are using
 #a raspberry pi you will need additional libraries
kit = ServoKit(channels=16) #set up the kit object for servos plus channels
#channels = to the channels on your controller, this was done with an adafruit
#PCA9685 which has 36 servo channels.
#pick a direction for your quadruped to face before defining these, it will make it easier
RFP = kit.servo[19] #Right Front Pivot (the corner hip servo)
LFP = kit.servo[21] #Left Front Pivot
RBP = kit.servo[5] # Right Back Pivot
LBP = kit.servo[4] # Left Back Pivot
RFL = kit.servo[32] #Right Front Lift servo (the knee servo)
LFL = kit.servo[33] #Left Front :ift
RBL = kit.servo[13] #Right Back Lift
LBL = kit.servo[14] #Left Back Lift
#these designations are fairly arbitrary, the quad is symmetrical but it helps to think of a "front"
RFPCal = -5 #calibration values, servos may be slightly off center, these will allow for that
LFPCal = 0
RBPCal = 5
LBPCal = 5
RFLCal = -5
LFLCal = 20
RBLCal = 5
LBLCal = 0
#find these values by setting the pivot servos to 90 degrees then adding or subtracting single degrees
# until each leg points at a 45 degree angle from the body
#servo positions (calibration allowed for)
RFP90 = (90+RFPCal)
RFP120 = (120+RFPCal)
RFP150 = (150+RFPCal)
RFP180 = (180+RFPCal)
LFP90 = (90+LFPCal)
LFP120 = (120+LFPCal)
LFP150 = (150+LFPCal)
LFP180 = (180+LFPCal)
RBP0 = (0+RBPCal)
RBP30 = (30+RBPCal)
RBP60 = (60+RBPCal)
RBP90 = (90+RBPCal)
LBP0 = (0+LBPCal)
LBP30 = (30+LBPCal)
LBP60 = (60+LBPCal)
LBP90 = (90+LBPCal)
#using these variables should allow repeatable results
#allowed for these variables within the srv function so they arent used, kept them incase
OverallSpeed = 0.003 #speed of motion, defined by a wait between actions.faster speeds can be experimented with
RFPCurr = 90 #holds current position of servos
LFPCurr = 90 #these ignore calibration because they are "imagined" positions, for the purpose of MATHS
RBPCurr = 90
LBPCurr = 90
RFLCurr = 90
LFLCurr = 90
RBLCurr = 90
LBLCurr = 90
def srv(PLFP, PLBP, PRBP, PRFP, PLFL, PLBL, PRBL, PRFL, SP1, SP2, SP3, SP4):
    #PLFP : positionto move Left Front Pivot servo to
    #PLBP : Position for Left Back Pivot
    #PRBP : Position for Right Back Pivot
    #PRFP : Position for Right Front Pivot
    #PLFL : Position for Left Front Lift servo
    #PLBL : Position for Left Back Lift servo
    #PRBL: : Position for Right Back Lift servo
    #PRFL: Position for Right Front Lift servo
    # SP1-SP4 : Speed values, amount of degrees to move each servo by each loop
    global RFPCurr# = 90 #holds current position of servos
    global LFPCurr #= 90 #these ignore calibration because they are "imagined" positions, for the purpose of MATHS
    global RBPCurr #= 90
    global LBPCurr# = 90
    global RFLCurr# = 90
    global LFLCurr# = 90
    global RBLCurr# = 90
    global LBLCurr# = 90
    
    #global SP1
    #global SP2
    #global SP3
    #global SP4
    
    
    while PLFP != LFPCurr or PLBP != LBPCurr or PRBP != RBPCurr or PRFP != RFPCurr or PLFL != LFLCurr or PLBL != LBLCurr or PRBL != RBLCurr or PRFL != RFLCurr :
        
        if LFPCurr < PLFP:
            if (LFPCurr + SP1) <= PLFP:
                LFPCurr = LFPCurr + SP1
            else:
                LFPCurr = PLFP
            
        if (LFPCurr > PLFP): #Left Front Pivot servo
            if (LFPCurr - SP1) >= PLFP:
                LFPCurr = LFPCurr - SP1
            else:
                LFPCurr = PLFP
        #time.sleep(0.002)        
        if (LBPCurr < PLBP) :#Left Front Pivot servo
            if (LBPCurr + SP2) <= PLBP:
                LBPCurr = LBPCurr + SP2
            else:
                LBPCurr = PLBP
                
        if (LBPCurr > PLBP): #Left Front Pivot servo
            if (LBPCurr - SP2) >= PLBP:
                LBPCurr = LBPCurr - SP2
            else:
                LBPCurr = PLBP
        #time.sleep(0.002)           
        if (RBPCurr < PRBP): #Left Front Pivot servo
            if (RBPCurr + SP3) <= PRBP:
                RBPCurr = RBPCurr + SP3
            else:
                RBPCurr = PRBP
                
        if (RBPCurr > PRBP): #Left Front Pivot servo
            if (RBPCurr - SP3) >= PRBP:
                RBPCurr = RBPCurr - SP3
            else:
                RBPCurr = PRBP
        #time.sleep(0.002)           
        if (RFPCurr < PRFP) :#Left Front Pivot servo
            if (RFPCurr + SP4) <= PRFP:
                RFPCurr = RFPCurr + SP4
            else:
                RFPCurr = PRFP
                
                   
        if (RFPCurr > PRFP): #Left Front Pivot servo
            if (RFPCurr - SP4) >= PRFP:
                RFPCurr = RFPCurr - SP4
            else:
                RFPCurr = PRFP
        #time.sleep(0.002)           
        if (LFLCurr < PLFL):#Left Front Pivot servo
            if (LFLCurr + SP1) <= PLFL:
                LFLCurr = LFLCurr + SP1
            else:
                LFLCurr = PLFL
                
                
        if (LFLCurr > PLFL): #Left Front Pivot servo
            if (LFLCurr - SP1) >= PLFL:
                LFLCurr = LFLCurr - SP1
            else:
                LFLCurr = PLFL
        #time.sleep(0.002)           
        if (LBLCurr < PLBL) :#Left Front Pivot servo
            if (LBLCurr + SP2) <= PLBL:
                LBLCurr = LBLCurr + SP2
            else:
                LBLCurr = PLBL
                
        if (LBLCurr > PLBL): #Left Front Pivot servo
            if (LBLCurr - SP2) >= PLBL:
                LBLCurr = LBLCurr - SP2
            else:
                LBLCurr = PLBL
        #time.sleep(0.002)       
        if (RBLCurr < PRBL) :#Left Front Pivot servo
            if (RBLCurr + SP3) <= PRBL:
                RBLCurr = RBLCurr + SP3
            else:
                RBLCurr = PRBL
        if (RBLCurr > PRBL) :#Left Front Pivot servo
            if (RBLCurr - SP3) >= PRBL:
                RBLCurr = RBLCurr - SP3
            else:
                RBLCurr = PRBL
        #time.sleep(0.002)   
        if (RFLCurr < PRFL) :#Left Front Pivot servo
            if (RFLCurr + SP4) <= PRFL:
                RFLCurr = RFLCurr + SP4
            else:
                RFLCurr = PRFL
        if (RFLCurr > PRFL) :#Left Front Pivot servo
            if (RFLCurr - SP4) >= PRFL:
                RFLCurr = RFLCurr - SP4
            else:
                RFLCurr = PRFL
        #time.sleep(0.002)
        
        if (LFLCurr+LFLCal) >= 0 and (LFLCurr+LFLCal) <= 180 :
        
            LFL.angle = LFLCurr + LFLCal
        if (LBLCurr+LBLCal) >= 0 and (LBLCurr+LBLCal) <= 180 :
            LBL.angle = LBLCurr + LBLCal
        if (RBLCurr+RBLCal) >= 0 and (RBLCurr+RBLCal) <= 180 :
            RBL.angle = RBLCurr + RBLCal
        if (RFLCurr+RFLCal) >= 0 and (RFLCurr+RFLCal) <= 180 :
            RFL.angle = RFLCurr + RFLCal
        
        if (LFPCurr+LFPCal) >= 0 and (LFPCurr+LFPCal) <= 180 :
            
            LFP.angle = LFPCurr + LFPCal
        if (LBPCurr+LBPCal) >= 0 and (LBPCurr+LBPCal) <= 180 :
            LBP.angle = LBPCurr + LBPCal
        if (RFPCurr+RFPCal) >= 0 and (RFPCurr+RFPCal) <= 180 :
            RFP.angle = RFPCurr + RFPCal
        if (RBPCurr+RBPCal) >= 0 and (RBPCurr+RBPCal) <= 180 :
            RBP.angle = RBPCurr + RBPCal
     #This ufly block of code makes sure that an angle below 0 or above 180 is sent to each servo
     #this could cause problems , a better option might be to set to exacxtly 0 or 180       
        
            
        time.sleep(OverallSpeed)
        #sleep for the overall speed, not ACTUALLY required for motion
        
def srv2(PLFP, PLBP, PRBP, PRFP, PLFL, PLBL, PRBL, PRFL, SP1, SP2, SP3, SP4):
    #secondary serv function processing each movement in a different order, to possibly
    #improve gait, not used in current code, still a WIP
    #PLFP : positionto move Left Front Pivot servo to
    #PLBP : Position for Left Back Pivot
    #PRBP : Position for Right Back Pivot
    #PRFP : Position for Right Front Pivot
    #PLFL : Position for Left Front Lift servo
    #PLBL : Position for Left Back Lift servo
    #PRBL: : Position for Right Back Lift servo
    #PRFL: Position for Right Front Lift servo
    # SP1-SP4 : Speed values, amount of degrees to move each servo by each loop
    global RFPCurr# = 90 #holds current position of servos
    global LFPCurr #= 90 #these ignore calibration because they are "imagined" positions, for the purpose of MATHS
    global RBPCurr #= 90
    global LBPCurr# = 90
    global RFLCurr# = 90
    global LFLCurr# = 90
    global RBLCurr# = 90
    global LBLCurr# = 90
    
    #global SP1
    #global SP2
    #global SP3
    #global SP4
    
    while PLFL != LFLCurr or PLBL != LBLCurr or PRBL != RBLCurr or PRFL != RFLCurr :
        if (LFLCurr < PLFL):#Left Front Pivot servo
            if (LFLCurr + SP1) <= PLFL:
                LFLCurr = LFLCurr + SP1
            else:
                LFLCurr = PLFL
        if (LFLCurr > PLFL): #Left Front Pivot servo
            if (LFLCurr - SP1) >= PLFL:
                LFLCurr = LFLCurr - SP1
            else:
                LFLCurr = PLFL
        time.sleep(0.002)           
        if (LBLCurr < PLBL) :#Left Front Pivot servo
            if (LBLCurr + SP2) <= PLBL:
                LBLCurr = LBLCurr + SP2
            else:
                LBLCurr = PLBL
                
        if (LBLCurr > PLBL): #Left Front Pivot servo
            if (LBLCurr - SP2) >= PLBL:
                LBLCurr = LBLCurr - SP2
            else:
                LBLCurr = PLBL
        time.sleep(0.002)       
        if (RBLCurr < PRBL) :#Left Front Pivot servo
            if (RBLCurr + SP3) <= PRBL:
                RBLCurr = RBLCurr + SP3
            else:
                RBLCurr = PRBL
        if (RBLCurr > PRBL) :#Left Front Pivot servo
            if (RBLCurr - SP3) >= PRBL:
                RBLCurr = RBLCurr - SP3
            else:
                RBLCurr = PRBL
        time.sleep(0.002)   
        if (RFLCurr < PRFL) :#Left Front Pivot servo
            if (RFLCurr + SP4) <= PRFL:
                RFLCurr = RFLCurr + SP4
            else:
                RFLCurr = PRFL
        if (RFLCurr > PRFL) :#Left Front Pivot servo
            if (RFLCurr - SP4) >= PRFL:
                RFLCurr = RFLCurr - SP4
            else:
                RFLCurr = PRFL
        time.sleep(0.001)
        
        if (LFLCurr+LFLCal) >= 0 and (LFLCurr+LFLCal) <= 180 :
        
            LFL.angle = LFLCurr + LFLCal
        if (LBLCurr+LBLCal) >= 0 and (LBLCurr+LBLCal) <= 180 :
            LBL.angle = LBLCurr + LBLCal
        if (RBLCurr+RBLCal) >= 0 and (RBLCurr+RBLCal) <= 180 :
            RBL.angle = RBLCurr + RBLCal
        if (RFLCurr+RFLCal) >= 0 and (RFLCurr+RFLCal) <= 180 :
            RFL.angle = RFLCurr + RFLCal
    
    while PLFP != LFPCurr or PLBP != LBPCurr or PRBP != RBPCurr or PRFP != RFPCurr : 
        
        if LFPCurr < PLFP:
            if (LFPCurr + SP1) <= PLFP:
                LFPCurr = LFPCurr + SP1
            else:
                LFPCurr = PLFP
            
        if (LFPCurr > PLFP): #Left Front Pivot servo
            if (LFPCurr - SP1) >= PLFP:
                LFPCurr = LFPCurr - SP1
            else:
                LFPCurr = PLFP
        time.sleep(0.002)        
        if (LBPCurr < PLBP) :#Left Front Pivot servo
            if (LBPCurr + SP2) <= PLBP:
                LBPCurr = LBPCurr + SP2
            else:
                LBPCurr = PLBP
                
        if (LBPCurr > PLBP): #Left Front Pivot servo
            if (LBPCurr - SP2) >= PLBP:
                LBPCurr = LBPCurr - SP2
            else:
                LBPCurr = PLBP
        time.sleep(0.002)           
        if (RBPCurr < PRBP): #Left Front Pivot servo
            if (RBPCurr + SP3) <= PRBP:
                RBPCurr = RBPCurr + SP3
            else:
                RBPCurr = PRBP
                
        if (RBPCurr > PRBP): #Left Front Pivot servo
            if (RBPCurr - SP3) >= PRBP:
                RBPCurr = RBPCurr - SP3
            else:
                RBPCurr = PRBP
        time.sleep(0.002)           
        if (RFPCurr < PRFP) :#Left Front Pivot servo
            if (RFPCurr + SP4) <= PRFP:
                RFPCurr = RFPCurr + SP4
            else:
                RFPCurr = PRFP
                
                   
        if (RFPCurr > PRFP): #Left Front Pivot servo
            if (RFPCurr - SP4) >= PRFP:
                RFPCurr = RFPCurr - SP4
            else:
                RFPCurr = PRFP
        time.sleep(0.001)           
        
        if (LFPCurr+LFPCal) >= 0 and (LFPCurr+LFPCal) <= 180 :
            
            LFP.angle = LFPCurr + LFPCal
        if (LBPCurr+LBPCal) >= 0 and (LBPCurr+LBPCal) <= 180 :
            LBP.angle = LBPCurr + LBPCal
        if (RFPCurr+RFPCal) >= 0 and (RFPCurr+RFPCal) <= 180 :
            RFP.angle = RFPCurr + RFPCal
        if (RBPCurr+RBPCal) >= 0 and (RBPCurr+RBPCal) <= 180 :
            RBP.angle = RBPCurr + RBPCal
      
        
            
        time.sleep(0.001)
        
def changespeed(spdchange):
    
    global OverallSpeed
    
    OverallSpeed = OverallSpeed + spdchange
    #command to allow changing the time between motions, using a global like this isnt recommended but it works.
    
                
def forward():
    #work in profress walk gait, not used.
    srv(180, 0 , 120, 60, 82,  73,  73,  82,  2,  6,  2,  2)
    time.sleep(2)
    srv( 90, 30, 90,  30, 36,   73,  73,  82,  6,  2,  2,  2)
    time.sleep(2)
    srv( 90, 30, 90,  30, 82,  73,  73,  82,  6,  2,  2,  2)
    time.sleep(2)
    srv( 90, 60, 90,  30, 82,  73,  73,  82,  6,  2,  2,  2)
    time.sleep(2)
    srv( 90, 60, 90,  30, 82,  73,  36,  82,  6,  2,  2,  2)
    time.sleep(2)
    srv(120, 60, 180, 0,  82,  73,  36,   82,  2,  2,  6,  2)
    time.sleep(2)
    srv(120, 60, 180, 0,  82,  73,  73,  36,  2,  2,  6,  2)
    time.sleep(2)
    srv(150, 90, 150, 90, 82,  73,  100,  36,   2,  2,  2,  6)
    srv(150, 90, 150, 90, 82,  73,  100,  82,   2,  2,  2,  6)
    time.sleep(2)
    srv(150, 90, 150, 90, 82,  36,  100,  82,  2,  2,  2,  6)
    time.sleep(2)
    srv(180, 0,  120, 60, 82,  73,   73,  82,  2,  6,  2,  2)
    
def for2():
    #second work in progress walk gate, not used
    srv2(180, 0 , 90, 90, 90,  90,  90,  90,  3,  3,  3,  3)
    time.sleep(2)
    srv2( 40, 0, 90,  90, 30,   90,  90,  90,  3,  1,  1,  1)
    time.sleep(2)
    srv2( 90, 90, 30,  0, 90,  90,  90,  90,  3,  3,  3,  3)
    time.sleep(2)
    srv2(90, 90, 180, 0,  90,  90,  36,   90,  3,  3,  3,  3)
    time.sleep(2)
    srv2(90, 90, 180, 150,  90,  90,  90,  30,  3,  3,  3,  3)
    time.sleep(2)
    srv2(180, 140, 90, 90, 90,  90,  90, 90,   3,  3,  3,  3)
    time.sleep(2)
    srv2(180, 0, 90, 90, 90,  30, 90,  90,  3, 3,  3,  3)
    
    #srv(180, 0,  120, 60, 82,  36,   73,  82,  1,  3,  1,  1)
def forwardbase():
    #the walk gait we use, simple and taken directly from original code, not perfect.
    srv(180, 0 , 120, 60, 72,  63,  63,  72,  1,  3,  1,  1);
    srv( 90, 30, 90,  30, 36,   63,  63,  72,  3,  1,  1,  1);
    srv( 90, 30, 90,  30, 72,  63,  63,  72,  3,  1,  1,  1);
    srv(120, 60, 180, 0,  72,  63,  36,   72,  1,  1,  3,  1);
    srv(120, 60, 180, 0,  72,  63,  63,  72,  1,  1,  3,  1);
    srv(150, 90, 150, 90, 72,  63,  63,  36,   1,  1,  1,  3);
    srv(150, 90, 150, 90, 72,  63,  63,  72,  1,  1,  1,  3);
    srv(180, 0,  120, 60, 72,  36,   63,  72,  1,  3,  1,  1);
def backbase():
    #basic backwards walk, something isnt perfect with it as of writing this
    srv(180, 0,  120, 60, 72, 63, 63, 72, 3,  1, 1, 1);
    srv(150, 90, 150, 90, 72, 48, 63, 72, 1,  3, 1, 1);
    srv(150, 90, 150, 90, 72, 63, 63, 72, 1,  3, 1, 1);
    srv(120, 60, 180, 0,  72, 63, 63, 36,  1,  1, 1, 3);
    srv(120, 60, 180, 0,  72, 63, 63, 72, 1,  1, 1, 3);
    srv(90,  30, 90,  30, 72, 63, 48, 72, 1,  1, 3, 1);
    srv(90,  30, 90,  30, 72, 63, 63, 72, 1,  1, 3, 1);
    srv(180, 0,  120, 60, 36,  63, 63, 72, 3,  1, 1, 1);
def baseleft():
    #turn left, drifts slightly
    srv(150,  90, 90,  30, 72, 36,  63, 72, 1, 3, 1, 1);
    srv(150,  90, 90,  30, 72, 63, 63, 72, 1, 3, 1, 1);
    srv(120,  60, 180, 0,  72, 63, 36,  72, 1, 1, 3, 1);
    srv(120,  60, 180, 0,  72, 63, 63, 54, 1, 1, 3, 1);
    srv(90,   30, 150, 90, 72, 63, 63, 36,  1, 1, 1, 3);
    srv(90,   30, 150, 90, 72, 63, 63, 72, 1, 1, 1, 3);
    srv(180,  0,  120, 60, 36,  63, 63, 72, 3, 1, 1, 1);
    srv(180,  0,  120, 60, 72, 63, 63, 63, 3, 1, 1, 1);
def baseright():
    #turn right, drifts slightly
    srv( 90, 30, 150, 90, 36,  63, 63, 72, 3, 1, 1, 1);
    srv( 90, 30, 150, 90, 72, 63, 63, 72, 3, 1, 1, 1);
    srv(120, 60, 180, 0,  72, 63, 63, 36,  1, 1, 1, 3);
    srv(120, 60, 180, 0,  72, 63, 63, 72, 1, 1, 1, 3);
    srv(150, 90, 90,  30, 72, 63, 36,  72, 1, 1, 3, 1);
    srv(150, 90, 90,  30, 72, 63, 63, 72, 1, 1, 3, 1);
    srv(180, 0,  120, 60, 72, 36,  63, 72, 1, 3, 1, 1);
    srv(180, 0,  120, 60, 72, 63, 63, 72, 1, 3, 1, 1);
def center_servos():
    #center the servos, self explanatory.
    RFP.angle = RFP90
    time.sleep(0.001)
    RFL.angle = 90 + RFLCal
    time.sleep(0.001)
    LFP.angle = LFP90
    time.sleep(0.001)
    LFL.angle = 90 + LFLCal
    time.sleep(0.001)
    RBP.angle = RBP90
    time.sleep(0.001)
    RBL.angle = 90 + RBLCal
    time.sleep(0.001)
    LBP.angle = LBP90
    time.sleep(0.001)
    LBL.angle = 90 + LBLCal
    
   
    RFPCurr = 90 #holds current position of servos
    LFPCurr = 90
    RBPCurr = 90
    LBPCurr = 90
    RFLCurr = 90
    LFLCurr = 90
    RBLCurr = 90
    LBLCurr = 90
def lean_left():
    # lean to the left, used for the Dance function
    LFL.angle = 150 + LFLCal
    LBL.angle = 150 + LBLCal
    RFL.angle = 15 + RFLCal
    RBL.angle = 15 + RBLCal
    
def lean_right():
    #lean to the right, used for the dance function
    LFL.angle = 15 + LFLCal
    LBL.angle = 15 + LBLCal
    RFL.angle = 150 + RFLCal
    RBL.angle = 150 + RBLCal
def bow():
    #a little bow, used for the dance
    center_servos()
    time.sleep(0.2)
    LFL.angle = 15 + LFLCal
    RFL.angle = 15 + RFLCal
    time.sleep(0.7)
    LFL.angle = 90 + LFLCal
    RFL.angle = 90 + RFLCal
    
def dance():
    #a cute but jerky dance
    center_servos()
    time.sleep(0.1)
    lean_left()
    time.sleep(0.3)
    lean_right()
    time.sleep(0.3)
    lean_left()
    time.sleep(0.3)
    lean_right()
    time.sleep(0.3)
    lean_left()
    time.sleep(0.3)
    lean_right()
    time.sleep(0.3)
    lean_left()
    time.sleep(0.3)
    lean_right()
    time.sleep(0.8)
    center_servos()
    time.sleep(0.3)
    bow()
    time.sleep(0.1)
    center_servos()
def twerk(): # dont ask
    center_servos()
    RFL.angle = 15 + RBLCal
    LFL.angle = 15 + LBLCal
    RBL.angle = 360 + RBLCal
    LBL.angle = 360 + LBLCal
    time.sleep(0.1)
    RBL.angle = 100 + RBLCal
    LBL.angle = 100 + LBLCal
    time.sleep(0.1)
    RBL.angle = 360 + RBLCal
    LBL.angle = 360 + LBLCal
    time.sleep(0.1)
    RBL.angle = 100 + RBLCal
    LBL.angle = 100 + LBLCal
    time.sleep(0.1)
    RBL.angle = 360 + RBLCal
    LBL.angle = 360 + LBLCal
    time.sleep(0.1)
    RBL.angle = 100 + RBLCal
    LBL.angle = 100 + LBLCal
    time.sleep(0.1)
    RBL.angle = 360 + RBLCal
    LBL.angle = 360 + LBLCal
    time.sleep(0.1)
    RBL.angle = 100 + RBLCal
    LBL.angle = 100 + LBLCal
    time.sleep(0.1)
    RBL.angle = 360 + RBLCal
    LBL.angle = 360 + LBLCal
    time.sleep(0.1)
    RBL.angle = 100 + RBLCal
    LBL.angle = 100 + LBLCal
    time.sleep(0.1)
    RBL.angle = 360 + RBLCal
    LBL.angle = 360 + LBLCal
    time.sleep(0.1)
    RBL.angle = 100 + RBLCal
    LBL.angle = 100 + LBLCal
    time.sleep(0.1)
    RBL.angle = 360 + RBLCal
    LBL.angle = 360 + LBLCal
    time.sleep(0.1)
    RBL.angle = 100 + RBLCal
    LBL.angle = 100 + LBLCal
    time.sleep(0.1)
    RBL.angle = 360 + RBLCal
    LBL.angle = 360 + LBLCal
    time.sleep(0.1)
    RBL.angle = 100 + RBLCal
    LBL.angle = 100 + LBLCal
    time.sleep(0.1)
    RBL.angle = 360 + RBLCal
    LBL.angle = 360 + LBLCal
    time.sleep(0.1)
    RBL.angle = 100 + RBLCal
    LBL.angle = 100 + LBLCal
    time.sleep(0.1)
    RBL.angle = 360 + RBLCal
    LBL.angle = 360 + LBLCal
    time.sleep(0.1)
    RBL.angle = 100 + RBLCal
    LBL.angle = 100 + LBLCal
    time.sleep(0.1)
    RBL.angle = 360 + RBLCal
    LBL.angle = 360 + LBLCal
    time.sleep(0.1)
    RBL.angle = 100 + RBLCal
    LBL.angle = 100 + LBLCal
    time.sleep(0.1)
    center_servos()
#everything below this is for testing, it will change and should be ignored.
center_servos()
time.sleep(5)
while True:
    baseright()