#!/usr/bin/python
# -*- coding: utf-8 -*-
import time
import hal
import Tkinter as tk
import tkMessageBox
import os
import serial

ser = serial.Serial('/dev/arduino', 9600, timeout=3)

h = hal.component("dist")
h.newpin("auto-feed-override.onoff", hal.HAL_BIT, hal.HAL_IN)
h.newpin("feed-override-max", hal.HAL_FLOAT, hal.HAL_IN)
h.newpin("program.is-idle", hal.HAL_BIT, hal.HAL_IN)
h.newpin("program.is-paused", hal.HAL_BIT, hal.HAL_IN)
h.newpin("program.pause", hal.HAL_BIT, hal.HAL_OUT)

h.newpin("setting-frequency", hal.HAL_S32, hal.HAL_IN)
h.newpin("running-frequency", hal.HAL_S32, hal.HAL_IN)
h.newpin("machine.is-on", hal.HAL_BIT, hal.HAL_IN)

h.newpin("feed-override.counts", hal.HAL_S32, hal.HAL_OUT)
h.newpin("feed-override.value", hal.HAL_FLOAT, hal.HAL_IN)


h.newpin("tenzo", hal.HAL_FLOAT, hal.HAL_IN)
h.newpin("current", hal.HAL_FLOAT, hal.HAL_IN)
h.newpin("motion-feed-inhibit", hal.HAL_BIT, hal.HAL_OUT)
h.newpin("porog", hal.HAL_FLOAT, hal.HAL_IN)
h.newpin("fixtok", hal.HAL_FLOAT, hal.HAL_OUT)
h.newpin("porogview", hal.HAL_FLOAT, hal.HAL_OUT)
h.newpin("temp", hal.HAL_FLOAT, hal.HAL_OUT)

h.newpin("spindle-button", hal.HAL_BIT, hal.HAL_IN)
h.newpin("nasos-button", hal.HAL_BIT, hal.HAL_IN)
h.newpin("nasos+spindle", hal.HAL_BIT, hal.HAL_IN)
h.newpin("spindle-on", hal.HAL_BIT, hal.HAL_IN)
h.newpin("nasos-pin-02", hal.HAL_BIT, hal.HAL_OUT)

h.newpin("led", hal.HAL_BIT, hal.HAL_OUT)
h.newpin("reset-estop", hal.HAL_BIT, hal.HAL_IN)
h.newpin("enable-estop", hal.HAL_BIT, hal.HAL_OUT)
h.newpin("estop-pin14", hal.HAL_BIT, hal.HAL_OUT)

h.ready()

def warningdriver1():
    root = tk.Tk()
    root.withdraw()
    tkMessageBox.showerror("АВАРИЯ!!!", "Авария драйвера по оси X")
    root.destroy()
    h['estop-pin14'] = 1
    time.sleep(0.3)
    h['estop-pin14'] = 0

def warningdriver2():
    root = tk.Tk()
    root.withdraw()
    tkMessageBox.showerror("АВАРИЯ!!!", "Авария драйвера по оси Y")
    root.destroy()
    h['estop-pin14'] = 1
    time.sleep(0.3)
    h['estop-pin14'] = 0

def warningdriver3():
    root = tk.Tk()
    root.withdraw()
    tkMessageBox.showerror("АВАРИЯ!!!", "Авария драйвера по оси Z")
    root.destroy()
    h['estop-pin14'] = 1
    time.sleep(0.3)
    h['estop-pin14'] = 0

time.sleep(2)
counts = 100
value = 100
tok = 0
fixtok = 0
uslovie = 0
forerror = 0
tenzo = 0
dr1 = 0
dr2 = 0
dr3 = 0
tmp = 0
Flag = True
sa = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
h["enable-estop"] = 1

try:
    while 1:
        s = ser.readline()
        try:
            sa = map(float, s.split(','))
        except ValueError:
            pass
        if len(sa) == 6:
            forerror, tenzo, dr1, dr2, dr3, tmp = sa
        h['tenzo'] = tenzo
        h['temp'] = tmp
        tok = h['current']
        porog = h['porog']
        freq = h['setting-frequency']
        run = h['running-frequency']
        maxporog = h["feed-override-max"]
        time.sleep(0.1)

        if h['nasos-button']:
            h['nasos-pin-02'] = 1
        else:
            h['nasos-pin-02'] = 0

        if h['machine.is-on']:
            rabporog = fixtok + porog
            rabporogup = rabporog + 0.21
            h['porogview'] = rabporog

            if not h['program.is-idle']:

                if (h['nasos+spindle'] and h['spindle-on']):
                    h['nasos-pin-02'] = 1
                elif not h['nasos-button']:
                    h['nasos-pin-02'] = 0

                if h['spindle-button']:
                    h['program.pause'] = 1
                else:
                    h['program.pause'] = 0

                if run == freq:
                    h['motion-feed-inhibit'] = 0
                    if (run != 0 and uslovie == 1):
                        fixtok = tok
                        h['fixtok'] = fixtok
                        time.sleep(0.1)
                        uslovie = 0
                else:
                    h['motion-feed-inhibit'] = 1
                if (fixtok > tok or fixtok < 1 and run != 0 and not h['spindle-button'] and not h['program.is-paused']):
                    fixtok = tok
                    h['fixtok'] = fixtok
            else:
                fixtok = 0
                h['fixtok'] = fixtok
                uslovie = 1

            if h['auto-feed-override.onoff']:
                value = h['feed-override.value']*101
                if tok > rabporogup:
                    if value > 0.1:
                        counts -= 10
                        h['feed-override.counts'] = int(counts)
                        time.sleep(0.15)
                elif value < maxporog:
                    counts += 2
                    h['feed-override.counts'] = int(counts)
                    time.sleep(0.15)

        if (dr1 == 1 and Flag == True):
            h["led"] = 1
            h["enable-estop"] = 0
            Flag = False
            warningdriver1()

        if (dr2 == 1 and Flag == True):
            h["led"] = 1
            h["enable-estop"] = 0
            Flag = False
            warningdriver2()

        if (dr3 == 1 and Flag == True):
            h["led"] = 1
            h["enable-estop"] = 0
            Flag = False
            warningdriver3()

        if h['reset-estop']:
            h["led"] = 0
            h["enable-estop"] = 1
            Flag = True

except KeyboardInterrupt:
    raise SystemExit