Compare commits

..

2 Commits

Author SHA1 Message Date
72580bb5b2 La til card punch constructor fra seriel packet 2022-04-07 21:00:37 +02:00
6df94a2f0d Bedre variabelnavn 2022-04-07 20:59:58 +02:00
4 changed files with 80 additions and 27 deletions

View File

@ -23,13 +23,13 @@ class MtrLogFormatter:
'"%s"' % datetime_extracted.strftime('%d.%m.%y %H:%M:%S.000')) '"%s"' % datetime_extracted.strftime('%d.%m.%y %H:%M:%S.000'))
log_line.append( log_line.append(
'"%02d.%02d.%02d %02d:%02d:%02d.%03d"' % ( '"%02d.%02d.%02d %02d:%02d:%02d.%03d"' % (
msg.timestamp_day(), msg.day(),
msg.timestamp_month(), msg.month(),
msg.timestamp_year(), msg.year(),
msg.timestamp_hours(), msg.hours(),
msg.timestamp_minutes(), msg.minutes(),
msg.timestamp_seconds(), msg.seconds(),
msg.timestamp_milliseconds())) msg.milliseconds()))
log_line.append('%06d' % msg.card_id()) log_line.append('%06d' % msg.card_id())
log_line.append('%04d' % 0) # skipped product week log_line.append('%04d' % 0) # skipped product week
log_line.append('%04d' % 0) # skipped product year log_line.append('%04d' % 0) # skipped product year

View File

@ -170,25 +170,25 @@ class MtrStatusMessage:
def mtr_id(self): def mtr_id(self):
return int.from_bytes(self.message_bytes[6:8], 'little') return int.from_bytes(self.message_bytes[6:8], 'little')
def timestamp_year(self): def year(self):
return int.from_bytes(self.message_bytes[8:9], 'little') return int.from_bytes(self.message_bytes[8:9], 'little')
def timestamp_month(self): def month(self):
return int.from_bytes(self.message_bytes[9:10], 'little') return int.from_bytes(self.message_bytes[9:10], 'little')
def timestamp_day(self): def day(self):
return int.from_bytes(self.message_bytes[10:11], 'little') return int.from_bytes(self.message_bytes[10:11], 'little')
def timestamp_hours(self): def hours(self):
return int.from_bytes(self.message_bytes[11:12], 'little') return int.from_bytes(self.message_bytes[11:12], 'little')
def timestamp_minutes(self): def minutes(self):
return int.from_bytes(self.message_bytes[12:13], 'little') return int.from_bytes(self.message_bytes[12:13], 'little')
def timestamp_seconds(self): def seconds(self):
return int.from_bytes(self.message_bytes[13:14], 'little') return int.from_bytes(self.message_bytes[13:14], 'little')
def timestamp_milliseconds(self): def milliseconds(self):
return int.from_bytes(self.message_bytes[14:16], 'little') return int.from_bytes(self.message_bytes[14:16], 'little')
def battery_status(self): def battery_status(self):
@ -214,25 +214,25 @@ class MtrDataMessage:
def mtr_id(self): def mtr_id(self):
return int.from_bytes(self.message_bytes[6:8], 'little') return int.from_bytes(self.message_bytes[6:8], 'little')
def timestamp_year(self): def year(self):
return int.from_bytes(self.message_bytes[8:9], 'little') return int.from_bytes(self.message_bytes[8:9], 'little')
def timestamp_month(self): def month(self):
return int.from_bytes(self.message_bytes[9:10], 'little') return int.from_bytes(self.message_bytes[9:10], 'little')
def timestamp_day(self): def day(self):
return int.from_bytes(self.message_bytes[10:11], 'little') return int.from_bytes(self.message_bytes[10:11], 'little')
def timestamp_hours(self): def hours(self):
return int.from_bytes(self.message_bytes[11:12], 'little') return int.from_bytes(self.message_bytes[11:12], 'little')
def timestamp_minutes(self): def minutes(self):
return int.from_bytes(self.message_bytes[12:13], 'little') return int.from_bytes(self.message_bytes[12:13], 'little')
def timestamp_seconds(self): def seconds(self):
return int.from_bytes(self.message_bytes[13:14], 'little') return int.from_bytes(self.message_bytes[13:14], 'little')
def timestamp_milliseconds(self): def milliseconds(self):
return int.from_bytes(self.message_bytes[14:16], 'little') return int.from_bytes(self.message_bytes[14:16], 'little')
def packet_num(self): def packet_num(self):

