SXXXXXXX_PyBusMonitor1553/cpp/GrifoScope/GrifoXLruMonitor/xlru/xlru_psm.h
2025-12-17 07:59:30 +01:00

403 lines
12 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*==================================================================================================
FILE INFORMATION HEADER
USED IN PROJECT: S1003065-01 PPS-TX/S1003067-01 PPS-RX software application
ITEM TYPE: Source Code
ITEM NAME: xlru_psm.h
ITEM DESCRIPTION: This file contains the list of class and interface definitions for the PSM / REP connection
TARGET: ATSAM4LC8B / ATSAM4LS8B
DOC REFERENCES: SWDS1003065-01/SWDS1003065-01
PROGRAMMER NAME(S): A.Chessa, L.Vallongo
COPYRIGHT: LEONARDO-FINMECCANICA S.p.A
REVISION HISTORY:
- 01.00: first release
====================================================================================================
© Copyright LEONARDO S.p.A.. All rights reserved
Any right of industrial and intellectual property on this document,
and of technical Know-how herein contained, belongs to
LEONARDO S.p.A. and/or third parties.
According to the law, it is forbidden to disclose, reproduce or however
use this document and any data herein contained for any use without
previous written authorization by LEONARDO S.p.A.
==================================================================================================*/
#ifndef XLRU_PSM_H_
#define XLRU_PSM_H_
#include <stdint.h>
#include "xlru_message_def.h"
#define DEF_CMDID 0
#define DEF_EMERGENCY 0
#define DEF_FAST_CMD 0
//definition of ASCII for message
#define PSM_COMMAND_MSG 'C'
#define PSM_CMDID_POWER_DOWN 'P' //power-down request - immediately switch-off
#define PSM_CMDID_POWER_RECYCLE 'R'
#define PSM_CMDID_GO 'G' //GO, in normal operation
#define PSM_EMERGENCY_E 'E' //emergency mode enable
#define PSM_EMERGENCY_IGNORE 'B' //ignore battle short
#define PSM_EMERGENCY_NOT_E 'X' //<> 'E' emergency mode disable
#define PSM_FAST_CMD_CHARGE 'C' //charge 3SEC counter
#define PSM_FAST_CMD_DISCHARGE '_' //discharge 3SEC counter
//#define PSM_SPARE '_'
//response
#define PSM_STS_ID 'S'
#define PSM_STS_IDLE 'I'
#define PSM_STS_POWERUP 'P'
#define PSM_STS_NORMAL 'G'
#define PSM_STS_FAIL 'F'
#define PSM_STS_MICROINTERR 'M'
#define PSM_STS_BACKUP 'B'
#define PSM_HAZARD_NORMAL 'N'
#define PSM_HAZARD_WARNING 'W'
#define PSM_HAZARD_1 'h'
#define PSM_HAZARD_2 'H'
#define PSM_3SEC_CHARGED 'C'
#define PSM_3SEC_NOT_CHARGED 'c'
#define PSM_WOW_ACTIVE 'W'
#define PSM_WOW_INACTIVE 'w'
#define PSM_AC_OK 'A'
#define PSM_AC_1 '1'
#define PSM_AC_2 '2'
#define PSM_AC_3 '3'
#define PSM_AC_4 '4'
#define PSM_AC_5 '5'
#define PSM_AC_6 '6'
#define PSM_AC_7 '7'
#define PSM_AC_FAIL 'a'
#define PSM_BS_NORMAL 'N'
#define PSM_BS_ACTIVE 'B'
#define PSM_DC_OK 'N'
#define PSM_DC_FAIL 'U'
#define PSM_PFC_NORMAL 'N'
#define PSM_PFC_UNDER 'U'
#define PSM_PFC_OVER 'O'
#define PSM_OUT_RAIL_NORMAL 'N'
#define PSM_OUT_RAIL_UNDER 'U'
#define PSM_OUT_RAIL_OVER 'O'
#define PSM_NO_LAST_RECYCLE '_'
#define PSM_LAST_RECYCLE_EIF 'R'
#define PSM_LAST_RECYCLE_PANIC 'P'
// TX MESSAGE PAYLOAD BYTES INDEX
#define PSM_STS_ID_INDEX 4
#define PSM_STS_INDEX 5
#define PSM_HAZARD_INDEX 6
#define PSM_3SEC_INDEX 7
#define PSM_WOW_INDEX 8
#define PSM_AC_INDEX 9
#define PSM_BS_INDEX 10
#define PSM_DC_INDEX 11
#define PSM_PFC_INDEX 12
#define PSM_OUT_RAIL3V3_INDEX 13
#define PSM_OUT_RAIL5V_INDEX 14
#define PSM_OUT_RAIL15V_INDEX 15
#define PSM_OUT_RAILNEG15V_INDEX 16
#define PSM_IN_AMP1_INDEX 17
#define PSM_IN_AMP2_INDEX 18
#define PSM_OUT_VOLT3V3_1_INDEX 19
#define PSM_OUT_VOLT3V3_2_INDEX 20
#define PSM_OUT_VOLT3V3_3_INDEX 21
#define PSM_OUT_VOLT3V3_4_INDEX 22
#define PSM_OUT_VOLT5V_1_INDEX 23
#define PSM_OUT_VOLT5V_2_INDEX 24
#define PSM_OUT_VOLT5V_3_INDEX 25
#define PSM_OUT_VOLT5V_4_INDEX 26
#define PSM_OUT_VOLT15V_1_INDEX 27
#define PSM_OUT_VOLT15V_2_INDEX 28
#define PSM_OUT_VOLT15V_3_INDEX 29
#define PSM_OUT_VOLT15V_4_INDEX 30
#define PSM_OUT_VOLTNEG15V_1_INDEX 31
#define PSM_OUT_VOLTNEG15V_2_INDEX 32
#define PSM_OUT_VOLTNEG15V_3_INDEX 33
#define PSM_OUT_VOLTNEG15V_4_INDEX 34
#define PSM_TEMP1_INDEX 35
#define PSM_TEMP2_INDEX 36
#define PSM_ETI1_INDEX 37
#define PSM_ETI2_INDEX 38
#define PSM_ETI3_INDEX 39
#define PSM_ETI4_INDEX 40
#define PSM_ON_COUNTER1_INDEX 41
#define PSM_ON_COUNTER2_INDEX 42
#define PSM_ON_COUNTER3_INDEX 43
#define PSM_ON_COUNTER4_INDEX 44
#define PSM_SW_MAJORL_INDEX 45
#define PSM_SW_MAJORH_INDEX 46
#define PSM_SW_MINORL_INDEX 47
#define PSM_SW_MINORH_INDEX 48
#define PSM_UNC_COUNTERL_INDEX 49
#define PSM_UNC_COUNTERH_INDEX 50
#define PSM_BITE_WORD1_INDEX 51
#define PSM_BITE_WORD2_INDEX 53
#define PSM_BITE_WORD3_INDEX 55
#define PSM_BITE_WORD4_INDEX 57
//#define PSM_SPARE1_TX_INDEX 59
#define PSM_LAST_RECYCLE_INDEX 59
#define PSM_SPARE2_TX_INDEX 60
// TX FOOTER BYTES INDEX
#define PSM_CHK_TXH_INDEX 61
#define PSM_CHK_TXL_INDEX 62
#define PSM_EOM_TX_INDEX 63
#define PSM_IN_AMP_LSB (double)0.1 //DC_BUS_CURRENT measure
#define PSM_OUT_VOLT_LSB (double)0.1 //5V, 3V3_int, 15V, -15V measure
#define PSM_TEMP_LSB (double)1 //BOARD_TEMP measure
enum psm_mode_status_t
{
PSMIdle = 'I', //idle
PSMPowerUp = 'P', //power-up in progress
PSMNormal = 'G', //normal operation
PSMFail = 'F', //fail
PSMMicroInterrupt = 'M', //micro-interruption in progress
PSMBackuUp = 'B' //backup tha is in case of timeout on valid command reception
};
enum psm_hazard_status_t
{
PSMHazardNormal = 'N', //normal
PSMWarning = 'w', //warning
PSMHazard1 = 'h', //hazard 1
PSMHazard2 = 'H' //hazard 2 not override by emergency command
};
enum psm_3sec_status_t
{
PSM3SecCharged = 'C', //3sec charged
PSM3SecNotCharged = 'c' //3sec not charged
};
enum psm_wow_status_t
{
PSMWowActive = 'W', //wow active
PSMWowInactive = 'w' //wow inactive
};
enum psm_ac_status_t
{
PSMACOk = 'A', //AC ok, AC_LOSS (high) ok
PSMAC1PhaseA = '1',
PSMAC2PhaseB = '2',
PSMAC3 = '3',
PSMAC4PhaseC = '4',
PSMAC5 = '5',
PSMAC6 = '6',
PSMAC7 = '7',
PSMACFail = 'a' //AC Fail, AC_LOSS (low) fail
};
enum psm_bs_status_t
{
PSMBattleShortCmdOff = 'N', //battle short cmd off
PSMBattleShortCmdOn = 'B' //battle short cmd on
};
enum psm_dc_status_t
{
PSMUV270OK = 'N', //uv_270v (high) off
PSMUV270Fail = 'U' //uv_270v (low) fail
};
enum psm_pfc_status_t
{
PSMUV350veOV350vnormal = 'N', //normal, uv_350v(high) & ov_350v(high)
PSMUV350v = 'U', //under, uv_350v (low)
PSMOV350v = 'O' //over, ov_350v (low)
};
enum psm_out_rail_status_t
{
PSMOutRailNormal = 'N', //N: normal, 5V, 3V3_int, 15V, -15V between min, max
PSMOutRailUnder = 'U', //'U: under, 5V, 3V3_int, 15V, -15V under min
PSMOutRailOver = 'O' //O: over, 5V, 3V3_int, 15V, -15V over max
};
enum psm_last_recycle_t
{
PSMNoLastRecycle = '_', //_: no recycle
PSMLastRecycleEif = 'R', //'R: recycle requested by eif
PSMLastRecyclePanic = 'P' //P: panic recycle for missed message from eif
};
struct psm_status_byte4_t
{
unsigned int b0_rdr_on_sts : 1;
unsigned int b1_lcu_rdy_uc : 1;
unsigned int b2_uc_interlock_o : 1;
unsigned int b3_ac_loss : 1;
unsigned int b4_ps_interlock_n : 1;
unsigned int b5_ov_temp_haz : 1;
unsigned int b6_uv_270v : 1;
unsigned int b7_battle_short_cmd : 1;
} __attribute__((packed));
struct psm_status_byte3_t
{
unsigned int b0_ov_13v_b : 1;
unsigned int b1_uv_13v_b : 1;
unsigned int b2_wow_out : 1;
unsigned int b3_3sec_in : 1;
unsigned int b4_uv_350v : 1;
unsigned int b5_ov_350v : 1;
unsigned int b6_blko_tst : 1;
unsigned int b7_pwr_err : 1;
} __attribute__((packed));
struct psm_status_byte2_t
{
unsigned int b0_ov_m15v : 1;
unsigned int b1_uv_m15v : 1;
unsigned int b2_ov_15v : 1;
unsigned int b3_uv_15v : 1;
unsigned int b4_ov_5v : 1;
unsigned int b5_uv_5v : 1;
unsigned int b6_ov_3v3 : 1;
unsigned int b7_uv_3v3 : 1;
} __attribute__((packed));
struct psm_status_byte1_t
{
//unsigned int b0_spare : 1;
unsigned int b0_PSM_recycle_panic : 1;
unsigned int b1_PSM_EIF_comm : 1;
unsigned int b2_rs422_comm : 1;
unsigned int b3_rs485_comm : 1;
unsigned int b4_rs232_comm : 1;
unsigned int b5_ov_temp_haz_2 : 1;
unsigned int b6_ov_board_temp : 1;
unsigned int b7_ov_dc_bus_current : 1;
} __attribute__((packed));
class xlru_psm
{
private:
struct xlru_psm_command_t
{
unsigned int cmd_id; // 0 -> 'P', 1 -> 'R', 2 -> 'G'
unsigned int emergency; // 0 -> 'E', 1 -> 'B' ,3 -> <>'E'
unsigned int fast_cmd; // 0 -> 'C', 1 -> '_'
char last_recycle_reason;
int mode;
};
static xlru_psm_command_t xlru_psm_command;
struct xlru_psm_status_t
{
xlru_unit_status_t status;
bool wow; //Weight-on-Wheel
psm_mode_status_t mode_status;
psm_hazard_status_t hazard_status;
psm_3sec_status_t _3sec_status;
psm_wow_status_t wow_status;
psm_ac_status_t ac_status;
psm_bs_status_t bs_status;
psm_dc_status_t dc_status;
psm_pfc_status_t pfc_status;
psm_last_recycle_t last_recycle;
psm_out_rail_status_t out_rail_VOLT3V3_status;
psm_out_rail_status_t out_rail_VOLT5V_status;
psm_out_rail_status_t out_rail_VOLT15V_status;
psm_out_rail_status_t out_rail_VOLTNEG15V_status;
char last_recycle_reason;
float in_amp; //LSB=0.1 DC_BUS_CURRENT measure
float out_volt_VOLT3V3; //LSB=0.1 3V3_int
float out_volt_VOLT5V; //LSB=0.1 5V
float out_volt_VOLT15V; //LSB=0.1 15V
float out_volt_VOLTNEG15V; //LSB=0.1 -15V
int temperature; //LSB=1 BOARD_TEMP measure
unsigned int eti; //Counter_day*1440+Counter_hr*60+Counter_min
unsigned int on_counter; //psm_on_counter
unsigned int sw_major; //software version
unsigned int sw_minor; //software revision, release
unsigned int unc_counter; //Micro-interruptions counter - microint_count
psm_status_byte1_t byte1;
psm_status_byte2_t byte2;
psm_status_byte3_t byte3;
psm_status_byte4_t byte4;
char extra_info[BUFFER_DIM];//contiene tutti i byte presenti nel payload in più rispetto al protocollo
};
public:
static xlru_psm_status_t xlru_psm_status;
static xlru_counter_t xlru_counter;
static char xlru_psm_fcs_prev; //fcs previous
//****************************************************
// MASTER - from EIF TO PSM-
// SET MESSAGE - PSM Operative Control Msg
// GET MESSAGE
static void psm_header_master(void);
static void psm_get_message_payload_master(void);
static void psm_set_message_payload_master(void);
static char* psm_get_message_master(void);
static char* psm_set_message_master(void);
static char *psm_getStringTx(void);
static char *psm_getStringRx(void);
static void psm_setStringTx(char *txt);
static void psm_setStringRx(char *txt);
static void psm_reset_buffer_TX_RX(void);
static void init(void);
static unsigned int get_psm_cmd_id();
static unsigned int get_psm_fast_cmd();
static unsigned int get_psm_emergency();
static void set_psm_cmd_id(int value); // 0 -> 'P', 1 -> 'R', 2 -> 'G'
static void set_psm_fast_cmd(int value); // 0 -> 'E', 1 -> 'B' ,3 -> <>'E'
static void set_psm_emergency(int value); // 0 -> 'C', 1 -> '_'
static void set_psm_last_recycle_reason(char value);
static int xlru_psm_command_message_decoder(char* buffer);
static void xlru_display(int (*print_func)(const char*, ...));
static void xlru_display_compact(int (*print_func)(const char*, ...));
static void xlru_add_error(int n_error); //error into last decode response message
static void xlru_add_rx(int n_rx); //response messages
static void xlru_add_rx_error(int n_error); //response messages with error
static void xlru_add_no_rx(int n_error); //count messages without response
static void xlru_set_last_error(char *last_error); //report last error
static void xlru_set_last_rx(char *last_rx); //report last received message
static void xlru_set_last_tx(char *last_tx); //report last trasmitted message
static char* xlru_get_last_error();
static char* xlru_get_last_rx();
static char* xlru_get_last_tx();
};
#endif /* XLRU_PSM_H_ */