/**
  ******************************************************************************
  * @file    sysdata.h
  * @author  ECS - Falko Jahn
  * @version V1.0.0
  * @date    30-jan-2021
  * @brief   System Daten
  *
  *          Beschreibung          
  *          enthält alle Systemdaten. Diese sind via modbus auslesbar und veränderbar
  *
  ******************************************************************************
  */ 
#ifndef __SYSDATA_H
#define __SYSDATA_H


//--- INCLUDEs -----------------------------------------------------------------
#include "main.h"
#include "modbus.h"

//--- GLOBALE TYPE DEFS --------------------------------------------------------   

// !!! Tabellenstruktur von LiPro1-x V2 als Vorlage !!!
typedef  struct __attribute__ ((__packed__))
{ 	
  //---- GERÄTE INFORMATIONEN ---
  uint16_t	      	deviceTypeId;               //0
  uint16_t	      	reserved0;                  //1     Reserviert Alignement
  uint32_t		deviceSn;                   //2-3   Seriennummer
  uint16_t              fwMajor;                    //4     FW Versionsnummer
  uint16_t              fwMinor;                    //5     FW Versionsnummer
  uint16_t              fwRevision;                 //6     FW Versionsnummer
  uint16_t              reserved1;                  //7     RESERVIERT

  //--- GERÄTE PARAMETER ALLGEMEIN ---
  uint32_t              baudrate;                   //8-9   Baudraute
  uint16_t              parityMode;                 //10    Parity Mode 101 = 'e' = even, 111 = 'o' = odd, 110 = 'n' = none, default even
  uint16_t              stopBits;                   //11    Aktuell nicht ausgewert, automatische Auswahl nach Modbus standard abhängig vom Parity Mode
  uint16_t              slaveAddress;               //12    Slave Adresse
  uint16_t              command;                    //13    Commnd
  uint16_t              reserved2[6];               //14-19 RESERVIERT

  //--- GERÄTE PARAMETER GERÄTE SPEZIFISCH ---
  uint16_t              ovpAlarm;                   //20        Gespeicherter Parameter: OVP Alarm Spannung in mV
  uint16_t              lvpAlarm;                   //21        Gespeicherter Parameter: LVP Alarm Spannung in mV 
  uint16_t              ovpStart;                   //22        Gespeicherter Parameter: OVP Start Spannung in mV
  uint16_t              ovpStop;                    //23        Gespeicherter Parameter: OVP Stopp Spannung in mV
  uint16_t              lvpStart;                   //24        Gespeicherter Parameter: LVP Start Spannung in mV
  uint16_t              lvpStop;                    //25        Gespeicherter Parameter: LVP Stopp Spannung in mV
  uint16_t              vShutdownStart;             //26        Gespeicherter Parameter: Unterspannungsabschaltung Start in mV
  uint16_t              vShutdownStop;              //27        Gespeicherter Parameter: Unterspannungsabschaltung Stopp in mV
  int16_t               otShutdownStart;            //28        Gespeicherter Parameter: Übertemperaturabschaltung Start in °C * 100
  int16_t               otShutdownStop;             //29        Gespeicherter Parameter: Übertemperaturabschaltung Stopp in °C * 100
  int16_t               utpChargeStart;             //30        Gespeicherter Parameter: Untertemperaturabschaltung Ladung Start in mV -- AB HIER NEUE PARAMETER ---
  int16_t               utpChargeStop;              //31        Gespeicherter Parameter: Untertemperaturabschaltung Ladung Stopp in mV
  int16_t               utpDischargeStart;          //32        Gespeicherter Parameter: Untertemperaturabschaltung Entladung Start in mV
  int16_t               utpDischargeStop;           //33        Gespeicherter Parameter: Untertemperaturabschaltung Entladung Stopp in mV
  uint16_t              lvpTime;                    //34        Gespeicherter Parameter: LVP Verzögerung in s
  uint16_t              defaultBalVoltage;          //35        Gespeicherter Parameter: Ausgleichsspannung Defaultwert in mV. Wird verwendet wenn kein Mastergerät vorhanden ist
  int16_t               refTemp;                    //36        Gespeicherter Parameter: Referenz Temperatur
  int16_t               ovpAlarmTempco;             //37        Gespeicherter Parameter: Temperaturkompensation OVP Alarmspannung in mV / °C
  int16_t               lvpAlarmTempco;             //38        Gespeicherter Parameter: Temperaturkompensation LVP ALarmspannung in mV / °C
  int16_t               ovpStartTempco;             //39        Gespeicherter Parameter: Temperaturkompensation OVP Startspannung in mV / °C
  int16_t               ovpStopTempco;              //40        Gespeicherter Parameter: Temperaturkompensation OVP Stoppspannung in mV / °C
  int16_t               lvpStartTempco;             //41        Gespeicherter Parameter: Temperaturkompensation LVP Startspannung in mV / °C
  int16_t               lvpStopTempco;              //42        Gespeicherter Parameter: Temperaturkompensation LVP Stoppspannung in mV / °C
  int16_t               vShutdownStartTempco;       //43        Gespeicherter Parameter: Temperaturkompensation Unterspannungsabschaltung Start in  mV / °C
  int16_t               vShutdownStopTempco;        //44        Gespeicherter Parameter: Temperaturkompensation Unterspannungsabschaltung Stopp in  mV / °C
  int16_t               balancerVoltageTempco;      //45        Gespeicherter Parameter: Temperaturkompensation Ausgleichsspannung (Standalone Mode) in mV / °C
  uint16_t              balancerVoltageRemote;      //46        Remote Setpoint Ausgleichsspannung, diese Register dient zur Steuerung der Balancerspannung von Mastergerät
  uint16_t              writeLocked;                //47        1= (Einige) Register sind geschützt, 0 = Kein Schutz vorhanden
  uint16_t              keyAccepted;                //48        1= lockKey is correct, gesperrte Register sind freigegeben zum beschreiben
  uint16_t              lockKey;                    //49        EINGABE ENTSPERR CODE
  uint16_t              newLockKey;                 //50        EINGABE NEUER Sperrcode
  uint16_t              reserved3[49];              //51-99 RESERVIERT

  // --- AKTUELLE DATEN ab Adresse 100 ---
  uint16_t		cellVoltage;                //100       Zellspannung in mV
  int16_t		cellTemperature;            //101       Zelltemperatur
  int16_t               balancerCurrent;            //102       Aktueller Ausgleichsstrom in mA --> Neuer Istwert
  uint16_t              otShutdown;                 //103       Übertemperatur Shutdown Status, 0 = AUS, 1 = AKTIV
  uint16_t              utChargeShutdown;           //104       Untertemperatur Ladung Shutdown Status, 0 = AUS, 1 = AKTIV
  uint16_t              utDischargeShutdown;        //105       Untertemperatur Entladung Shutdown Status, 0 = AUS, 1 = AKTIV
  uint16_t              voltageShutdown;            //106       Spannuns shutdown Status, 0 = AUS, 1 = AKTIV
  uint16_t              lvpDelayCounter;            //107       Zähler bis Abschaltung LVP in Sekunden, ACHTUNG, EINHEIT GEÄNDERT IN SEKUNDEN
  uint16_t              balancerPower;              //108       Nicht wirklich Power in Watt, sondern DAC Value von 0 bis MAX_DAC_VALUE, Achtung Bereich geändert
  uint16_t              mode;                       //109       Modus 0 = Autmatisch. Modus 1 = Manuelle Steuerung über Register 12 möglich
  uint16_t              lvpState;                   //110       Zustand Schaltausgang LVP, 0 = LVP aus, 1 = LVP aktiv (verzögert), 2 = LVP aktiv (unverzögert)
  uint16_t              ovpState;                   //111       Zustand Schaltausgang OVP, 0 = OVP aus, 1 = LVP aktiv
  uint16_t              maxVoltage;                 //112       Höchste Spannung seit letztem Reset
  uint16_t              minVoltage;                 //113       Niedrigste Spannung seit letztem Reset 
  int16_t               maxTemperature;             //114       Höchste Temperatur seit letztem Reset
  int16_t               minTemperature;             //115       Niedrigste Temperatur seit letztem Reset

  // --- AKTUELLE BERECHNETE PARAMTER ---
  uint16_t              balancerVoltage;            //116       Aktuelle Ausgleichsspannung
  uint16_t              ovpAlarmComp;               //117       OVP Alarmspannung Temperatur kompensiert
  uint16_t              lvpAlarmComp;               //118       LVP Alarmspannung Temperatur kompensiert
  uint16_t              ovpStartComp;               //119       OVP Startspannung Temperatur kompensiert
  uint16_t              ovpStopComp;                //120       OVP Stoppspannung Temperatur kompensiert
  uint16_t              lvpStartComp;               //121       LVP Startspannung Temperatur kompensiert
  uint16_t              lvpStopComp;                //122       LVP Stoppspannung Temperatur kompensiert
  uint16_t              vShutdownStartComp;         //123       Spannungsabschaltung Start Temperatur kompensiert
  uint16_t              vShutdownStopComp;          //124       Spannungsabschaltung Stopp Temperatur kompensiert
  uint16_t              balancerVoltageComp;        //125       Ausgleichsspannung Temperatur kompensiert (wenn im Standalone Mode)  
  uint16_t              masterMode;                 //126       Master modus dedektiert
  uint16_t              converterError;             //127       Fehler DC / DC Converter

  // --- weitere historische Daten
  uint16_t              cycleCounter;               //128
  uint16_t              criticalUnderTempTime;      //129
  uint16_t              criticalOverTempTime;       //130
  uint16_t              criticalUnderVoltageTime;   //131
  uint16_t              criticalOverVoltageTime;    //132
  uint16_t              reserved6[17];              //133-149   RESERVIERT für weitere wichtige Daten

  // --- AKTUELLE BERECHNETE PARAMTER, Weniger Wichtig, für DEBUG Zwecke, normalerweise keine Übertragung notwendig ---
  uint16_t              chargeTime;                 //150       Interner Debbug Wert: Ladezeit DC DC Converter
  uint16_t              chargeTransferTime;         //151       Interner Debbug Wert: Ladungstransfer Zeit DC DC Converter
  uint16_t              sekVoltage;                 //152
  uint16_t              SekHvErrorCounter;          //153
  uint16_t              SekLvErrorCounter;          //154
  uint16_t              cellVoltageUnfiltered;      //155
}sys_data_struct_t;