View File

@ -239,6 +239,40 @@ class card_punch:
def __repr__(self): def __repr__(self):
return f'card({self.card}) controls({self.controls}) splits({self.splits})' return f'card({self.card}) controls({self.controls}) splits({self.splits})'
def from_mtr_bytes(datamsg):
card = int.from_bytes(datamsg[20:23], 'little')
#Extract codes and splits:
controls = []
splits = []
splits_offset = 26
code_numbytes = 1
time_numbytes = 2
split_numbytes = code_numbytes + time_numbytes
for split_index in range(50):
code_offset = splits_offset + split_index * split_numbytes
time_offset = code_offset + code_numbytes
code = int.from_bytes(datamsg[code_offset:code_offset+code_numbytes], 'little')
time = int.from_bytes(datamsg[time_offset:time_offset+time_numbytes], 'little')
if code != 0:
controls.append(code)
splits.append(time)
# Extract start time:
year = int.from_bytes(datamsg[8:9], 'little')
month = int.from_bytes(datamsg[9:10], 'little')
day = int.from_bytes(datamsg[10:11], 'little')
hours = int.from_bytes(datamsg[11:12], 'little')
minutes = int.from_bytes(datamsg[12:13], 'little')
seconds = int.from_bytes(datamsg[13:14], 'little')
milliseconds = int.from_bytes(datamsg[14:16], 'little')
read_time = datetime.datetime(year, month, day, hours, minutes, seconds, milliseconds)
start_time = read_time - datetime.timedelta(seconds = splits[-1])
finish_time = read_time - datetime.timedelta(seconds = splits[-2])
return(card_punch(card, controls, splits, start_time, finish_time))
def list_from_mtr_f(mtr_f): def list_from_mtr_f(mtr_f):
csvreader = csv.reader(open(mtr_f)) csvreader = csv.reader(open(mtr_f))

View File

@ -3,17 +3,36 @@ import mtrreader
from rich import inspect from rich import inspect
import mtrlog import mtrlog
from datetime import datetime from datetime import datetime
import binascii
import otime
mtr = serial.Serial(port='/dev/ttyUSB0', baudrate=9600, timeout=40) mtr = serial.Serial(port='/dev/ttyUSB0', baudrate=9600, timeout=40)
def main(): def main():
data = mtr.read_until(expected='FFFFFFFFFF', size=230) pree = mtr.read_until(expected=b'\xFF\xFF\xFF\xFF')
size = mtr.read(size=1)
if size == b'\xe6':
meat = mtr.read(229)
print('START') print('START')
msg = mtrreader.MtrDataMessage(data)
full = b'\xFF\xFF\xFF\xFF' + size + meat
print(binascii.hexlify(full))
msg = mtrreader.MtrDataMessage(full)
f = mtrlog.MtrLogFormatter f = mtrlog.MtrLogFormatter
print(f.format(f, msg, datetime.now())) #print(f.format(f, msg, datetime.now()))
#card_r_from_mtr_bytes(full)
inspect(otime.card_punch.from_mtr_bytes(full))
print('END') print('END')
elif size == b'\x37':
meat = mtr.read(55)
status = mtrreader.MtrStatusMessage(meat)
inspect(status)
print(status.year(),status.month(),status.day(),status.hours(),status.minutes())
main() main()
def send_status_command(mtr):
mtr.write(b'/ST')
if __name__ == '__main__': if __name__ == '__main__':
#send_status_command(mtr)
main() main()