You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

196 lines
7.1 KiB

import SocketServer
import sys
class IncomingPacketHandler(SocketServer.BaseRequestHandler):
def handle(self):
self.data = self.request.recv(6).strip()
handler_keyboard_cmd(self.data)
if __name__ == "__main__":
#TODO
#1. get serial port parameter from command line arguements
#2. print usage with examples before Enter your input
#3. add debug mode
#initialize global vars
sys_up = False
run = True
valid_cmd = False
int_ser_data = [0,0,0,0,0,0,0,0,0,0,0,0,0]
hex_ser_data = [0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0]
#functions defined here
def write_serial(ser, out_ser_pkt):
#function writes 13 bytes to serial port
# ser.write(out_ser_pkt)
import time
time.sleep(5 / 1000000.0)
for i in range(0, 13):
ser.write(chr(out_ser_pkt[i]))
# ser.write(out_ser_pkt[i])
# print "wrote i=%i out_ser_pkt=%i" % (i,out_ser_pkt[i])
# time.sleep(5)
#serial port packet handler
def handler_serial_pkt():
global sys_up
global int_ser_data
global out_ser_pkt
global valid_cmd
#print "in hsp int_ser_data[4]= %i", (int_ser_data[4])
#print "in hsp valid_cmd= %i", (valid_cmd)
#do the needful for sys up
if sys_up == False and int_ser_data[4] == 01:
out_ser_pkt=[0x7e,0x7e,0xff,0xfa,0x0,0x01,0x01,0x0,0x61,0x0,0x0,0xff,0x7e]
write_serial(ser,out_ser_pkt)
sys_up = True
print "sent packet sys up"
else:
#the basic switch which was used in c is here
#print "looping back"
if int_ser_data[4] == 01:
#send device cmd & data to panel
if valid_cmd == True:
out_ser_pkt=[0x7e,0x7e,0xff,0xfa,0x0,0x01,dev_cmd,0x01,0xAA,panel_dev,dev_no,0xff,0x7e]
print "prepared out_ser_pkt "
write_serial(ser,out_ser_pkt)
print "sent packet out_ser_pkt "
#if device cmd & data ack from panel
elif int_ser_data[4] == 0x5a:
valid_cmd = False
print "Done device cmd"
elif int_ser_data[4] == 0x55:
valid_cmd = False
print "FATAL ERROR!!! Received NAK from panel"
#no data for panel send keep alive
else:
out_ser_pkt=[0x7e,0x7e,0xff,0xfa,0x0,0x01,0x0,0x01,0xAA,0x52,0x01,0xff,0x7e]
write_serial(ser,out_ser_pkt)
#keyboard command handler
def handler_keyboard_cmd(kbd_cmd):
# global kdb_cmd
global dev
global str_dev_no
global dev_no
global dev_cmd
global str_dev_cmd
global valid_cmd
global panel_dev
print kbd_cmd
#if lenght of keyboard cmd equals 6, parse keyboard input
if kbd_cmd[0] == 'r' or kbd_cmd[0] == 'R'or kbd_cmd[0] == 'd' or kbd_cmd[0] == 'D':
import string
dev=string.upper(kbd_cmd[0])
print "dev=%s" % (dev)
str_dev_no=kbd_cmd[1] + kbd_cmd[2]
print "str_dev_no=%s" %str_dev_no
if str_dev_no =='01':
dev_no=1
elif str_dev_no =='02':
dev_no=2
elif str_dev_no =='03':
dev_no=3
elif str_dev_no =='04':
dev_no=4
elif str_dev_no =='05':
dev_no=5
elif str_dev_no =='06':
dev_no=6
elif str_dev_no =='07':
dev_no=7
elif str_dev_no =='08':
dev_no=8
elif str_dev_no =='09':
dev_no=9
elif str_dev_no =='10':
#print "debug in 10"
dev_no=0xa
elif str_dev_no =='11':
#print "debug in 11"
dev_no=0xb
elif str_dev_no =='12':
#print "debug in 12"
dev_no=0xc
elif str_dev_no =='13':
#print "debug in 13"
dev_no=0xd
elif str_dev_no =='14':
#print "debug in 14"
dev_no=0xe
elif str_dev_no =='15':
#print "debug in 15"
dev_no=0xf
elif str_dev_no =='16':
#print "debug in 16"
dev_no=0x10
else:
dev_no=0
#print "invalid device no"
if dev_no >= 1 and dev_no <= 0x10:
print "--- valid device no.---"
str_dev_cmd = kbd_cmd[4] + kbd_cmd[5]
dev_cmd=int(str_dev_cmd, 16)
print "str_dev_cmd=%s" % (str_dev_cmd)
print "dev_cmd= %x " %(dev_cmd)
if dev == 'R':
if dev_cmd == 00 or dev_cmd == 01:
valid_cmd = True
panel_dev=0x52
#print "valid_cmd = %s" % (valid_cmd)
else:
valid_cmd = False
print "for relay valid_cmd = %s" % (valid_cmd)
else:
if dev_cmd >= 0x0 and dev_cmd <= 0xff:
valid_cmd = True
panel_dev=0x44
dev_no=dev_no-1
#print "for dac valid_cmd = %s" % (valid_cmd)
else:
valid_cmd = False
print "valid_cmd = %s" % (valid_cmd)
else:
print "Invlaid device"
else:
print "Invalid Command"
#---- main program here
#init serial port
import serial
ser = serial.Serial('/dev/ttyS0', 115200,timeout=20)#init serial port TODO serial port params should be command line arguements
sys_up=False;
print "Connecting to Panel. Please wait..."
while run:
ser_data = ser.read(13)#read 1 packet of 13bytes from panel
for i in range(0, 13):
int_ser_data[i]=ord(ser_data[i])#convert packet received from char to integer
# print "i = %i int_ser_data = %i" % (i,int_ser_data[i])
#validate packet byte 1, byte 2, byte 13 =126 viz 0x7e
if int_ser_data[0] == 126 and int_ser_data[1] == 126 and int_ser_data[12] == 126:
#print "b4 hsp int_ser_data[4]= %i", (int_ser_data[4])
handler_serial_pkt()
# else:
# print "imporper packet"
if valid_cmd == False:
HOST, PORT = "127.0.0.1", 4321
server = SocketServer.TCPServer((HOST, PORT), IncomingPacketHandler)
server.serve_forever()
# l=len(kbd_cmd)
# print "kbd_cmd=%s l=%i " % (kbd_cmd,l)
# if l==6:
# handler_keyboard_cmd(kbd_cmd)
# else:
# print "Invalid Input"