#!/usr/bin/python -u
import saturn, re, commands, time, sys, anydbm, thread, threading, datetime, string
from sys import argv
# e-Event )
global e
#const
DB_FILE = 'tag.db'
TIMEOUT_ = 30
# default depart time is 5 sec
DEPARTTIME = 3000
DIO_PIN = "1"
DIO_LO = "0"
DIO_HI = "1"
#
# callback for dio events
#
def evt_rec(data):
evt_type = type_event(data)
if evt_type == "event.tag.arrive":
tag_arrive(data)
if evt_type == "event.tag.report":
tag_report(data)
if evt_type == "event.tag.depart":
tag_depart(data)
def tag_arrive(data):
print "event.tag.arrive"
tagid = parse_data(data, "tag_id=", 26)
if tagid != 'NULL':
print "TagID: %s " % tagid
else:
print "No tag id found: %s " %data
if len(taglist) > 0:
for id in taglist:
if tagid == id:
cd = checkdate()
if cd == 'false':
e.clear()
rc = cmd.sendcommand('dio.in.4')
#ПЕРЕДЕЛАЙ, если подается сигнал на вход не открывать ворота
#т.е. вот так rc[1] != 1:
if rc[1] == "1":
print "gate will be open"
rc = cmd.sendcommand('dio.out.'+DIO_PIN+'='+DIO_HI)
if rc[0] != "ok":
print "setup error for dio.out: %s " % rc[0]
rc = cmd.sendcommand('dio.out.'+DIO_PIN+'='+DIO_LO)
if rc[0] != "ok":
print "setup error for dio.out: %s " % rc[0]
break
else:
break
else:
print "not found key in db"
else:
print "base is empty"
#
def tag_report(data):
tagid = parse_data(data, "tag_id=", 26)
if len(taglist) > 0:
for id in taglist:
if tagid == id:
print "event.tag.report"
e.clear()
def tag_depart(data):
tagid = parse_data(data, "tag_id=", 26)
if len(taglist) > 0:
for id in taglist:
if tagid == id:
print "event.tag.depart"
e.set()
def dio_evt(data):
try:
print "dio out"
except:
print "dio out error"
def parse_data(data, field_name, field_size):
rdata = "NULL"
field_index=data.find(field_name)
if field_index != -1:
field_index += len(field_name)
rdata=data[field_index:field_index+field_size]
return rdata
def type_event(data):
rdata = "NULL"
i=0
s=""
while data[i] != ' ':
s=s+data[i]
i=i+1
if s != '':
rdata=s
return rdata
def timeout(n):
t = time.time()
print "start timeout"
while (time.time() - t < n):
if e.isSet() == False:
t = (time.time())+1
time.sleep(1)
print "timeout completed"
thread.start_new_thread(timeout,(n,))
# if function return TRUE then not open gate :)
def checkdate():
datefile = 'day.cfg'
timefile = 'time.cfg'
rdata = 'false'
today = datetime.date.today()
day = today.strftime("%A")
try:
f = open(datefile,'r')
f.seek(0)
s = 'test'
while not (s==''):
s = f.readline()
s = string.strip(s)
if day == s:
rdata = 'true'
break
f.close()
except:
print "Can't open " + dayfile
try:
f = open(timefile,'r')
f.seek(0)
morning = f.readline() # first string in timefile
evening = f.readline() # second string in timefile
f.close()
now = datetime.datetime.now()
now = now.strftime("%H:%M:%S")
if (morning <> '') and (evening <> ''):
if (morning > now) or (evening < now):
rdata = 'true'
else:
print "Check file " + timefile
except:
print "Can't open " + timefile
return rdata
#
#
# default for timeout
#
try:
timeout_ = argv[1]
except:
timeout_ = TIMEOUT_
try:
departtime = argv[2]
except:
departtime = DEPARTTIME
e = threading.Event()
e.clear()
# starting timeout
thread.start_new_thread(timeout,(20,))
#
# setup the command and event session
#
cmd = saturn.Command('localhost',50007)
evt = saturn.Event('localhost',50008)
temp_str = 'tag.reporting.depart_time = '+str(departtime)
print temp_str
rc = cmd.sendcommand(temp_str)
if rc[0] == "ok":
print "tag.reporting.depart_time is %s msec" % (departtime)
else:
print "err in tag.reporting.depart_time"
evtarr = evt.getid()
evtrep = evt.getid()
evtdep = evt.getid()
print "Event arrive = ",evtarr
print "Event report = ",evtrep
print "Event depart = ",evtdep
#
# make sure the dio output pin is off
#
rc = cmd.sendcommand('dio.out.'+DIO_PIN+'='+DIO_LO)
if rc[0] != "ok":
print "setup error for dio.out: %s " % rc[0]
try:
db = anydbm.open(DB_FILE)
print "base open"
except:
db = anydbm.open(DB_FILE,'c')
print "created new base"
taglist = db.keys()
print "tags in base: "
print taglist
#
# register for tag arrive events
#
rc = cmd.sendcommand('reader.register_event(id='+evtarr+',name=event.tag.arrive)')
if rc[0] == "ok":
print "register event tag.arrive succesfull"
else:
print "error register event tag.arrive"
rc = cmd.sendcommand('reader.register_event(id='+evtrep+',name=event.tag.report)')
if rc[0] == "ok":
print "register event tag.report succesfull"
else:
print "error register event tag.report"
rc = cmd.sendcommand('reader.register_event(id='+evtdep+',name=event.tag.depart)')
if rc[0] == "ok":
print "register event tag.depart succesfull"
else:
print "error register event tag.depart"
evt.receive(evt_rec)
#
#change the operating mode
#
evt.close()
cmd.close()