#!/usr/bin/env python3

import hal_glib
import hal
import linuxcnc
from gi.repository import GObject

class HandlerClass:
    def __init__(self, halcomp,builder,useropts):
        self.builder = builder
        self.halcomp = halcomp
        self.st = linuxcnc.stat()
        self.jog_increment = self.builder.get_object('jog_increment')
        self.g54inch = self.builder.get_object('g54inch_jog')
        self.g54tenths = self.builder.get_object('g54tenth_jog')
        self.g54hundredths = self.builder.get_object('g54hundedth_jog')
        self.g54thousandths = self.builder.get_object('g54thousandth_jog')
        self.zw_label = self.builder.get_object('zw_label')
        self.example_trigger = hal_glib.GPin(halcomp.newpin('label-trigger', hal.HAL_BIT, hal.HAL_IN))
        self.example_trigger.connect('value-changed', self.on_label_trigger_value_changed)
        
        self.left_clamp = self.builder.get_object('left_clamp')
        self.right_clamp = self.builder.get_object('right_clamp')
        self.left_unclamp = self.builder.get_object('left_unclamp')
        self.right_unclamp = self.builder.get_object('right_unclamp')
        
        self.on_left_clamp = hal_glib.GPin(halcomp.newpin('on-left-clamp', hal.HAL_BIT, hal.HAL_IN))
        self.on_left_clamp.connect('value-changed', self.on_left_clamp_value_changed)
        self.on_right_clamp = hal_glib.GPin(halcomp.newpin('on-right-clamp', hal.HAL_BIT, hal.HAL_IN))
        self.on_right_clamp.connect('value-changed', self.on_right_clamp_value_changed)
        self.on_left_unclamp = hal_glib.GPin(halcomp.newpin('on-left-unclamp', hal.HAL_BIT, hal.HAL_IN))
        self.on_left_unclamp.connect('value-changed', self.on_left_unclamp_value_changed)
        self.on_right_unclamp = hal_glib.GPin(halcomp.newpin('on-right-unclamp', hal.HAL_BIT, hal.HAL_IN))
        self.on_right_unclamp.connect('value-changed', self.on_right_unclamp_value_changed)
        
        # called every 100 ms
        GObject.timeout_add(100, self.periodic_check)
        self.last = 1
        self.convert = { 1:"G54(Front)", 2:"G55(Rear)", 3:"56", 4:"57", 5:"58", 6:"59", 7:"59.1", 8:"59.2", 9:"59.3"}

    def on_label_trigger_value_changed(self, pin):
        state = pin.get()
        if state:
            self.zw_label.set_markup('<span foreground="blue">ZZ</span>')
        else:
            self.zw_label.set_markup('<span foreground="black">ZW</span>')

    def activ_inc(self, widget):
        if widget.get_active():
            if widget == self.g54inch: self.jog_increment.set_text('1.000')
            elif widget == self.g54tenths: self.jog_increment.set_text('0.100')
            elif widget == self.g54hundredths:  self.jog_increment.set_text('0.010')
            elif widget == self.g54thousandths: self.jog_increment.set_text('0.001')

    def on_left_clamp_value_changed(self, pin):
        state = pin.get()
        if state:
            self.left_clamp.set_active(True)
    def on_right_clamp_value_changed(self, pin):
        state = pin.get()
        if state:
            self.right_clamp.set_active(True)
    def on_left_unclamp_value_changed(self, pin):
        state = pin.get()
        if state:
            self.left_unclamp.set_active(True)
    def on_right_unclamp_value_changed(self, pin):
        state = pin.get()
        if state:
            self.right_unclamp.set_active(True)
            
    def periodic_check(self):
        self.st.poll()
        current =  self.st.g5x_index
        if current != self.last:
            text = self.convert[int(current)]
            # update label
            self.builder.get_object('work_coord_label').set_text(text)
        self.last = current
        return True

# This is boiler code, required for gladevcp
def get_handlers(halcomp,builder,useropts):
    return [HandlerClass(halcomp,builder,useropts)]
