Наработки за 5 лет

This commit is contained in:
2019-08-27 14:47:10 +05:00
commit f5582d88c3
56 changed files with 11117 additions and 0 deletions

368
HXgui/HX.py Executable file
View File

@@ -0,0 +1,368 @@
# -*- coding: utf-8 -*-
########################################
# HXbot utility module #
# EoF 2016 EoF@itphx.ru #
########################################
# I2C bus
I2C_BUS_NUMBER = 1
EXT_COM = 0xAA
XOR_SEQ = 0xFF
# VAR
REFLEX_ADDRESS = 0x04
REFLEX_RESPONSE_DELAY = 0.1 # Delay to get response after send command, sec
REFLEX_ERROR_LIMIT = 5
REFLEX_MOVE_TIMEOUT = 60
# COMMANDS
# Util
COM_PING = 0x01
COM_GET_TEMP = 0x02
COM_GET_DISTANCE = 0x03
# Stop
STOP = 0x0F
# Move
MOVE_FLAG = 0x04
MOVE_FLOAT = 0x10
MOVE_FWD1 = 0x11
MOVE_FWD2 = 0x12
MOVE_FWD3 = 0x13
MOVE_FWD4 = 0x14
MOVE_FWD5 = 0x15
MOVE_FWD6 = 0x16
MOVE_FWD7 = 0x17
MOVE_BREAK = 0x18
MOVE_REV7 = 0x19
MOVE_REV6 = 0x1A
MOVE_REV5 = 0x1B
MOVE_REV4 = 0x1C
MOVE_REV3 = 0x1D
MOVE_REV2 = 0x1E
MOVE_REV1 = 0x1F
# Steering
STEER_FLAG = 0x05
STEER_CENTER = 0x20
STEER_LEFT1 = 0x21
STEER_LEFT2 = 0x22
STEER_LEFT3 = 0x23
STEER_LEFT4 = 0x24
STEER_LEFT5 = 0x25
STEER_LEFT6 = 0x26
STEER_LEFT7 = 0x27
STEER_FIX_CENTER = 0x28
STEER_RIGHT7 = 0x29
STEER_RIGHT6 = 0x2A
STEER_RIGHT5 = 0x2B
STEER_RIGHT4 = 0x2C
STEER_RIGHT3 = 0x2D
STEER_RIGHT2 = 0x2E
STEER_RIGHT1 = 0x2F
# Head
HEAD_H_FLAG = 0x30
HEAD_V_FLAG = 0x31
HEAD_H_R_RANGE = 83
HEAD_H_L_RANGE = 94
HEAD_V_UP_RANGE = 90
HEAD_V_DOWN_RANGE = 25
HEAD_H_CENTER = 83
HEAD_V_CENTER = 150
# CONTROL SOURCE
CONTROL_SRC_NONE = 0x00
CONTROL_SRC_JOYSTICK = 0x01
CONTROL_SRC_IRREMOTE = 0x02
CONTROL_SRC_SERVER = 0x03
CONTROL_SRC_DB = 0x04
CONTROL_SRC_SUB1 = 0x11
CONTROL_SRC_SUB2 = 0x12
CONTROL_SRC_SUB3 = 0x13
CONTROL_SRC_SUB4 = 0x14
CONTROL_SRC_SUB5 = 0x15
CONTROL_SRC_DEFAULT = CONTROL_SRC_JOYSTICK
# MOVE STATES
MOVE_STATE_STOP = 0x00
MOVE_STATE_MOVE = 0x01
# STATUS
STATUS_INIT = 0x00
STATUS_READY = 0x01
STATUS_RUNNING = 0x02
STATUS_STOP = 0x03
STATUS_EXIT = 0x04
# STATUS STATES
#STATUS_STATE_OK = 0x00
#STATUS_STATE_WARNING = 0x01
#STATUS_STATE_ERROR = 0x02
#STATUS_STATE_LOWBAT1 = 0x03
#STATUS_STATE_LOWBAT2 = 0x04
# JOYSTICK
JOYSTICK_PATH = '/dev/input/js0'
JOYSTICK_READY_TIMEOUT = 60
# These constants were borrowed from linux/input.h
JOYSTICK_AXIS_NAMES = {
0x00: 'x',
0x01: 'y',
0x02: 'z',
0x03: 'rx',
0x04: 'ry',
0x05: 'rz',
0x06: 'trottle',
0x07: 'rudder',
0x08: 'wheel',
0x09: 'gas',
0x0a: 'brake',
0x10: 'hat0x',
0x11: 'hat0y',
0x12: 'hat1x',
0x13: 'hat1y',
0x14: 'hat2x',
0x15: 'hat2y',
0x16: 'hat3x',
0x17: 'hat3y',
0x18: 'pressure',
0x19: 'distance',
0x1a: 'tilt_x',
0x1b: 'tilt_y',
0x1c: 'tool_width',
0x20: 'volume',
0x28: 'misc',
}
JOYSTICK_BUTTON_NAMES = {
0x120: 'trigger',
0x121: 'thumb',
0x122: 'thumb2',
0x123: 'top',
0x124: 'top2',
0x125: 'pinkie',
0x126: 'base',
0x127: 'base2',
0x128: 'base3',
0x129: 'base4',
0x12a: 'base5',
0x12b: 'base6',
0x12f: 'dead',
0x130: 'a',
0x131: 'b',
0x132: 'c',
0x133: 'x',
0x134: 'y',
0x135: 'z',
0x136: 'tl',
0x137: 'tr',
0x138: 'tl2',
0x139: 'tr2',
0x13a: 'select',
0x13b: 'start',
0x13c: 'mode',
0x13d: 'thumbl',
0x13e: 'thumbr',
0x220: 'dpad_up',
0x221: 'dpad_down',
0x222: 'dpad_left',
0x223: 'dpad_right',
# XBox 360 controller uses these codes.
0x2c0: 'dpad_left',
0x2c1: 'dpad_right',
0x2c2: 'dpad_up',
0x2c3: 'dpad_down',
}
# JOYSTICK BINDS
JOYSTICK_MOVE_AXIS = 'y'
JOYSTICK_STEER_AXIS = 'x'
JOYSTICK_HEAD_V_AXIS = 'rz'
JOYSTICK_HEAD_H_AXIS = 'z'
JOYSTICK_START_BTN_1 = 'tl2'
JOYSTICK_START_BTN_2 = 'tr2'
# HXpower
POWER_ADDRESS = 0x05
POWER_RESPONSE_DELAY = 0.05 # Delay to get response after send command, sec
POWER_DELAY = 0.3
POWER_ERROR_LIMIT = 3
POWER_PF_TIMEOUT = 60
# Commands
# VOLTMETERS
COM_GET_VIN = 0x01
COM_GET_VDC = 0x02
COM_GET_VBT = 0x03
COM_GET_VBA = 0x04
COM_GET_VIS = 0x05
COM_GET_VZU = 0x06
COM_GET_VCC = 0x07
# AMPERMETERS
COM_GET_AHX = 0x21
COM_GET_ABA = 0x22
COM_GET_AIN = 0x23
COM_GET_ADC = 0x24
# STATUS
COM_GET_STAT1 = 0x08
# 0x01 - vcc_ok
# 0x02 - vin_ok
# 0x04 - vdc_ok
# 0x08 - vbt_ok
# 0x10 - vba_ok
# 0x20 - lr_enabled
# 0x40 - ba_enabled
# 0x80 - ba_blocked
COM_GET_STAT2 = 0x09
# 0x01 - bl_powered
# 0x02 - bl_error
# 0x04 - pf_complete
# 0x08 - pf_charge
# 0x10 - vis_ok
# 0x20 - vzu_ok
# 0x40 - pf_enabled
# 0x80 - bl_enabled
COM_GET_STAT3 = 0x20
# 0x01 - ahx_ok
# 0x02 - aba_ok
# 0x04 - ain_ok
# 0x08 - adc_ok
# TEMP
COM_GET_POWER_TEMP = 0x10
VIN_MIN = 10.0
VIN_MAX = 14.0
VIN_LOW = 11.0
VIN_HIGH = 13.0
VDC_MIN = 5.0
VDC_MAX = 5.7
VDC_LOW = 5.1
VDC_HIGH = 5.5
VBT_MIN = 3.65
VBT_MAX = 4.25
VBT_LOW = 3.68
VBT_FULL = 4.1
VBA_MIN = 9.0
VBA_MAX = 12.8
VBA_LOW = 10.0
VBA_FULL = 12.4
VIS_MIN = 4.5
VIS_MAX = 5.3
VIS_LOW = 4.7
VIS_HIGH = 5.2
VZU_MIN = 5.0
VZU_MAX = 6.3
VZU_LOW = 5.2
VZU_HIGH = 6.2
VCC_MIN = 4.5
VCC_MAX = 5.3
VCC_LOW = 4.7
VCC_HIGH = 5.1
AHX_MIN = 0.3
AHX_MAX = 2.0
AHX_LOW = 0.4
AHX_HIGH = 1.2
ABA_MIN = 0.05
ABA_MAX = 2.0
ABA_LOW = 0.5
ABA_HIGH = 1.5
AIN_MIN = 0.05
AIN_MAX = 2.0
AIN_LOW = 0.1
AIN_HIGH = 1.5
ADC_MIN = 0.05
ADC_MAX = 3.0
ADC_LOW = 0.1
ADC_HIGH = 1.5
# RELAYS
COM_POWER_ON_BL = 0x11 # 17
COM_POWER_ON_PF = 0x12 # 18
COM_SWITCH_TO_IS = 0x13 # 19
COM_SWITCH_TO_IN = 0x14 # 20
COM_SHUTDOWN_BL = 0x15 # 21
COM_SHUTDOWN_PF = 0x16 # 22
COM_SWITCH_TO_LR = 0x17 # 23
COM_SWITCH_TO_BA = 0x18 # 24
COM_ENABLE_PF = 0x1B # 27
COM_DISABLE_PF = 0x1C # 28
COM_ENABLE_BL = 0x1D # 29
COM_DISABLE_BL = 0x1E # 30
# HXserver
SRV_PORT = 50306
SRV_HOST = ''
SRV_CMD_GET_ALL = 0x01
SRV_TIMEOUT = 1
SRV_MAX_ERR_COUNT = 3
# RETURN CODES
# Universal return codes
OK_RSP = 0x00
NO_RSP = 0xFF
ERR_RSP = 0x01
BLK_RSP = 0x02
CSE_RSP = 0x03
IOE_RSP = 0x04
TMO_RSP = 0x05
# HXbot modul flags
I2C_BUS_ERR = 0x0001
HXPOWER_ERR = 0x0002
REFLEX_ERR = 0x0004
SERVER_ERR = 0x0008
JOYSTICK_WRN = 0x0010
HXCAMERA_WRN = 0x0020
HXLCD_WRN = 0x0040
HXDB_WRN = 0x0080
HXLIGHT_WRN = 0x0100
HXSOUND_WRN = 0x0200
HXLOG_WRN = 0x0400
# HXlcd
LCD_ADDRESS = 0x06
LCD_ERROR_LIMIT = 5
LCD_DELAY = 1
LCD_RESPONSE_DELAY = 0.05
# HXcam
CAM_MAX_WRN_COUNT = 3
CAM_DELAY = 1.0
CAM_STATE_STP = 0
CAM_STATE_RUN = 1
CAM_STATE_WRN = 2
CAM_STATE_ERR = 3
# HXdb
DB_DELAY = 1.0
DB_HOST = 'localhost'
DB_NAME = 'hxdb'
DB_USER = 'hxdb'
DB_PASS = 'hxdbP@S$'