typedef union sys_data_union
{
        sys_data_struct_t	s; 
        bword_t mb[sizeof( sys_data_struct_t) /2];
} sys_data_t;


//--- GLOBALE DEFINES ----------------------------------------------------------
#define			CMD_NOCMD				0
#define			CMD_SAVE_PARAMETER_TO_EEPROM		1
#define			CMD_APPLY_MB_PARAMETER			2
#define			CMD_RESET_FACTORY			3
#define                 CMD_RESET                               4
#define                 CMD_SAVE_LOCK_KEY                       5
#define                 CMD_RESET_COUNTERS                      6
#define                 CMD_RESET_MIN_MAX_VALUES                7
#define			CMD_SAVE_SN				12345




    
#define MB_BAUDRATE_DEFAULT					19200	// bit pro sekunde
#define MB_PARITY_MODE_DEFAULT					'e'	// EVEN  - GERADE
#define MB_STOPBIT_MODE_DEFAULT                                 1
#define MB_SLAVE_ADDRESS_DEFAULT				1
#define MB_MASTER_MODE_DEFAULT					0
#define MIN_VOLTAGE_DEFAULT					65535
#define MAX_VOLTAGE_DEFAULT					0
#define MIN_TEMPERATURE_DEFAULT					32767
#define MAX_TEMPERATURE_DEFAULT					-32767



