#!/usr/bin/env python3
# -*- 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

# lecture du fichier de données de données brutes

from struct import calcsize, unpack

class ubt_raw_file:
	def __init__(self, _filename):
		"""Function that initiates a ubt_raw_file object which allows to read a raw.udt file chunk by chunk.
		Works only for raw.udt files from webui2 (UB-Lab P).

		Args:
		    _filename (string): file path of raw.udt file

		Returns:
			None
		"""
		self.fd=open(_filename,'rb') # 1er argument : fichier raw
		self.total_size=0

		header = self.fd.read(42).decode("utf-8").split(" ")
		self.version=header[0]
		print("raw header : ", self.version)
		assert (self.version == "UDT005")
		self.board = header[1]
		print("board : ", self.board)
		header = header[2].split("/")
		self.webui2 = header[0]
		print("webui2 : ", self.webui2)
		print("header extension : ", header[1:])

	def __read_file__ (self, _size):
		"""Function that reads a certain sized chunk of the file.

		Args:
		    _size (int): size of chunk to read

		Returns:
			_data (bytes object): read chunk
		"""
		# print "_size in read file %d"%_size
		_data=self.fd.read(_size)
		# print "_data in read file %s"%_data
		if _data == '':
			print("%d byte read in the file"%(self.total_size))
			raise EOFError
		else:
			if _size!=len(_data):
				raise EOFError
			self.total_size+=_size
			#print("total size in read file %d"%self.total_size)
			return _data

	def read_chunk(self) :
		"""Function that reads a certain sized chunk of the file.

		Args:
		    _size (int): size of chunk to read

		Returns:
			flag (int): identification flag for data in the chunk
			size (int): size of the data in the chunk
			data (bytes object): data in the chunk
		"""
		flag = unpack('h', self.__read_file__(calcsize('h')))[0]
		size = unpack('h', self.__read_file__(calcsize('h')))[0]
		# print "flag in read chunk %d"%flag
		# print "size in read chunk %d"%size
		if size:
			data=self.__read_file__(size)
		else :
			print("chunck vide")
			data = ''

		# crc = unpack('h', self.__read_file__(calcsize('h')))[0]
		return flag, size, data