BIN
HXgui/HX.pyc Normal file

Binary file not shown.

724
HXgui/HXgui.py Executable file
View File

@@ -0,0 +1,724 @@
#!/usr/bin/python3
# -*- coding: utf-8 -*-
########################################
# HXbot GUI #
# EoF 2016 EoF@itphx.ru #
########################################
import socket
import sys
import struct
import curses
import time
import HX
import select
from curses import wrapper
class HXguiClass():
def __init__(self, stdscr):
super(HXguiClass, self).__init__()
# UDP Socket
self.s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
self.s.settimeout(HX.SRV_TIMEOUT)
# Init color pairs
self.RED_ON_BLACK = 1
self.GREEN_ON_BLACK = 2
self.YELLOW_ON_BLACK = 3
self.BLUE_ON_BLACK = 4
self.BLACK_ON_RED = 5
curses.init_pair(self.RED_ON_BLACK, curses.COLOR_RED,
curses.COLOR_BLACK)
curses.init_pair(self.GREEN_ON_BLACK, curses.COLOR_GREEN,
curses.COLOR_BLACK)
curses.init_pair(self.YELLOW_ON_BLACK, curses.COLOR_YELLOW,
curses.COLOR_BLACK)
curses.init_pair(self.BLUE_ON_BLACK, curses.COLOR_BLUE,
curses.COLOR_BLACK)
curses.init_pair(self.BLACK_ON_RED, curses.COLOR_BLACK,
curses.COLOR_RED)
# Params
self.power_online = False
self.vcc = 0.0
self.vin = 0.0
self.vdc = 0.0
self.vbt = 0.0
self.vba = 0.0
self.vpf = 0.0
self.vzu = 0.0
self.abt = 0.0
self.aba = 0.0
self.ain = 0.0
self.ahx = 0.0
self.vcc_ok = False
self.vcc_low = False
self.vcc_high = False
self.vin_ok = False
self.vin_low = False
self.vin_high = False
self.vdc_ok = False
self.vdc_low = False
self.vdc_high = False
self.vbt_ok = False
self.vbt_low = False
self.vbt_full = False
self.vba_ok = False
self.vba_low = False
self.vba_full = False
self.vpf_ok = False
self.vpf_low = False
self.vpf_high = False
self.vzu_ok = False
self.vzu_low = False
self.vzu_high = False
self.abt_ok = False
self.abt_low = False
self.abt_high = False
self.aba_ok = False
self.aba_low = False
self.aba_high = False
self.ain_ok = False
self.ain_low = False
self.ain_high = False
self.adc_ok = False
self.adc_low = False
self.adc_high = False
self.bt_enabled = False
self.ba_enabled = False
self.mv_enabled = False
self.us_enabled = False
self.in_plugged = False
self.bt_blocked = False
self.ba_blocked = False
self.bt_full = False
self.ba_full = False
self.reflex_online = False
self.joystick_online = False
self.lcd_online = False
self.main_cam_state = 0
self.rear_cam_state = 0
self.main_mic_state = 0
self.error_count = 0
self.connected = False
# Init screen
stdscr.clear()
stdscr.refresh()
def draw_interface(self):
self.header_text = "-= HXbot console v0.4 =-"
self.footer_text = "-= EoF 2016 =-"
self.header = curses.newwin(1, curses.COLS, 0, 0)
self.header.bkgd(' ', curses.A_REVERSE)
self.header.addstr(0, (curses.COLS - len(self.header_text)) // 2,
self.header_text, curses.A_REVERSE)
self.footer = curses.newwin(1, curses.COLS, curses.LINES - 1, 0)
self.footer.bkgd(' ', curses.A_REVERSE)
self.footer.addstr(0, (curses.COLS - len(self.footer_text)) // 2,
self.footer_text, curses.A_REVERSE)
self.comline = curses.newwin(1, curses.COLS, curses.LINES - 2, 0)
self.comline.bkgd(' ', curses.A_NORMAL)
self.comline.addstr(0, 0, "COMMAND: ", curses.A_BOLD)
self.mainwin = curses.newwin(curses.LINES - 3, curses.COLS, 1, 0)
self.mainwin.border()
# Draw tables
self.mainwin.addstr(2, 3, "| Vcc | Vin | Vdc | Vbt | Vba " +
"| Vpf | Vzu |", curses.A_REVERSE)
self.mainwin.addstr(3, 3, "| | | | | " +
"| | |", curses.A_NORMAL)
self.mainwin.addstr(4, 3, "| | | | | " +
"| | |", curses.A_NORMAL)
self.mainwin.addstr(6, 3, "| Abt || Aba || Ain || Ahx |",
curses.A_REVERSE)
self.mainwin.addstr(7, 3, "| || || || |",
curses.A_NORMAL)
self.mainwin.addstr(8, 3, "| || || || |",
curses.A_NORMAL)
self.mainwin.addstr(10, 3, "| MAIN POWER || MOVE POWER |",
curses.A_REVERSE)
self.mainwin.addstr(11, 3, "| || |",
curses.A_NORMAL)
self.mainwin.addstr(12, 3, "| || |",
curses.A_NORMAL)
#self.mainwin.addstr(11, 41, "| OK |",
#curses.A_REVERSE)
#self.mainwin.addstr(12, 41, "| |",
#curses.A_NORMAL)
self.mainwin.addstr(2, 55, "| STATUS |",
curses.A_REVERSE)
self.mainwin.addstr(3, 55, "| |",
curses.A_NORMAL)
self.mainwin.addstr(4, 55, "| |",
curses.A_NORMAL)
self.mainwin.addstr(5, 55, "| |",
curses.A_NORMAL)
self.mainwin.addstr(6, 55, "| |",
curses.A_NORMAL)
self.mainwin.addstr(7, 55, "| |",
curses.A_NORMAL)
self.mainwin.addstr(8, 55, "| |",
curses.A_NORMAL)
self.mainwin.addstr(9, 55, "| |",
curses.A_NORMAL)
self.mainwin.addstr(6, 41, "| BT & BA |",
curses.A_REVERSE)
self.mainwin.addstr(7, 41, "| |",
curses.A_NORMAL)
self.mainwin.addstr(8, 41, "| |",
curses.A_NORMAL)
self.mainwin.addstr(9, 41, "| |",
curses.A_NORMAL)
self.mainwin.addstr(10, 41, "| |",
curses.A_NORMAL)
self.mainwin.addstr(11, 41, "| |",
curses.A_NORMAL)
# Add text windows
# Voltage states
self.vcc_st_win = curses.newwin(1, 5, 4, 5)
self.vin_st_win = curses.newwin(1, 5, 4, 12)
self.vdc_st_win = curses.newwin(1, 5, 4, 19)
self.vbt_st_win = curses.newwin(1, 5, 4, 26)
self.vba_st_win = curses.newwin(1, 5, 4, 33)
self.vpf_st_win = curses.newwin(1, 5, 4, 40)
self.vzu_st_win = curses.newwin(1, 5, 4, 47)
# Voltage values
self.vcc_win = curses.newwin(1, 5, 5, 5)
self.vin_win = curses.newwin(1, 5, 5, 12)
self.vdc_win = curses.newwin(1, 5, 5, 19)
self.vbt_win = curses.newwin(1, 5, 5, 26)
self.vba_win = curses.newwin(1, 5, 5, 33)
self.vpf_win = curses.newwin(1, 5, 5, 40)
self.vzu_win = curses.newwin(1, 5, 5, 47)
# Current states
self.abt_st_win = curses.newwin(1, 6, 8, 5)
self.aba_st_win = curses.newwin(1, 6, 8, 14)
self.ain_st_win = curses.newwin(1, 6, 8, 23)
self.ahx_st_win = curses.newwin(1, 6, 8, 32)
# Current values
self.abt_win = curses.newwin(1, 6, 9, 5)
self.aba_win = curses.newwin(1, 6, 9, 14)
self.ain_win = curses.newwin(1, 6, 9, 23)
self.ahx_win = curses.newwin(1, 6, 9, 32)
# Status
self.bt_st_win = curses.newwin(1, 14, 12, 5)
self.ba_st_win = curses.newwin(1, 14, 13, 5)
self.mv_st_win = curses.newwin(1, 14, 12, 23)
self.us_st_win = curses.newwin(1, 14, 13, 23)
# Online Status
self.pw_online_win = curses.newwin(1, 19, 4, 57)
self.rf_online_win = curses.newwin(1, 19, 5, 57)
self.js_online_win = curses.newwin(1, 19, 6, 57)
self.lc_online_win = curses.newwin(1, 19, 7, 57)
self.mc_online_win = curses.newwin(1, 19, 8, 57)
self.rc_online_win = curses.newwin(1, 19, 9, 57)
self.mm_online_win = curses.newwin(1, 19, 10, 57)
# BL & BA status
self.bt_blocked_win = curses.newwin(1, 9, 8, 43)
self.ba_blocked_win = curses.newwin(1, 9, 9, 43)
self.in_status_win = curses.newwin(1, 9, 10, 43)
self.bt_status_win = curses.newwin(1, 9, 11, 43)
self.ba_status_win = curses.newwin(1, 9, 12, 43)
# Error pad
clr = curses.color_pair(self.RED_ON_BLACK)
self.error_pad = curses.newpad(3, 20)
self.error_pad.border()
self.error_pad.addstr(1, 2, "Connection lost!", clr)
self.header.refresh()
self.footer.refresh()
self.mainwin.refresh()
def draw_data(self):
# Set voltage states
if self.vcc_ok:
tst = " OK "
clr = curses.color_pair(self.GREEN_ON_BLACK)
if self.vcc_low:
tst = "LOW "
clr = curses.color_pair(self.YELLOW_ON_BLACK)
elif self.vcc_high:
tst = "HIGH"
clr = curses.color_pair(self.YELLOW_ON_BLACK)
else:
tst = "FAIL"
clr = curses.color_pair(self.RED_ON_BLACK)
self.vcc_st_win.addstr(0, 0, tst, clr)
self.vcc_st_win.refresh()
if self.vin_ok:
tst = " OK "
clr = curses.color_pair(self.GREEN_ON_BLACK)
if self.vin_low:
tst = "LOW "
clr = curses.color_pair(self.YELLOW_ON_BLACK)
elif self.vin_high:
tst = "HIGH"
clr = curses.color_pair(self.YELLOW_ON_BLACK)
else:
tst = "FAIL"
clr = curses.color_pair(self.RED_ON_BLACK)
self.vin_st_win.addstr(0, 0, tst, clr)
self.vin_st_win.refresh()
if self.vdc_ok:
tst = " OK "
clr = curses.color_pair(self.GREEN_ON_BLACK)
if self.vdc_low:
tst = "LOW "
clr = curses.color_pair(self.YELLOW_ON_BLACK)
elif self.vdc_high:
tst = "HIGH"
clr = curses.color_pair(self.YELLOW_ON_BLACK)
else:
tst = "FAIL"
clr = curses.color_pair(self.RED_ON_BLACK)
self.vdc_st_win.addstr(0, 0, tst, clr)
self.vdc_st_win.refresh()
if self.vbt_ok:
tst = " OK "
clr = curses.color_pair(self.GREEN_ON_BLACK)
if self.vbt_low:
tst = "LOW "
clr = curses.color_pair(self.YELLOW_ON_BLACK)
elif self.vbt_full:
tst = "FULL"
clr = curses.color_pair(self.GREEN_ON_BLACK)
else:
tst = "FAIL"
clr = curses.color_pair(self.RED_ON_BLACK)
self.vbt_st_win.addstr(0, 0, tst, clr)
self.vbt_st_win.refresh()
if self.mv_enabled:
if self.vpf_ok:
tst = " OK "
clr = curses.color_pair(self.GREEN_ON_BLACK)
if self.vpf_low:
tst = "LOW "
clr = curses.color_pair(self.YELLOW_ON_BLACK)
elif self.vpf_high:
tst = "HIGH"
clr = curses.color_pair(self.GREEN_ON_BLACK)
else:
tst = "FAIL"
clr = curses.color_pair(self.RED_ON_BLACK)
else:
tst = "OFF "
clr = curses.color_pair(self.BLUE_ON_BLACK)
self.vpf_st_win.addstr(0, 0, tst, clr)
self.vpf_st_win.refresh()
if self.vba_ok:
tst = " OK "
clr = curses.color_pair(self.GREEN_ON_BLACK)
if self.vba_low:
tst = "LOW "
clr = curses.color_pair(self.YELLOW_ON_BLACK)
elif self.vba_full:
tst = "FULL"
clr = curses.color_pair(self.GREEN_ON_BLACK)
else:
tst = "FAIL"
clr = curses.color_pair(self.RED_ON_BLACK)
self.vba_st_win.addstr(0, 0, tst, clr)
self.vba_st_win.refresh()
if self.mv_enabled:
if self.vzu_ok:
tst = " OK "
clr = curses.color_pair(self.GREEN_ON_BLACK)
if self.vzu_low:
tst = "LOW "
clr = curses.color_pair(self.YELLOW_ON_BLACK)
elif self.vzu_high:
tst = "HIGH"
clr = curses.color_pair(self.GREEN_ON_BLACK)
else:
tst = "FAIL"
clr = curses.color_pair(self.RED_ON_BLACK)
else:
tst = "OFF "
clr = curses.color_pair(self.BLUE_ON_BLACK)
self.vzu_st_win.addstr(0, 0, tst, clr)
self.vzu_st_win.refresh()
if self.abt_ok:
tst = " OK "
clr = curses.color_pair(self.GREEN_ON_BLACK)
if self.abt_low:
tst = "LOW "
clr = curses.color_pair(self.YELLOW_ON_BLACK)
elif self.abt_high:
tst = "HIGH"
clr = curses.color_pair(self.YELLOW_ON_BLACK)
else:
tst = "FAIL"
clr = curses.color_pair(self.RED_ON_BLACK)
self.abt_st_win.addstr(0, 0, tst, clr)
self.abt_st_win.refresh()
if self.aba_ok:
tst = " OK "
clr = curses.color_pair(self.GREEN_ON_BLACK)
if self.aba_low:
tst = "LOW "
clr = curses.color_pair(self.YELLOW_ON_BLACK)
elif self.aba_high:
tst = "HIGH"
clr = curses.color_pair(self.YELLOW_ON_BLACK)
else:
tst = "FAIL"
clr = curses.color_pair(self.RED_ON_BLACK)
self.aba_st_win.addstr(0, 0, tst, clr)
self.aba_st_win.refresh()
if self.ain_ok:
tst = " OK "
clr = curses.color_pair(self.GREEN_ON_BLACK)
if self.ain_low:
tst = "LOW "
clr = curses.color_pair(self.YELLOW_ON_BLACK)
elif self.ain_high:
tst = "HIGH"
clr = curses.color_pair(self.YELLOW_ON_BLACK)
else:
tst = "FAIL"
clr = curses.color_pair(self.RED_ON_BLACK)
self.ain_st_win.addstr(0, 0, tst, clr)
self.ain_st_win.refresh()
if self.ahx_ok:
tst = " OK "
clr = curses.color_pair(self.GREEN_ON_BLACK)
if self.ahx_low:
tst = "LOW "
clr = curses.color_pair(self.YELLOW_ON_BLACK)
elif self.ahx_high:
tst = "HIGH"
clr = curses.color_pair(self.YELLOW_ON_BLACK)
else:
tst = "FAIL"
clr = curses.color_pair(self.RED_ON_BLACK)
self.ahx_st_win.addstr(0, 0, tst, clr)
self.ahx_st_win.refresh()
# Set voltage values
try:
self.vcc_win.addstr(0, 0, '{:1.2f}'.format(self.vcc),
curses.A_NORMAL)
self.vcc_win.refresh()
self.vin_win.addstr(0, 0, '{:2.1f}'.format(self.vin),
curses.A_NORMAL)
self.vin_win.refresh()
self.vdc_win.addstr(0, 0, '{:1.2f}'.format(self.vdc),
curses.A_NORMAL)
self.vdc_win.refresh()
self.vbt_win.addstr(0, 0, '{:1.2f}'.format(self.vbt),
curses.A_NORMAL)
self.vbt_win.refresh()
self.vba_win.addstr(0, 0, '{:2.1f}'.format(self.vba),
curses.A_NORMAL)
self.vba_win.refresh()
self.vpf_win.addstr(0, 0, '{:1.2f}'.format(self.vpf),
curses.A_NORMAL)
self.vpf_win.refresh()
self.vzu_win.addstr(0, 0, '{:1.2f}'.format(self.vzu),
curses.A_NORMAL)
self.vzu_win.refresh()
self.abt_win.addstr(0, 0, '{:2.2f}'.format(self.abt),
curses.A_NORMAL)
self.abt_win.refresh()
self.aba_win.addstr(0, 0, '{:2.2f}'.format(self.aba),
curses.A_NORMAL)
self.aba_win.refresh()
self.ain_win.addstr(0, 0, '{:2.2f}'.format(self.ain),
curses.A_NORMAL)
self.ain_win.refresh()
self.ahx_win.addstr(0, 0, '{:2.2f}'.format(self.ahx),
curses.A_NORMAL)
self.ahx_win.refresh()
except curses.error:
#comline.addstr(0, 0, str(vba), curses.A_NORMAL)
#comline.refresh()
pass
# Set status
if self.bt_enabled:
tst = "BT Enabled "
clr = curses.color_pair(self.GREEN_ON_BLACK)
else:
tst = "BT Disabled"
clr = curses.color_pair(self.YELLOW_ON_BLACK)
self.bt_st_win.addstr(0, 0, tst, clr)
self.bt_st_win.refresh()
if self.ba_enabled:
tst = "BA Enabled "
clr = curses.color_pair(self.GREEN_ON_BLACK)
else:
tst = "BA Disabled"
clr = curses.color_pair(self.YELLOW_ON_BLACK)
self.ba_st_win.addstr(0, 0, tst, clr)
self.ba_st_win.refresh()
if self.mv_enabled:
tst = "MV Enabled "
clr = curses.color_pair(self.GREEN_ON_BLACK)
else:
tst = "MV Disabled"
clr = curses.color_pair(self.RED_ON_BLACK)
self.mv_st_win.addstr(0, 0, tst, clr)
self.mv_st_win.refresh()
if self.us_enabled:
tst = "US Enabled "
clr = curses.color_pair(self.GREEN_ON_BLACK)
else:
tst = "US Disabled"
clr = curses.color_pair(self.RED_ON_BLACK)
self.us_st_win.addstr(0, 0, tst, clr)
self.us_st_win.refresh()
# Set online status
tst = "HXpower"
if self.power_online:
clr = curses.color_pair(self.GREEN_ON_BLACK)
else:
clr = curses.color_pair(self.RED_ON_BLACK)
self.pw_online_win.addstr(0, 0, tst, clr)
self.pw_online_win.refresh()
tst = "REflex"
if self.reflex_online:
clr = curses.color_pair(self.GREEN_ON_BLACK)
else:
clr = curses.color_pair(self.RED_ON_BLACK)
self.rf_online_win.addstr(0, 0, tst, clr)
self.rf_online_win.refresh()
tst = "Joystick"
if self.joystick_online:
clr = curses.color_pair(self.GREEN_ON_BLACK)
else:
clr = curses.color_pair(self.BLUE_ON_BLACK)
self.js_online_win.addstr(0, 0, tst, clr)
self.js_online_win.refresh()
tst = "Display"
if self.lcd_online:
clr = curses.color_pair(self.GREEN_ON_BLACK)
else:
clr = curses.color_pair(self.BLUE_ON_BLACK)
self.lc_online_win.addstr(0, 0, tst, clr)
self.lc_online_win.refresh()
tst = "Main camera"
if self.main_cam_state == HX.CAM_STATE_RUN:
clr = curses.color_pair(self.GREEN_ON_BLACK)
elif self.main_cam_state == HX.CAM_STATE_STP:
clr = curses.color_pair(self.BLUE_ON_BLACK)
elif self.main_cam_state == HX.CAM_STATE_WRN:
clr = curses.color_pair(self.YELLOW_ON_BLACK)
else:
clr = curses.color_pair(self.RED_ON_BLACK)
self.mc_online_win.addstr(0, 0, tst, clr)
self.mc_online_win.refresh()
tst = "Rear camera"
if self.rear_cam_state == HX.CAM_STATE_RUN:
clr = curses.color_pair(self.GREEN_ON_BLACK)
elif self.rear_cam_state == HX.CAM_STATE_STP:
clr = curses.color_pair(self.BLUE_ON_BLACK)
elif self.rear_cam_state == HX.CAM_STATE_WRN:
clr = curses.color_pair(self.YELLOW_ON_BLACK)
else:
clr = curses.color_pair(self.RED_ON_BLACK)
self.rc_online_win.addstr(0, 0, tst, clr)
self.rc_online_win.refresh()
tst = "Main mic"
if self.main_mic_state == HX.CAM_STATE_RUN:
clr = curses.color_pair(self.GREEN_ON_BLACK)
elif self.main_mic_state == HX.CAM_STATE_STP:
clr = curses.color_pair(self.BLUE_ON_BLACK)
elif self.main_mic_state == HX.CAM_STATE_WRN:
clr = curses.color_pair(self.YELLOW_ON_BLACK)
else:
clr = curses.color_pair(self.RED_ON_BLACK)
self.mm_online_win.addstr(0, 0, tst, clr)
self.mm_online_win.refresh()
# Set EX & BA status
tst = "BT block"
if self.bt_blocked:
clr = curses.color_pair(self.GREEN_ON_BLACK)
else:
clr = curses.color_pair(self.BLUE_ON_BLACK)
self.bt_blocked_win.addstr(0, 0, tst, clr)
self.bt_blocked_win.refresh()
tst = "BA block"
if self.ba_blocked:
clr = curses.color_pair(self.GREEN_ON_BLACK)
else:
clr = curses.color_pair(self.BLUE_ON_BLACK)
self.ba_blocked_win.addstr(0, 0, tst, clr)
self.ba_blocked_win.refresh()
tst = "IN plugg"
if self.in_plugged:
clr = curses.color_pair(self.GREEN_ON_BLACK)
else:
clr = curses.color_pair(self.BLUE_ON_BLACK)
self.in_status_win.addstr(0, 0, tst, clr)
self.in_status_win.refresh()
#if self.bt_charge:
#tst = "BT chrg"
#clr = curses.color_pair(self.YELLOW_ON_BLACK)
if self.bt_full:
tst = "BT full"
clr = curses.color_pair(self.GREEN_ON_BLACK)
else:
tst = "BT chrg"
clr = curses.color_pair(self.BLUE_ON_BLACK)
self.bt_status_win.addstr(0, 0, tst, clr)
self.bt_status_win.refresh()
#if self.ba_charge:
#tst = "BA chrg"
#clr = curses.color_pair(self.YELLOW_ON_BLACK)
if self.ba_full:
tst = "BA full"
clr = curses.color_pair(self.GREEN_ON_BLACK)
else:
tst = "BA chrg"
clr = curses.color_pair(self.BLUE_ON_BLACK)
self.ba_status_win.addstr(0, 0, tst, clr)
self.ba_status_win.refresh()
def get_data(self):
# Get values
HOST, PORT = "localhost", HX.SRV_PORT
self.s.sendto(struct.pack('B', HX.SRV_CMD_GET_ALL), (HOST, PORT))
try:
data = self.s.recv(1024)
except socket.timeout:
if self.error_count < HX.SRV_MAX_ERR_COUNT:
self.error_count += 1
else:
self.connected = False
return
self.error_count = 0
self.connected = True
self.vcc, self.vin, self.vdc, self.vbt, self.vba, self.vpf, self.vzu, \
self.abt, self.aba, self.ain, self.ahx, \
self.power_online, \
self.vcc_ok, self.vin_ok, self.vdc_ok, self.vbt_ok, self.vba_ok, \
self.vpf_ok, self.vzu_ok, \
self.abt_ok, self.aba_ok, self.ain_ok, self.ahx_ok, \
self.bt_enabled, self.ba_enabled, self.bt_blocked, self.ba_blocked, \
self.vcc_low, self.vcc_high, self.vin_low, self.vin_high, \
self.vdc_low, self.vdc_high, self.vbt_low, self.vbt_full, \
self.vba_low, self.vba_full, self.vpf_low, self.vpf_high, \
self.vzu_low, self.vzu_high, \
self.abt_low, self.abt_high, self.aba_low, self.aba_high, \
self.ain_low, self.ain_high, self.ahx_low, self.ahx_high, \
self.mv_enabled, self.us_enabled, self.in_plugged, \
self.ba_full, self.bt_full, self.reflex_online, \
self.joystick_online, self.lcd_online, \
self.main_cam_state, self.rear_cam_state, self.main_mic_state = \
struct.unpack(
'fffffffffff??????????????????????????????????????????????BBB',
data)
def execute(self):
self.draw_interface()
redrawed = False
while True:
# Get values
self.get_data()
self.draw_data()
if not self.connected:
self.error_pad.refresh(0, 0, 10, 30, 13, 50)
redrawed = False
else:
if not redrawed:
self.mainwin.redrawwin()
self.mainwin.refresh()
redrawed = True
self.comline.refresh()
if sys.stdin in select.select([sys.stdin], [], [], 0)[0]:
key = self.comline.getkey()
if key.upper() == 'Q':
break
time.sleep(0.2)
def main(stdscr):
HXgui = HXguiClass(stdscr)
HXgui.execute()
sys.exit()
# GENERAL PROGRAM
if __name__ == "__main__":
# Setup
stdscr = curses.initscr()
curses.start_color()
curses.noecho()
curses.cbreak()
stdscr.keypad(True)
# Start main function
wrapper(main)
# Cleanup
curses.nocbreak()
stdscr.keypad(False)
curses.echo()
curses.endwin()

Binary file not shown.

Binary file not shown.

7
HXgui/hxgui.nja Executable file
View File

@@ -0,0 +1,7 @@
{
"venv": "",
"project-type": "Import from sources",
"name": "HXgui",
"license": "GNU General Public License v3",
"description": "HXbot GUI"
}