acoused/Model/udt_extract/raw_extract.py

111 lines
3.7 KiB
Python

# -*- coding: UTF_8 -*-
# @copyright this code is the property of Ubertone.
# You may use this code for your personal, informational, non-commercial purpose.
# You may not distribute, transmit, display, reproduce, publish, license, create derivative works from, transfer or sell any information, software, products or services based on this code.
# @author Stéphane Fischer
import json
from datetime import datetime # pour time count
from Model.udt_extract.ubt_raw_file import ubt_raw_file
from Model.udt_extract.ubt_raw_data import ubt_raw_data
from Model.udt_extract.ubt_raw_flag import *
def raw_extract(_raw_file):
"""
This method will extract data from the raw.udt file and convert it to dicts which are easy to go through and to import in the DB.
Parameters
----------
_raw_file : string
path to .udt file
Returns
-------
device_name : string
time_begin : datetime
time_end : datetime
data_us_dicts : list of dicts
data, us related, with param_us associated
param_us_dicts : list of dicts
param_us for us related data
data_dicts : list of dicts
data not us related, with no param_us associated
"""
fileraw = ubt_raw_file(_raw_file)
profile_id = 0
try:
while 1:
flag, size, data = fileraw.read_chunk()
# Pour raw UDT005 (ie. UB-Lab P, UB-SediFlow, UB-Lab 3C) on peut
# rencontrer 4 flags: const, settings json, configs (HW), profils
if flag == CONST_TAG:
try:
const_dict = json.loads(data.decode("utf-8"))
except:
const_dict = json.loads(
data.decode("utf-8")
.replace("'", '"')
.replace("True", "true")
.replace("False", "false")
)
ubt_data = ubt_raw_data( const_dict )
if flag == SETTINGS_JSON_TAG:
try:
settings_dict = json.loads(data.decode("utf-8"))
except:
settings_dict = json.loads(
data.decode("utf-8")
.replace("'", '"')
.replace("True", "true")
.replace("False", "false")
)
ubt_data.set_config(settings_dict)
if flag == CONFIG_TAG:
# what is needed from here and which is not in param_us_dict is only blind_ca0 and blind_ca1
# note: this is not useful on APF06, but could be used for double check
ubt_data.set_confighw(size, data)
if flag == PROFILE_TAG or flag == PROFILE_INST_TAG:
timestamp = ubt_data.read_line(size, data, flag==PROFILE_INST_TAG)
profile_id += 1
# get the first timestamp of udt file for time_begin definition of the run:
if profile_id == 1:
time_begin = timestamp
except KeyboardInterrupt:
print("read interrupted by user")
except EOFError:
print("End of file")
except:
print("Error")
raise
#print("%d profiles read" % profile_id)
# last timestamp of udt file for time_end definition of run:
# based on the last profile processed
time_end = timestamp
return (
const_dict["product_id"],
time_begin,
time_end,
ubt_data.param_us_dicts,
ubt_data.data_us_dicts,
ubt_data.data_dicts,
settings_dict,
)