// ------ DEFAULT CELLPARAMETER  ------
#define OVP_ALARM_VOLTAGE_DEFAULT				3700    // [mV] 
#define LVP_ALARM_VOLTAGE_DEFAULT				2800	// [mV] 
#define OVP_START_VOLTAGE_DEFAULT				3650    // [mV] 
#define OVP_STOPP_VOLTAGE_DEFAULT				3600	// [mV] 
#define LVP_START_VOLTAGE_DEFAULT				2900	// [mV] 
#define LVP_STOPP_VOLTAGE_DEFAULT				3200    // [mV] 
#define BAL_VOLTAGE_DEFAULT					3600    // [mV] für 14,4 V Ladeschlussspannung
#define VOLTAGE_SHUTDOWN_START_VOLTAGE_DEFAULT			2500    // [mV] 
#define VOLTAGE_SHUTDOWN_STOPP_VOLTAGE_DEFAULT			2600    // [mV] 
#define OVERTEMPPROTECTION_START_DEFAULT			500     // [°C *10]
#define OVERTEMPPROTECTION_STOP_DEFAULT                         450     // [°C *10]
#define UNDERTEMPPROTECTION_CHARGE_START_DEFAULT		50      // [°C *10]
#define UNDERTEMPPROTECTION_CHARGE_STOP_DEFAULT			70      // [°C *10]
#define UNDERTEMPPROTECTION_DISCHARGE_START_DEFAULT		-150    // [°C *10]
#define UNDERTEMPPROTECTION_DISCHARGE_STOP_DEFAULT		-100    // [°C *10]
#define LVP_TIME_DEFAULT					600     // s
#define BASIS_TEMP_DEFAULT                                      250     // 25°C
#define OVP_ALARM_TEMPCO_DEFAULT                                0       // [mV / °C]
#define OVP_START_TEMPCO_DEFAULT                                0       // [mV / °C]
#define OVP_STOPP_TEMPCO_DEFAULT                                0       // [mV / °C]
#define LVP_ALARM_TEMPCO_DEFAULT                                0       // [mV / °C]
#define LVP_START_TEMPCO_DEFAULT                                0       // [mV / °C]
#define LVP_STOPP_TEMPCO_DEFAULT                                0       // [mV / °C]
#define V_SHUTDOWN_START_TEMPCO_DEFAULT                         0       // [mV / °C]
#define V_SHUTDOWN_STOPP_TEMPCO_DEFAULT                         0       // [mV / °C]
#define BAL_TEMPCO_DEFAULT                                      0       // [mV / °C]


#define CONVERTER_ERROR_NONE                                    0
#define CONVERTER_ERROR_OUTPUT_VOLT_TOO_HIGH                    2
#define CONVERTER_ERROR_OUTPUT_VOLT_TOO_LOW                     3
#define CONVERTER_ERROR_STARTUP_ERROR                           4


//--- GLOBALE VARIABLEN PROTOTYPEN ---------------------------------------------
extern sys_data_t sysData;


#define	MIN_ADRESS                                              0
#define	MAX_ADRESS                                              ((sizeof(sysData)/2)-1)

extern accessMode_t accessModeTable[MAX_ADRESS+1];

    
//--- GLOBALE FUNKTIONS PROTOTYPEN ---------------------------------------------
void SYSDATA_Init(void);




#endif