#!/usr/bin/env 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 os
import json
import logging
logging.basicConfig(level=logging.DEBUG)

## Adresses et commandes de l'APF04

# numéro de commande d'inaction (tourne en boucle en attendant une commande) 
CMD_NULL = 0 
# numéro de commande pour l'arrêt de l'action en cours 
CMD_STOP = 1 
# numéro de commande mode bloquant 
CMD_PROFILE_BLOCKING = 3 
# numéro de commande mode non bloquant 
CMD_PROFILE_NON_BLOCKING = 4 
# numéro de commande mesure avec remontée des IQ 
CMD_PROFILE_IQ = 6 
# numéro de commande démarrage du mode auto 
CMD_START_AUTO = 2 
# numéro de commande verification de la configuration courante 
CMD_CHECK_CONFIG = 5 
# numéro de commande de réinitialisation du settings
CMD_INIT_SETTINGS = 7
# mesure de niveau 
CMD_MEAS_LEVEL = 20 
# numéro de commande pour un test de LED 
CMD_TEST_LED = 190 
# numéro de commande pour une mesure de température + pitch + roll 
CMD_TEST_I2C = 195 

# ces 5 adresses sont considérées comme fixes et qui ne changeront jamais.
ADDR_ACTION = 0xFFFD

ADDR_VERSION_C    = 0x0000 # nécessaire pour pouvoir justement déterminer le dict des autres adresses
ADDR_VERSION_VHDL = 0xFFFE
ADDR_MODEL_YEAR   = 0x0001
ADDR_SERIAL_NUM   = 0x0002

def get_addr_dict(version_c, addr_json=None):
    """
    Gets the addresses in RAM given the firmware version.

    Args:
        version_c: two digits number version
        addr_json: possible to give directly a json file

    Returns:
        Dictionnary with the addresses names as keys and addresses in hexa as values.
    """

    version_c = int(version_c)

    if addr_json:
        with open(addr_json) as json_file:
            addr_dict = json.loads(json_file.read())
    else:
        if version_c <= 52 and version_c >= 47:
            addr_json = os.path.abspath(__file__).split('/peacock_uvp/')[0] + "/peacock_uvp/addr_S-Firmware-47.json"
        else:
            addr_json = os.path.abspath(__file__).split('/peacock_uvp/')[0] + "/peacock_uvp/addr_S-Firmware-"+str(version_c)+".json"
        if addr_json.split("/")[-1] in os.listdir(os.path.abspath(__file__).split('/peacock_uvp/')[0] + "/peacock_uvp/"):
            with open(addr_json) as json_file:
                addr_dict = json.loads(json_file.read())
        else:
            # TODO mb 20/10/2021 choisir si on veut mettre un comportement par défaut ou fonctionner par exception
            logging.debug("WARNING: Unknown Addresses for this S-Firmware version.")
            addr_dict = None
    
    logging.debug(os.listdir("."))
    logging.debug("addr json: %s"%addr_json)
    logging.debug("addr dict: %s"%addr_dict)

    print(addr_dict)

    # conversion of haxa strings to hexa number
    if addr_dict:
        for key,value in addr_dict.items():
            if isinstance(value, str):
                if "x" in value:
                    addr_dict.update({key:int(value, 16)})

    logging.debug("addr dict converted: %s"%addr_dict)

    return addr_dict

# ===============================================
# DESCRIPTION OF AVAILABLE ADDRESSES IN THE DICT:
# ===============================================
#ADDR_SOUND_SPEED_AUTO
#ADDR_SOUND_SPEED_SET

#Adresse contenant l'adresse de la configuration de séquencement ultrasons demandée par Modbus. Elle est suivie par les 3 config partagées avec Modbus.
#ADDR_CONFIG_ID
#Adresse de départ de la zone contenant les config
#ADDR_CONFIG
#Décallage entre chaque config
#OFFSET_CONFIG
#SIZE_CONFIG

# ----- Mesures Sensors -----
#Adresse du tanguage moyen mesuré (à destination du Modbus)
#ADDR_TANGAGE
#Adresse du roulis moyen mesuré (à destination du Modbus)
#ADDR_ROULIS
#Adresse de la température moyenne mesurée (à destination du Modbus)
#ADDR_TEMP_MOY

# ---- En-tête des profils ----
#ADDR_SOUND_SPEED
#ADDR_GAIN_CA0
#ADDR_GAIN_CA1

#Adresse des profils de vitesse et amplitude
#ADDR_PROFILE_HEADER # adresse du tangage, 1er sensor
#SIZE_PROFILE_HEADER
#ADDR_PROFILE_DATA # le début des données
