
import sys
import importlib
from qtvcp.core import Path, Qhal, Action
PATH = Path()
QHAL = Qhal()
ACTION = Action()

# get reference to original handler file so we can subclass it
sys.path.insert(0, PATH.SCREENDIR)
module = "{}.{}_handler".format(PATH.BASEPATH,PATH.BASEPATH)
mod = importlib.import_module(module, PATH.SCREENDIR)
sys.path.remove(PATH.SCREENDIR)
HandlerClass = mod.HandlerClass

# return our subclassed handler object
def get_handlers(halcomp, widgets, paths):
    return [UserHandlerClass(halcomp, widgets, paths)]

class UserHandlerClass(HandlerClass):
    print('Custom subclassed handler loaded\n')

    def init_pins(self):
        super().init_pins()
        self.FEED_RATE_ENABLE = 0
        self.SPINDLE_RATE_ENABLE = 0
        self.ANGULAR_JOG_RATE_ENABLE = 0
        self.JOG_RATE_ENABLE = 0
        self.RAPID_RATE_ENABLE = 0
        # generate the pins to connect analog inputs for sliders
        pin = QHAL.newpin("feed.feed-override.analog-enable", QHAL.HAL_BIT, QHAL.HAL_IN)
        pin.value_changed.connect(lambda s: self._on_analog_enable_changed(s,"FEED_RATE"))
        pin = QHAL.newpin("spindle.spindle-override.analog-enable", QHAL.HAL_BIT, QHAL.HAL_IN)
        pin.value_changed.connect(lambda s: self._on_analog_enable_changed(s,"SPINDLE_RATE"))
        pin = QHAL.newpin("jog.jog-velocity.analog-enable", QHAL.HAL_BIT, QHAL.HAL_IN)
        pin.value_changed.connect(lambda s: self._on_analog_enable_changed(s,"JOG_RATE"))
        pin = QHAL.newpin("jog.angular-jog-velocity.analog-enable", QHAL.HAL_BIT, QHAL.HAL_IN)
        pin.value_changed.connect(lambda s: self._on_analog_enable_changed(s,"ANGULAR_JOG_RATE"))

        pin = QHAL.newpin("rapid.rapid-override.analog-enable", QHAL.HAL_BIT, QHAL.HAL_IN)
        pin.value_changed.connect(lambda s: self._on_analog_enable_changed(s,"RAPID_RATE"))

        pin = QHAL.newpin("feed.feed-override.direct-value", QHAL.HAL_FLOAT, QHAL.HAL_IN)
        pin.value_changed.connect(lambda s: self._on_analog_value_changed(s,"FEED_RATE"))
        pin = QHAL.newpin("spindle.spindle-override.direct-value", QHAL.HAL_FLOAT, QHAL.HAL_IN)
        pin.value_changed.connect(lambda s: self._on_analog_value_changed(s,"SPINDLE_RATE"))
        pin = QHAL.newpin("jog.jog-velocity.direct-value", QHAL.HAL_FLOAT, QHAL.HAL_IN)
        pin.value_changed.connect(lambda s: self._on_analog_value_changed(s,"JOG_RATE"))
        pin = QHAL.newpin("jog.angular-jog-velocity.direct-value", QHAL.HAL_FLOAT, QHAL.HAL_IN)
        pin.value_changed.connect(lambda s: self._on_analog_value_changed(s,"ANGULAR_JOG_RATE"))

        pin = QHAL.newpin("rapid.rapid-override.direct-value", QHAL.HAL_FLOAT, QHAL.HAL_IN)
        pin.value_changed.connect(lambda s: self._on_analog_value_changed(s,"RAPID_RATE"))

        # make a pin to set turtle jog vel
        pin = QHAL.newpin("jog.turtle-jog", QHAL.HAL_BIT, QHAL.HAL_IN)
        pin.value_changed.connect(lambda s: self.toogle_jog_range(s))


    def toogle_jog_range(self, state):
        self.w.btn_jog_l_slow.setChecked(not state)
        self.w.btn_jog_l_slow.clicked.emit(not state)
        self.w.btn_jog_a_slow.setChecked(not state)
        self.w.btn_jog_a_slow.clicked.emit(not state)

    def _on_analog_enable_changed(self, state, command):
        self['{}_ENABLE'.format(command)] = state

    def _on_analog_value_changed(self, value, command):
        #print(value,command,self['{}_ENABLE'.format(command)])
        if self['{}_ENABLE'.format(command)]:
            if command == 'JOG_RATE':
                self.w.slider_jog_linear.setValue(self.w.slider_jog_linear.maximum()*value)
            elif command == 'ANGULAR_JOG_RATE':
                self.w.slider_jog_angular.setValue(self.w.slider_jog_angular.maximum()*value)
            elif command == "FEED_RATE":
                self.w.slider_feed_ovr.setValue(self.w.slider_jog_linear.maximum()*value)
            elif command == "SPINDLE_RATE":
                self.w.slider_spindle_ovr.setValue(self.w.slider_jog_linear.maximum()*value)
            elif command == "RAPID_RATE":
                self.w.slider_rapid_ovr.setValue(self.w.slider_jog_linear.maximum()*value)
            else:
                ACTION['SET_{}'.format(command)](value*100)


