import time
import threading
import DobotDllType as dType

class Candybot:
    def __init__(self):
        CON_STR = {
            dType.DobotConnect.DobotConnect_NoError:  "DobotConnect_NoError",
            dType.DobotConnect.DobotConnect_NotFound: "DobotConnect_NotFound",
            dType.DobotConnect.DobotConnect_Occupied: "DobotConnect_Occupied"}

        #Load Dll
        self.api = dType.load()

        #Connect Dobot
        state = dType.ConnectDobot(self.api, "", 115200)[0]
        print("Connect status:",CON_STR[state])

        if (state == dType.DobotConnect.DobotConnect_NoError):

            #Clean Command Queued
            dType.SetQueuedCmdClear(self.api)

            #Async Motion Params Setting
            dType.SetHOMEParams(self.api, 250, 0, 50, 0, isQueued = 1)
            dType.SetJOGJointParams(self.api, 200, 200, 200, 200, 200, 200, 200, 200, isQueued = 1)
            dType.SetJOGCommonParams(self.api, 100, 100, isQueued = 1)

            #linear rail
            dType.SetDeviceWithL(self.api, 1)
            dType.SetJOGLParams(self.api,  200, 200, isQueued=0)

            #Async Home
            dType.SetHOMECmd(self.api, temp = 0, isQueued = 1)

    def disconnect(self):
        #Disconnect Dobot
        dType.DisconnectDobot(self.api)

    def base(self, direction):
        if direction == 1:
            dType.SetJOGCmd(self.api,1,1)
    
        elif direction == -1:
            dType.SetJOGCmd(self.api,1,2)

        else :
            return
        threading.Timer(0.1,self.stop).start()
        #dType.SetWAITCmd(self.api, 1, isQueued=0)
        #dType.SetJOGCmd(self.api, 1, 0)

    def rearArm(self, direction):
        if direction == 1:
            dType.SetJOGCmd(self.api,1,3)
    
        elif direction == -1:
            dType.SetJOGCmd(self.api,1,4)

        else :
            return
        #dType.SetWAITCmd(self.api, 1, isQueued=0)
        #dType.SetJOGCmd(self.api, 1, 0)
        threading.Timer(0.1,self.stop).start()

    def forearm(self, direction):
        if direction == 1:
            dType.SetJOGCmd(self.api,1,5)
    
        elif direction == -1:
            dType.SetJOGCmd(self.api,1,6)

        else :
            return
        #dType.SetWAITCmd(self.api, 1, isQueued=0)
        #dType.SetJOGCmd(self.api, 1, 0)
        threading.Timer(0.1,self.stop).start()

    def gripperRotation(self, direction):
        if direction == 1:
            dType.SetJOGCmd(self.api,1,7)
    
        elif direction == -1:
            dType.SetJOGCmd(self.api,1,8)

        else :
            return
        #dType.SetWAITCmd(self.api, 1, isQueued=0)
        #dType.SetJOGCmd(self.api, 1, 0)
        threading.Timer(0.1,self.stop).start()

    def linear(self, direction):
        if direction == 1:
            dType.SetJOGCmd(self.api,1,9)
    
        elif direction == -1:
            dType.SetJOGCmd(self.api,1,10)

        else :
            return
        #dType.SetWAITCmd(self.api, 1, isQueued=0)
        #dType.SetJOGCmd(self.api, 1, 0)
        threading.Timer(0.1,self.stop).start()

    def gripp(self):
        dType.SetEndEffectorGripper(self.api, 1,  1, isQueued=0)
    
    def letgo(self):
        dType.SetEndEffectorGripper(self.api, 1,  0, isQueued=0)

    def stop(self):
        dType.SetJOGCmd(self.api, 1, 0)

    def stopcmp(self):
        dType.SetEndEffectorGripper(self.api, 0,  0, isQueued=0)

    def panic(self):
        dType.SetQueuedCmdForceStopExec(self.api)