|
@@ -1,16033 +1,16121 @@
|
|
|
-#include "Module_OcppBackend.h"
|
|
|
-#include "define.h"
|
|
|
-
|
|
|
-//ChargePointMaxProfile
|
|
|
-#define ChargePointMaxProfile_JSON "/Storage/OCPP/ChargePointMaxProfile.json"
|
|
|
-
|
|
|
-//TxDefaultProfile
|
|
|
-#define TxDefaultProfile_0_JSON "/Storage/OCPP/TxDefaultProfile_0.json"
|
|
|
-#define TxDefaultProfile_1_JSON "/Storage/OCPP/TxDefaultProfile_1.json"
|
|
|
-#define TxDefaultProfile_2_JSON "/Storage/OCPP/TxDefaultProfile_2.json"
|
|
|
-
|
|
|
-//TxProfile
|
|
|
-#define TxProfile_1_JSON "/Storage/OCPP/TxProfile_1.json"
|
|
|
-#define TxProfile_2_JSON "/Storage/OCPP/TxProfile_2.json"
|
|
|
-
|
|
|
-#define ChargingProfile_0_JSON "/Storage/OCPP/chargingprofile_0.json"
|
|
|
-#define ChargingProfile_1_JSON "/Storage/OCPP/chargingprofile_1.json"
|
|
|
-#define ChargingProfile_2_JSON "/Storage/OCPP/chargingprofile_2.json"
|
|
|
-#define AuthorizationCache_JSON "/Storage/OCPP/AuthorizationCache.json"
|
|
|
-#define LocalAuthorizationList_JSON "/Storage/OCPP/LocalAuthorizationList.json"
|
|
|
-
|
|
|
-
|
|
|
-//===================================
|
|
|
-// Define CP State constant
|
|
|
-//===================================
|
|
|
-#define CP_STATE_UNKNOWN 0
|
|
|
-#define CP_STATE_A 1
|
|
|
-#define CP_STATE_B 2
|
|
|
-#define CP_STATE_C 3
|
|
|
-#define CP_STATE_D 4
|
|
|
-#define CP_STATE_E 5
|
|
|
-#define CP_STATE_F 6
|
|
|
-
|
|
|
-struct SysConfigAndInfo *ShmSysConfigAndInfo;
|
|
|
-struct StatusCodeData *ShmStatusCodeData;
|
|
|
-struct PsuData *ShmPsuData ;
|
|
|
-struct OCPP16Data *ShmOCPP16Data;
|
|
|
-
|
|
|
-#define MACROSTR(k) #k
|
|
|
-
|
|
|
-//ConfigurationMaxKeys
|
|
|
-#define GetConfigurationMaxKeysNUM 43
|
|
|
-
|
|
|
-pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
|
|
|
-char queuedata[2600] = {0};
|
|
|
-
|
|
|
-//=================================
|
|
|
-// StatusNotification cycle
|
|
|
-//=================================
|
|
|
-static int server_cycle_Status = 120;
|
|
|
-
|
|
|
-//===============================
|
|
|
-// Configuration: unknownkey
|
|
|
-//===============================
|
|
|
-static char unknownkey[10][20] = {0};
|
|
|
-static int UnknownKeynum = 0;
|
|
|
-
|
|
|
-//===============================
|
|
|
-// Gun Total Numbers
|
|
|
-//===============================
|
|
|
-static int gunTotalNumber = 0;
|
|
|
-static unsigned char gunType[4] = {0};
|
|
|
-
|
|
|
-//===============================
|
|
|
-// Local List Version
|
|
|
-//===============================
|
|
|
-static int localversion=0;
|
|
|
-static char idTagAuthorization[32] = {0};
|
|
|
-
|
|
|
-//===============================
|
|
|
-// OCPP sign variable
|
|
|
-//===============================
|
|
|
-static int server_sign = FALSE;
|
|
|
-int server_pending = FALSE;
|
|
|
-int PRE_SYS_MODE[CHAdeMO_QUANTITY+ CCS_QUANTITY + GB_QUANTITY + AC_QUANTITY];
|
|
|
-static int BootNotificationInterval = 0;
|
|
|
-static int SystemInitial = 0;//= CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY; // System Boot UP
|
|
|
-
|
|
|
-//===============================
|
|
|
-// OCPP auth variable
|
|
|
-//===============================
|
|
|
-static int authorizeRetryTimes = 0; //number of Retry times
|
|
|
-
|
|
|
-//===============================
|
|
|
-// OCPP other variables
|
|
|
-//===============================
|
|
|
-//int isUpdateRequest = FALSE;
|
|
|
-static int HeartBeatWaitTime = 10;
|
|
|
-static int FirstHeartBeat = 0;
|
|
|
-static int FirmwareStatusNotificationStatus = FIRMWARE_STATUS_IDLE; // Idle
|
|
|
-static int DiagnosticsStatusNotificationStatus = DIAGNOSTIC_STATUS_IDLE; // Idle
|
|
|
-static char CurrentChargingProfileScheduleStr[30] = {0};
|
|
|
-
|
|
|
-//========================================
|
|
|
-// OCPP status/previous related variables
|
|
|
-//========================================
|
|
|
-static int GunStatusInterval = 10;
|
|
|
-static int statusModeChage[CHAdeMO_QUANTITY+ CCS_QUANTITY + GB_QUANTITY + AC_QUANTITY] = {FALSE};
|
|
|
-static int ChademoPreviousSystemStatus[CHAdeMO_QUANTITY];
|
|
|
-static int CcsPreviousSystemStatus[CCS_QUANTITY];
|
|
|
-static int GbPreviousSystemStatus[GB_QUANTITY];
|
|
|
-static int AcPreviousSystemStatus[AC_QUANTITY];
|
|
|
-static int ChademoPreviousConnectorPlugIn[CHAdeMO_QUANTITY];
|
|
|
-static int CcsPreviousConnectorPlugIn[CCS_QUANTITY];
|
|
|
-static int GbPreviousConnectorPlugIn[GB_QUANTITY];
|
|
|
-static int AcPreviousConnectorPlugIn[AC_QUANTITY];
|
|
|
-static int TransactionMessageAttemptsValue = 0;
|
|
|
-static int TransactionMessageRetryIntervalValue = 0;
|
|
|
-static int TempMeterValueInterval = 0;
|
|
|
-static struct OCPPAuthLocalElemet
|
|
|
-{
|
|
|
- int listVersionInt;
|
|
|
- char idTagstr[20];
|
|
|
- char parentIdTag[20];
|
|
|
- char expiryDate[30];
|
|
|
- char idTagstatus[16];
|
|
|
-}idTagQuery;
|
|
|
-
|
|
|
-//=============================================
|
|
|
-// OCPP HeartBeat Response Not Receive Counts
|
|
|
-//============================================
|
|
|
-static int HeartBeatWithNOResponse = 0;
|
|
|
-static int HeartBeatCountPerHour = 0;
|
|
|
-
|
|
|
-extern void ChageWebSocketPingInterval(int WebSocketPingInterval);
|
|
|
-extern int GetTransactionQueueNum(void);
|
|
|
-extern pthread_mutex_t mutex1;
|
|
|
-extern struct Charger_Info Charger;
|
|
|
-extern sqlite3 *db;
|
|
|
-
|
|
|
-int TransactionMessageAttemptsGet(void);
|
|
|
-int TransactionMessageRetryIntervalGet(void);
|
|
|
-int GetOcppConnStatus(void);
|
|
|
-void SetOcppConnStatus(uint8_t status);
|
|
|
-int setKeyValue(char *key, char *value);
|
|
|
-void OCPP_get_TableAuthlocalAllData(void);
|
|
|
-void processUnkownKey(void);
|
|
|
-
|
|
|
-struct StructOCPPMeterValue
|
|
|
-{
|
|
|
- unsigned char TimeStamp[28];
|
|
|
- struct StructSampledValue SampledValue[10];
|
|
|
-};
|
|
|
-
|
|
|
-struct ClientTime
|
|
|
-{
|
|
|
- unsigned int Heartbeat;
|
|
|
- unsigned int StatusNotification[CHAdeMO_QUANTITY+ CCS_QUANTITY + GB_QUANTITY + AC_QUANTITY];
|
|
|
- unsigned int StartTransaction;
|
|
|
- unsigned int StopTransaction;
|
|
|
- unsigned int MeterValues[CHAdeMO_QUANTITY+ CCS_QUANTITY + GB_QUANTITY + AC_QUANTITY];
|
|
|
-
|
|
|
-}clientTime;
|
|
|
-
|
|
|
-typedef union
|
|
|
-{
|
|
|
- //Operations Initiated by Central System
|
|
|
- unsigned char CsMsgValue[CHAdeMO_QUANTITY+ CCS_QUANTITY + GB_QUANTITY + AC_QUANTITY];
|
|
|
- struct
|
|
|
- {
|
|
|
- //CsMsgValue[0]
|
|
|
- unsigned char StatusNotificationReq :1; //bit 0,
|
|
|
- unsigned char StatusNotificationConf :1; //bit 0,
|
|
|
- unsigned char :6; //bit 2~7
|
|
|
- }bits[CHAdeMO_QUANTITY+ CCS_QUANTITY + GB_QUANTITY + AC_QUANTITY];
|
|
|
-}CpinitiateMsg;
|
|
|
-
|
|
|
-CpinitiateMsg cpinitateMsg;
|
|
|
-
|
|
|
-//==========================================
|
|
|
-// Init all Enumeration & Mapping String
|
|
|
-//==========================================
|
|
|
-/*ChargePointErrorCode*/
|
|
|
-typedef enum {
|
|
|
- ConnectorLockFailure,
|
|
|
- EVCommunicationError,
|
|
|
- GroundFailure,
|
|
|
- HighTemperature,
|
|
|
- InternalError,
|
|
|
- LocalListConflict,
|
|
|
- NoError,
|
|
|
- OtherError,
|
|
|
- OverCurrentFailure,
|
|
|
- OverVoltage,
|
|
|
- PowerMeterFailure,
|
|
|
- PowerSwitchFailure,
|
|
|
- ReaderFailure,
|
|
|
- ResetFailure,
|
|
|
- UnderVoltage,
|
|
|
- WeakSignal
|
|
|
-} ChargePointErrorCode;
|
|
|
-
|
|
|
-#if 0
|
|
|
-static char *ChargePointErrorCodeStr[] = {
|
|
|
- MACROSTR(ConnectorLockFailure),
|
|
|
- MACROSTR(EVCommunicationError),
|
|
|
- MACROSTR(GroundFailure),
|
|
|
- MACROSTR(HighTemperature),
|
|
|
- MACROSTR(InternalError),
|
|
|
- MACROSTR(LocalListConflict),
|
|
|
- MACROSTR(NoError),
|
|
|
- MACROSTR(OtherError),
|
|
|
- MACROSTR(OverCurrentFailure),
|
|
|
- MACROSTR(OverVoltage),
|
|
|
- MACROSTR(PowerMeterFailure),
|
|
|
- MACROSTR(PowerSwitchFailure),
|
|
|
- MACROSTR(ReaderFailure),
|
|
|
- MACROSTR(ResetFailure),
|
|
|
- MACROSTR(UnderVoltage),
|
|
|
- MACROSTR(WeakSignal)
|
|
|
-};
|
|
|
-#endif
|
|
|
-
|
|
|
-/*ChargePointStatus*/
|
|
|
-typedef enum {
|
|
|
- Available =0,
|
|
|
- Preparing,
|
|
|
- Charging,
|
|
|
- SuspendedEVSE,
|
|
|
- SuspendedEV,
|
|
|
- Finishing,
|
|
|
- Reserved,
|
|
|
- Unavailable,
|
|
|
- Faulted
|
|
|
-} ChargePointStatus;
|
|
|
-
|
|
|
-static char * ChargePointStatusStr[] = {
|
|
|
- MACROSTR(Available),
|
|
|
- MACROSTR(Preparing),
|
|
|
- MACROSTR(Charging),
|
|
|
- MACROSTR(SuspendedEVSE),
|
|
|
- MACROSTR(SuspendedEV),
|
|
|
- MACROSTR(Finishing),
|
|
|
- MACROSTR(Reserved),
|
|
|
- MACROSTR(Unavailable),
|
|
|
- MACROSTR(Faulted)
|
|
|
-};
|
|
|
-
|
|
|
-/*AvailabilityType*/
|
|
|
-typedef enum {
|
|
|
- RegistrationStatus_Accepted,
|
|
|
- RegistrationStatus_Pending,
|
|
|
- RegistrationStatus_Rejected
|
|
|
-} RegistrationStatus;
|
|
|
-
|
|
|
-static char *RegistrationStatusStr[] = {
|
|
|
- MACROSTR(Accepted),
|
|
|
- MACROSTR(Pending),
|
|
|
- MACROSTR(Rejected)
|
|
|
-};
|
|
|
-
|
|
|
-/*AvailabilityType*/
|
|
|
-typedef enum {
|
|
|
- Inoperative,
|
|
|
- Operative
|
|
|
-} AvailabilityType;
|
|
|
-
|
|
|
-static char *AvailabilityTypeStr[] = {
|
|
|
- MACROSTR(Inoperative),
|
|
|
- MACROSTR(Operative)
|
|
|
-};
|
|
|
-
|
|
|
-/*AvailabilityStatus*/
|
|
|
-typedef enum {
|
|
|
- Accepted,
|
|
|
- Rejected,
|
|
|
- Scheduled
|
|
|
-} AvailabilityStatus;
|
|
|
-
|
|
|
-static char *AvailabilityStatusStr[] = {
|
|
|
- MACROSTR(Accepted),
|
|
|
- MACROSTR(Rejected),
|
|
|
- MACROSTR(Scheduled)
|
|
|
-};
|
|
|
-
|
|
|
-/*ConfigurationStatus*/
|
|
|
-typedef enum {
|
|
|
- ConfigurationStatus_Accepted,
|
|
|
- ConfigurationStatus_Rejected,
|
|
|
- RebootRequired,
|
|
|
- NotSupported
|
|
|
-} ConfigurationStatus;
|
|
|
-
|
|
|
-static char *ConfigurationStatusStr[] = {
|
|
|
- MACROSTR(Accepted),
|
|
|
- MACROSTR(Rejected),
|
|
|
- MACROSTR(RebootRequired),
|
|
|
- MACROSTR(NotSupported)
|
|
|
-};
|
|
|
-
|
|
|
-/*ClearCacheStatus*/
|
|
|
-typedef enum {
|
|
|
- ClearCacheStatus_Accepted,
|
|
|
- ClearCacheStatus_Rejected
|
|
|
-} ClearCacheStatus;
|
|
|
-
|
|
|
-static char *ClearCacheStatusStr[] = {
|
|
|
- MACROSTR(Accepted),
|
|
|
- MACROSTR(Rejected)
|
|
|
-};
|
|
|
-
|
|
|
-/*ChargingProfilePurposeType*/
|
|
|
-typedef enum {
|
|
|
- ChargePointMaxProfile,
|
|
|
- TxDefaultProfile,
|
|
|
- TxProfile
|
|
|
-} ChargingProfilePurposeType;
|
|
|
-
|
|
|
-static char *ChargingProfilePurposeTypeStr[] = {
|
|
|
- MACROSTR(ChargePointMaxProfile),
|
|
|
- MACROSTR(TxDefaultProfile),
|
|
|
- MACROSTR(TxProfile)
|
|
|
-};
|
|
|
-
|
|
|
-/*ChargingProfileStatus*/
|
|
|
-typedef enum {
|
|
|
- ChargingProfileStatus_Accepted,
|
|
|
- ChargingProfileStatus_Rejected,
|
|
|
- ChargingProfileStatus_NotSupported
|
|
|
-} ChargingProfileStatus;
|
|
|
-
|
|
|
-static char *ChargingProfileStatusStr[] = {
|
|
|
- MACROSTR(Accepted),
|
|
|
- MACROSTR(Rejected),
|
|
|
- MACROSTR(NotSupported)
|
|
|
-};
|
|
|
-
|
|
|
-/*ClearChargingProfileStatus*/
|
|
|
-typedef enum {
|
|
|
- ClearChargingProfileStatus_Accepted,
|
|
|
- ClearChargingProfileStatus_Unknown
|
|
|
-} ClearChargingProfileStatus;
|
|
|
-
|
|
|
-static char *ClearChargingProfileStatusStr[] = {
|
|
|
- MACROSTR(Accepted),
|
|
|
- MACROSTR(Unknown)
|
|
|
-};
|
|
|
-
|
|
|
-/*GetCompositeScheduleStatus*/
|
|
|
-typedef enum {
|
|
|
- GetCompositeScheduleStatus_Accepted,
|
|
|
- GetCompositeScheduleStatus_Rejected
|
|
|
-} GetCompositeScheduleStatus;
|
|
|
-
|
|
|
-
|
|
|
-static char *GetCompositeScheduleStatusStr[] = {
|
|
|
- MACROSTR(Accepted),
|
|
|
- MACROSTR(Rejected)
|
|
|
-};
|
|
|
-
|
|
|
-/*ChargingRateUnitType*/
|
|
|
-typedef enum {
|
|
|
- ChargingRateUnitType_W,
|
|
|
- ChargingRateUnitType_A
|
|
|
-} ChargingRateUnitType;
|
|
|
-
|
|
|
-/*AuthorizationStatus*/
|
|
|
-typedef enum {
|
|
|
- AuthorizationStatus_Accepted ,
|
|
|
- AuthorizationStatus_Blocked ,
|
|
|
- AuthorizationStatus_Expired ,
|
|
|
- AuthorizationStatus_Invalid ,
|
|
|
- AuthorizationStatus_ConcurrentTx
|
|
|
-} AuthorizationStatus;
|
|
|
-
|
|
|
-/*UpdateType*/
|
|
|
-typedef enum {
|
|
|
- Differential ,
|
|
|
- Full
|
|
|
-} UpdateType;
|
|
|
-
|
|
|
-static char *UpdateTypeStr[] = {
|
|
|
- MACROSTR(Differential),
|
|
|
- MACROSTR(Full)
|
|
|
-};
|
|
|
-
|
|
|
-/*UpdateStatus*/
|
|
|
-typedef enum {
|
|
|
- UpdateStatus_Accepted ,
|
|
|
- UpdateStatus_Failed ,
|
|
|
- UpdateStatus_NotSupported ,
|
|
|
- UpdateStatus_VersionMismatch
|
|
|
-} UpdateStatus;
|
|
|
-
|
|
|
-static char *UpdateStatusStr[] = {
|
|
|
- MACROSTR(Accepted),
|
|
|
- MACROSTR(Failed),
|
|
|
- MACROSTR(NotSupported),
|
|
|
- MACROSTR(VersionMismatch)
|
|
|
-};
|
|
|
-
|
|
|
-/*RemoteStartStopStatus*/
|
|
|
-typedef enum {
|
|
|
- RemoteStartStopStatus_Accepted,
|
|
|
- RemoteStartStopStatus_Rejected
|
|
|
-
|
|
|
-} RemoteStartStopStatus;
|
|
|
-
|
|
|
-
|
|
|
-static char *RemoteStartStopStatusStr[] = {
|
|
|
- MACROSTR(Accepted),
|
|
|
- MACROSTR(Rejected)
|
|
|
-
|
|
|
-};
|
|
|
-
|
|
|
-/*ReservationStatus*/
|
|
|
-typedef enum {
|
|
|
- ReservationStatus_Accepted,
|
|
|
- ReservationStatus_Faulted,
|
|
|
- ReservationStatus_Occupied,
|
|
|
- ReservationStatus_Rejected,
|
|
|
- ReservationStatus_Unavailable
|
|
|
-
|
|
|
-} ReservationStatus;
|
|
|
-
|
|
|
-static char *ReservationStatusStr[] = {
|
|
|
- MACROSTR(Accepted),
|
|
|
- MACROSTR(Faulted),
|
|
|
- MACROSTR(Occupied),
|
|
|
- MACROSTR(Rejected),
|
|
|
- MACROSTR(Unavailable)
|
|
|
-};
|
|
|
-
|
|
|
-/*ResetType*/
|
|
|
-typedef enum {
|
|
|
- Hard,
|
|
|
- Soft
|
|
|
-} ResetType;
|
|
|
-
|
|
|
-
|
|
|
-static char *ResetTypeStr[] = {
|
|
|
- MACROSTR(Hard),
|
|
|
- MACROSTR(Soft)
|
|
|
-};
|
|
|
-
|
|
|
-
|
|
|
-/*ResetStatus*/
|
|
|
-typedef enum {
|
|
|
- ResetStatus_Accepted,
|
|
|
- ResetStatus_Rejected
|
|
|
-} ResetStatus;
|
|
|
-
|
|
|
-
|
|
|
-static char *ResetStatusStr[] = {
|
|
|
- MACROSTR(Accepted),
|
|
|
- MACROSTR(Rejected)
|
|
|
-};
|
|
|
-
|
|
|
-/*DiagnosticsStatus*/
|
|
|
-typedef enum {
|
|
|
- DiagnosticsStatus_Idle,
|
|
|
- DiagnosticsStatus_Uploaded,
|
|
|
- DiagnosticsStatus_UploadFailed,
|
|
|
- DiagnosticsStatus_Uploading
|
|
|
-} DiagnosticsStatus;
|
|
|
-
|
|
|
-
|
|
|
-static char * DiagnosticsStatusStr[] = {
|
|
|
- MACROSTR(Idle),
|
|
|
- MACROSTR(Uploaded),
|
|
|
- MACROSTR(UploadFailed),
|
|
|
- MACROSTR(Uploading)
|
|
|
-};
|
|
|
-
|
|
|
-/*FirmwareStatus*/
|
|
|
-typedef enum {
|
|
|
- FirmwareStatus_Downloaded,
|
|
|
- FirmwareStatus_DownloadFailed,
|
|
|
- FirmwareStatus_Downloading,
|
|
|
- FirmwareStatus_Idle,
|
|
|
- FirmwareStatus_InstallationFailed,
|
|
|
- FirmwareStatus_Installing,
|
|
|
- FirmwareStatus_Installed
|
|
|
-} FirmwareStatus;
|
|
|
-
|
|
|
-
|
|
|
-static char * FirmwareStatusStr[] = {
|
|
|
- MACROSTR(Downloaded),
|
|
|
- MACROSTR(DownloadFailed),
|
|
|
- MACROSTR(Downloading),
|
|
|
- MACROSTR(Idle),
|
|
|
- MACROSTR(InstallationFailed),
|
|
|
- MACROSTR(Installing),
|
|
|
- MACROSTR(Installed)
|
|
|
-};
|
|
|
-
|
|
|
-
|
|
|
-/*MessageTrigger*/
|
|
|
-typedef enum {
|
|
|
- BootNotification,
|
|
|
- DiagnosticsStatusNotification,
|
|
|
- FirmwareStatusNotification,
|
|
|
- Heartbeat,
|
|
|
- MeterValues,
|
|
|
- StatusNotification
|
|
|
-} MessageTrigger;
|
|
|
-
|
|
|
-
|
|
|
-static char * MessageTriggerStr[] = {
|
|
|
- MACROSTR(BootNotification),
|
|
|
- MACROSTR(DiagnosticsStatusNotification),
|
|
|
- MACROSTR(FirmwareStatusNotification),
|
|
|
- MACROSTR(Heartbeat),
|
|
|
- MACROSTR(MeterValues),
|
|
|
- MACROSTR(StatusNotification)
|
|
|
-};
|
|
|
-
|
|
|
-
|
|
|
-/*TriggerMessageStatus*/
|
|
|
-typedef enum {
|
|
|
- TriggerMessageStatus_Accepted ,
|
|
|
- TriggerMessageStatus_Rejected ,
|
|
|
- TriggerMessageStatus_NotImplemented
|
|
|
-} TriggerMessageStatus;
|
|
|
-
|
|
|
-
|
|
|
-static char * TriggerMessageStatusStr[] = {
|
|
|
- MACROSTR(Accepted),
|
|
|
- MACROSTR(Rejected),
|
|
|
- MACROSTR(NotImplemented)
|
|
|
-};
|
|
|
-
|
|
|
-
|
|
|
-/*UnlockStatus*/
|
|
|
-typedef enum {
|
|
|
- Unlocked,
|
|
|
- UnlockFailed,
|
|
|
- UnlockStatus_NotSupported
|
|
|
-} UnlockStatus;
|
|
|
-
|
|
|
-
|
|
|
-static char * UnlockStatusStr[] = {
|
|
|
- MACROSTR(Unlocked),
|
|
|
- MACROSTR(UnlockFailed),
|
|
|
- MACROSTR(NotSupported)
|
|
|
-};
|
|
|
-
|
|
|
-/*StopTransactionReason*/
|
|
|
-typedef enum {
|
|
|
- EmergencyStop,
|
|
|
- EVDisconnected,
|
|
|
- HardReset,
|
|
|
- Local,
|
|
|
- Other,
|
|
|
- PowerLoss,
|
|
|
- Reboot,
|
|
|
- Remote,
|
|
|
- SoftReset,
|
|
|
- UnlockCommand,
|
|
|
- DeAuthorized
|
|
|
-} StopTransactionReason;
|
|
|
-
|
|
|
-#if 0
|
|
|
-static char * StopTransactionReasonStr[] = {
|
|
|
- MACROSTR(EmergencyStop),
|
|
|
- MACROSTR(EVDisconnected),
|
|
|
- MACROSTR(HardReset),
|
|
|
- MACROSTR(Local),
|
|
|
- MACROSTR(Other),
|
|
|
- MACROSTR(PowerLoss),
|
|
|
- MACROSTR(Reboot),
|
|
|
- MACROSTR(Remote),
|
|
|
- MACROSTR(SoftReset),
|
|
|
- MACROSTR(UnlockCommand),
|
|
|
- MACROSTR(DeAuthorized)
|
|
|
-};
|
|
|
-#endif
|
|
|
-
|
|
|
-/*CancelReservationStatus*/
|
|
|
-typedef enum {
|
|
|
- CancelReservationStatus_Accepted,
|
|
|
- CancelReservationStatus_Rejected
|
|
|
-} CancelReservationStatus;
|
|
|
-
|
|
|
-static char * CancelReservationStatusStr[] = {
|
|
|
- MACROSTR(Accepted),
|
|
|
- MACROSTR(Rejected)
|
|
|
-};
|
|
|
-
|
|
|
-/*ReadingContext*/
|
|
|
-typedef enum {
|
|
|
- ReadingContext_Interruption_Begin,
|
|
|
- ReadingContext_Interruption_End,
|
|
|
- ReadingContext_Other,
|
|
|
- ReadingContext_Sample_Clock,
|
|
|
- ReadingContext_Sample_Periodic ,
|
|
|
- ReadingContext_Transaction_Begin ,
|
|
|
- ReadingContext_Transaction_End,
|
|
|
- ReadingContext_Trigger
|
|
|
-} ReadingContext;
|
|
|
-
|
|
|
-
|
|
|
-static char * ReadingContextStr[] = {
|
|
|
- MACROSTR(Interruption.Begin),
|
|
|
- MACROSTR(Interruption.End),
|
|
|
- MACROSTR(Other),
|
|
|
- MACROSTR(Sample.Clock),
|
|
|
- MACROSTR(Sample.Periodic),
|
|
|
- MACROSTR(Transaction.Begin),
|
|
|
- MACROSTR(Transaction.End),
|
|
|
- MACROSTR(Trigger)
|
|
|
-};
|
|
|
-
|
|
|
-
|
|
|
-/*ValueFormat*/
|
|
|
-typedef enum {
|
|
|
- Raw,
|
|
|
- SignedData
|
|
|
-} ValueFormat;
|
|
|
-
|
|
|
-
|
|
|
-static char * ValueFormatStr[] = {
|
|
|
- MACROSTR(Raw),
|
|
|
- MACROSTR(SignedData)
|
|
|
-};
|
|
|
-
|
|
|
-/*Measurand*/
|
|
|
-typedef enum {
|
|
|
- Current_Export ,
|
|
|
- Current_Import,
|
|
|
- Current_Offered,
|
|
|
- Energy_Active_Export_Register,
|
|
|
- Energy_Active_Import_Register,
|
|
|
- Energy_Reactive_Export_Register,
|
|
|
- Energy_Reactive_Import_Register,
|
|
|
- Energy_Active_Export_Interval,
|
|
|
- Energy_Active_Import_Interval,
|
|
|
- Energy_Reactive_Export_Interval,
|
|
|
- Energy_Reactive_Import_Interval,
|
|
|
- Frequency,
|
|
|
- Power_Active_Export ,
|
|
|
- Power_Active_Import,
|
|
|
- Power_Factor,
|
|
|
- Power_Offered,
|
|
|
- Power_Reactive_Export,
|
|
|
- Power_Reactive_Import,
|
|
|
- RPM,
|
|
|
- SoC,
|
|
|
- Temperature ,
|
|
|
- Voltage
|
|
|
-} Measurand;
|
|
|
-
|
|
|
-
|
|
|
-static char * MeasurandStr[] = {
|
|
|
- MACROSTR(Current.Export),
|
|
|
- MACROSTR(Current.Import),
|
|
|
- MACROSTR(Current.Offered),
|
|
|
- MACROSTR(Energy.Active.Export.Register),
|
|
|
- MACROSTR(Energy.Active.Import.Register),
|
|
|
- MACROSTR(Energy.Reactive.Export.Register),
|
|
|
- MACROSTR(Energy.Reactive.Import.Register),
|
|
|
- MACROSTR(Energy.Active.Export.Interval),
|
|
|
- MACROSTR(Energy.Active.Import.Interval),
|
|
|
- MACROSTR(Energy.Reactive.Export.Interval),
|
|
|
- MACROSTR(Energy.Reactive.Import.Interval),
|
|
|
- MACROSTR(Frequency),
|
|
|
- MACROSTR(Power.Active.Export),
|
|
|
- MACROSTR(Power.Active.Import),
|
|
|
- MACROSTR(Power.Factor),
|
|
|
- MACROSTR(Power.Offered),
|
|
|
- MACROSTR(Power.Reactive.ExportMACROSTR),
|
|
|
- MACROSTR(Power.Reactive.Import),
|
|
|
- MACROSTR(RPM),
|
|
|
- MACROSTR(SoC),
|
|
|
- MACROSTR(Temperature),
|
|
|
- MACROSTR(Voltage)
|
|
|
-};
|
|
|
-
|
|
|
-
|
|
|
-/*Location*/
|
|
|
-typedef enum {
|
|
|
- Location_Body,
|
|
|
- Location_Cable,
|
|
|
- Location_EV,
|
|
|
- Location_Inlet ,
|
|
|
- Location_Outlet
|
|
|
-} Location;
|
|
|
-
|
|
|
-
|
|
|
-static char * LocationStr[] = {
|
|
|
- MACROSTR(Body),
|
|
|
- MACROSTR(Cable),
|
|
|
- MACROSTR(EV),
|
|
|
- MACROSTR(Inlet),
|
|
|
- MACROSTR(Outlet)
|
|
|
-};
|
|
|
-
|
|
|
-
|
|
|
-/*Phase*/
|
|
|
-typedef enum {
|
|
|
- L1,
|
|
|
- L2,
|
|
|
- L3,
|
|
|
- N,
|
|
|
- L1_N,
|
|
|
- L2_N,
|
|
|
- L3_N,
|
|
|
- L1_L2,
|
|
|
- L2_L3,
|
|
|
- L3_L1
|
|
|
-} Phase;
|
|
|
-
|
|
|
-
|
|
|
-static char * PhaseStr[] = {
|
|
|
- MACROSTR(L1),
|
|
|
- MACROSTR(L2),
|
|
|
- MACROSTR(L3),
|
|
|
- MACROSTR(N),
|
|
|
- MACROSTR(L1-N),
|
|
|
- MACROSTR(L2-N),
|
|
|
- MACROSTR(L3-N),
|
|
|
- MACROSTR(L1-L2),
|
|
|
- MACROSTR(L2-L3),
|
|
|
- MACROSTR(L3-L1)
|
|
|
-};
|
|
|
-
|
|
|
-
|
|
|
-/*UnitOfMeasure*/
|
|
|
-typedef enum {
|
|
|
- UnitOfMeasure_Wh,
|
|
|
- UnitOfMeasure_kWh ,
|
|
|
- UnitOfMeasure_varh ,
|
|
|
- UnitOfMeasure_kvarh ,
|
|
|
- UnitOfMeasure_W ,
|
|
|
- UnitOfMeasure_kW ,
|
|
|
- UnitOfMeasure_VA ,
|
|
|
- UnitOfMeasure_kVA ,
|
|
|
- UnitOfMeasure_var ,
|
|
|
- UnitOfMeasure_kvar ,
|
|
|
- UnitOfMeasure_A ,
|
|
|
- UnitOfMeasure_V ,
|
|
|
- UnitOfMeasure_Celsius ,
|
|
|
- UnitOfMeasure_Fahrenheit ,
|
|
|
- UnitOfMeasure_K ,
|
|
|
- UnitOfMeasure_Percent
|
|
|
-
|
|
|
-} UnitOfMeasure;
|
|
|
-
|
|
|
-
|
|
|
-static char * UnitOfMeasureStr[] = {
|
|
|
- MACROSTR(Wh),
|
|
|
- MACROSTR(kWh),
|
|
|
- MACROSTR(varh),
|
|
|
- MACROSTR(kvarh),
|
|
|
- MACROSTR(W),
|
|
|
- MACROSTR(kW),
|
|
|
- MACROSTR(VA),
|
|
|
- MACROSTR(kVA),
|
|
|
- MACROSTR(var),
|
|
|
- MACROSTR(kvar),
|
|
|
- MACROSTR(A),
|
|
|
- MACROSTR(V),
|
|
|
- MACROSTR(Celsius),
|
|
|
- MACROSTR(Fahrenheit),
|
|
|
- MACROSTR(K),
|
|
|
- MACROSTR(Percent)
|
|
|
-};
|
|
|
-
|
|
|
-enum LocalAuthListManagementProfile{
|
|
|
- LocalAuthListEnabled=0,
|
|
|
- LocalAuthListMaxLength,
|
|
|
- SendLocalListMaxLength,
|
|
|
- _LocalAuthListManagementProfile_CNT
|
|
|
-};
|
|
|
-
|
|
|
-enum ReservationProfile{
|
|
|
- ReserveConnectorZeroSupported
|
|
|
-};
|
|
|
-
|
|
|
-enum SmartChargingProfile{
|
|
|
- ChargeProfileMaxStackLevel,
|
|
|
- ChargingScheduleAllowedChargingRateUnit,
|
|
|
- ChargingScheduleMaxPeriods,
|
|
|
- ConnectorSwitch3to1PhaseSupported,
|
|
|
- MaxChargingProfilesInstalled
|
|
|
-};
|
|
|
-
|
|
|
-enum ChargerSystemStatus{
|
|
|
- ChargerSystemStatus_Booting,
|
|
|
- ChargerSystemStatus_Idle,
|
|
|
- ChargerSystemStatus_Authorizing,
|
|
|
- ChargerSystemStatus_Preparing,
|
|
|
- ChargerSystemStatus_Charging,
|
|
|
- ChargerSystemStatus_Terminating,
|
|
|
- ChargerSystemStatus_Alarm,
|
|
|
- ChargerSystemStatus_Fault
|
|
|
-};
|
|
|
-
|
|
|
-enum GetConfigurationKey {
|
|
|
- GetConfiguration_AllowOfflineTxForUnknownId=0,
|
|
|
- GetConfiguration_AuthorizationCacheEnabled,
|
|
|
- GetConfiguration_AuthorizeRemoteTxRequests,
|
|
|
- GetConfiguration_BlinkRepeat,
|
|
|
- GetConfiguration_ClockAlignedDataInterval,
|
|
|
- GetConfiguration_ConnectionTimeOut,
|
|
|
- GetConfiguration_GetConfigurationMaxKeys,
|
|
|
- GetConfiguration_HeartbeatInterval,
|
|
|
- GetConfiguration_LightIntensity,
|
|
|
- GetConfiguration_LocalAuthorizeOffline,
|
|
|
- GetConfiguration_LocalPreAuthorize,
|
|
|
- GetConfiguration_MaxEnergyOnInvalidId,
|
|
|
- GetConfiguration_MeterValuesAlignedData,
|
|
|
- GetConfiguration_MeterValuesAlignedDataMaxLength,
|
|
|
- GetConfiguration_MeterValuesSampledData,
|
|
|
- GetConfiguration_MeterValuesSampledDataMaxLength,
|
|
|
- GetConfiguration_MeterValueSampleInterval,
|
|
|
- GetConfiguration_MinimumStatusDuration,
|
|
|
- GetConfiguration_NumberOfConnectors,
|
|
|
- GetConfiguration_ResetRetries,
|
|
|
- GetConfiguration_ConnectorPhaseRotation,
|
|
|
- GetConfiguration_ConnectorPhaseRotationMaxLength,
|
|
|
- GetConfiguration_StopTransactionOnEVSideDisconnect,
|
|
|
- GetConfiguration_StopTransactionOnInvalidId,
|
|
|
- GetConfiguration_StopTxnAlignedData,
|
|
|
- GetConfiguration_StopTxnAlignedDataMaxLength,
|
|
|
- GetConfiguration_StopTxnSampledData,
|
|
|
- GetConfiguration_StopTxnSampledDataMaxLength,
|
|
|
- GetConfiguration_SupportedFeatureProfiles,
|
|
|
- GetConfiguration_SupportedFeatureProfilesMaxLength,
|
|
|
- GetConfiguration_TransactionMessageAttempts,
|
|
|
- GetConfiguration_TransactionMessageRetryInterval,
|
|
|
- GetConfiguration_UnlockConnectorOnEVSideDisconnect,
|
|
|
- GetConfiguration_WebSocketPingInterval,
|
|
|
- GetConfiguration_LocalAuthListEnabled,
|
|
|
- GetConfiguration_LocalAuthListMaxLength,
|
|
|
- GetConfiguration_SendLocalListMaxLength,
|
|
|
- GetConfiguration_ReserveConnectorZeroSupported,
|
|
|
- GetConfiguration_ChargeProfileMaxStackLevel,
|
|
|
- GetConfiguration_ChargingScheduleAllowedChargingRateUnit,
|
|
|
- GetConfiguration_ChargingScheduleMaxPeriods,
|
|
|
- GetConfiguration_ConnectorSwitch3to1PhaseSupported,
|
|
|
- GetConfiguration_MaxChargingProfilesInstalled,
|
|
|
-};
|
|
|
-
|
|
|
-//GetConfiguration Array
|
|
|
-struct StructConfigurationKeyItems staticKeyArray[GetConfigurationMaxKeysNUM]={0};
|
|
|
-struct StructConfigurationKey staticResponseConfigurationKeyArray[GetConfigurationMaxKeysNUM]={0};
|
|
|
-struct StructConfigurationKeyItems staticResponseUnknownKey[10]={0};
|
|
|
-struct StructLocalAuthorizationList staticLocalAuthorizationList[500]={0};
|
|
|
-
|
|
|
-
|
|
|
-//==========================================
|
|
|
-// GetCompositeSchedule logic related function
|
|
|
-//==========================================
|
|
|
-int DiffTimebSec(struct timeb ST, struct timeb ET)
|
|
|
-{
|
|
|
- //return milli-second
|
|
|
- unsigned int StartTime,StopTime;
|
|
|
-
|
|
|
- StartTime=(unsigned int)ST.time;
|
|
|
- StopTime=(unsigned int)ET.time;
|
|
|
- return (StopTime-StartTime);
|
|
|
-}
|
|
|
-
|
|
|
-int DiffTimebWithNowSec(struct timeb ST)
|
|
|
-{
|
|
|
- //return milli-second
|
|
|
- struct timeb ET;
|
|
|
- unsigned int StartTime,StopTime;
|
|
|
-
|
|
|
- ftime(&ET);
|
|
|
- StartTime=(unsigned int)ST.time;
|
|
|
- StopTime=(unsigned int)ET.time;
|
|
|
- return (StopTime-StartTime);
|
|
|
-}
|
|
|
-
|
|
|
-int getStartStop(uint8_t *start, uint8_t *stop)
|
|
|
-{
|
|
|
- int result = -1;
|
|
|
- struct tm tmStart;
|
|
|
- struct timeb tbStart;
|
|
|
- struct tm tmStop;
|
|
|
- struct timeb tbStop;
|
|
|
-
|
|
|
-
|
|
|
- if((sscanf((char*)start, "%4d-%2d-%2dT%2d:%2d:%2d", &tmStart.tm_year, &tmStart.tm_mon, &tmStart.tm_mday, &tmStart.tm_hour, &tmStart.tm_min, &tmStart.tm_sec) == 6) &&
|
|
|
- (sscanf((char*)stop, "%4d-%2d-%2dT%2d:%2d:%2d", &tmStop.tm_year, &tmStop.tm_mon, &tmStop.tm_mday, &tmStop.tm_hour, &tmStop.tm_min, &tmStop.tm_sec) == 6))
|
|
|
- {
|
|
|
- tmStart.tm_year -= 1900;
|
|
|
- tmStart.tm_mon -= 1;
|
|
|
- tbStart.time = mktime(&tmStart);
|
|
|
- tbStart.millitm = 0;
|
|
|
-
|
|
|
- tmStop.tm_year -= 1900;
|
|
|
- tmStop.tm_mon -= 1;
|
|
|
- tbStop.time = mktime(&tmStop);
|
|
|
- tbStop.millitm = 0;
|
|
|
-
|
|
|
- result = DiffTimebSec(tbStart, tbStop);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- DEBUG_WARN("Start or stop date parsing error.\r\n");
|
|
|
- }
|
|
|
-
|
|
|
- return result;
|
|
|
-}
|
|
|
-
|
|
|
-int getStartSinceToday(uint8_t *stop)
|
|
|
-{
|
|
|
- int result = -1;
|
|
|
- time_t t;
|
|
|
- struct tm *tmStartToday;
|
|
|
- struct timeb tbStartToday;
|
|
|
- struct tm tmStop;
|
|
|
- struct timeb tbStop;
|
|
|
-
|
|
|
- if((sscanf((char*)stop, "%4d-%2d-%2dT%2d:%2d:%2d", &tmStop.tm_year, &tmStop.tm_mon, &tmStop.tm_mday, &tmStop.tm_hour, &tmStop.tm_min, &tmStop.tm_sec) == 6))
|
|
|
- {
|
|
|
- t=time(NULL);
|
|
|
- tmStartToday=localtime(&t);
|
|
|
- tmStartToday->tm_hour = 0;
|
|
|
- tmStartToday->tm_min = 0;
|
|
|
- tmStartToday->tm_sec = 0;
|
|
|
- tbStartToday.time = mktime(tmStartToday);
|
|
|
-
|
|
|
- tmStop.tm_year -= 1900;
|
|
|
- tmStop.tm_mon -= 1;
|
|
|
- tbStop.time = mktime(&tmStop);
|
|
|
- tbStop.millitm = 0;
|
|
|
-
|
|
|
- result = DiffTimebSec(tbStartToday, tbStop);
|
|
|
- }
|
|
|
-
|
|
|
- return result;
|
|
|
-}
|
|
|
-
|
|
|
-int getStartSinceWeek(uint8_t *stop)
|
|
|
-{
|
|
|
- int result = -1;
|
|
|
- time_t t;
|
|
|
- struct tm *tmStartWeek;
|
|
|
- struct timeb tbStartWeek;
|
|
|
- struct tm tmStop;
|
|
|
- struct timeb tbStop;
|
|
|
-
|
|
|
- if((sscanf((char*)stop, "%4d-%2d-%2dT%2d:%2d:%2d", &tmStop.tm_year, &tmStop.tm_mon, &tmStop.tm_mday, &tmStop.tm_hour, &tmStop.tm_min, &tmStop.tm_sec) == 6))
|
|
|
- {
|
|
|
- t=time(NULL);
|
|
|
- tmStartWeek=localtime(&t);
|
|
|
- t-=86400*tmStartWeek->tm_wday;
|
|
|
- tmStartWeek=localtime(&t);
|
|
|
-
|
|
|
- tmStartWeek->tm_hour = 0;
|
|
|
- tmStartWeek->tm_min = 0;
|
|
|
- tmStartWeek->tm_sec = 0;
|
|
|
- tbStartWeek.time = mktime(tmStartWeek);
|
|
|
-
|
|
|
- tmStop.tm_year -= 1900;
|
|
|
- tmStop.tm_mon -= 1;
|
|
|
- tbStop.time = mktime(&tmStop);
|
|
|
- tbStop.millitm = 0;
|
|
|
-
|
|
|
- result = DiffTimebSec(tbStartWeek, tbStop);
|
|
|
- }
|
|
|
-
|
|
|
- return result;
|
|
|
-}
|
|
|
-
|
|
|
-void checkCompositeSchedule(uint8_t connectorId, uint32_t durationReq, struct StructChargingProfile *compositeProfile)
|
|
|
-{
|
|
|
- FILE *fp;
|
|
|
- char profileFileName[128];
|
|
|
- char *line = NULL;
|
|
|
- size_t len = 0;
|
|
|
- time_t CurrentTime;
|
|
|
- struct tm *tmComposite;
|
|
|
-
|
|
|
- struct StructChargingProfile maxProfile;
|
|
|
- struct StructChargingProfile defaultTxProfile;
|
|
|
- struct StructChargingProfile txProfile;
|
|
|
-
|
|
|
- struct StructChargingSchedulePeriod tmpPeriod;
|
|
|
- uint8_t limitMax=0;
|
|
|
- uint8_t limitDef=0;
|
|
|
- uint8_t limitTx=0;
|
|
|
-
|
|
|
- int compositePeriodIdx = 0;
|
|
|
-
|
|
|
- CurrentTime = time(NULL);
|
|
|
- tmComposite=localtime(&CurrentTime);
|
|
|
- sprintf((char*)compositeProfile->ChargingSchedule.StartSchedule, "%04d-%02d-%02dT%02d:%02d:%02dZ", tmComposite->tm_year+1900, tmComposite->tm_mon+1, tmComposite->tm_mday, tmComposite->tm_hour, tmComposite->tm_min, tmComposite->tm_sec);
|
|
|
- sprintf((char*)compositeProfile->ChargingSchedule.ChargingRateUnit, "A");
|
|
|
- compositeProfile->ChargingSchedule.Duration = durationReq;
|
|
|
- for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(compositeProfile->ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
|
|
|
- {
|
|
|
- compositeProfile->ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod = -1;
|
|
|
- compositeProfile->ChargingSchedule.ChargingSchedulePeriod[idxPeriod].Limit = -1;
|
|
|
- compositeProfile->ChargingSchedule.ChargingSchedulePeriod[idxPeriod].NumberPhases = 3;
|
|
|
- }
|
|
|
- compositeProfile->ChargingProfileId = 1;
|
|
|
- compositeProfile->StackLevel = 99 ;
|
|
|
- sprintf((char*)compositeProfile->ChargingProfileKind ,"Absolute");
|
|
|
-
|
|
|
- maxProfile.ChargingProfileId = -1;
|
|
|
- defaultTxProfile.ChargingProfileId = -1;
|
|
|
- txProfile.ChargingProfileId = -1;
|
|
|
-
|
|
|
- system("yes|rm /tmp/*.json");
|
|
|
- system("cp /Storage/OCPP/*.json /tmp");
|
|
|
- /*
|
|
|
- * Search valid charging profile
|
|
|
- */
|
|
|
- //DEBUG_INFO("====================================\n");
|
|
|
- // Search max profile
|
|
|
- sprintf(profileFileName, "/tmp/ChargePointMaxProfile.json");
|
|
|
- if((access(profileFileName, F_OK))!=-1)
|
|
|
- {
|
|
|
- fp = fopen(profileFileName, "r");
|
|
|
-
|
|
|
- for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(maxProfile.ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
|
|
|
- {
|
|
|
- maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod = -1;
|
|
|
- maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].Limit = -1;
|
|
|
- maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].NumberPhases = 3;
|
|
|
- }
|
|
|
- maxProfile.ChargingProfileId = -1;
|
|
|
- maxProfile.StackLevel = -1;
|
|
|
-
|
|
|
- while(getline(&line, &len, fp) != -1)
|
|
|
- {
|
|
|
- json_object *obj = NULL;
|
|
|
-
|
|
|
- obj = json_tokener_parse(line);
|
|
|
- if(is_error(obj))
|
|
|
- {
|
|
|
- DEBUG_ERROR("Parse MaxProfile from file error.\n");
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- if((json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "ChargingProfileId")) != maxProfile.ChargingProfileId) &&
|
|
|
- (json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "stackLevel")) >= maxProfile.StackLevel)
|
|
|
- )
|
|
|
- {
|
|
|
- if((json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validFrom") != NULL) &&
|
|
|
- (json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validTo") != NULL)
|
|
|
- )
|
|
|
- {
|
|
|
- struct tm tmFrom, tmTo;
|
|
|
- struct timeb tbFrom, tbTo;
|
|
|
-
|
|
|
- if((sscanf((char*)json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validFrom")), "%4d-%2d-%2dT%2d:%2d:%2d", &tmFrom.tm_year, &tmFrom.tm_mon, &tmFrom.tm_mday, &tmFrom.tm_hour, &tmFrom.tm_min, &tmFrom.tm_sec) == 6) &&
|
|
|
- (sscanf((char*)json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validTo")), "%4d-%2d-%2dT%2d:%2d:%2d", &tmTo.tm_year, &tmTo.tm_mon, &tmTo.tm_mday, &tmTo.tm_hour, &tmTo.tm_min, &tmTo.tm_sec) == 6))
|
|
|
- {
|
|
|
- tmFrom.tm_year -= 1900;
|
|
|
- tmFrom.tm_mon -= 1;
|
|
|
- tbFrom.time = mktime(&tmFrom);
|
|
|
-
|
|
|
- tmTo.tm_year -= 1900;
|
|
|
- tmTo.tm_mon -= 1;
|
|
|
- tbTo.time = mktime(&tmTo);
|
|
|
-
|
|
|
- if((DiffTimebWithNowSec(tbFrom)>=0) && (DiffTimebWithNowSec(tbTo)<=0))
|
|
|
- {
|
|
|
- if(maxProfile.ChargingProfileId == -1)
|
|
|
- DEBUG_INFO("MaxProfile found.\n");
|
|
|
- else
|
|
|
- DEBUG_INFO("MaxProfile updated.\n");
|
|
|
-
|
|
|
- // Required item
|
|
|
- maxProfile.ChargingProfileId = json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingProfileId"));
|
|
|
- maxProfile.StackLevel = json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "stackLevel"));
|
|
|
- sprintf((char*)maxProfile.ChargingProfileKind, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingProfileKind")));
|
|
|
- sprintf((char*)maxProfile.ChargingSchedule.ChargingRateUnit, "A");
|
|
|
-
|
|
|
- for(int idxPeriod=0;idxPeriod<json_object_array_length(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"));idxPeriod++)
|
|
|
- {
|
|
|
- maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod = json_object_get_int(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "startPeriod"));
|
|
|
- maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].Limit = (strstr(json_object_get_string(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingRateUnit")),"W")!=NULL?json_object_get_double(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "limit"))/220:json_object_get_double(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "limit")));
|
|
|
- maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].NumberPhases = (json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "numberPhases")==NULL?
|
|
|
- 3:
|
|
|
- json_object_get_int(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "numberPhases")));
|
|
|
- }
|
|
|
-
|
|
|
- // Optional item
|
|
|
- if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validFrom") != NULL)
|
|
|
- {
|
|
|
- sprintf((char*)maxProfile.ValidFrom, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validFrom")));
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- sprintf((char*)maxProfile.ValidFrom, " ");
|
|
|
- }
|
|
|
-
|
|
|
- if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validTo") != NULL)
|
|
|
- {
|
|
|
- sprintf((char*)maxProfile.ValidTo, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validTo")));
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- sprintf((char*)maxProfile.ValidTo, " ");
|
|
|
- }
|
|
|
-
|
|
|
- if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "RecurrencyKind") != NULL)
|
|
|
- {
|
|
|
- sprintf((char*)maxProfile.RecurrencyKind, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "RecurrencyKind")));
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- sprintf((char*)maxProfile.RecurrencyKind, " ");
|
|
|
- }
|
|
|
-
|
|
|
- if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "transactionId") != NULL)
|
|
|
- {
|
|
|
- maxProfile.TransactionId = json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "transactionId"));
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- maxProfile.TransactionId = -1;
|
|
|
- }
|
|
|
-
|
|
|
- if(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "duration") != NULL)
|
|
|
- {
|
|
|
- maxProfile.ChargingSchedule.Duration = json_object_get_int(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "duration"));
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- maxProfile.ChargingSchedule.Duration = -1;
|
|
|
- }
|
|
|
-
|
|
|
- if(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "startSchedule") != NULL)
|
|
|
- {
|
|
|
- sprintf((char*)maxProfile.ChargingSchedule.StartSchedule, "%s", json_object_get_string(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "startSchedule")));
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- sprintf((char*)maxProfile.ChargingSchedule.StartSchedule, " ");
|
|
|
- }
|
|
|
-
|
|
|
- if(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "minChargingRate") != NULL)
|
|
|
- {
|
|
|
- maxProfile.ChargingSchedule.MinChargingRate = json_object_get_double(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "minChargingRate"));
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- maxProfile.ChargingSchedule.MinChargingRate = -1;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- if(maxProfile.ChargingProfileId == -1)
|
|
|
- DEBUG_INFO("MaxProfile found.\n");
|
|
|
- else
|
|
|
- DEBUG_INFO("MaxProfile updated.\n");
|
|
|
-
|
|
|
- // Required item
|
|
|
- maxProfile.ChargingProfileId = json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingProfileId"));
|
|
|
- maxProfile.StackLevel = json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "stackLevel"));
|
|
|
- sprintf((char*)maxProfile.ChargingProfileKind, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingProfileKind")));
|
|
|
- sprintf((char*)maxProfile.ChargingSchedule.ChargingRateUnit, "A");
|
|
|
-
|
|
|
- for(int idxPeriod=0;idxPeriod<json_object_array_length(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"));idxPeriod++)
|
|
|
- {
|
|
|
- maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod = json_object_get_int(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "startPeriod"));
|
|
|
- maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].Limit = (strstr((char*)json_object_get_string(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingRateUnit")),"W")!=NULL?json_object_get_double(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "limit"))/220:json_object_get_double(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "limit")));
|
|
|
- maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].NumberPhases = (json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "numberPhases")==NULL?
|
|
|
- 3:
|
|
|
- json_object_get_int(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "numberPhases")));
|
|
|
- }
|
|
|
-
|
|
|
- // Optional item
|
|
|
- if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validFrom") != NULL)
|
|
|
- {
|
|
|
- sprintf((char*)maxProfile.ValidFrom, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validFrom")));
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- sprintf((char*)maxProfile.ValidFrom, " ");
|
|
|
- }
|
|
|
-
|
|
|
- if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validTo") != NULL)
|
|
|
- {
|
|
|
- sprintf((char*)maxProfile.ValidTo, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validTo")));
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- sprintf((char*)maxProfile.ValidTo, " ");
|
|
|
- }
|
|
|
-
|
|
|
- if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "RecurrencyKind") != NULL)
|
|
|
- {
|
|
|
- sprintf((char*)maxProfile.RecurrencyKind, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "RecurrencyKind")));
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- sprintf((char*)maxProfile.RecurrencyKind, " ");
|
|
|
- }
|
|
|
-
|
|
|
- if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "transactionId") != NULL)
|
|
|
- {
|
|
|
- maxProfile.TransactionId = json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "transactionId"));
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- maxProfile.TransactionId = -1;
|
|
|
- }
|
|
|
-
|
|
|
- if(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "duration") != NULL)
|
|
|
- {
|
|
|
- maxProfile.ChargingSchedule.Duration = json_object_get_int(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "duration"));
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- maxProfile.ChargingSchedule.Duration = -1;
|
|
|
- }
|
|
|
-
|
|
|
- if(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "startSchedule") != NULL)
|
|
|
- {
|
|
|
- sprintf((char*)maxProfile.ChargingSchedule.StartSchedule, "%s", json_object_get_string(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "startSchedule")));
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- sprintf((char*)maxProfile.ChargingSchedule.StartSchedule, " ");
|
|
|
- }
|
|
|
-
|
|
|
- if(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "minChargingRate") != NULL)
|
|
|
- {
|
|
|
- maxProfile.ChargingSchedule.MinChargingRate = json_object_get_double(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "minChargingRate"));
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- maxProfile.ChargingSchedule.MinChargingRate = -1;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- json_object_put(obj);
|
|
|
- }
|
|
|
- fclose(fp);
|
|
|
-/*
|
|
|
- if(maxProfile.ChargingProfileId !=-1)
|
|
|
- {
|
|
|
- DEBUG_INFO("Profile ID: %d\n", maxProfile.ChargingProfileId);
|
|
|
- DEBUG_INFO("Profile stackLevel: %d\n", maxProfile.StackLevel);
|
|
|
- DEBUG_INFO("Profile TransactionId: %d\n", maxProfile.TransactionId);
|
|
|
- DEBUG_INFO("Profile valid from: %s\n", maxProfile.ValidFrom);
|
|
|
- DEBUG_INFO("Profile valid to: %s\n", maxProfile.ValidTo);
|
|
|
- DEBUG_INFO("Profile ChargingProfileKind: %s\n", maxProfile.ChargingProfileKind);
|
|
|
- DEBUG_INFO("Profile RecurrencyKind: %s\n", maxProfile.RecurrencyKind);
|
|
|
-
|
|
|
- DEBUG_INFO("Profile start schedule: %s\n", maxProfile.ChargingSchedule.StartSchedule);
|
|
|
- DEBUG_INFO("Profile schedule duration: %d\n", maxProfile.ChargingSchedule.Duration);
|
|
|
- DEBUG_INFO("Profile charging rate unit: %s\n", maxProfile.ChargingSchedule.ChargingRateUnit);
|
|
|
- DEBUG_INFO("Profile charging min rate: %f\n", maxProfile.ChargingSchedule.MinChargingRate);
|
|
|
-
|
|
|
- for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(maxProfile.ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
|
|
|
- {
|
|
|
- if(maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod >= 0)
|
|
|
- {
|
|
|
- DEBUG_INFO("Period-%02d startPeriod: %d\n", idxPeriod, maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod);
|
|
|
- DEBUG_INFO("Period-%02d limit: %f\n", idxPeriod, maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].Limit);
|
|
|
- DEBUG_INFO("Period-%02d NumberPhases: %d\n", idxPeriod, maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].NumberPhases);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- DEBUG_INFO("MaxProfile not found.\n");
|
|
|
- DEBUG_INFO("------------------------------------\n");*/
|
|
|
- }
|
|
|
-
|
|
|
- // Search default tx profile
|
|
|
- sprintf(profileFileName, "/tmp/TxDefaultProfile_%d.json", connectorId);
|
|
|
- if((access(profileFileName, F_OK))==-1)
|
|
|
- sprintf(profileFileName, "/tmp/TxDefaultProfile_0.json");
|
|
|
-
|
|
|
- if((access(profileFileName, F_OK))!=-1)
|
|
|
- {
|
|
|
- fp = fopen(profileFileName, "r");
|
|
|
-
|
|
|
- for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
|
|
|
- {
|
|
|
- defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod = -1;
|
|
|
- defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].Limit = -1;
|
|
|
- defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].NumberPhases = 3;
|
|
|
- }
|
|
|
- defaultTxProfile.ChargingProfileId = -1;
|
|
|
- defaultTxProfile.StackLevel = -1;
|
|
|
-
|
|
|
- while(getline(&line, &len, fp) != -1)
|
|
|
- {
|
|
|
- json_object *obj = NULL;
|
|
|
-
|
|
|
- obj = json_tokener_parse(line);
|
|
|
- if(is_error(obj))
|
|
|
- {
|
|
|
- DEBUG_ERROR("Parse TxDefaultProfile from file error.\n");
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- if((json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "ChargingProfileId")) != defaultTxProfile.ChargingProfileId) &&
|
|
|
- (json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "stackLevel")) >= defaultTxProfile.StackLevel)
|
|
|
- )
|
|
|
- {
|
|
|
- if((json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validFrom") != NULL) &&
|
|
|
- (json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validTo") != NULL)
|
|
|
- )
|
|
|
- {
|
|
|
- struct tm tmFrom, tmTo;
|
|
|
- struct timeb tbFrom, tbTo;
|
|
|
-
|
|
|
- if((sscanf((char*)json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validFrom")), "%4d-%2d-%2dT%2d:%2d:%2d", &tmFrom.tm_year, &tmFrom.tm_mon, &tmFrom.tm_mday, &tmFrom.tm_hour, &tmFrom.tm_min, &tmFrom.tm_sec) == 6) &&
|
|
|
- (sscanf((char*)json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validTo")), "%4d-%2d-%2dT%2d:%2d:%2d", &tmTo.tm_year, &tmTo.tm_mon, &tmTo.tm_mday, &tmTo.tm_hour, &tmTo.tm_min, &tmTo.tm_sec) == 6))
|
|
|
- {
|
|
|
- tmFrom.tm_year -= 1900;
|
|
|
- tmFrom.tm_mon -= 1;
|
|
|
- tbFrom.time = mktime(&tmFrom);
|
|
|
-
|
|
|
- tmTo.tm_year -= 1900;
|
|
|
- tmTo.tm_mon -= 1;
|
|
|
- tbTo.time = mktime(&tmTo);
|
|
|
-
|
|
|
- if((DiffTimebWithNowSec(tbFrom)>=0) && (DiffTimebWithNowSec(tbTo)<=0))
|
|
|
- {
|
|
|
- if(defaultTxProfile.ChargingProfileId == -1)
|
|
|
- DEBUG_INFO("TxDefaultProfile found.\n");
|
|
|
- else
|
|
|
- DEBUG_INFO("TxDefaultProfile updated.\n");
|
|
|
-
|
|
|
- // Required item
|
|
|
- defaultTxProfile.ChargingProfileId = json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingProfileId"));
|
|
|
- defaultTxProfile.StackLevel = json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "stackLevel"));
|
|
|
- sprintf((char*)defaultTxProfile.ChargingProfileKind, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingProfileKind")));
|
|
|
- sprintf((char*)defaultTxProfile.ChargingSchedule.ChargingRateUnit, "A");
|
|
|
-
|
|
|
- for(int idxPeriod=0;idxPeriod<json_object_array_length(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"));idxPeriod++)
|
|
|
- {
|
|
|
- defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod = json_object_get_int(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "startPeriod"));
|
|
|
- defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].Limit = (strstr(json_object_get_string(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingRateUnit")),"W")!=NULL?json_object_get_double(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "limit"))/220:json_object_get_double(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "limit")));
|
|
|
- defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].NumberPhases = (json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "numberPhases")==NULL?
|
|
|
- 3:
|
|
|
- json_object_get_int(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "numberPhases")));
|
|
|
- }
|
|
|
-
|
|
|
- // Optional item
|
|
|
- if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validFrom") != NULL)
|
|
|
- {
|
|
|
- sprintf((char*)defaultTxProfile.ValidFrom, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validFrom")));
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- sprintf((char*)defaultTxProfile.ValidFrom, " ");
|
|
|
- }
|
|
|
-
|
|
|
- if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validTo") != NULL)
|
|
|
- {
|
|
|
- sprintf((char*)defaultTxProfile.ValidTo, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validTo")));
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- sprintf((char*)defaultTxProfile.ValidTo, " ");
|
|
|
- }
|
|
|
-
|
|
|
- if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "RecurrencyKind") != NULL)
|
|
|
- {
|
|
|
- sprintf((char*)defaultTxProfile.RecurrencyKind, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "RecurrencyKind")));
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- sprintf((char*)defaultTxProfile.RecurrencyKind, " ");
|
|
|
- }
|
|
|
-
|
|
|
- if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "transactionId") != NULL)
|
|
|
- {
|
|
|
- defaultTxProfile.TransactionId = json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "transactionId"));
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- defaultTxProfile.TransactionId = -1;
|
|
|
- }
|
|
|
-
|
|
|
- if(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "duration") != NULL)
|
|
|
- {
|
|
|
- defaultTxProfile.ChargingSchedule.Duration = json_object_get_int(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "duration"));
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- defaultTxProfile.ChargingSchedule.Duration = -1;
|
|
|
- }
|
|
|
-
|
|
|
- if(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "startSchedule") != NULL)
|
|
|
- {
|
|
|
- sprintf((char*)defaultTxProfile.ChargingSchedule.StartSchedule, "%s", json_object_get_string(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "startSchedule")));
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- sprintf((char*)defaultTxProfile.ChargingSchedule.StartSchedule, " ");
|
|
|
- }
|
|
|
-
|
|
|
- if(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "minChargingRate") != NULL)
|
|
|
- {
|
|
|
- defaultTxProfile.ChargingSchedule.MinChargingRate = json_object_get_double(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "minChargingRate"));
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- defaultTxProfile.ChargingSchedule.MinChargingRate = -1;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- if(defaultTxProfile.ChargingProfileId == -1)
|
|
|
- DEBUG_INFO("TxDefaultProfile found.\n");
|
|
|
- else
|
|
|
- DEBUG_INFO("TxDefaultProfile updated.\n");
|
|
|
-
|
|
|
- // Required item
|
|
|
- defaultTxProfile.ChargingProfileId = json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingProfileId"));
|
|
|
- defaultTxProfile.StackLevel = json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "stackLevel"));
|
|
|
- sprintf((char*)defaultTxProfile.ChargingProfileKind, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingProfileKind")));
|
|
|
- sprintf((char*)defaultTxProfile.ChargingSchedule.ChargingRateUnit, "A");
|
|
|
-
|
|
|
- for(int idxPeriod=0;idxPeriod<json_object_array_length(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"));idxPeriod++)
|
|
|
- {
|
|
|
- defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod = json_object_get_int(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "startPeriod"));
|
|
|
- defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].Limit = (strstr(json_object_get_string(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingRateUnit")),"W")!=NULL?json_object_get_double(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "limit"))/220:json_object_get_double(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "limit")));
|
|
|
- defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].NumberPhases = (json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "numberPhases")==NULL?
|
|
|
- 3:
|
|
|
- json_object_get_int(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "numberPhases")));
|
|
|
- }
|
|
|
-
|
|
|
- // Optional item
|
|
|
- if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validFrom") != NULL)
|
|
|
- {
|
|
|
- sprintf((char*)defaultTxProfile.ValidFrom, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validFrom")));
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- sprintf((char*)defaultTxProfile.ValidFrom, " ");
|
|
|
- }
|
|
|
-
|
|
|
- if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validTo") != NULL)
|
|
|
- {
|
|
|
- sprintf((char*)defaultTxProfile.ValidTo, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validTo")));
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- sprintf((char*)defaultTxProfile.ValidTo, " ");
|
|
|
- }
|
|
|
-
|
|
|
- if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "RecurrencyKind") != NULL)
|
|
|
- {
|
|
|
- sprintf((char*)defaultTxProfile.RecurrencyKind, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "RecurrencyKind")));
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- sprintf((char*)defaultTxProfile.RecurrencyKind, " ");
|
|
|
- }
|
|
|
-
|
|
|
- if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "transactionId") != NULL)
|
|
|
- {
|
|
|
- defaultTxProfile.TransactionId = json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "transactionId"));
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- defaultTxProfile.TransactionId = -1;
|
|
|
- }
|
|
|
-
|
|
|
- if(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "duration") != NULL)
|
|
|
- {
|
|
|
- defaultTxProfile.ChargingSchedule.Duration = json_object_get_int(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "duration"));
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- defaultTxProfile.ChargingSchedule.Duration = -1;
|
|
|
- }
|
|
|
-
|
|
|
- if(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "startSchedule") != NULL)
|
|
|
- {
|
|
|
- sprintf((char*)defaultTxProfile.ChargingSchedule.StartSchedule, "%s", json_object_get_string(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "startSchedule")));
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- sprintf((char*)defaultTxProfile.ChargingSchedule.StartSchedule, " ");
|
|
|
- }
|
|
|
-
|
|
|
- if(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "minChargingRate") != NULL)
|
|
|
- {
|
|
|
- maxProfile.ChargingSchedule.MinChargingRate = json_object_get_double(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "minChargingRate"));
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- maxProfile.ChargingSchedule.MinChargingRate = -1;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- json_object_put(obj);
|
|
|
- }
|
|
|
- fclose(fp);
|
|
|
-/*
|
|
|
- if(defaultTxProfile.ChargingProfileId != -1)
|
|
|
- {
|
|
|
- DEBUG_INFO("Profile ID: %d\n", defaultTxProfile.ChargingProfileId);
|
|
|
- DEBUG_INFO("Profile stackLevel: %d\n", defaultTxProfile.StackLevel);
|
|
|
- DEBUG_INFO("Profile TransactionId: %d\n", defaultTxProfile.TransactionId);
|
|
|
- DEBUG_INFO("Profile valid from: %s\n", defaultTxProfile.ValidFrom);
|
|
|
- DEBUG_INFO("Profile valid to: %s\n", defaultTxProfile.ValidTo);
|
|
|
- DEBUG_INFO("Profile ChargingProfileKind: %s\n", defaultTxProfile.ChargingProfileKind);
|
|
|
- DEBUG_INFO("Profile RecurrencyKind: %s\n", defaultTxProfile.RecurrencyKind);
|
|
|
-
|
|
|
- DEBUG_INFO("Profile start schedule: %s\n", defaultTxProfile.ChargingSchedule.StartSchedule);
|
|
|
- DEBUG_INFO("Profile schedule duration: %d\n", defaultTxProfile.ChargingSchedule.Duration);
|
|
|
- DEBUG_INFO("Profile charging rate unit: %s\n", defaultTxProfile.ChargingSchedule.ChargingRateUnit);
|
|
|
- DEBUG_INFO("Profile charging min rate: %f\n", defaultTxProfile.ChargingSchedule.MinChargingRate);
|
|
|
-
|
|
|
- for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
|
|
|
- {
|
|
|
- if(defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod >= 0)
|
|
|
- {
|
|
|
- DEBUG_INFO("Period-%02d startPeriod: %d\n", idxPeriod, defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod);
|
|
|
- DEBUG_INFO("Period-%02d limit: %f\n", idxPeriod, defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].Limit);
|
|
|
- DEBUG_INFO("Period-%02d NumberPhases: %d\n", idxPeriod, defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].NumberPhases);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- DEBUG_INFO("TxDefaultProfile not found.\n");
|
|
|
-
|
|
|
- DEBUG_INFO("------------------------------------\n");*/
|
|
|
- }
|
|
|
-
|
|
|
- // Search tx profile
|
|
|
- sprintf(profileFileName, "/tmp/TxProfile_%d.json", connectorId);
|
|
|
- if((access(profileFileName, F_OK))!=-1)
|
|
|
- {
|
|
|
- fp = fopen(profileFileName, "r");
|
|
|
-
|
|
|
- for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(txProfile.ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
|
|
|
- {
|
|
|
- txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod = -1;
|
|
|
- txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].Limit = -1;
|
|
|
- txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].NumberPhases = 3;
|
|
|
- }
|
|
|
- txProfile.ChargingProfileId = -1;
|
|
|
- txProfile.StackLevel = -1;
|
|
|
-
|
|
|
- while(getline(&line, &len, fp) != -1)
|
|
|
- {
|
|
|
- json_object *obj = NULL;
|
|
|
-
|
|
|
- obj = json_tokener_parse(line);
|
|
|
- if(is_error(obj))
|
|
|
- {
|
|
|
- DEBUG_ERROR("Parse txProfile from file error.\n");
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- if((json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "ChargingProfileId")) != txProfile.ChargingProfileId) &&
|
|
|
- (json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "stackLevel")) >= txProfile.StackLevel)
|
|
|
- )
|
|
|
- {
|
|
|
- if((json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validFrom") != NULL) &&
|
|
|
- (json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validTo") != NULL)
|
|
|
- )
|
|
|
- {
|
|
|
- struct tm tmFrom, tmTo;
|
|
|
- struct timeb tbFrom, tbTo;
|
|
|
-
|
|
|
- if((sscanf((char*)json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validFrom")), "%4d-%2d-%2dT%2d:%2d:%2d", &tmFrom.tm_year, &tmFrom.tm_mon, &tmFrom.tm_mday, &tmFrom.tm_hour, &tmFrom.tm_min, &tmFrom.tm_sec) == 6) &&
|
|
|
- (sscanf((char*)json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validTo")), "%4d-%2d-%2dT%2d:%2d:%2d", &tmTo.tm_year, &tmTo.tm_mon, &tmTo.tm_mday, &tmTo.tm_hour, &tmTo.tm_min, &tmTo.tm_sec) == 6))
|
|
|
- {
|
|
|
- tmFrom.tm_year -= 1900;
|
|
|
- tmFrom.tm_mon -= 1;
|
|
|
- tbFrom.time = mktime(&tmFrom);
|
|
|
-
|
|
|
- tmTo.tm_year -= 1900;
|
|
|
- tmTo.tm_mon -= 1;
|
|
|
- tbTo.time = mktime(&tmTo);
|
|
|
-
|
|
|
- if((DiffTimebWithNowSec(tbFrom)>=0) && (DiffTimebWithNowSec(tbTo)<=0))
|
|
|
- {
|
|
|
- if(txProfile.ChargingProfileId == -1)
|
|
|
- DEBUG_INFO("TxProfile found.\n");
|
|
|
- else
|
|
|
- DEBUG_INFO("TxProfile updated.\n");
|
|
|
-
|
|
|
- // Required item
|
|
|
- txProfile.ChargingProfileId = json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingProfileId"));
|
|
|
- txProfile.StackLevel = json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "stackLevel"));
|
|
|
- sprintf((char*)txProfile.ChargingProfileKind, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingProfileKind")));
|
|
|
- sprintf((char*)txProfile.ChargingSchedule.ChargingRateUnit, "A");
|
|
|
-
|
|
|
- for(int idxPeriod=0;idxPeriod<json_object_array_length(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"));idxPeriod++)
|
|
|
- {
|
|
|
- txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod = json_object_get_int(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "startPeriod"));
|
|
|
- txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].Limit = (strstr(json_object_get_string(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingRateUnit")),"W")!=NULL?json_object_get_double(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "limit"))/220:json_object_get_double(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "limit")));
|
|
|
- txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].NumberPhases = (json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "numberPhases")==NULL?
|
|
|
- 3:
|
|
|
- json_object_get_int(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "numberPhases")));
|
|
|
- }
|
|
|
-
|
|
|
- // Optional item
|
|
|
- if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validFrom") != NULL)
|
|
|
- {
|
|
|
- sprintf((char*)txProfile.ValidFrom, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validFrom")));
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- sprintf((char*)txProfile.ValidFrom, " ");
|
|
|
- }
|
|
|
-
|
|
|
- if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validTo") != NULL)
|
|
|
- {
|
|
|
- sprintf((char*)txProfile.ValidTo, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validTo")));
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- sprintf((char*)txProfile.ValidTo, " ");
|
|
|
- }
|
|
|
-
|
|
|
- if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "RecurrencyKind") != NULL)
|
|
|
- {
|
|
|
- sprintf((char*)txProfile.RecurrencyKind, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "RecurrencyKind")));
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- sprintf((char*)txProfile.RecurrencyKind, " ");
|
|
|
- }
|
|
|
-
|
|
|
- if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "transactionId") != NULL)
|
|
|
- {
|
|
|
- txProfile.TransactionId = json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "transactionId"));
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- txProfile.TransactionId = -1;
|
|
|
- }
|
|
|
-
|
|
|
- if(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "duration") != NULL)
|
|
|
- {
|
|
|
- txProfile.ChargingSchedule.Duration = json_object_get_int(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "duration"));
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- txProfile.ChargingSchedule.Duration = -1;
|
|
|
- }
|
|
|
-
|
|
|
- if(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "startSchedule") != NULL)
|
|
|
- {
|
|
|
- sprintf((char*)txProfile.ChargingSchedule.StartSchedule, "%s", json_object_get_string(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "startSchedule")));
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- sprintf((char*)txProfile.ChargingSchedule.StartSchedule, " ");
|
|
|
- }
|
|
|
-
|
|
|
- if(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "minChargingRate") != NULL)
|
|
|
- {
|
|
|
- txProfile.ChargingSchedule.MinChargingRate = json_object_get_double(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "minChargingRate"));
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- txProfile.ChargingSchedule.MinChargingRate = -1;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- if(txProfile.ChargingProfileId == -1)
|
|
|
- DEBUG_INFO("TxProfile found.\n");
|
|
|
- else
|
|
|
- DEBUG_INFO("TxProfile updated.\n");
|
|
|
-
|
|
|
- // Required item
|
|
|
- txProfile.ChargingProfileId = json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingProfileId"));
|
|
|
- txProfile.StackLevel = json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "stackLevel"));
|
|
|
- sprintf((char*)txProfile.ChargingProfileKind, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingProfileKind")));
|
|
|
- sprintf((char*)txProfile.ChargingSchedule.ChargingRateUnit, "A");
|
|
|
-
|
|
|
- for(int idxPeriod=0;idxPeriod<json_object_array_length(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"));idxPeriod++)
|
|
|
- {
|
|
|
- txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod = json_object_get_int(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "startPeriod"));
|
|
|
- txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].Limit = (strstr(json_object_get_string(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingRateUnit")),"W")!=NULL?json_object_get_double(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "limit"))/220:json_object_get_double(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "limit")));
|
|
|
- txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].NumberPhases = (json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "numberPhases")==NULL?
|
|
|
- 3:
|
|
|
- json_object_get_int(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "numberPhases")));
|
|
|
- }
|
|
|
-
|
|
|
- // Optional item
|
|
|
- if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validFrom") != NULL)
|
|
|
- {
|
|
|
- sprintf((char*)txProfile.ValidFrom, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validFrom")));
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- sprintf((char*)txProfile.ValidFrom, " ");
|
|
|
- }
|
|
|
-
|
|
|
- if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validTo") != NULL)
|
|
|
- {
|
|
|
- sprintf((char*)txProfile.ValidTo, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validTo")));
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- sprintf((char*)txProfile.ValidTo, " ");
|
|
|
- }
|
|
|
-
|
|
|
- if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "RecurrencyKind") != NULL)
|
|
|
- {
|
|
|
- sprintf((char*)txProfile.RecurrencyKind, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "RecurrencyKind")));
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- sprintf((char*)txProfile.RecurrencyKind, " ");
|
|
|
- }
|
|
|
-
|
|
|
- if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "transactionId") != NULL)
|
|
|
- {
|
|
|
- txProfile.TransactionId = json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "transactionId"));
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- txProfile.TransactionId = -1;
|
|
|
- }
|
|
|
-
|
|
|
- if(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "duration") != NULL)
|
|
|
- {
|
|
|
- txProfile.ChargingSchedule.Duration = json_object_get_int(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "duration"));
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- txProfile.ChargingSchedule.Duration = -1;
|
|
|
- }
|
|
|
-
|
|
|
- if(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "startSchedule") != NULL)
|
|
|
- {
|
|
|
- sprintf((char*)txProfile.ChargingSchedule.StartSchedule, "%s", json_object_get_string(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "startSchedule")));
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- sprintf((char*)txProfile.ChargingSchedule.StartSchedule, " ");
|
|
|
- }
|
|
|
-
|
|
|
- if(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "minChargingRate") != NULL)
|
|
|
- {
|
|
|
- maxProfile.ChargingSchedule.MinChargingRate = json_object_get_double(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "minChargingRate"));
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- maxProfile.ChargingSchedule.MinChargingRate = -1;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- json_object_put(obj);
|
|
|
- }
|
|
|
- fclose(fp);
|
|
|
-/*
|
|
|
- if(defaultTxProfile.ChargingProfileId != -1)
|
|
|
- {
|
|
|
- DEBUG_INFO("Profile ID: %d\n", txProfile.ChargingProfileId);
|
|
|
- DEBUG_INFO("Profile stackLevel: %d\n", txProfile.StackLevel);
|
|
|
- DEBUG_INFO("Profile TransactionId: %d\n", txProfile.TransactionId);
|
|
|
- DEBUG_INFO("Profile valid from: %s\n", txProfile.ValidFrom);
|
|
|
- DEBUG_INFO("Profile valid to: %s\n", txProfile.ValidTo);
|
|
|
- DEBUG_INFO("Profile ChargingProfileKind: %s\n", txProfile.ChargingProfileKind);
|
|
|
- DEBUG_INFO("Profile RecurrencyKind: %s\n", txProfile.RecurrencyKind);
|
|
|
-
|
|
|
- DEBUG_INFO("Profile start schedule: %s\n", txProfile.ChargingSchedule.StartSchedule);
|
|
|
- DEBUG_INFO("Profile schedule duration: %d\n", txProfile.ChargingSchedule.Duration);
|
|
|
- DEBUG_INFO("Profile charging rate unit: %s\n", txProfile.ChargingSchedule.ChargingRateUnit);
|
|
|
- DEBUG_INFO("Profile charging min rate: %f\n", txProfile.ChargingSchedule.MinChargingRate);
|
|
|
-
|
|
|
- for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(txProfile.ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
|
|
|
- {
|
|
|
- if(txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod >= 0)
|
|
|
- {
|
|
|
- DEBUG_INFO("Period-%02d startPeriod: %d\n", idxPeriod, txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod);
|
|
|
- DEBUG_INFO("Period-%02d limit: %f\n", idxPeriod, txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].Limit);
|
|
|
- DEBUG_INFO("Period-%02d NumberPhases: %d\n", idxPeriod, txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].NumberPhases);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- DEBUG_INFO("TxProfile not found.\n");*/
|
|
|
- }
|
|
|
-
|
|
|
- /*
|
|
|
- * Align found profile start schedule & periods
|
|
|
- */
|
|
|
- //DEBUG_INFO("====================================\n");
|
|
|
- /*
|
|
|
- // For local test usage, force modify found profile start schedule info
|
|
|
- sprintf((char*)maxProfile.ChargingSchedule.StartSchedule, "%04d-%02d-%02dT%02d:%02d:%02dZ", tmComposite->tm_year+1900, tmComposite->tm_mon+1, tmComposite->tm_mday, tmComposite->tm_hour, tmComposite->tm_min, tmComposite->tm_sec-10);
|
|
|
- sprintf((char*)defaultTxProfile.ChargingSchedule.StartSchedule, "%04d-%02d-%02dT%02d:%02d:%02dZ", tmComposite->tm_year+1900, tmComposite->tm_mon+1, tmComposite->tm_mday, tmComposite->tm_hour, tmComposite->tm_min, tmComposite->tm_sec-5);
|
|
|
- sprintf((char*)txProfile.ChargingSchedule.StartSchedule, "%04d-%02d-%02dT%02d:%02d:%02dZ", tmComposite->tm_year+1900, tmComposite->tm_mon+1, tmComposite->tm_mday, tmComposite->tm_hour, tmComposite->tm_min, tmComposite->tm_sec-3);
|
|
|
-*/
|
|
|
-
|
|
|
- if(maxProfile.ChargingProfileId != -1)
|
|
|
- {
|
|
|
- if(strstr((char*)maxProfile.ChargingProfileKind, "Absolute") != NULL)
|
|
|
- {
|
|
|
- if(maxProfile.ChargingSchedule.Duration != -1)
|
|
|
- {
|
|
|
- maxProfile.ChargingSchedule.Duration = ((maxProfile.ChargingSchedule.Duration-getStartStop(maxProfile.ChargingSchedule.StartSchedule, compositeProfile->ChargingSchedule.StartSchedule))<0?
|
|
|
- 0:
|
|
|
- (maxProfile.ChargingSchedule.Duration-getStartStop(maxProfile.ChargingSchedule.StartSchedule, compositeProfile->ChargingSchedule.StartSchedule)));
|
|
|
- }
|
|
|
-
|
|
|
- for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(maxProfile.ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
|
|
|
- {
|
|
|
- if(maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod != -1)
|
|
|
- {
|
|
|
- maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod = ((maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartStop(maxProfile.ChargingSchedule.StartSchedule, compositeProfile->ChargingSchedule.StartSchedule))<0?
|
|
|
- 0:
|
|
|
- (maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartStop(maxProfile.ChargingSchedule.StartSchedule, compositeProfile->ChargingSchedule.StartSchedule)));
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- else if(strstr((char*)maxProfile.ChargingProfileKind, "Relative") != NULL)
|
|
|
- {
|
|
|
- if(maxProfile.ChargingSchedule.Duration != -1)
|
|
|
- {
|
|
|
- maxProfile.ChargingSchedule.Duration = (strstr((char*)ShmOCPP16Data->StatusNotification[(connectorId==0?0:connectorId-1)].Status, "Charging")==NULL)?maxProfile.ChargingSchedule.Duration:((maxProfile.ChargingSchedule.Duration-getStartStop(ShmOCPP16Data->StartTransaction[(connectorId==0?0:connectorId-1)].Timestamp, compositeProfile->ChargingSchedule.StartSchedule))<0?
|
|
|
- 0:
|
|
|
- (maxProfile.ChargingSchedule.Duration-getStartStop(ShmOCPP16Data->StartTransaction[(connectorId==0?0:connectorId-1)].Timestamp, compositeProfile->ChargingSchedule.StartSchedule)));
|
|
|
- }
|
|
|
-
|
|
|
- for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(maxProfile.ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
|
|
|
- {
|
|
|
- if(maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod != -1)
|
|
|
- {
|
|
|
- maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod = (strstr((char*)ShmOCPP16Data->StatusNotification[(connectorId==0?0:connectorId-1)].Status, "Charging")==NULL)?maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod:((maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartStop(ShmOCPP16Data->StartTransaction[(connectorId==0?0:connectorId-1)].Timestamp, compositeProfile->ChargingSchedule.StartSchedule))<0?
|
|
|
- 0:
|
|
|
- (maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartStop(ShmOCPP16Data->StartTransaction[(connectorId==0?0:connectorId-1)].Timestamp, compositeProfile->ChargingSchedule.StartSchedule)));
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- if(strstr((char*)maxProfile.RecurrencyKind, "Weekly") != NULL)
|
|
|
- {
|
|
|
- if(maxProfile.ChargingSchedule.Duration != -1)
|
|
|
- {
|
|
|
- maxProfile.ChargingSchedule.Duration = ((maxProfile.ChargingSchedule.Duration-getStartSinceWeek(compositeProfile->ChargingSchedule.StartSchedule))<0?
|
|
|
- 0:
|
|
|
- (maxProfile.ChargingSchedule.Duration-getStartSinceWeek(compositeProfile->ChargingSchedule.StartSchedule)));
|
|
|
- }
|
|
|
-
|
|
|
- for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(maxProfile.ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
|
|
|
- {
|
|
|
- if(maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod != -1)
|
|
|
- {
|
|
|
- maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod = ((maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartSinceWeek(compositeProfile->ChargingSchedule.StartSchedule))<0?
|
|
|
- 0:
|
|
|
- (maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartSinceWeek(compositeProfile->ChargingSchedule.StartSchedule)));
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- if(maxProfile.ChargingSchedule.Duration != -1)
|
|
|
- {
|
|
|
- maxProfile.ChargingSchedule.Duration = ((maxProfile.ChargingSchedule.Duration-getStartSinceToday(compositeProfile->ChargingSchedule.StartSchedule))<0?
|
|
|
- 0:
|
|
|
- (maxProfile.ChargingSchedule.Duration-getStartSinceToday(compositeProfile->ChargingSchedule.StartSchedule)));
|
|
|
- }
|
|
|
-
|
|
|
- for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(maxProfile.ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
|
|
|
- {
|
|
|
- if(maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod != -1)
|
|
|
- {
|
|
|
- maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod = ((maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartSinceToday(compositeProfile->ChargingSchedule.StartSchedule))<0?
|
|
|
- 0:
|
|
|
- (maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartSinceToday(compositeProfile->ChargingSchedule.StartSchedule)));
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-/*
|
|
|
- DEBUG_INFO("MaxProfile after align.\n");
|
|
|
- DEBUG_INFO("Profile ID: %d\n", maxProfile.ChargingProfileId);
|
|
|
- DEBUG_INFO("Profile stackLevel: %d\n", maxProfile.StackLevel);
|
|
|
- DEBUG_INFO("Profile TransactionId: %d\n", maxProfile.TransactionId);
|
|
|
- DEBUG_INFO("Profile valid from: %s\n", maxProfile.ValidFrom);
|
|
|
- DEBUG_INFO("Profile valid to: %s\n", maxProfile.ValidTo);
|
|
|
- DEBUG_INFO("Profile ChargingProfileKind: %s\n", maxProfile.ChargingProfileKind);
|
|
|
- DEBUG_INFO("Profile RecurrencyKind: %s\n", maxProfile.RecurrencyKind);
|
|
|
-
|
|
|
- DEBUG_INFO("Profile start schedule: %s\n", compositeProfile->ChargingSchedule.StartSchedule);
|
|
|
- DEBUG_INFO("Profile schedule duration: %d\n", maxProfile.ChargingSchedule.Duration);
|
|
|
- DEBUG_INFO("Profile charging rate unit: %s\n", maxProfile.ChargingSchedule.ChargingRateUnit);
|
|
|
- DEBUG_INFO("Profile charging min rate: %f\n", maxProfile.ChargingSchedule.MinChargingRate);
|
|
|
-
|
|
|
- for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(maxProfile.ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
|
|
|
- {
|
|
|
- if(maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod >= 0)
|
|
|
- {
|
|
|
- DEBUG_INFO("Period-%02d startPeriod: %d\n", idxPeriod, maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod);
|
|
|
- DEBUG_INFO("Period-%02d limit: %f\n", idxPeriod, maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].Limit);
|
|
|
- DEBUG_INFO("Period-%02d NumberPhases: %d\n", idxPeriod, maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].NumberPhases);
|
|
|
- }
|
|
|
- }
|
|
|
- DEBUG_INFO("------------------------------------\n");*/
|
|
|
- }
|
|
|
-
|
|
|
- if(defaultTxProfile.ChargingProfileId != -1)
|
|
|
- {
|
|
|
- if(strstr((char*)defaultTxProfile.ChargingProfileKind, "Absolute") != NULL)
|
|
|
- {
|
|
|
- if(defaultTxProfile.ChargingSchedule.Duration != -1)
|
|
|
- {
|
|
|
- defaultTxProfile.ChargingSchedule.Duration = ((defaultTxProfile.ChargingSchedule.Duration-getStartStop(defaultTxProfile.ChargingSchedule.StartSchedule, compositeProfile->ChargingSchedule.StartSchedule))<0?
|
|
|
- 0:
|
|
|
- (defaultTxProfile.ChargingSchedule.Duration-getStartStop(defaultTxProfile.ChargingSchedule.StartSchedule, compositeProfile->ChargingSchedule.StartSchedule)));
|
|
|
- }
|
|
|
-
|
|
|
- for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
|
|
|
- {
|
|
|
- if(defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod != -1)
|
|
|
- {
|
|
|
- defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod = ((defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartStop(defaultTxProfile.ChargingSchedule.StartSchedule, compositeProfile->ChargingSchedule.StartSchedule))<0?
|
|
|
- 0:
|
|
|
- (defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartStop(defaultTxProfile.ChargingSchedule.StartSchedule, compositeProfile->ChargingSchedule.StartSchedule)));
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- else if(strstr((char*)defaultTxProfile.ChargingProfileKind, "Relative") != NULL)
|
|
|
- {
|
|
|
- if(defaultTxProfile.ChargingSchedule.Duration != -1)
|
|
|
- {
|
|
|
- defaultTxProfile.ChargingSchedule.Duration = (strstr((char*)ShmOCPP16Data->StatusNotification[(connectorId==0?0:connectorId-1)].Status, "Charging")==NULL)?defaultTxProfile.ChargingSchedule.Duration:((defaultTxProfile.ChargingSchedule.Duration-getStartStop(ShmOCPP16Data->StartTransaction[(connectorId==0?0:connectorId-1)].Timestamp, compositeProfile->ChargingSchedule.StartSchedule))<0?
|
|
|
- 0:
|
|
|
- (defaultTxProfile.ChargingSchedule.Duration-getStartStop(ShmOCPP16Data->StartTransaction[(connectorId==0?0:connectorId-1)].Timestamp, compositeProfile->ChargingSchedule.StartSchedule)));
|
|
|
- }
|
|
|
-
|
|
|
- for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
|
|
|
- {
|
|
|
- if(defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod != -1)
|
|
|
- {
|
|
|
- defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod = (strstr((char*)ShmOCPP16Data->StatusNotification[(connectorId==0?0:connectorId-1)].Status, "Charging")==NULL)?defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod:((defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartStop(ShmOCPP16Data->StartTransaction[(connectorId==0?0:connectorId-1)].Timestamp, compositeProfile->ChargingSchedule.StartSchedule))<0?
|
|
|
- 0:
|
|
|
- (defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartStop(ShmOCPP16Data->StartTransaction[(connectorId==0?0:connectorId-1)].Timestamp, compositeProfile->ChargingSchedule.StartSchedule)));
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- if(strstr((char*)defaultTxProfile.RecurrencyKind, "Weekly") != NULL)
|
|
|
- {
|
|
|
- if(defaultTxProfile.ChargingSchedule.Duration != -1)
|
|
|
- {
|
|
|
- defaultTxProfile.ChargingSchedule.Duration = ((defaultTxProfile.ChargingSchedule.Duration-getStartSinceWeek(compositeProfile->ChargingSchedule.StartSchedule))<0?
|
|
|
- 0:
|
|
|
- (defaultTxProfile.ChargingSchedule.Duration-getStartSinceWeek(compositeProfile->ChargingSchedule.StartSchedule)));
|
|
|
- }
|
|
|
-
|
|
|
- for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
|
|
|
- {
|
|
|
- if(defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod != -1)
|
|
|
- {
|
|
|
- defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod = ((defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartSinceWeek(compositeProfile->ChargingSchedule.StartSchedule))<0?
|
|
|
- 0:
|
|
|
- (defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartSinceWeek(compositeProfile->ChargingSchedule.StartSchedule)));
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- if(defaultTxProfile.ChargingSchedule.Duration != -1)
|
|
|
- {
|
|
|
- defaultTxProfile.ChargingSchedule.Duration = ((defaultTxProfile.ChargingSchedule.Duration-getStartSinceToday(compositeProfile->ChargingSchedule.StartSchedule))<0?
|
|
|
- 0:
|
|
|
- (defaultTxProfile.ChargingSchedule.Duration-getStartSinceToday(compositeProfile->ChargingSchedule.StartSchedule)));
|
|
|
- }
|
|
|
-
|
|
|
- for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
|
|
|
- {
|
|
|
- if(defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod != -1)
|
|
|
- {
|
|
|
- defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod = ((defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartSinceToday(compositeProfile->ChargingSchedule.StartSchedule))<0?
|
|
|
- 0:
|
|
|
- (defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartSinceToday(compositeProfile->ChargingSchedule.StartSchedule)));
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-/*
|
|
|
- DEBUG_INFO("defaultTxProfile after align.\n");
|
|
|
- DEBUG_INFO("Profile ID: %d\n", defaultTxProfile.ChargingProfileId);
|
|
|
- DEBUG_INFO("Profile stackLevel: %d\n", defaultTxProfile.StackLevel);
|
|
|
- DEBUG_INFO("Profile TransactionId: %d\n", defaultTxProfile.TransactionId);
|
|
|
- DEBUG_INFO("Profile valid from: %s\n", defaultTxProfile.ValidFrom);
|
|
|
- DEBUG_INFO("Profile valid to: %s\n", defaultTxProfile.ValidTo);
|
|
|
- DEBUG_INFO("Profile ChargingProfileKind: %s\n", defaultTxProfile.ChargingProfileKind);
|
|
|
- DEBUG_INFO("Profile RecurrencyKind: %s\n", defaultTxProfile.RecurrencyKind);
|
|
|
-
|
|
|
- DEBUG_INFO("Profile start schedule: %s\n", compositeProfile->ChargingSchedule.StartSchedule);
|
|
|
- DEBUG_INFO("Profile schedule duration: %d\n", defaultTxProfile.ChargingSchedule.Duration);
|
|
|
- DEBUG_INFO("Profile charging rate unit: %s\n", defaultTxProfile.ChargingSchedule.ChargingRateUnit);
|
|
|
- DEBUG_INFO("Profile charging min rate: %f\n", defaultTxProfile.ChargingSchedule.MinChargingRate);
|
|
|
-
|
|
|
- for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
|
|
|
- {
|
|
|
- if(defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod >= 0)
|
|
|
- {
|
|
|
- DEBUG_INFO("Period-%02d startPeriod: %d\n", idxPeriod, defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod);
|
|
|
- DEBUG_INFO("Period-%02d limit: %f\n", idxPeriod, defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].Limit);
|
|
|
- DEBUG_INFO("Period-%02d NumberPhases: %d\n", idxPeriod, defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].NumberPhases);
|
|
|
- }
|
|
|
- }
|
|
|
- DEBUG_INFO("------------------------------------\n");*/
|
|
|
- }
|
|
|
-
|
|
|
- if(txProfile.ChargingProfileId != -1)
|
|
|
- {
|
|
|
- if(strstr((char*)txProfile.ChargingProfileKind, "Absolute") != NULL)
|
|
|
- {
|
|
|
- if(txProfile.ChargingSchedule.Duration != -1)
|
|
|
- {
|
|
|
- txProfile.ChargingSchedule.Duration = ((txProfile.ChargingSchedule.Duration-getStartStop(txProfile.ChargingSchedule.StartSchedule, compositeProfile->ChargingSchedule.StartSchedule))<0?
|
|
|
- 0:
|
|
|
- (txProfile.ChargingSchedule.Duration-getStartStop(txProfile.ChargingSchedule.StartSchedule, compositeProfile->ChargingSchedule.StartSchedule)));
|
|
|
- }
|
|
|
-
|
|
|
- for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(txProfile.ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
|
|
|
- {
|
|
|
- if(txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod != -1)
|
|
|
- {
|
|
|
- txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod = ((txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartStop(txProfile.ChargingSchedule.StartSchedule, compositeProfile->ChargingSchedule.StartSchedule))<0?
|
|
|
- 0:
|
|
|
- (txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartStop(txProfile.ChargingSchedule.StartSchedule, compositeProfile->ChargingSchedule.StartSchedule)));
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- else if(strstr((char*)txProfile.ChargingProfileKind, "Relative") != NULL)
|
|
|
- {
|
|
|
- if(txProfile.ChargingSchedule.Duration != -1)
|
|
|
- {
|
|
|
- txProfile.ChargingSchedule.Duration = (strstr((char*)ShmOCPP16Data->StatusNotification[(connectorId==0?0:connectorId-1)].Status, "Charging")==NULL)?txProfile.ChargingSchedule.Duration:((txProfile.ChargingSchedule.Duration-getStartStop(ShmOCPP16Data->StartTransaction[(connectorId==0?0:connectorId-1)].Timestamp, compositeProfile->ChargingSchedule.StartSchedule))<0?
|
|
|
- 0:
|
|
|
- (txProfile.ChargingSchedule.Duration-getStartStop(ShmOCPP16Data->StartTransaction[(connectorId==0?0:connectorId-1)].Timestamp, compositeProfile->ChargingSchedule.StartSchedule)));
|
|
|
- }
|
|
|
-
|
|
|
- for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(txProfile.ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
|
|
|
- {
|
|
|
- if(txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod != -1)
|
|
|
- {
|
|
|
- txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod = (strstr((char*)ShmOCPP16Data->StatusNotification[(connectorId==0?0:connectorId-1)].Status, "Charging")==NULL)?txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod:((txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartStop(ShmOCPP16Data->StartTransaction[(connectorId==0?0:connectorId-1)].Timestamp, compositeProfile->ChargingSchedule.StartSchedule))<0?
|
|
|
- 0:
|
|
|
- (txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartStop(ShmOCPP16Data->StartTransaction[(connectorId==0?0:connectorId-1)].Timestamp, compositeProfile->ChargingSchedule.StartSchedule)));
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- if(strstr((char*)txProfile.RecurrencyKind, "Weekly") != NULL)
|
|
|
- {
|
|
|
- if(txProfile.ChargingSchedule.Duration != -1)
|
|
|
- {
|
|
|
- txProfile.ChargingSchedule.Duration = ((txProfile.ChargingSchedule.Duration-getStartSinceWeek(compositeProfile->ChargingSchedule.StartSchedule))<0?
|
|
|
- 0:
|
|
|
- (txProfile.ChargingSchedule.Duration-getStartSinceWeek(compositeProfile->ChargingSchedule.StartSchedule)));
|
|
|
- }
|
|
|
-
|
|
|
- for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(txProfile.ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
|
|
|
- {
|
|
|
- if(txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod != -1)
|
|
|
- {
|
|
|
- txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod = ((txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartSinceWeek(compositeProfile->ChargingSchedule.StartSchedule))<0?
|
|
|
- 0:
|
|
|
- (txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartSinceWeek(compositeProfile->ChargingSchedule.StartSchedule)));
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- if(txProfile.ChargingSchedule.Duration != -1)
|
|
|
- {
|
|
|
- txProfile.ChargingSchedule.Duration = ((txProfile.ChargingSchedule.Duration-getStartSinceToday(compositeProfile->ChargingSchedule.StartSchedule))<0?
|
|
|
- 0:
|
|
|
- (txProfile.ChargingSchedule.Duration-getStartSinceToday(compositeProfile->ChargingSchedule.StartSchedule)));
|
|
|
- }
|
|
|
-
|
|
|
- for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(txProfile.ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
|
|
|
- {
|
|
|
- if(txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod != -1)
|
|
|
- {
|
|
|
- txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod = ((txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartSinceToday(compositeProfile->ChargingSchedule.StartSchedule))<0?
|
|
|
- 0:
|
|
|
- (txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartSinceToday(compositeProfile->ChargingSchedule.StartSchedule)));
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- /*
|
|
|
- DEBUG_INFO("txProfile after align.\n");
|
|
|
- DEBUG_INFO("Profile ID: %d\n", txProfile.ChargingProfileId);
|
|
|
- DEBUG_INFO("Profile stackLevel: %d\n", txProfile.StackLevel);
|
|
|
- DEBUG_INFO("Profile TransactionId: %d\n", txProfile.TransactionId);
|
|
|
- DEBUG_INFO("Profile valid from: %s\n", txProfile.ValidFrom);
|
|
|
- DEBUG_INFO("Profile valid to: %s\n", txProfile.ValidTo);
|
|
|
- DEBUG_INFO("Profile ChargingProfileKind: %s\n", txProfile.ChargingProfileKind);
|
|
|
- DEBUG_INFO("Profile RecurrencyKind: %s\n", txProfile.RecurrencyKind);
|
|
|
-
|
|
|
- DEBUG_INFO("Profile start schedule: %s\n", compositeProfile->ChargingSchedule.StartSchedule);
|
|
|
- DEBUG_INFO("Profile schedule duration: %d\n", txProfile.ChargingSchedule.Duration);
|
|
|
- DEBUG_INFO("Profile charging rate unit: %s\n", txProfile.ChargingSchedule.ChargingRateUnit);
|
|
|
- DEBUG_INFO("Profile charging min rate: %f\n", txProfile.ChargingSchedule.MinChargingRate);
|
|
|
-
|
|
|
- for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(txProfile.ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
|
|
|
- {
|
|
|
- if(txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod >= 0)
|
|
|
- {
|
|
|
- DEBUG_INFO("Period-%02d startPeriod: %d\n", idxPeriod, txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod);
|
|
|
- DEBUG_INFO("Period-%02d limit: %f\n", idxPeriod, txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].Limit);
|
|
|
- DEBUG_INFO("Period-%02d NumberPhases: %d\n", idxPeriod, txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].NumberPhases);
|
|
|
- }
|
|
|
- }*/
|
|
|
- }
|
|
|
-
|
|
|
- /*
|
|
|
- * Merge to conposite schedule
|
|
|
- */
|
|
|
- //DEBUG_INFO("====================================\n");
|
|
|
- // Find each profile period quantity
|
|
|
- for(int idx=0;idx<ARRAY_SIZE(maxProfile.ChargingSchedule.ChargingSchedulePeriod);idx++)
|
|
|
- {
|
|
|
- if(maxProfile.ChargingSchedule.ChargingSchedulePeriod[idx].Limit != -1)
|
|
|
- limitMax = idx+1;
|
|
|
- }
|
|
|
-
|
|
|
- for(int idx=0;idx<ARRAY_SIZE(defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod);idx++)
|
|
|
- {
|
|
|
- if(defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idx].Limit != -1)
|
|
|
- limitDef = idx+1;
|
|
|
- }
|
|
|
-
|
|
|
- for(int idx=0;idx<ARRAY_SIZE(txProfile.ChargingSchedule.ChargingSchedulePeriod);idx++)
|
|
|
- {
|
|
|
- if(txProfile.ChargingSchedule.ChargingSchedulePeriod[idx].Limit != -1)
|
|
|
- limitTx = idx+1;
|
|
|
- }
|
|
|
-
|
|
|
- // TxProfile found, composite schedule based on it
|
|
|
- if(txProfile.ChargingProfileId != -1)
|
|
|
- {
|
|
|
- for(int idxTxPeriod=0;idxTxPeriod<limitTx;idxTxPeriod++)
|
|
|
- {
|
|
|
- if((txProfile.ChargingSchedule.ChargingSchedulePeriod[idxTxPeriod].Limit != -1) &&
|
|
|
- (txProfile.ChargingSchedule.ChargingSchedulePeriod[idxTxPeriod].StartPeriod < durationReq))
|
|
|
- {
|
|
|
- if(maxProfile.ChargingProfileId != -1)
|
|
|
- {
|
|
|
- for(int idxMaxPeriod=0;idxMaxPeriod<limitMax;idxMaxPeriod++)
|
|
|
- {
|
|
|
- if((txProfile.ChargingSchedule.ChargingSchedulePeriod[idxTxPeriod].StartPeriod >= maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxMaxPeriod].StartPeriod) &&
|
|
|
- (maxProfile.ChargingSchedule.Duration > txProfile.ChargingSchedule.ChargingSchedulePeriod[idxTxPeriod].StartPeriod))
|
|
|
- {
|
|
|
- tmpPeriod.StartPeriod = txProfile.ChargingSchedule.ChargingSchedulePeriod[idxTxPeriod].StartPeriod;
|
|
|
- tmpPeriod.NumberPhases = txProfile.ChargingSchedule.ChargingSchedulePeriod[idxTxPeriod].NumberPhases;
|
|
|
- tmpPeriod.Limit = (txProfile.ChargingSchedule.ChargingSchedulePeriod[idxTxPeriod].Limit>maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxMaxPeriod].Limit?maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxMaxPeriod].Limit:txProfile.ChargingSchedule.ChargingSchedulePeriod[idxTxPeriod].Limit);
|
|
|
- }
|
|
|
-
|
|
|
- if(idxMaxPeriod == (limitMax-1))
|
|
|
- {
|
|
|
- if(tmpPeriod.Limit != compositeProfile->ChargingSchedule.ChargingSchedulePeriod[(compositePeriodIdx==0?compositePeriodIdx:compositePeriodIdx-1)].Limit)
|
|
|
- {
|
|
|
- if(tmpPeriod.StartPeriod != compositeProfile->ChargingSchedule.ChargingSchedulePeriod[(compositePeriodIdx==0?compositePeriodIdx:compositePeriodIdx-1)].StartPeriod)
|
|
|
- {
|
|
|
- memcpy(&compositeProfile->ChargingSchedule.ChargingSchedulePeriod[compositePeriodIdx], &tmpPeriod , sizeof(struct StructChargingSchedulePeriod));
|
|
|
- compositePeriodIdx++;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- memcpy(&compositeProfile->ChargingSchedule.ChargingSchedulePeriod[(compositePeriodIdx==0?compositePeriodIdx:compositePeriodIdx-1)], &tmpPeriod , sizeof(struct StructChargingSchedulePeriod));
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- if(txProfile.ChargingSchedule.ChargingSchedulePeriod[idxTxPeriod].StartPeriod != compositeProfile->ChargingSchedule.ChargingSchedulePeriod[(compositePeriodIdx==0?compositePeriodIdx:compositePeriodIdx-1)].StartPeriod)
|
|
|
- {
|
|
|
- memcpy(&compositeProfile->ChargingSchedule.ChargingSchedulePeriod[compositePeriodIdx], &txProfile.ChargingSchedule.ChargingSchedulePeriod[idxTxPeriod],sizeof(struct StructChargingSchedulePeriod));
|
|
|
- compositePeriodIdx++;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- memcpy(&compositeProfile->ChargingSchedule.ChargingSchedulePeriod[(compositePeriodIdx==0?compositePeriodIdx:compositePeriodIdx-1)], &txProfile.ChargingSchedule.ChargingSchedulePeriod[idxTxPeriod],sizeof(struct StructChargingSchedulePeriod));
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- if(idxTxPeriod == (limitTx-1))
|
|
|
- {
|
|
|
- if(defaultTxProfile.ChargingProfileId != -1)
|
|
|
- {
|
|
|
- for(int idxDefPeriod=0;idxDefPeriod<limitDef;idxDefPeriod++)
|
|
|
- {
|
|
|
- if((defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxDefPeriod].StartPeriod > txProfile.ChargingSchedule.ChargingSchedulePeriod[idxTxPeriod].StartPeriod) &&
|
|
|
- (defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxDefPeriod].StartPeriod < durationReq))
|
|
|
- {
|
|
|
- if(maxProfile.ChargingProfileId != -1)
|
|
|
- {
|
|
|
- for(int idxMaxPeriod=0;idxMaxPeriod<limitMax;idxMaxPeriod++)
|
|
|
- {
|
|
|
- if(defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxDefPeriod].StartPeriod >= maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxMaxPeriod].StartPeriod)
|
|
|
- {
|
|
|
- tmpPeriod.StartPeriod = defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxDefPeriod].StartPeriod;
|
|
|
- tmpPeriod.NumberPhases = defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxDefPeriod].NumberPhases;
|
|
|
- tmpPeriod.Limit = (defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxDefPeriod].Limit>maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxMaxPeriod].Limit?maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxMaxPeriod].Limit:defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxTxPeriod].Limit);
|
|
|
-
|
|
|
- if(tmpPeriod.Limit != compositeProfile->ChargingSchedule.ChargingSchedulePeriod[(compositePeriodIdx==0?compositePeriodIdx:compositePeriodIdx-1)].Limit)
|
|
|
- {
|
|
|
- if(tmpPeriod.StartPeriod != compositeProfile->ChargingSchedule.ChargingSchedulePeriod[(compositePeriodIdx==0?compositePeriodIdx:compositePeriodIdx-1)].StartPeriod)
|
|
|
- {
|
|
|
- memcpy(&compositeProfile->ChargingSchedule.ChargingSchedulePeriod[compositePeriodIdx], &tmpPeriod , sizeof(struct StructChargingSchedulePeriod));
|
|
|
- compositePeriodIdx++;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- memcpy(&compositeProfile->ChargingSchedule.ChargingSchedulePeriod[(compositePeriodIdx==0?compositePeriodIdx:compositePeriodIdx-1)], &tmpPeriod , sizeof(struct StructChargingSchedulePeriod));
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- if(defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxDefPeriod].StartPeriod != compositeProfile->ChargingSchedule.ChargingSchedulePeriod[(compositePeriodIdx==0?compositePeriodIdx:compositePeriodIdx-1)].StartPeriod)
|
|
|
- {
|
|
|
- memcpy(&compositeProfile->ChargingSchedule.ChargingSchedulePeriod[compositePeriodIdx], &defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxDefPeriod],sizeof(struct StructChargingSchedulePeriod));
|
|
|
- compositePeriodIdx++;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- memcpy(&compositeProfile->ChargingSchedule.ChargingSchedulePeriod[(compositePeriodIdx==0?compositePeriodIdx:compositePeriodIdx-1)], &defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxDefPeriod],sizeof(struct StructChargingSchedulePeriod));
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- // TxProfile not found but defaultTxProfile found, composite schedule based on it
|
|
|
- else if(defaultTxProfile.ChargingProfileId != -1)
|
|
|
- {
|
|
|
- for(int idxDefPeriod=0;idxDefPeriod<limitDef;idxDefPeriod++)
|
|
|
- {
|
|
|
- if((defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxDefPeriod].Limit != -1) &&
|
|
|
- (defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxDefPeriod].StartPeriod < durationReq))
|
|
|
- {
|
|
|
- if(maxProfile.ChargingProfileId != -1)
|
|
|
- {
|
|
|
- for(int idxMaxPeriod=0;idxMaxPeriod<limitMax;idxMaxPeriod++)
|
|
|
- {
|
|
|
- if(defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxDefPeriod].StartPeriod >= maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxMaxPeriod].StartPeriod)
|
|
|
- {
|
|
|
- tmpPeriod.StartPeriod = defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxDefPeriod].StartPeriod;
|
|
|
- tmpPeriod.NumberPhases = defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxDefPeriod].NumberPhases;
|
|
|
- tmpPeriod.Limit = (defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxDefPeriod].Limit>maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxMaxPeriod].Limit?maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxMaxPeriod].Limit:defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxDefPeriod].Limit);
|
|
|
-
|
|
|
- if(tmpPeriod.Limit != compositeProfile->ChargingSchedule.ChargingSchedulePeriod[(compositePeriodIdx==0?compositePeriodIdx:compositePeriodIdx-1)].Limit)
|
|
|
- {
|
|
|
- if(tmpPeriod.StartPeriod != compositeProfile->ChargingSchedule.ChargingSchedulePeriod[(compositePeriodIdx==0?compositePeriodIdx:compositePeriodIdx-1)].StartPeriod)
|
|
|
- {
|
|
|
- memcpy(&compositeProfile->ChargingSchedule.ChargingSchedulePeriod[compositePeriodIdx], &tmpPeriod , sizeof(struct StructChargingSchedulePeriod));
|
|
|
- compositePeriodIdx++;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- memcpy(&compositeProfile->ChargingSchedule.ChargingSchedulePeriod[(compositePeriodIdx==0?compositePeriodIdx:compositePeriodIdx-1)], &tmpPeriod , sizeof(struct StructChargingSchedulePeriod));
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- if(defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxDefPeriod].StartPeriod != compositeProfile->ChargingSchedule.ChargingSchedulePeriod[(compositePeriodIdx==0?compositePeriodIdx:compositePeriodIdx-1)].StartPeriod)
|
|
|
- {
|
|
|
- memcpy(&compositeProfile->ChargingSchedule.ChargingSchedulePeriod[compositePeriodIdx], &defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxDefPeriod],sizeof(struct StructChargingSchedulePeriod));
|
|
|
- compositePeriodIdx++;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- memcpy(&compositeProfile->ChargingSchedule.ChargingSchedulePeriod[(compositePeriodIdx==0?compositePeriodIdx:compositePeriodIdx-1)], &defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxDefPeriod],sizeof(struct StructChargingSchedulePeriod));
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- // Fill other period by MaxProfile
|
|
|
- if(maxProfile.ChargingProfileId != -1)
|
|
|
- {
|
|
|
- for(int idxMaxPeriod=0;idxMaxPeriod<limitMax;idxMaxPeriod++)
|
|
|
- {
|
|
|
- if((maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxMaxPeriod].Limit != -1) &&
|
|
|
- (maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxMaxPeriod].StartPeriod < durationReq))
|
|
|
- {
|
|
|
- if((maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxMaxPeriod].StartPeriod >= compositeProfile->ChargingSchedule.ChargingSchedulePeriod[compositePeriodIdx==0?0:compositePeriodIdx-1].StartPeriod) &&
|
|
|
- (maxProfile.ChargingSchedule.Duration > compositeProfile->ChargingSchedule.ChargingSchedulePeriod[compositePeriodIdx==0?0:compositePeriodIdx-1].StartPeriod))
|
|
|
- {
|
|
|
- tmpPeriod.StartPeriod = compositeProfile->ChargingSchedule.ChargingSchedulePeriod[compositePeriodIdx==0?0:compositePeriodIdx-1].StartPeriod;
|
|
|
- tmpPeriod.NumberPhases = compositeProfile->ChargingSchedule.ChargingSchedulePeriod[compositePeriodIdx==0?0:compositePeriodIdx-1].NumberPhases;
|
|
|
- tmpPeriod.Limit = maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxMaxPeriod].Limit;
|
|
|
- }
|
|
|
-
|
|
|
- if(idxMaxPeriod == (limitMax-1))
|
|
|
- {
|
|
|
- if(maxProfile.ChargingSchedule.Duration > compositeProfile->ChargingSchedule.ChargingSchedulePeriod[compositePeriodIdx==0?0:compositePeriodIdx-1].StartPeriod)
|
|
|
- {
|
|
|
- tmpPeriod.StartPeriod = compositeProfile->ChargingSchedule.Duration;
|
|
|
- tmpPeriod.NumberPhases = maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxMaxPeriod].NumberPhases;
|
|
|
- tmpPeriod.Limit = maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxMaxPeriod].Limit;
|
|
|
- }
|
|
|
-
|
|
|
- if(tmpPeriod.Limit != -1)
|
|
|
- {
|
|
|
- if(tmpPeriod.Limit != compositeProfile->ChargingSchedule.ChargingSchedulePeriod[(compositePeriodIdx==0?compositePeriodIdx:compositePeriodIdx-1)].Limit)
|
|
|
- {
|
|
|
- if(tmpPeriod.StartPeriod != compositeProfile->ChargingSchedule.ChargingSchedulePeriod[(compositePeriodIdx==0?compositePeriodIdx:compositePeriodIdx-1)].StartPeriod)
|
|
|
- {
|
|
|
- memcpy(&compositeProfile->ChargingSchedule.ChargingSchedulePeriod[compositePeriodIdx], &tmpPeriod , sizeof(struct StructChargingSchedulePeriod));
|
|
|
- compositePeriodIdx++;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- memcpy(&compositeProfile->ChargingSchedule.ChargingSchedulePeriod[(compositePeriodIdx==0?compositePeriodIdx:compositePeriodIdx-1)], &tmpPeriod , sizeof(struct StructChargingSchedulePeriod));
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- DEBUG_INFO("Composite schedule start: %s\n", compositeProfile->ChargingSchedule.StartSchedule);
|
|
|
- DEBUG_INFO("Composite schedule duration: %d\n", compositeProfile->ChargingSchedule.Duration);
|
|
|
- DEBUG_INFO("Composite rate unit: %s\n", compositeProfile->ChargingSchedule.ChargingRateUnit);
|
|
|
- for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(compositeProfile->ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
|
|
|
- {
|
|
|
- if(compositeProfile->ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod >= 0)
|
|
|
- {
|
|
|
- DEBUG_INFO("Period-%02d startPeriod: %d\n", idxPeriod, compositeProfile->ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod);
|
|
|
- DEBUG_INFO("Period-%02d limit: %f\n", idxPeriod, compositeProfile->ChargingSchedule.ChargingSchedulePeriod[idxPeriod].Limit);
|
|
|
- DEBUG_INFO("Period-%02d NumberPhases: %d\n", idxPeriod, compositeProfile->ChargingSchedule.ChargingSchedulePeriod[idxPeriod].NumberPhases);
|
|
|
- }
|
|
|
-
|
|
|
- if(compositeProfile->ChargingSchedule.ChargingSchedulePeriod[idxPeriod].Limit == -1)
|
|
|
- compositeProfile->ChargingSchedule.ChargingSchedulePeriod[idxPeriod].Limit =0;
|
|
|
-
|
|
|
- if(compositeProfile->ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod == -1)
|
|
|
- compositeProfile->ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod =0;
|
|
|
- }
|
|
|
-
|
|
|
- if(line)
|
|
|
- free(line);
|
|
|
-}
|
|
|
-
|
|
|
-//==========================================
|
|
|
-// Init all share memory
|
|
|
-//==========================================
|
|
|
-int InitShareMemory()
|
|
|
-{
|
|
|
- int result = PASS;
|
|
|
- int MeterSMId;
|
|
|
-
|
|
|
- //creat ShmSysConfigAndInfo
|
|
|
- if ((MeterSMId = shmget(ShmSysConfigAndInfoKey, sizeof(struct SysConfigAndInfo), 0777)) < 0)
|
|
|
- {
|
|
|
- DEBUG_ERROR("shmget ShmSysConfigAndInfo NG\n");
|
|
|
- result = FAIL;
|
|
|
- }
|
|
|
- else if ((ShmSysConfigAndInfo = shmat(MeterSMId, NULL, 0)) == (void *) -1)
|
|
|
- {
|
|
|
- DEBUG_ERROR("shmat ShmSysConfigAndInfo NG\n");
|
|
|
- result = FAIL;
|
|
|
- }
|
|
|
- else
|
|
|
- {}
|
|
|
-
|
|
|
- if ((MeterSMId = shmget(ShmStatusCodeKey, sizeof(struct StatusCodeData), 0777)) < 0)
|
|
|
- {
|
|
|
- DEBUG_ERROR("shmget ShmStatusCodeData NG\n");
|
|
|
- result = FAIL;
|
|
|
- }
|
|
|
- else if ((ShmStatusCodeData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
|
|
|
- {
|
|
|
- DEBUG_ERROR("shmat ShmStatusCodeData NG\n");
|
|
|
- result = FAIL;
|
|
|
- }
|
|
|
- else
|
|
|
- {}
|
|
|
-
|
|
|
- //creat ShmPsuData
|
|
|
- if ((MeterSMId = shmget(ShmPsuKey, sizeof(struct PsuData), 0777)) < 0)
|
|
|
- {
|
|
|
- DEBUG_ERROR("shmget ShmPsuData NG\n");
|
|
|
- result = FAIL;
|
|
|
- }
|
|
|
- else if ((ShmPsuData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
|
|
|
- {
|
|
|
- DEBUG_ERROR("shmat ShmPsuData NG\n");
|
|
|
- result = FAIL;
|
|
|
- }
|
|
|
- else
|
|
|
- {}
|
|
|
-
|
|
|
- //creat ShmOCPP16Data
|
|
|
- if ((MeterSMId = shmget(ShmOcppModuleKey, sizeof(struct OCPP16Data), 0777)) < 0)
|
|
|
- {
|
|
|
- DEBUG_ERROR("shmget ShmOCPP16Data NG");
|
|
|
- result = FAIL;
|
|
|
- }
|
|
|
- else if ((ShmOCPP16Data = shmat(MeterSMId, NULL, 0)) == (void *) -1)
|
|
|
- {
|
|
|
- DEBUG_ERROR("shmat ShmOCPP16Data NG");
|
|
|
- result = FAIL;
|
|
|
- }
|
|
|
- else
|
|
|
- {}
|
|
|
-
|
|
|
-
|
|
|
- /****************************** For Initial Settings************************************************/
|
|
|
- ShmOCPP16Data->GetConfiguration.ResponseUnknownKey = NULL;
|
|
|
- ShmOCPP16Data->SendLocalList.LocalAuthorizationList = NULL;
|
|
|
-
|
|
|
- // allocate Configuration memory address
|
|
|
- ShmOCPP16Data->GetConfiguration.Key = staticKeyArray;
|
|
|
- ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey = staticResponseConfigurationKeyArray;
|
|
|
- ShmOCPP16Data->GetConfiguration.ResponseUnknownKey = staticResponseUnknownKey;
|
|
|
- ShmOCPP16Data->SendLocalList.LocalAuthorizationList = staticLocalAuthorizationList;
|
|
|
-
|
|
|
- //offline MeterValue Interval
|
|
|
- TempMeterValueInterval = 0;
|
|
|
-
|
|
|
- return result;
|
|
|
-}
|
|
|
-
|
|
|
-
|
|
|
-int ProcessShareMemory()
|
|
|
-{
|
|
|
- if(InitShareMemory() == FAIL)
|
|
|
- {
|
|
|
- DEBUG_ERROR("InitShareMemory NG\n");
|
|
|
-
|
|
|
- if(ShmStatusCodeData!=NULL)
|
|
|
- {
|
|
|
- ShmStatusCodeData->AlarmCode.AlarmEvents.bits.FailToCreateShareMemory=1;
|
|
|
- }
|
|
|
- sleep(5);
|
|
|
- return FAIL;
|
|
|
- }
|
|
|
- return PASS;
|
|
|
-}
|
|
|
-
|
|
|
-//---------------------common routine---------------------------//
|
|
|
-int isOFFline(void)
|
|
|
-{
|
|
|
- if(ShmSysConfigAndInfo->SysInfo.InternetConn == 0)
|
|
|
- {
|
|
|
- if(TempMeterValueInterval >= 2 )
|
|
|
- {
|
|
|
- TempMeterValueInterval = 0;
|
|
|
- return TRUE;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- TempMeterValueInterval = TempMeterValueInterval+ 1;
|
|
|
- return FALSE;
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- return FALSE;
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-//---------------------------------------------
|
|
|
-// new:
|
|
|
-// enum SYSTEM_STATUS
|
|
|
-// {
|
|
|
-// SYS_MODE_BOOTING = 0,
|
|
|
-// SYS_MODE_IDLE = 1,
|
|
|
-// SYS_MODE_AUTHORIZING = 2,
|
|
|
-// SYS_MODE_MODE_REASSIGN_CHECK = 3,
|
|
|
-// SYS_MODE_REASSIGN = 4,
|
|
|
-// SYS_MODE_PREPARING = 5,
|
|
|
-// SYS_MODE_PREPARE_FOR_EV = 6,
|
|
|
-// SYS_MODE_PREPARE_FOR_EVSE = 7,
|
|
|
-// SYS_MODE_CHARGING = 8,
|
|
|
-// SYS_MODE_TERMINATING = 9,
|
|
|
-// SYS_MODE_COMPLETE = 10,
|
|
|
-// SYS_MODE_ALARM = 11,
|
|
|
-// SYS_MODE_FAULT = 12,
|
|
|
-// SYS_MODE_RESERVATION = 13,
|
|
|
-// SYS_MODE_BOOKING = 14,
|
|
|
-// SYS_MODE_MAINTAIN = 15,
|
|
|
-// SYS_MODE_DEBUG = 16,
|
|
|
-// SYS_MODE_CCS_PRECHARGE_STEP0 = 17,
|
|
|
-// SYS_MODE_CCS_PRECHARGE_STEP1 = 18,
|
|
|
-// SYS_MODE_UPDATE = 19
|
|
|
-// };
|
|
|
-//
|
|
|
-//
|
|
|
-//-----------------------------------------
|
|
|
-
|
|
|
-void CheckSystemValue(void)
|
|
|
-{
|
|
|
- int meterValueSend[CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY + AC_QUANTITY]={0};
|
|
|
- //int IdleModeCnt = 0;
|
|
|
- char filenmae[100]={0};
|
|
|
- char str[100]={0};
|
|
|
-
|
|
|
- //===============================
|
|
|
- // send Heartbeat
|
|
|
- //===============================
|
|
|
- //HeartBeatWaitTime = ShmOCPP16Data->BootNotification.ResponseHeartbeatInterval;
|
|
|
- if((difftime(time((time_t*)NULL), clientTime.Heartbeat) < 0) || (HeartBeatWaitTime <= 0))
|
|
|
- {
|
|
|
- clientTime.Heartbeat=time((time_t*)NULL);
|
|
|
-
|
|
|
- if(server_sign == TRUE)
|
|
|
- {
|
|
|
- HeartBeatWaitTime = ShmOCPP16Data->BootNotification.ResponseHeartbeatInterval;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- HeartBeatWaitTime = atoi((char*)ShmOCPP16Data->ConfigurationTable.CoreProfile[HeartbeatInterval].ItemData);
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- if((server_sign == TRUE) && (difftime(time((time_t*)NULL), clientTime.Heartbeat) >= HeartBeatWaitTime))
|
|
|
- {
|
|
|
- //parameter for test
|
|
|
- sendHeartbeatRequest(0);
|
|
|
- //==============================================
|
|
|
- // Reset Waiting Time
|
|
|
- //==============================================
|
|
|
- clientTime.Heartbeat=time((time_t*)NULL);
|
|
|
- HeartBeatWithNOResponse = HeartBeatWithNOResponse + 1;
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- for(int gun_index=0;gun_index < gunTotalNumber ;gun_index++)
|
|
|
- {
|
|
|
- //===============================
|
|
|
- // CSU Trigger Reset Conf
|
|
|
- //===============================
|
|
|
- if((server_sign == TRUE) && (ShmOCPP16Data->MsMsg.bits.ResetConf == 1))
|
|
|
- {
|
|
|
- sendResetConfirmation((char *)ShmOCPP16Data->Reset.guid, (char *)ShmOCPP16Data->Reset.ResponseStatus);
|
|
|
- }
|
|
|
-
|
|
|
- //===============================
|
|
|
- // CSU Trigger Authorize Request
|
|
|
- //===============================
|
|
|
- if((server_sign == TRUE) && (ShmOCPP16Data->SpMsg.bits.AuthorizeReq == 1)&&(authorizeRetryTimes < 3))
|
|
|
- {
|
|
|
- sendAuthorizeRequest(0);
|
|
|
- authorizeRetryTimes = authorizeRetryTimes + 1;
|
|
|
-
|
|
|
- if(authorizeRetryTimes < 3)
|
|
|
- ShmOCPP16Data->SpMsg.bits.AuthorizeReq = 0;
|
|
|
-
|
|
|
- }
|
|
|
- else if((server_sign == TRUE) && (ShmOCPP16Data->SpMsg.bits.AuthorizeReq == 1)&&(authorizeRetryTimes >= 3))
|
|
|
- {
|
|
|
- authorizeRetryTimes = 0;
|
|
|
- ShmOCPP16Data->OcppConnStatus = 0; // ocpp offline
|
|
|
- server_sign = FALSE;
|
|
|
- }
|
|
|
- else if((server_sign == FALSE) &&(strcmp((const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalAuthorizeOffline].ItemData, "TRUE") == 0)&&(strcmp((const char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemData, "TRUE") == 0)&&(ShmOCPP16Data->OcppConnStatus == 0)&& (ShmOCPP16Data->SpMsg.bits.AuthorizeReq == 1))
|
|
|
- {
|
|
|
- sendAuthorizeRequest(0);
|
|
|
- }
|
|
|
-
|
|
|
- //===============================
|
|
|
- // CSU Trigger Smart Charging Profilw
|
|
|
- //===============================
|
|
|
- if(ShmOCPP16Data->CSUMsg.bits[gun_index].ChargingProfileReq == 1)
|
|
|
- {
|
|
|
- ShmOCPP16Data->CSUMsg.bits[gun_index].ChargingProfileReq = 0;
|
|
|
- checkCompositeSchedule(gun_index+1, 86400, &ShmOCPP16Data->SmartChargingProfile[gun_index]);
|
|
|
- ShmOCPP16Data->CSUMsg.bits[gun_index].ChargingProfileConf = 1;
|
|
|
- }
|
|
|
-
|
|
|
- //==============================================
|
|
|
- // Charger start transaction
|
|
|
- //==============================================
|
|
|
- if(/*(server_sign == TRUE) &&*/ (ShmOCPP16Data->CpMsg.bits[gun_index].StartTransactionReq == 1))
|
|
|
- {
|
|
|
- ShmOCPP16Data->CpMsg.bits[gun_index].StartTransactionReq =0;
|
|
|
- sendStartTransactionRequest(gun_index);
|
|
|
- clientTime.StartTransaction = time((time_t*)NULL);
|
|
|
- clientTime.MeterValues[gun_index] = time((time_t*)NULL);
|
|
|
- }
|
|
|
-
|
|
|
- //==============================================
|
|
|
- // Charger stop transaction
|
|
|
- //==============================================
|
|
|
- if(/*(server_sign == TRUE) &&*/ ((ShmOCPP16Data->CpMsg.bits[gun_index].StopTransactionReq == 1)))
|
|
|
- {
|
|
|
- ShmOCPP16Data->CpMsg.bits[gun_index].StopTransactionReq =0;
|
|
|
- sendStopTransactionRequest(gun_index);
|
|
|
- clientTime.StopTransaction = time((time_t*)NULL);
|
|
|
- }
|
|
|
-
|
|
|
- //==============================================
|
|
|
- // Charger status report
|
|
|
- //==============================================
|
|
|
- //--- Check Mode Change ---//
|
|
|
- // J: CHAdeMO U: CCS1 combo E: CCS2 combo G: GBT DCcc
|
|
|
-
|
|
|
- if(gunType[gun_index] == 'J')
|
|
|
- {
|
|
|
- for (int index = 0; index < CHAdeMO_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == gun_index)
|
|
|
- {
|
|
|
- if((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus != ChademoPreviousSystemStatus[index]) || (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].ConnectorPlugIn != ChademoPreviousConnectorPlugIn[index]) )//if(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus != ChademoPreviousSystemStatus[index]/*PRE_SYS_MODE[gun_index]*/ )
|
|
|
- {
|
|
|
- //PRE_SYS_MODE[gun_index] = ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus;
|
|
|
- ChademoPreviousSystemStatus[index] = ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus;
|
|
|
- ChademoPreviousConnectorPlugIn[index] = ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].ConnectorPlugIn;
|
|
|
- cpinitateMsg.bits[gun_index].StatusNotificationReq = 1;
|
|
|
- statusModeChage[gun_index] = TRUE;
|
|
|
- }
|
|
|
-
|
|
|
- #if 1 // for TempStopTransaction
|
|
|
- if((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == gun_index)&&(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_IDLE) && (ShmOCPP16Data->CpMsg.bits[gun_index].StopTransactionReq == 0))
|
|
|
- {
|
|
|
- checkTempStopTransaction(gun_index);
|
|
|
- }
|
|
|
- #endif
|
|
|
-
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
|
|
|
- {
|
|
|
- for (int index = 0; index < CCS_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == gun_index)
|
|
|
- {
|
|
|
- if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus != CcsPreviousSystemStatus[index]) || (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].ConnectorPlugIn != CcsPreviousConnectorPlugIn[index]) )//if(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus != CcsPreviousSystemStatus[index]/*PRE_SYS_MODE[gun_index]*/ )
|
|
|
- {
|
|
|
- //PRE_SYS_MODE[gun_index] = ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus;
|
|
|
- CcsPreviousSystemStatus[index] = ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus;
|
|
|
- CcsPreviousConnectorPlugIn[index] = ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].ConnectorPlugIn;
|
|
|
- cpinitateMsg.bits[gun_index].StatusNotificationReq = 1;
|
|
|
- statusModeChage[gun_index] = TRUE;
|
|
|
- }
|
|
|
-
|
|
|
- #if 1 // for TempStopTransaction
|
|
|
- if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == gun_index)&&(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_IDLE) && (ShmOCPP16Data->CpMsg.bits[gun_index].StopTransactionReq == 0))
|
|
|
- {
|
|
|
- checkTempStopTransaction(gun_index);
|
|
|
- }
|
|
|
- #endif
|
|
|
-
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- else if(gunType[gun_index] == 'G')
|
|
|
- {
|
|
|
- for (int index = 0; index < GB_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == gun_index)
|
|
|
- {
|
|
|
- if((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus != GbPreviousSystemStatus[index]) || (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].ConnectorPlugIn != GbPreviousConnectorPlugIn[index]) )//if(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus != GbPreviousSystemStatus[index]/*PRE_SYS_MODE[gun_index]*/ )
|
|
|
- {
|
|
|
- //PRE_SYS_MODE[gun_index] = ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus;
|
|
|
- GbPreviousSystemStatus[index] = ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus;
|
|
|
- GbPreviousConnectorPlugIn[index] = ShmSysConfigAndInfo->SysInfo.GbChargingData[index].ConnectorPlugIn;
|
|
|
- cpinitateMsg.bits[gun_index].StatusNotificationReq = 1;
|
|
|
- statusModeChage[gun_index] = TRUE;
|
|
|
- }
|
|
|
-
|
|
|
- #if 1 // for TempStopTransaction
|
|
|
- if((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == gun_index)&&(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_IDLE) && (ShmOCPP16Data->CpMsg.bits[gun_index].StopTransactionReq == 0))
|
|
|
- {
|
|
|
- checkTempStopTransaction(gun_index);
|
|
|
- }
|
|
|
- #endif
|
|
|
-
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- for (int index = 0; index < AC_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == gun_index)
|
|
|
- {
|
|
|
- if((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus != AcPreviousSystemStatus[index]) || (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PilotState != AcPreviousConnectorPlugIn[index]) )//if(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus != AcPreviousSystemStatus[index]/*PRE_SYS_MODE[gun_index]*/ )
|
|
|
- {
|
|
|
- //PRE_SYS_MODE[gun_index] = ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus;
|
|
|
- AcPreviousSystemStatus[index] = ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus;
|
|
|
- AcPreviousConnectorPlugIn[index] = ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PilotState;
|
|
|
- cpinitateMsg.bits[gun_index].StatusNotificationReq = 1;
|
|
|
- statusModeChage[gun_index] = TRUE;
|
|
|
- }
|
|
|
-
|
|
|
- #if 1 // for TempStopTransaction
|
|
|
- if((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == gun_index)&&(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_IDLE) && (ShmOCPP16Data->CpMsg.bits[gun_index].StopTransactionReq == 0))
|
|
|
- {
|
|
|
- checkTempStopTransaction(gun_index);
|
|
|
- }
|
|
|
- #endif
|
|
|
- }
|
|
|
- }// END
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- if(((server_sign == TRUE) && (SystemInitial > 0)) ||
|
|
|
- ((server_sign == TRUE) && ((statusModeChage[gun_index] == TRUE) || ((time((time_t*)NULL)-clientTime.StatusNotification[gun_index]) > (server_cycle_Status + (GunStatusInterval*gun_index))) || ((cpinitateMsg.bits[gun_index].StatusNotificationReq == 1) && ((time((time_t*)NULL)-clientTime.StatusNotification[gun_index]) > 30)))) )
|
|
|
- {
|
|
|
- if(SystemInitial > 0)
|
|
|
- SystemInitial = SystemInitial -1;
|
|
|
-
|
|
|
- sendStatusNotificationRequest(gun_index);
|
|
|
- clientTime.StatusNotification[gun_index] = time((time_t*)NULL);
|
|
|
- statusModeChage[gun_index] = FALSE;
|
|
|
- }
|
|
|
-
|
|
|
- //==============================================
|
|
|
- // Meter report
|
|
|
- //==============================================
|
|
|
- if(/*(server_sign == TRUE) &&*/(isOFFline() == TRUE) || ((time((time_t*)NULL) - clientTime.MeterValues[gun_index])> (atoi((const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValueSampleInterval].ItemData)- 1 ) ) )
|
|
|
- {
|
|
|
- //check Transaction active
|
|
|
- if(gunType[gun_index] == 'J')
|
|
|
- {
|
|
|
- for (int index = 0; index < CHAdeMO_QUANTITY; index++)
|
|
|
- {
|
|
|
- // 0: Booting, 1: idle, 2: authorizing, 3: preparing, 4: charging, 5: terminating, 6: alarm, 7: fault
|
|
|
- if ((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == gun_index)&&(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_CHARGING))
|
|
|
- {
|
|
|
- meterValueSend[gun_index] =1;
|
|
|
- }
|
|
|
-
|
|
|
- if((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == gun_index)&&(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_COMPLETE)) // complete
|
|
|
- {
|
|
|
- sprintf(filenmae,"/Storage/OCPP/TxProfile_%d.json",(gun_index+1));
|
|
|
- if((access(filenmae,F_OK))!=-1)
|
|
|
- {
|
|
|
- DEBUG_INFO("TxProfile exist. OCPP will delete TX Charging Profile\n");
|
|
|
-
|
|
|
- sprintf(str,"rm -f %s",filenmae);
|
|
|
- system(str);
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
- }// End for CHAdeMO
|
|
|
- }
|
|
|
- else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
|
|
|
- {
|
|
|
- for (int index = 0; index < CCS_QUANTITY; index++)
|
|
|
- {
|
|
|
- // 0: Booting, 1: idle, 2: authorizing, 3: preparing, 4: charging, 5: terminating, 6: alarm, 7: fault
|
|
|
- if ((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == gun_index)&&(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_CHARGING))
|
|
|
- {
|
|
|
- meterValueSend[gun_index] =1;
|
|
|
- }
|
|
|
-
|
|
|
- if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == gun_index)&&(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_COMPLETE)) // complete
|
|
|
- {
|
|
|
- sprintf(filenmae,"/Storage/OCPP/TxProfile_%d.json",(gun_index+1));
|
|
|
- if((access(filenmae,F_OK))!=-1)
|
|
|
- {
|
|
|
- DEBUG_INFO("TxProfile exist. OCPP will delete TX Charging Profile\n");
|
|
|
- sprintf(str,"rm -f %s",filenmae);
|
|
|
- system(str);
|
|
|
- }
|
|
|
- }
|
|
|
- } // End for CCS
|
|
|
- }
|
|
|
- else if(gunType[gun_index] == 'G')
|
|
|
- {
|
|
|
- for (int index = 0; index < GB_QUANTITY; index++)
|
|
|
- {
|
|
|
- // 0: Booting, 1: idle, 2: authorizing, 3: preparing, 4: charging, 5: terminating, 6: alarm, 7: fault
|
|
|
- if ((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == gun_index)&&(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_CHARGING))
|
|
|
- {
|
|
|
- meterValueSend[gun_index] =1;
|
|
|
- }
|
|
|
-
|
|
|
- if((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == gun_index)&&(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_COMPLETE)) // complete
|
|
|
- {
|
|
|
- sprintf(filenmae,"/Storage/OCPP/TxProfile_%d.json",(gun_index+1));
|
|
|
- if((access(filenmae,F_OK))!=-1)
|
|
|
- {
|
|
|
- DEBUG_INFO("TxProfile exist. OCPP will delete TX Charging Profile\n");
|
|
|
- sprintf(str,"rm -f %s",filenmae);
|
|
|
- system(str);
|
|
|
- }
|
|
|
- }
|
|
|
- }// End for GB
|
|
|
-
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- for (int index = 0; index < AC_QUANTITY; index++)
|
|
|
- {
|
|
|
- // 0: Booting, 1: idle, 2: authorizing, 3: preparing, 4: charging, 5: terminating, 6: alarm, 7: fault
|
|
|
- if ((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == gun_index)&&(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_CHARGING))
|
|
|
- {
|
|
|
- meterValueSend[gun_index] =1;
|
|
|
- }
|
|
|
-
|
|
|
- if((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == gun_index)&&(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_COMPLETE)) // complete
|
|
|
- {
|
|
|
- sprintf(filenmae,"/Storage/OCPP/TxProfile_%d.json",(gun_index+1));
|
|
|
- if((access(filenmae,F_OK))!=-1)
|
|
|
- {
|
|
|
- DEBUG_INFO("TxProfile exist. OCPP will delete TX Charging Profile\n");
|
|
|
-
|
|
|
- sprintf(str,"rm -f %s",filenmae);
|
|
|
- system(str);
|
|
|
- }
|
|
|
- }
|
|
|
- }//End for AC
|
|
|
- }
|
|
|
-
|
|
|
- clientTime.MeterValues[gun_index] = time((time_t*)NULL);
|
|
|
-
|
|
|
- if(meterValueSend[gun_index] == 1)
|
|
|
- {
|
|
|
- sendMeterValuesRequest(gun_index);
|
|
|
-#if 1 // for TempStopTransaction
|
|
|
- storeTempStopTransaction(gun_index);
|
|
|
-#endif
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- //==============================================
|
|
|
- // Check Connector reserved
|
|
|
- //==============================================
|
|
|
-
|
|
|
- //===============================
|
|
|
- // Check if Reserve is expired
|
|
|
- //===============================
|
|
|
- if((server_sign == TRUE) && (ShmOCPP16Data->ReserveNow[gun_index].ExpiryDate[0] != 0) )
|
|
|
- {
|
|
|
- double diff_t;
|
|
|
- struct tm tp;
|
|
|
- // current time
|
|
|
- time_t t = time(NULL);
|
|
|
- strptime((char *)ShmOCPP16Data->ReserveNow[gun_index].ExpiryDate, "%Y-%m-%dT%H:%M:%S", &tp);
|
|
|
- tp.tm_isdst = -1;
|
|
|
- time_t utc = mktime(&tp);
|
|
|
- diff_t = difftime(utc, t);
|
|
|
-
|
|
|
- if(diff_t <= 0)
|
|
|
- {
|
|
|
- DEBUG_INFO("reserve expired.\n");
|
|
|
- memset(ShmOCPP16Data->ReserveNow[gun_index].ExpiryDate,0,sizeof(ShmOCPP16Data->ReserveNow[gun_index].ExpiryDate));
|
|
|
- }
|
|
|
-
|
|
|
- }//END OF Check if Reserve is expired
|
|
|
-
|
|
|
- //==========================================
|
|
|
- // csu trigger FirmwareStatusNotificationReq
|
|
|
- //==========================================
|
|
|
- if((server_sign == TRUE) && (ShmOCPP16Data->SpMsg.bits.FirmwareStatusNotificationReq == 1))
|
|
|
- {
|
|
|
- sendFirmwareStatusNotificationRequest((char *)ShmOCPP16Data->FirmwareStatusNotification.Status);
|
|
|
- }
|
|
|
-
|
|
|
- //==========================================
|
|
|
- // csu trigger CancelReservationConf
|
|
|
- //==========================================
|
|
|
- if((server_sign == TRUE) && (ShmOCPP16Data->CsMsg.bits[gun_index].CancelReservationConf == 1))
|
|
|
- {
|
|
|
- sendCancelReservationConfirmation((char *)ShmOCPP16Data->CancelReservation[gun_index].guid,(char *)ShmOCPP16Data->CancelReservation[gun_index].ResponseStatus);
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- //==========================================
|
|
|
- // csu trigger ChangeAvailabilityConf
|
|
|
- //==========================================
|
|
|
- if((server_sign == TRUE) && (ShmOCPP16Data->CsMsg.bits[gun_index].ChangeAvailabilityConf == 1))
|
|
|
- {
|
|
|
- //sendChangeAvailabilityConfirmation(,(char *)ShmOCPP16Data->ChangeAvailability[gun_index].ResponseStatus);
|
|
|
- }
|
|
|
-
|
|
|
- //==========================================
|
|
|
- // csu trigger UnlockConnectorConf
|
|
|
- //==========================================
|
|
|
- if((server_sign == TRUE) && (ShmOCPP16Data->CsMsg.bits[gun_index].UnlockConnectorConf == 1))
|
|
|
- {
|
|
|
- sendUnlockConnectorConfirmation((char *)ShmOCPP16Data->UnlockConnector[gun_index].guid, (char *)ShmOCPP16Data->UnlockConnector[gun_index].ResponseStatus);
|
|
|
- ShmOCPP16Data->CsMsg.bits[gun_index].UnlockConnectorConf = 0;
|
|
|
- }
|
|
|
-
|
|
|
- //==========================================
|
|
|
- // csu trigger ReserveNowConf
|
|
|
- //==========================================
|
|
|
- if((server_sign == TRUE) &&(ShmOCPP16Data->CsMsg.bits[gun_index].ReserveNowConf == 1))
|
|
|
- {
|
|
|
- sendReserveNowTransactionConfirmation((char *)ShmOCPP16Data->ReserveNow[gun_index].guid, (char *)ShmOCPP16Data->ReserveNow[gun_index].ResponseStatus);
|
|
|
- ShmOCPP16Data->CsMsg.bits[gun_index].ReserveNowConf = 0;
|
|
|
- }
|
|
|
-
|
|
|
- //==========================================
|
|
|
- // csu trigger DataTransferReq
|
|
|
- //==========================================
|
|
|
- if((server_sign == TRUE) &&(ShmOCPP16Data->CsMsg.bits[gun_index].DataTransferReq == 1))
|
|
|
- {
|
|
|
- sendDataTransferRequest(gun_index);
|
|
|
- ShmOCPP16Data->CsMsg.bits[gun_index].DataTransferReq = 0;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
-}
|
|
|
-
|
|
|
-//==========================================
|
|
|
-// send request routine
|
|
|
-//==========================================
|
|
|
-int sendAuthorizeRequest(int gun_index)
|
|
|
-{
|
|
|
-
|
|
|
- mtrace();
|
|
|
- int result = FAIL;
|
|
|
- char message[100]={0};
|
|
|
- char guid[37];
|
|
|
- char tempdata[65]={0};
|
|
|
-
|
|
|
- DEBUG_INFO("sendAuthorizeRequest...\n");
|
|
|
- memset(&(ShmOCPP16Data->Authorize.ResponseIdTagInfo),0,sizeof(struct StructIdTagInfo));
|
|
|
-
|
|
|
- //Local Authorize
|
|
|
- if ((strcmp((const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AllowOfflineTxForUnknownId].ItemData , "TRUE")==0) &&(ShmOCPP16Data->OcppConnStatus == 0))
|
|
|
- {
|
|
|
- DEBUG_INFO("Allow OfflineTx UnknownId Pass !!!!\n");
|
|
|
- strcpy((char *)ShmOCPP16Data->Authorize.ResponseIdTagInfo.ExpiryDate, "");
|
|
|
- strcpy((char *)ShmOCPP16Data->Authorize.ResponseIdTagInfo.ParentIdTag, "");
|
|
|
- strcpy((char *)ShmOCPP16Data->Authorize.ResponseIdTagInfo.Status, "Accepted");
|
|
|
- result = PASS;
|
|
|
- ShmOCPP16Data->SpMsg.bits.AuthorizeReq = 0;
|
|
|
- ShmOCPP16Data->SpMsg.bits.AuthorizeConf = 1; // inform csu
|
|
|
- authorizeRetryTimes = 0;
|
|
|
- return result;
|
|
|
-
|
|
|
- }
|
|
|
- else if(((strcmp((const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalAuthorizeOffline].ItemData, "TRUE") == 0)&&(strcmp((const char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemData, "TRUE") == 0)&&(ShmOCPP16Data->OcppConnStatus == 0))||
|
|
|
- ((strcmp((const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalPreAuthorize].ItemData, "TRUE") == 0)&&(strcmp((const char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemData, "TRUE") == 0)))
|
|
|
- {
|
|
|
- OCPP_getIdTag((char *)ShmSysConfigAndInfo->SysConfig.UserId);
|
|
|
- if((strcmp(idTagQuery.idTagstr,"") == 0) || (strcmp(idTagQuery.idTagstatus,"Accepted") != 0) )
|
|
|
- {
|
|
|
- if(strcmp(idTagQuery.idTagstr,"") == 0)
|
|
|
- {
|
|
|
- DEBUG_INFO("offline Local Authorization Fail !!!!, Card %s is blank!!!!\n", idTagQuery.idTagstr);
|
|
|
- }
|
|
|
-
|
|
|
- if(strcmp(idTagQuery.idTagstatus,"Accepted") != 0)
|
|
|
- {
|
|
|
- DEBUG_INFO("offline Local Authorization Fail !!!!, Card %s is not Accepted!!!!\n", idTagQuery.idTagstr);
|
|
|
- }
|
|
|
-
|
|
|
- DEBUG_INFO("offline Local Authorization Fail !!!!\n");
|
|
|
- strcpy((char *)ShmOCPP16Data->Authorize.ResponseIdTagInfo.ExpiryDate, "");
|
|
|
- strcpy((char *)ShmOCPP16Data->Authorize.ResponseIdTagInfo.ParentIdTag, (const char *)ShmSysConfigAndInfo->SysConfig.UserId);
|
|
|
- strcpy((char *)ShmOCPP16Data->Authorize.ResponseIdTagInfo.Status, "Invalid");
|
|
|
- ShmOCPP16Data->SpMsg.bits.AuthorizeReq = 0;
|
|
|
- ShmOCPP16Data->SpMsg.bits.AuthorizeConf = 1; // inform csu
|
|
|
- authorizeRetryTimes = 0;
|
|
|
- return result;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- DEBUG_INFO("offline Local Authorization Pass !!!!\n");
|
|
|
- strcpy((char *)ShmOCPP16Data->Authorize.ResponseIdTagInfo.ExpiryDate, idTagQuery.expiryDate);
|
|
|
- strcpy((char *)ShmOCPP16Data->Authorize.ResponseIdTagInfo.ParentIdTag, (const char *)ShmSysConfigAndInfo->SysConfig.UserId);
|
|
|
- strcpy((char *)ShmOCPP16Data->Authorize.ResponseIdTagInfo.Status, idTagQuery.idTagstatus);
|
|
|
- result = PASS;
|
|
|
- ShmOCPP16Data->SpMsg.bits.AuthorizeReq = 0;
|
|
|
- ShmOCPP16Data->SpMsg.bits.AuthorizeConf = 1; // inform csu
|
|
|
- authorizeRetryTimes = 0;
|
|
|
- return result;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- //initailize struct Authorize
|
|
|
- memset(&(ShmOCPP16Data->Authorize), 0 , sizeof(struct StructAuthorize));
|
|
|
-
|
|
|
- //get data from shared memory
|
|
|
- strcpy((char *)ShmOCPP16Data->Authorize.IdTag, (const char *)ShmSysConfigAndInfo->SysConfig.UserId);
|
|
|
-
|
|
|
- random_uuid(guid);
|
|
|
- sprintf(message,"[%d,\"%s\",\"Authorize\",{\"idTag\":\"%s\"}]",MESSAGE_TYPE_CALL, guid, ShmOCPP16Data->Authorize.IdTag);
|
|
|
- LWS_Send(message);
|
|
|
-
|
|
|
- sprintf(tempdata, "Authorize,%d", gun_index);
|
|
|
- if(hashmap_operation(HASH_OP_ADD, guid, tempdata) == 1)
|
|
|
- {
|
|
|
- result = PASS;
|
|
|
- DEBUG_INFO("Authorize mapItem pass\n");
|
|
|
- }
|
|
|
-
|
|
|
- ShmOCPP16Data->SpMsg.bits.AuthorizeReq = 0;
|
|
|
- return result;
|
|
|
-}
|
|
|
-
|
|
|
-int sendBootNotificationRequest(void)
|
|
|
-{
|
|
|
- mtrace();
|
|
|
- int result = FAIL;
|
|
|
- char message[500]={0}, payload[700]={0};
|
|
|
- char guid[37]={0};
|
|
|
- char tempdata[65]={0};
|
|
|
- int IsGunCharging = FALSE;
|
|
|
-
|
|
|
- //check Transaction active
|
|
|
- for (int index = 0; index < CHAdeMO_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_CHARGING) //S_CHARGING
|
|
|
- {
|
|
|
- IsGunCharging = TRUE;
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < CCS_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_CHARGING) //S_CHARGING
|
|
|
- {
|
|
|
- IsGunCharging = TRUE;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < GB_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_CHARGING) //S_CHARGING
|
|
|
- {
|
|
|
- IsGunCharging = TRUE;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < AC_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_CHARGING) //S_CHARGING
|
|
|
- {
|
|
|
- IsGunCharging = TRUE;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- if(IsGunCharging == TRUE)
|
|
|
- {
|
|
|
- server_sign = TRUE;
|
|
|
- return result;
|
|
|
- }
|
|
|
-
|
|
|
- // Fill BootNotification fields
|
|
|
- strcpy((char *)ShmOCPP16Data->BootNotification.CbSN,(const char *)ShmOCPP16Data->ChargeBoxId);
|
|
|
- strcpy((char *)ShmOCPP16Data->BootNotification.CpModel,(const char *)ShmSysConfigAndInfo->SysConfig.ModelName);
|
|
|
- strcpy((char *)ShmOCPP16Data->BootNotification.CpSN,(const char *)ShmSysConfigAndInfo->SysConfig.SerialNumber);
|
|
|
- strcpy((char *)ShmOCPP16Data->BootNotification.CpVendor,(const char *)ShmSysConfigAndInfo->SysConfig.chargePointVendor);
|
|
|
- strcpy((char *)ShmOCPP16Data->BootNotification.CpFwVersion,(const char *)ShmSysConfigAndInfo->SysInfo.CsuRootFsFwRev);
|
|
|
- strcpy((char *)ShmOCPP16Data->BootNotification.CpIccid,(const char *)ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomSimIccid);
|
|
|
- strcpy((char *)ShmOCPP16Data->BootNotification.CpImsi,(const char *)ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomSimImsi);
|
|
|
-
|
|
|
- sprintf(payload, "{\"chargeBoxSerialNumber\":\"%s\",\"chargePointModel\":\"%s\",\"chargePointSerialNumber\":\"%s\",\"chargePointVendor\":\"%s\",\"firmwareVersion\":\"%s\",\"iccid\":\"%s\",\"imsi\":\"%s\"} ",
|
|
|
- ShmOCPP16Data->ChargeBoxId
|
|
|
- ,ShmSysConfigAndInfo->SysConfig.ModelName
|
|
|
- ,ShmSysConfigAndInfo->SysConfig.SerialNumber
|
|
|
- ,ShmSysConfigAndInfo->SysConfig.chargePointVendor
|
|
|
- ,ShmOCPP16Data->BootNotification.CpFwVersion
|
|
|
- ,ShmOCPP16Data->BootNotification.CpIccid
|
|
|
- ,ShmOCPP16Data->BootNotification.CpImsi);
|
|
|
-
|
|
|
- random_uuid(guid);
|
|
|
-
|
|
|
- sprintf(message,"[%d,\"%s\",\"%s\",%s]",MESSAGE_TYPE_CALL, guid, "BootNotification", payload);
|
|
|
- LWS_Send(message);
|
|
|
- sprintf(tempdata, "BootNotification,0");
|
|
|
- if(hashmap_operation(HASH_OP_ADD, guid, tempdata) == 1)//if(hashmap_operation(0,NULL/*hashMap*/, guid,mapItem, tempdata/*(void**)(&mapItem)*//*(void**)(&mapItem)*/) == MAP_OK/*hashmap_put(hashMap, mapItem->key_string, mapItem) == MAP_OK*/)
|
|
|
- {
|
|
|
- result = PASS;
|
|
|
- }
|
|
|
-
|
|
|
- memset(queuedata, 0, sizeof(queuedata));
|
|
|
- strcpy(queuedata,message);
|
|
|
-
|
|
|
- return result;
|
|
|
-}
|
|
|
-
|
|
|
-int sendDataTransferRequest(int gun_index)
|
|
|
-{
|
|
|
- mtrace();
|
|
|
- char message[1000]={0};
|
|
|
- char guid[37]={0};
|
|
|
- char tempdata[65]={0};
|
|
|
- int result = FAIL;
|
|
|
-
|
|
|
-//[2,"696e8a35-f394-45e3-a0c7-7098b86f38a6","DataTransfer",{"vendorId":"Phihong","messageId":"FeePerKWH","data":"1"}]
|
|
|
-
|
|
|
- random_uuid(guid);
|
|
|
-
|
|
|
- sprintf(message,"[%d,\"%s\",\"DataTransfer\",{\"vendorId\":\"%s\",\"messageId\":\"%s\",\"data\":\"%s\"}]",
|
|
|
- MESSAGE_TYPE_CALL,
|
|
|
- guid,
|
|
|
- ShmOCPP16Data->DataTransfer[gun_index].VendorId,
|
|
|
- ShmOCPP16Data->DataTransfer[gun_index].MessageId,
|
|
|
- ShmOCPP16Data->DataTransfer[gun_index].Data);
|
|
|
-
|
|
|
- LWS_Send(message);
|
|
|
-
|
|
|
- sprintf(tempdata, "DataTransfer,%d", (gun_index + 1));
|
|
|
- if(hashmap_operation(HASH_OP_ADD, guid, tempdata) == 1)
|
|
|
- {
|
|
|
- result = PASS;
|
|
|
- DEBUG_INFO("DataTransfer mapItem pass\n");
|
|
|
- }
|
|
|
-
|
|
|
- return result;
|
|
|
-}
|
|
|
-
|
|
|
-int sendFirmwareVersionByDataTransfer(void)
|
|
|
-{
|
|
|
- int8_t result = FAIL;
|
|
|
- json_object *FirmwareDataTransfer = json_object_new_object();
|
|
|
-
|
|
|
- // AC & DC model
|
|
|
- json_object_object_add(FirmwareDataTransfer, "CsuBootLoadFwRev", json_object_new_string((char*)ShmSysConfigAndInfo->SysInfo.CsuBootLoadFwRev));
|
|
|
- json_object_object_add(FirmwareDataTransfer, "CsuKernelFwRev", json_object_new_string((char*)ShmSysConfigAndInfo->SysInfo.CsuKernelFwRev));
|
|
|
- json_object_object_add(FirmwareDataTransfer, "CsuRootFsFwRev", json_object_new_string((char*)ShmSysConfigAndInfo->SysInfo.CsuRootFsFwRev));
|
|
|
- json_object_object_add(FirmwareDataTransfer, "CsuPrimFwRev", json_object_new_string((char*)ShmSysConfigAndInfo->SysInfo.CsuPrimFwRev));
|
|
|
-
|
|
|
- // DC model
|
|
|
- if((ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D'))
|
|
|
- {
|
|
|
- json_object_object_add(FirmwareDataTransfer, "FanModuleFwRev", json_object_new_string((char*)ShmSysConfigAndInfo->SysInfo.FanModuleFwRev));
|
|
|
- json_object_object_add(FirmwareDataTransfer, "RelayModuleFwRev", json_object_new_string((char*)ShmSysConfigAndInfo->SysInfo.RelayModuleFwRev));
|
|
|
- json_object_object_add(FirmwareDataTransfer, "LedModuleFwRev", json_object_new_string((char*)ShmSysConfigAndInfo->SysInfo.LedModuleFwRev));
|
|
|
- json_object_object_add(FirmwareDataTransfer, "Connector1FwRev", json_object_new_string((char*)ShmSysConfigAndInfo->SysInfo.Connector1FwRev));
|
|
|
- }
|
|
|
-
|
|
|
- if((ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D') &&
|
|
|
- ((gunType[1] != '0') || (gunType[2] != '0') || (gunType[3] != '0')))
|
|
|
- {
|
|
|
- json_object_object_add(FirmwareDataTransfer, "Connector2FwRev", json_object_new_string((char*)ShmSysConfigAndInfo->SysInfo.Connector2FwRev));
|
|
|
- }
|
|
|
-
|
|
|
- // 4G model
|
|
|
- if((ShmSysConfigAndInfo->SysConfig.ModelName[10]=='T'))
|
|
|
- {
|
|
|
- json_object_object_add(FirmwareDataTransfer, "TelcomModemFwRev", json_object_new_string((char*)ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomSoftwareVer));
|
|
|
- }
|
|
|
-
|
|
|
- sprintf((char*)ShmOCPP16Data->DataTransfer[0].VendorId, "Phihong Technology");
|
|
|
- sprintf((char*)ShmOCPP16Data->DataTransfer[0].MessageId, "ID_FirmwareVersion");
|
|
|
- sprintf((char*)ShmOCPP16Data->DataTransfer[0].Data, json_object_to_json_string(FirmwareDataTransfer));
|
|
|
-
|
|
|
- if(sendDataTransferRequest(0))
|
|
|
- {
|
|
|
- result = PASS;
|
|
|
- }
|
|
|
-
|
|
|
- return result;
|
|
|
-}
|
|
|
-
|
|
|
-int sendDiagnosticsStatusNotificationRequest(char *status)
|
|
|
-{
|
|
|
- mtrace();
|
|
|
- int result = FAIL;
|
|
|
- char message[110]={0};
|
|
|
- char guid[37]={0};
|
|
|
- char tempdata[65]={0};
|
|
|
-
|
|
|
- //[ 2, "9f7bced1-b8b1-40ec-b3bb-2e15630e3cdc", "DiagnosticsStatusNotification", { "status": "Idle" } ]
|
|
|
-
|
|
|
- DEBUG_INFO("sendDiagnosticsStatusNotificationRequest \n");
|
|
|
- sprintf((char *)ShmOCPP16Data->DiagnosticsStatusNotification.Status,"%s",(const char *)status);
|
|
|
- random_uuid(guid);
|
|
|
-
|
|
|
- sprintf(message,"[%d,\"%s\",\"DiagnosticsStatusNotification\",{\"status\":\"%s\"}]",MESSAGE_TYPE_CALL, guid,status);
|
|
|
- LWS_Send(message);
|
|
|
-
|
|
|
- sprintf(tempdata, "DiagnosticsStatusNotification,%d", 0);
|
|
|
-
|
|
|
- if(hashmap_operation(HASH_OP_ADD, guid, tempdata) == 1)
|
|
|
- {
|
|
|
- result = PASS;
|
|
|
- //DEBUG_INFO("DiagnosticsStatusNotification mapItem pass\n");
|
|
|
- }
|
|
|
-
|
|
|
- //#ifdef SystemLogMessage
|
|
|
- //DEBUG_INFO(">>>>>DiagnosticsStatusNotification request\n");
|
|
|
- //DEBUG_INFO("Message: %s\n", SendBuffer);
|
|
|
- //DEBUG_INFO("After push hash length: %d\n", hashmapForMessageLength()/*hashmap_length(hashMap)*/);
|
|
|
- //#endif
|
|
|
-
|
|
|
- ShmOCPP16Data->SpMsg.bits.DiagnosticsStatusNotificationReq = 0;
|
|
|
- ShmOCPP16Data->SpMsg.bits.DiagnosticsStatusNotificationConf = 0;
|
|
|
-
|
|
|
- //record status
|
|
|
- if(strcmp(status,"Idle")==0)
|
|
|
- {
|
|
|
- DiagnosticsStatusNotificationStatus = DIAGNOSTIC_STATUS_IDLE;
|
|
|
- }
|
|
|
- else if(strcmp(status,"Uploaded")==0)
|
|
|
- {
|
|
|
- DiagnosticsStatusNotificationStatus = DIAGNOSTIC_STATUS_UPLOADED;
|
|
|
- }
|
|
|
- else if(strcmp(status,"UploadFailed")==0)
|
|
|
- {
|
|
|
- DiagnosticsStatusNotificationStatus = DIAGNOSTIC_STATUS_UPLOAD_FAIL;
|
|
|
- }
|
|
|
- else if(strcmp(status,"Uploading")==0)
|
|
|
- {
|
|
|
- DiagnosticsStatusNotificationStatus = DIAGNOSTIC_STATUS_UPLOADING;
|
|
|
- }
|
|
|
-
|
|
|
- return result;
|
|
|
-}
|
|
|
-
|
|
|
-int sendFirmwareStatusNotificationRequest(char *status)
|
|
|
-{
|
|
|
- mtrace();
|
|
|
- int result = FAIL;
|
|
|
- char message[110]={0};
|
|
|
- char guid[37]={0};
|
|
|
- char tempdata[65]={0};
|
|
|
-
|
|
|
-// [ 2, "eb841424-ae56-42b0-8c84-d5296018c33c", "FirmwareStatusNotification", { "status": "Downloaded" } ]
|
|
|
-
|
|
|
- DEBUG_INFO("sendFirmwareStatusNotificationRequest \n");
|
|
|
- sprintf((char *)ShmOCPP16Data->FirmwareStatusNotification.Status, "%s", (const char *)status);
|
|
|
- random_uuid(guid);
|
|
|
-
|
|
|
- sprintf(message,"[%d,\"%s\",\"FirmwareStatusNotification\",{\"status\":\"%s\"}]",MESSAGE_TYPE_CALL, guid, status);
|
|
|
- LWS_Send(message);
|
|
|
-
|
|
|
- sprintf(tempdata, "FirmwareStatusNotification,%d", 0);
|
|
|
-
|
|
|
- if(hashmap_operation(HASH_OP_ADD, guid, tempdata) == 1)//if(hashmap_operation(0,NULL/*hashMap*/, mapItem[0].key_string, mapItem[0].key_value/*mapItem*/, (void**)(&mapItem)/*(void**)(&mapItem)*/) == MAP_OK/*hashmap_put(hashMap, mapItem->key_string, mapItem) == MAP_OK*/)
|
|
|
- {
|
|
|
- result = PASS;
|
|
|
- DEBUG_INFO("FirmwareStatusNotification mapItem pass\n");
|
|
|
- }
|
|
|
-
|
|
|
- //#ifdef SystemLogMessage
|
|
|
- //DEBUG_INFO(">>>>>FirmwareStatusNotification request\n");
|
|
|
- //DEBUG_INFO("Message: %s\n", SendBuffer);
|
|
|
- //#endif
|
|
|
-
|
|
|
- ShmOCPP16Data->SpMsg.bits.FirmwareStatusNotificationReq = 0;
|
|
|
- ShmOCPP16Data->SpMsg.bits.FirmwareStatusNotificationConf = 0;
|
|
|
-
|
|
|
- //record status
|
|
|
- if(strcmp(status,"Downloaded")==0)
|
|
|
- {
|
|
|
- FirmwareStatusNotificationStatus = FIRMWARE_STATUS_DOWNLOADED;
|
|
|
- }
|
|
|
- else if(strcmp(status,"DownloadFailed")==0)
|
|
|
- {
|
|
|
- FirmwareStatusNotificationStatus = FIRMWARE_STATUS_DOWNLOAD_DAILED;
|
|
|
- }
|
|
|
- else if(strcmp(status,"Downloading")==0)
|
|
|
- {
|
|
|
- FirmwareStatusNotificationStatus = FIRMWARE_STATUS_DOWNLOADING;
|
|
|
- }
|
|
|
- else if(strcmp(status,"Idle")==0)
|
|
|
- {
|
|
|
- FirmwareStatusNotificationStatus = FIRMWARE_STATUS_IDLE;
|
|
|
- }
|
|
|
- else if(strcmp(status,"InstallationFailed")==0)
|
|
|
- {
|
|
|
- FirmwareStatusNotificationStatus = FIRMWARE_STATUS_INSTALLATION_FAILED;
|
|
|
- }
|
|
|
- else if(strcmp(status,"Installing")==0)
|
|
|
- {
|
|
|
- FirmwareStatusNotificationStatus = FIRMWARE_STATUS_INSTALLING;
|
|
|
- }
|
|
|
- else if(strcmp(status,"Installed")==0)
|
|
|
- {
|
|
|
- FirmwareStatusNotificationStatus = FIRMWARE_STATUS_INSTALLED;
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- return result;
|
|
|
-}
|
|
|
-
|
|
|
-int sendHeartbeatRequest(int gun_index)
|
|
|
-{
|
|
|
- mtrace();
|
|
|
- int result = FAIL;
|
|
|
-
|
|
|
- char message[80]={0};
|
|
|
- char guid[37]={0};
|
|
|
- char tempdata[65]={0};
|
|
|
-
|
|
|
- random_uuid(guid);
|
|
|
-
|
|
|
- sprintf(message, "[%d,\"%s\",\"Heartbeat\",{ }]"
|
|
|
- , MESSAGE_TYPE_CALL
|
|
|
- , guid );
|
|
|
-
|
|
|
- LWS_Send(message);
|
|
|
-
|
|
|
- sprintf(tempdata, "Heartbeat,%d", 0);
|
|
|
-
|
|
|
- if(hashmap_operation(HASH_OP_ADD, guid, tempdata) == 1)//if(hashmap_operation(0,NULL/*hashMap*/, guid, mapItem, tempdata/*(void**)(&mapItem)*/) == MAP_OK/*hashmap_put(hashMap, mapItem->key_string, mapItem) == MAP_OK*/)
|
|
|
- {
|
|
|
- result = PASS;
|
|
|
- }
|
|
|
-
|
|
|
- return result;
|
|
|
-}
|
|
|
-
|
|
|
-int sendStartTransactionRequest(int gun_index)
|
|
|
-{
|
|
|
- mtrace();
|
|
|
- int result = FAIL;
|
|
|
- char message[250]={0};
|
|
|
- char guid[37]={0};
|
|
|
- struct timeval tmnow;
|
|
|
- struct tm *tm;
|
|
|
- char buf[28];//, usec_buf[6];
|
|
|
- char tempdata[65]={0};
|
|
|
- int tempIndex = 0;
|
|
|
-
|
|
|
- DEBUG_INFO("sendStartTransactionRequest...\n");
|
|
|
- gettimeofday(&tmnow, NULL);
|
|
|
-
|
|
|
- time_t t;
|
|
|
- t = time(NULL);
|
|
|
- /*UTC time and date*/
|
|
|
- tm = gmtime(&t);
|
|
|
- strftime(buf,28,"%Y-%m-%dT%H:%M:%SZ", tm);
|
|
|
-
|
|
|
- ShmOCPP16Data->StartTransaction[gun_index].ConnectorId = gun_index +1 ; // gun start from 1~
|
|
|
- strcpy((char *)ShmOCPP16Data->StartTransaction[gun_index].Timestamp, buf);
|
|
|
- //strcpy((char *)ShmOCPP16Data->StartTransaction[gun_index].IdTag, (const char *)ShmSysConfigAndInfo->SysConfig.UserId);
|
|
|
-
|
|
|
- // clear StartTransaction Response
|
|
|
- strcpy((char *)ShmOCPP16Data->StartTransaction[gun_index].ResponseIdTagInfo.ExpiryDate, "");
|
|
|
- strcpy((char *)ShmOCPP16Data->StartTransaction[gun_index].ResponseIdTagInfo.ParentIdTag, "");
|
|
|
- strcpy((char *)ShmOCPP16Data->StartTransaction[gun_index].ResponseIdTagInfo.Status, "");
|
|
|
- ShmOCPP16Data->StartTransaction[gun_index].ResponseTransactionId = 0;
|
|
|
-
|
|
|
- //J: CHAdeMO U: CCS1 combo E: CCS2 combo G: GBT DCcc
|
|
|
-
|
|
|
- if(gunType[gun_index] == 'J')
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
- {
|
|
|
- tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tempIndex = gun_index;
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < CHAdeMO_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
|
|
|
- {
|
|
|
- ShmOCPP16Data->StartTransaction[gun_index].MeterStart = ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargedEnergy;
|
|
|
- ShmOCPP16Data->StartTransaction[gun_index].ReservationId = ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].ReservationId;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
- else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
- {
|
|
|
- tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tempIndex = gun_index;
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < CCS_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
|
|
|
- {
|
|
|
- ShmOCPP16Data->StartTransaction[gun_index].MeterStart = ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargedEnergy;
|
|
|
- ShmOCPP16Data->StartTransaction[gun_index].ReservationId = ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].ReservationId;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- else if(gunType[gun_index] == 'G')
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
- {
|
|
|
- tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tempIndex = gun_index;
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < GB_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
|
|
|
- {
|
|
|
- ShmOCPP16Data->StartTransaction[gun_index].MeterStart = ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargedEnergy;
|
|
|
- ShmOCPP16Data->StartTransaction[gun_index].ReservationId = ShmSysConfigAndInfo->SysInfo.GbChargingData[index].ReservationId;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
|
|
|
- {
|
|
|
- tempIndex = 2;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tempIndex = gun_index;
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < AC_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
|
|
|
- {
|
|
|
- ShmOCPP16Data->StartTransaction[gun_index].MeterStart = ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PowerConsumption;
|
|
|
- ShmOCPP16Data->StartTransaction[gun_index].ReservationId = ShmSysConfigAndInfo->SysInfo.AcChargingData[index].ReservationId;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- random_uuid(guid);
|
|
|
-
|
|
|
- if(ShmOCPP16Data->StartTransaction[gun_index].ReservationId == -1)
|
|
|
- {
|
|
|
- sprintf(message, "[%d,\"%s\",\"StartTransaction\",{\"connectorId\":%d,\"idTag\":\"%s\",\"meterStart\":%d,\"timestamp\":\"%s\"}]"
|
|
|
- , MESSAGE_TYPE_CALL
|
|
|
- , guid
|
|
|
- , ShmOCPP16Data->StartTransaction[gun_index].ConnectorId
|
|
|
- , ShmOCPP16Data->StartTransaction[gun_index].IdTag
|
|
|
- , ShmOCPP16Data->StartTransaction[gun_index].MeterStart
|
|
|
- , ShmOCPP16Data->StartTransaction[gun_index].Timestamp );
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- sprintf(message, "[%d,\"%s\",\"StartTransaction\",{\"connectorId\":%d,\"idTag\":\"%s\",\"meterStart\":%d,\"reservationId\":%d,\"timestamp\":\"%s\"}]"
|
|
|
- , MESSAGE_TYPE_CALL
|
|
|
- , guid
|
|
|
- , ShmOCPP16Data->StartTransaction[gun_index].ConnectorId
|
|
|
- , ShmOCPP16Data->StartTransaction[gun_index].IdTag
|
|
|
- , ShmOCPP16Data->StartTransaction[gun_index].MeterStart
|
|
|
- , ShmOCPP16Data->StartTransaction[gun_index].ReservationId
|
|
|
- , ShmOCPP16Data->StartTransaction[gun_index].Timestamp );
|
|
|
- }
|
|
|
-
|
|
|
- sprintf(tempdata, "StartTransaction,%d", (gun_index));
|
|
|
- if(hashmap_operation(HASH_OP_ADD, guid, tempdata) == 1)//if(hashmap_operation(0,NULL/*hashMap*/, mapItem[0].key_string, mapItem[0].key_value/*mapItem*/, (void**)(&mapItem)/*(void**)(&mapItem)*/) == MAP_OK/*hashmap_put(hashMap, mapItem->key_string, mapItem) == MAP_OK*/)
|
|
|
- {
|
|
|
- result = PASS;
|
|
|
- }
|
|
|
- strcpy(queuedata, message);
|
|
|
- queue_operation(4, guid, queuedata );//addq(guid, queuedata); ---> remove temporally
|
|
|
-
|
|
|
- if(GetTransactionQueueNum() == 1)
|
|
|
- {
|
|
|
- LWS_Send(message);
|
|
|
- }
|
|
|
-
|
|
|
- return result;
|
|
|
-}
|
|
|
-
|
|
|
-int sendStatusNotificationRequest(int gun_index)
|
|
|
-{
|
|
|
- mtrace();
|
|
|
- int result = FAIL;
|
|
|
-
|
|
|
- char message[600]={0};
|
|
|
- char guid[37];
|
|
|
- int currentStatus = 0;
|
|
|
- struct timeval tmnow;
|
|
|
- struct tm *tm;
|
|
|
- char buf[28];//, usec_buf[6];
|
|
|
- char tempdata[65]={0};
|
|
|
- int tempIndex = 0;
|
|
|
-
|
|
|
- gettimeofday(&tmnow, NULL);
|
|
|
-
|
|
|
- time_t t;
|
|
|
- t = time(NULL);
|
|
|
- /*UTC time and date*/
|
|
|
- tm = gmtime(&t);
|
|
|
- strftime(buf,28,"%Y-%m-%dT%H:%M:%SZ", tm);
|
|
|
-
|
|
|
- printf("%s",buf);
|
|
|
-
|
|
|
- ShmOCPP16Data->StatusNotification[gun_index].ConnectorId = (gun_index + 1);
|
|
|
-
|
|
|
- //strcpy(ShmOCPP16Data->StatusNotification[gun_index].ErrorCode, "NoError"); --- CSU Setting
|
|
|
-
|
|
|
- // it's option
|
|
|
- strcpy((char *)ShmOCPP16Data->StatusNotification[gun_index].Info, "");
|
|
|
-
|
|
|
-/*
|
|
|
- enum _SYSTEM_STATUS
|
|
|
-{
|
|
|
-S_BOOTING = 0,
|
|
|
-S_IDLE, = 1
|
|
|
-S_AUTHORIZING, =2
|
|
|
-S_REASSIGN_CHECK, =3
|
|
|
-S_REASSIGN, =4
|
|
|
-S_PRECHARGE, =5
|
|
|
-S_PREPARING_FOR_EV, =6
|
|
|
-S_PREPARING_FOR_EVSE, =7
|
|
|
-S_CHARGING, =8
|
|
|
-S_TERMINATING, =9
|
|
|
-S_COMPLETE, =10
|
|
|
-S_ALARM, =11
|
|
|
-S_FAULT =12
|
|
|
-}
|
|
|
-
|
|
|
-*/
|
|
|
-
|
|
|
- //check Transaction active
|
|
|
- //J: CHAdeMO U: CCS1 combo E: CCS2 combo G: GBT DCcc
|
|
|
- if(gunType[gun_index] == 'J')
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
- {
|
|
|
- tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tempIndex = gun_index;
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < CHAdeMO_QUANTITY; index++)
|
|
|
- {
|
|
|
- if ((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex))
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_IDLE)//S_IDLE
|
|
|
- {
|
|
|
-
|
|
|
- currentStatus = 0; //OCPP Status: Available
|
|
|
- }
|
|
|
- else if ( ((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus >= SYS_MODE_PREPARING)&&( ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus <= SYS_MODE_PREPARE_FOR_EVSE))
|
|
|
- || ( ( ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus >= SYS_MODE_CCS_PRECHARGE_STEP0) && ( ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus <= SYS_MODE_CCS_PRECHARGE_STEP1))
|
|
|
- || (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_AUTHORIZING)) //S_PRECHARGE
|
|
|
- {
|
|
|
- currentStatus = 1; //OCPP Status: Preparing
|
|
|
- }
|
|
|
- else if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_CHARGING) //S_CHARGING
|
|
|
- {
|
|
|
- currentStatus = 2; //OCPP Status: Charging
|
|
|
- }
|
|
|
- else if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_COMPLETE) //S_COMPLETE
|
|
|
- {
|
|
|
- currentStatus = 5; //OCPP Status: Finishing
|
|
|
- }
|
|
|
- else if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_TERMINATING) // S_TERMINATING ---> SuspendedEV
|
|
|
- {
|
|
|
- currentStatus = 4; //OCPP Status: SuspendedEV
|
|
|
- }
|
|
|
- else if ((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_MAINTAIN)|| (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_DEBUG) || (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_UPDATE)) // ---> Unavailable
|
|
|
- {
|
|
|
- currentStatus = 7; //OCPP Status: Unavailable
|
|
|
- }
|
|
|
- else if ((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_FAULT)|| (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_ALARM)) //S_ALARM,S_FAULT ---> Faulted
|
|
|
- {
|
|
|
- currentStatus = 8; //OCPP Status: Faulted
|
|
|
- }
|
|
|
- else if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_RESERVATION) // ---> Reserved
|
|
|
- {
|
|
|
- currentStatus = 6; //OCPP Status: Reserved
|
|
|
- }
|
|
|
-
|
|
|
- } //end of the same index
|
|
|
-
|
|
|
- }//end of for CHAdeMO_QUANTITY
|
|
|
-
|
|
|
- }
|
|
|
- else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
- {
|
|
|
- tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tempIndex = gun_index;
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < CCS_QUANTITY; index++)
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_IDLE) //S_IDLE
|
|
|
- {
|
|
|
-
|
|
|
- currentStatus = 0; //OCPP Status: Available
|
|
|
-
|
|
|
- }
|
|
|
- else if ( ((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus >= SYS_MODE_PREPARING)&&( ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus <= SYS_MODE_PREPARE_FOR_EVSE))
|
|
|
- || ( ( ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus >= SYS_MODE_CCS_PRECHARGE_STEP0) && ( ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus <= SYS_MODE_CCS_PRECHARGE_STEP1))
|
|
|
- || (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_AUTHORIZING)) //S_PRECHARGE
|
|
|
- {
|
|
|
- currentStatus = 1; //OCPP Status: Preparing
|
|
|
- }
|
|
|
- else if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_CHARGING) //S_CHARGING
|
|
|
- {
|
|
|
- currentStatus = 2; //OCPP Status: Charging
|
|
|
- }
|
|
|
- else if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_COMPLETE) //S_COMPLETE
|
|
|
- {
|
|
|
- currentStatus = 5; //OCPP Status: Finishing
|
|
|
- }
|
|
|
- else if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_TERMINATING) //S_TERMINATING ---> SuspendedEV
|
|
|
- {
|
|
|
- currentStatus = 4; //OCPP Status: SuspendedEV
|
|
|
- }
|
|
|
- else if ((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_MAINTAIN) || (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_DEBUG) || (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_UPDATE)) // ---> Unavailable
|
|
|
- {
|
|
|
- currentStatus = 7; //OCPP Status : Unavailable
|
|
|
- }
|
|
|
- else if ((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_FAULT) || (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_ALARM)) //S_ALARM ,S_FAULT ---> Faulted
|
|
|
- {
|
|
|
- currentStatus = 8; //OCPP Status: Faulted
|
|
|
- }
|
|
|
- else if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_RESERVATION) // ---> Reserved
|
|
|
- {
|
|
|
- currentStatus = 6; //OCPP Status: Reserved
|
|
|
- }
|
|
|
-
|
|
|
- } //end of the same index
|
|
|
-
|
|
|
- } // end of for CCS_QUANTITY
|
|
|
- }
|
|
|
- else if(gunType[gun_index] == 'G')
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
- {
|
|
|
- tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tempIndex = gun_index;
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < GB_QUANTITY; index++)
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_IDLE) //S_IDLE
|
|
|
- {
|
|
|
-
|
|
|
- currentStatus = 0; //OCPP Status: Available
|
|
|
-
|
|
|
- }
|
|
|
- else if (((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus >= SYS_MODE_PREPARING)&&( ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus <= SYS_MODE_PREPARE_FOR_EVSE))
|
|
|
- || ( ( ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus >= SYS_MODE_CCS_PRECHARGE_STEP0) && ( ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus <= SYS_MODE_CCS_PRECHARGE_STEP1))
|
|
|
- || (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_AUTHORIZING)) //S_PRECHARGE
|
|
|
- {
|
|
|
- currentStatus = 1; //OCPP Status: Preparing
|
|
|
- }
|
|
|
- else if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_CHARGING) //S_CHARGING
|
|
|
- {
|
|
|
- currentStatus = 2; //OCPP Status: Charging
|
|
|
- }
|
|
|
- else if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_COMPLETE) //S_COMPLETE
|
|
|
- {
|
|
|
- currentStatus = 5; //OCPP Status: Finishing
|
|
|
- }
|
|
|
- else if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_TERMINATING) // S_TERMINATING ---> SuspendedEV
|
|
|
- {
|
|
|
- currentStatus = 4; //OCPP Status: SuspendedEV
|
|
|
- }
|
|
|
- else if ((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_MAINTAIN) || (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_DEBUG) || (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_UPDATE)) // ---> Unavailable
|
|
|
- {
|
|
|
- currentStatus = 7; //OCPP Status: Unavailable
|
|
|
- }
|
|
|
- else if ((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_FAULT) || (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_ALARM)) //S_ALARM ,S_FAULT ---> Faulted
|
|
|
- {
|
|
|
- currentStatus = 8; //OCPP Status: Faulted
|
|
|
- }
|
|
|
- else if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_RESERVATION) // ---> Reserved
|
|
|
- {
|
|
|
- currentStatus = 6; //OCPP Status: Reserved
|
|
|
- }
|
|
|
- } //end of the same index
|
|
|
-
|
|
|
- } // end of for GB_QUANTITY
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
|
|
|
- {
|
|
|
- tempIndex = 2;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tempIndex = gun_index;
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < AC_QUANTITY; index++)
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_IDLE) //SYS_MODE_IDLE
|
|
|
- {
|
|
|
- if((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PilotState == CP_STATE_B) ||(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PilotState == CP_STATE_C) || (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PilotState == CP_STATE_D))
|
|
|
- {
|
|
|
- currentStatus = 1; //OCPP Status: Preparing
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- currentStatus = 0; //OCPP Status: Available
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
- else if ((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_PREPARING) || (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_AUTHORIZING)) //SYS_MODE_PREPARING
|
|
|
- {
|
|
|
- currentStatus = 1; //OCPP Status: Preparing
|
|
|
- }
|
|
|
- else if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_CHARGING) //SYS_MODE_CHARGING
|
|
|
- {
|
|
|
- currentStatus = 2; //OCPP Status: Charging
|
|
|
- }
|
|
|
- else if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_COMPLETE) //SYS_MODE_COMPLETE
|
|
|
- {
|
|
|
- currentStatus = 5; //OCPP Status: Finishing
|
|
|
- }
|
|
|
- else if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_TERMINATING) // S_TERMINATING ---> SuspendedEV
|
|
|
- {
|
|
|
- currentStatus = 4; //OCPP Status: SuspendedEV
|
|
|
- }
|
|
|
- else if ((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_MAINTAIN)|| (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_DEBUG) || (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_UPDATE)) // ---> Unavailable
|
|
|
- {
|
|
|
- currentStatus = 7; //OCPP Status: Unavailable
|
|
|
- }
|
|
|
- else if ((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_FAULT) || (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_ALARM)) //S_ALARM,S_FAULT ---> Faulted
|
|
|
- {
|
|
|
- currentStatus = 8; //OCPP Status: Faulted
|
|
|
- }
|
|
|
- else if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_RESERVATION) // ---> Reserved
|
|
|
- {
|
|
|
- currentStatus = 6; //OCPP Status: Reserved
|
|
|
- }
|
|
|
-
|
|
|
- }//end of the same index
|
|
|
-
|
|
|
- }//end of for AC_QUANTITY
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- //it's option
|
|
|
- strcpy((char *)ShmOCPP16Data->StatusNotification[gun_index].Timestamp, buf);
|
|
|
- strcpy((char *)ShmOCPP16Data->StatusNotification[gun_index].VendorId, "PhihongTechnology");
|
|
|
- strcpy((char *)ShmOCPP16Data->StatusNotification[gun_index].Status, ChargePointStatusStr[currentStatus]);
|
|
|
-
|
|
|
- random_uuid(guid);
|
|
|
-
|
|
|
- sprintf(message, "[%d,\"%s\",\"StatusNotification\",{\"connectorId\":%d,\"errorCode\":\"%s\",\"info\":\"%s\",\"status\":\"%s\",\"timestamp\":\"%s\",\"vendorId\":\"%s\",\"vendorErrorCode\":\"%s\"}]"
|
|
|
- , MESSAGE_TYPE_CALL
|
|
|
- , guid
|
|
|
- , ShmOCPP16Data->StatusNotification[gun_index].ConnectorId
|
|
|
- , ShmOCPP16Data->StatusNotification[gun_index].ErrorCode
|
|
|
- , ShmOCPP16Data->StatusNotification[gun_index].Info
|
|
|
- , ShmOCPP16Data->StatusNotification[gun_index].Status
|
|
|
- , ShmOCPP16Data->StatusNotification[gun_index].Timestamp
|
|
|
- , ShmOCPP16Data->StatusNotification[gun_index].VendorId
|
|
|
- , ShmOCPP16Data->StatusNotification[gun_index].VendorErrorCode);
|
|
|
-
|
|
|
- LWS_Send(message);
|
|
|
-
|
|
|
- sprintf(tempdata, "StatusNotification,%d", (gun_index));
|
|
|
-
|
|
|
- if(hashmap_operation(HASH_OP_ADD, guid, tempdata) == 1)//if(hashmap_operation(0,NULL/*hashMap*/, guid, mapItem, tempdata/*(void**)(&mapItem)*//*(void**)(&mapItem)*/) == MAP_OK/*hashmap_put(hashMap, mapItem->key_string, mapItem) == MAP_OK*/)
|
|
|
- {
|
|
|
- result = PASS;
|
|
|
- }
|
|
|
-
|
|
|
- return result;
|
|
|
-}
|
|
|
-
|
|
|
-int sendStopTransactionRequest(int gun_index)
|
|
|
-{
|
|
|
- mtrace();
|
|
|
- int result = FAIL;
|
|
|
- //char message[1500]={0};
|
|
|
- char guid[37]={0};
|
|
|
- char tempdata[65]={0};
|
|
|
- int tempIndex = 0;
|
|
|
- //int idx_sample=0;
|
|
|
-
|
|
|
- DEBUG_INFO("sendStopTransactionRequest...\n");
|
|
|
- memset(queuedata, 0, sizeof(queuedata));
|
|
|
-
|
|
|
- //ENERGY_ACTIVE_IMPORT_REGISTER
|
|
|
- //J: CHAdeMO U: CCS1 combo E: CCS2 combo G: GBT DCcc
|
|
|
- if(gunType[gun_index] == 'J')
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
- {
|
|
|
- tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tempIndex = gun_index;
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < CHAdeMO_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
|
|
|
- {
|
|
|
- ShmOCPP16Data->StopTransaction[gun_index].MeterStop = ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PowerConsumption;
|
|
|
- }
|
|
|
- }// END OF CHAdeMO_QUANTITY
|
|
|
- }
|
|
|
- else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
- {
|
|
|
- tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tempIndex = gun_index;
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < CCS_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
|
|
|
- {
|
|
|
- ShmOCPP16Data->StopTransaction[gun_index].MeterStop = ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PowerConsumption;
|
|
|
- }
|
|
|
- }// END OF CCS_QUANTITY
|
|
|
-
|
|
|
- }
|
|
|
- else if(gunType[gun_index] == 'G')
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
- {
|
|
|
- tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tempIndex = gun_index;
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < GB_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
|
|
|
- {
|
|
|
- ShmOCPP16Data->StopTransaction[gun_index].MeterStop = ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PowerConsumption;
|
|
|
- }
|
|
|
- }// END OF GB_QUANTITY
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
|
|
|
- {
|
|
|
- tempIndex = 2;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tempIndex = gun_index;
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < AC_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
|
|
|
- {
|
|
|
- ShmOCPP16Data->StopTransaction[gun_index].MeterStop = ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PowerConsumption;
|
|
|
- }
|
|
|
- }// END OF AC_QUANTITY
|
|
|
- }
|
|
|
-
|
|
|
- //Stop Transaction Time
|
|
|
- struct timeval tmnow;
|
|
|
- struct tm *tm;
|
|
|
- char buf[28];//, usec_buf[6];
|
|
|
- gettimeofday(&tmnow, NULL);
|
|
|
-
|
|
|
- time_t t;
|
|
|
- t = time(NULL);
|
|
|
- /*UTC time and date*/
|
|
|
- tm = gmtime(&t);
|
|
|
- strftime(buf,28,"%Y-%m-%dT%H:%M:%SZ", tm);
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].Timestamp,buf);
|
|
|
- ShmOCPP16Data->StopTransaction[gun_index].TransactionId = ShmOCPP16Data->StartTransaction[gun_index].ResponseTransactionId;
|
|
|
-
|
|
|
- random_uuid(guid);
|
|
|
-
|
|
|
- /***********************************transactionData******************************************************/
|
|
|
- memset(ShmOCPP16Data->StopTransaction[gun_index].TransactionData, 0, sizeof(sizeof(struct StructMeterValue)));
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].TimeStamp, buf);
|
|
|
-
|
|
|
- //=================================
|
|
|
- // Transaction_Begin
|
|
|
- //=================================
|
|
|
- // Energy.Active.Export.Interval
|
|
|
- //idx_sample=0;
|
|
|
- sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Value, "%.1f",(float)(ShmOCPP16Data->StartTransaction[gun_index].MeterStart)); // MeterStart is 0~6553.5 kWh
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Context,ReadingContextStr[ReadingContext_Transaction_Begin]);
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Format,ValueFormatStr[Raw]);
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Measurand,MeasurandStr[Energy_Active_Import_Interval]);//MeasurandStr[Energy_Active_Export_Interval/*Energy_Reactive_Export_Register*/]);
|
|
|
-
|
|
|
- //J: CHAdeMO U: CCS1 combo E: CCS2 combo G: GBT DCcc
|
|
|
- if((gunType[gun_index] == 'J')||(gunType[gun_index] == 'U')||(gunType[gun_index] == 'E')||(gunType[gun_index] == 'G'))
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Phase,PhaseStr[L3_N]);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Phase,PhaseStr[L1_N]);
|
|
|
- }
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Location,LocationStr[Location_Outlet]);
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Unit,UnitOfMeasureStr[UnitOfMeasure_kWh]);
|
|
|
-
|
|
|
- //=================================
|
|
|
- // Transaction_End
|
|
|
- //=================================
|
|
|
- //Current.Export
|
|
|
- //idx_sample=1;
|
|
|
- //J: CHAdeMO U: CCS1 combo E: CCS2 combo G : GBT DC
|
|
|
- if(gunType[gun_index] == 'J')
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
- {
|
|
|
- tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tempIndex = gun_index;
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < CHAdeMO_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
|
|
|
- {
|
|
|
- sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargingCurrent );// PresentChargingCurrent is 0~6553.5 amp
|
|
|
- }
|
|
|
- }// End of for CHAdeMO_QUANTITY
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Phase,PhaseStr[L3_N]);
|
|
|
- }
|
|
|
- else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
- {
|
|
|
- tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tempIndex = gun_index;
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < CCS_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
|
|
|
- {
|
|
|
- sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargingCurrent );// PresentChargingCurrent is 0~6553.5 amp
|
|
|
- }
|
|
|
- }// End of for CCS_QUANTITY
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Phase,PhaseStr[L3_N]);
|
|
|
- }
|
|
|
- else if(gunType[gun_index] == 'G')
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
- {
|
|
|
- tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tempIndex = gun_index;
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < GB_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
|
|
|
- {
|
|
|
- sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargingCurrent );// PresentChargingCurrent is 0~6553.5 amp
|
|
|
- }
|
|
|
- }// End of for GB_QUANTITY
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Phase,PhaseStr[L3_N]);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
|
|
|
- {
|
|
|
- tempIndex = 2;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tempIndex = gun_index;
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < AC_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
|
|
|
- {
|
|
|
- sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PresentChargingCurrent );// 0~6553.5 amp for EVSE
|
|
|
- }
|
|
|
- }// End of for AC_QUANTITY
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Phase,PhaseStr[L1_N]);
|
|
|
- }
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Context,ReadingContextStr[ReadingContext_Transaction_End]);
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Format,ValueFormatStr[Raw]);
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Measurand,MeasurandStr[Current_Import]);
|
|
|
- //strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Phase,PhaseStr[L1_N]);
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Location,LocationStr[Location_Outlet]);
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Unit,UnitOfMeasureStr[UnitOfMeasure_A]);
|
|
|
-
|
|
|
- //Energy.Active.Export.Interval
|
|
|
- //idx_sample=2;
|
|
|
- //J: CHAdeMO U: CCS1 combo E: CCS2 combo G: GBT DC
|
|
|
-
|
|
|
- if(gunType[gun_index] == 'J')
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
- {
|
|
|
- tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tempIndex = gun_index;
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < CHAdeMO_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
|
|
|
- {
|
|
|
- sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargedEnergy );// PresentChargedEnergy is 0~6553.5 kWh
|
|
|
- }
|
|
|
- }// END OF CHAdeMO_QUANTITY
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Phase,PhaseStr[L3_N]);
|
|
|
-
|
|
|
- }
|
|
|
- else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
- {
|
|
|
- tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tempIndex = gun_index;
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < CCS_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
|
|
|
- {
|
|
|
- sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargedEnergy );// PresentChargedEnergy is 0~6553.5 kWh
|
|
|
- }
|
|
|
- }// END OF CCS_QUANTITY
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Phase,PhaseStr[L3_N]);
|
|
|
-
|
|
|
- }
|
|
|
- else if(gunType[gun_index] == 'G')
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
- {
|
|
|
- tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tempIndex = gun_index;
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < GB_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
|
|
|
- {
|
|
|
- sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargedEnergy );// PresentChargedEnergy is 0~6553.5 kWh
|
|
|
- }
|
|
|
- }// END OF GB_QUANTITY
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Phase,PhaseStr[L3_N]);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
|
|
|
- {
|
|
|
- tempIndex = 2;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tempIndex = gun_index;
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- for (int index = 0; index < AC_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
|
|
|
- {
|
|
|
- sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PresentChargedEnergy );// PresentChargedEnergy is 0~6553.5 kWh
|
|
|
- }
|
|
|
- }// END OF AC_QUANTITY
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Phase,PhaseStr[L1_N]);
|
|
|
- }
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Context,ReadingContextStr[ReadingContext_Transaction_End]);
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Format,ValueFormatStr[Raw]);
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Measurand,MeasurandStr[Energy_Active_Import_Interval]);
|
|
|
- //strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Phase,PhaseStr[L1_N]);
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Location,LocationStr[Location_Outlet]);
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Unit,UnitOfMeasureStr[UnitOfMeasure_kWh]);
|
|
|
-
|
|
|
- //Power.Active.Export
|
|
|
- //idx_sample=3;
|
|
|
- //J: CHAdeMO U: CCS1 combo E: CCS2 combo G: GBT DC
|
|
|
-
|
|
|
- if(gunType[gun_index] == 'J')
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
- {
|
|
|
- tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tempIndex = gun_index;
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < CHAdeMO_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
|
|
|
- {
|
|
|
- sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargingPower );// PresentChargingPower is 0~6553.5 kW
|
|
|
- }
|
|
|
- } // End for CHAdeMO_QUANTITY
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Phase,PhaseStr[L3_N]);
|
|
|
- }
|
|
|
- else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
- {
|
|
|
- tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tempIndex = gun_index;
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < CCS_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
|
|
|
- {
|
|
|
- sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargingPower );// PresentChargingPower is 0~6553.5 kW
|
|
|
- }
|
|
|
- } // END for CCS_QUANTITY
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Phase,PhaseStr[L3_N]);
|
|
|
- }
|
|
|
- else if(gunType[gun_index] == 'G')
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
- {
|
|
|
- tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tempIndex = gun_index;
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < GB_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
|
|
|
- {
|
|
|
- sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargingPower );// PresentChargingPower is 0~6553.5 kW
|
|
|
- }
|
|
|
- }// END for GB_QUANTITY
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Phase,PhaseStr[L3_N]);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
|
|
|
- {
|
|
|
- tempIndex = 2;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tempIndex = gun_index;
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < AC_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
|
|
|
- {
|
|
|
- sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PresentChargingPower );// PresentChargingPower is 0~6553.5 kW
|
|
|
- }
|
|
|
- } // END for AC_QUANTITY
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Phase,PhaseStr[L1_N]);
|
|
|
- }
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Context,ReadingContextStr[ReadingContext_Transaction_End]);
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Format,ValueFormatStr[Raw]);
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Measurand,MeasurandStr[Power_Active_Import]);
|
|
|
- //strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Phase,PhaseStr[L1_N]);
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Location,LocationStr[Location_Outlet]);
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Unit,UnitOfMeasureStr[UnitOfMeasure_kW/*UnitOfMeasure_kWh*/]);
|
|
|
-
|
|
|
- //Voltage
|
|
|
- //idx_sample=4;
|
|
|
- //J: CHAdeMO U: CCS1 combo E: CCS2 combo G: GBT DC
|
|
|
- if(gunType[gun_index] == 'J')
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
- {
|
|
|
- tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tempIndex = gun_index;
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < CHAdeMO_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
|
|
|
- {
|
|
|
- sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargingVoltage );// PresentChargingVoltage is 0~6553.5 volt
|
|
|
- }
|
|
|
- } // END OF FOR CHAdeMO_QUANTITY
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Phase,PhaseStr[L3_N]);
|
|
|
-
|
|
|
- }
|
|
|
- else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
- {
|
|
|
- tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tempIndex = gun_index;
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < CCS_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
|
|
|
- {
|
|
|
- sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargingVoltage );// PresentChargingVoltage is 0~6553.5 volt
|
|
|
- }
|
|
|
- } // END OF FOR CCS_QUANTITY
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Phase,PhaseStr[L3_N]);
|
|
|
- }
|
|
|
- else if(gunType[gun_index] == 'G')
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
- {
|
|
|
- tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tempIndex = gun_index;
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < GB_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
|
|
|
- {
|
|
|
- sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargingVoltage );// PresentChargingVoltage is 0~6553.5 volt
|
|
|
- }
|
|
|
- } // END OF FOR GB_QUANTITY
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Phase,PhaseStr[L3_N]);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
|
|
|
- {
|
|
|
- tempIndex = 2;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tempIndex = gun_index;
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < AC_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
|
|
|
- {
|
|
|
- sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PresentChargingVoltage );//AcChargingVoltage is 0~6553.5 volt for AC EVSE
|
|
|
- }
|
|
|
- } // END OF FOR AC_QUANTITY
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Phase,PhaseStr[L1_N]);
|
|
|
- }
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Context,ReadingContextStr[ReadingContext_Transaction_End]);
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Format,ValueFormatStr[Raw]);
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Measurand,MeasurandStr[Voltage]);
|
|
|
- //strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Phase,PhaseStr[L1_N]);
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Location,LocationStr[Location_Outlet]);
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Unit,UnitOfMeasureStr[UnitOfMeasure_V]);
|
|
|
-
|
|
|
- //SoC
|
|
|
- //idx_sample=5;
|
|
|
- //J : CHAdeMO U: CCS1 combo E: CCS2 combo G: GBT DC
|
|
|
- if((gunType[gun_index] == 'J')||(gunType[gun_index] == 'U')||(gunType[gun_index] == 'E')||(gunType[gun_index] == 'G'))
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
- {
|
|
|
- tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tempIndex = gun_index;
|
|
|
- }
|
|
|
-
|
|
|
- if(gunType[gun_index] == 'J')
|
|
|
- {
|
|
|
- for (int index = 0; index < CHAdeMO_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
|
|
|
- {
|
|
|
- sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Value, "%d" ,ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].EvBatterySoc );// 0~100%
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
|
|
|
- {
|
|
|
- for (int index = 0; index < CCS_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
|
|
|
- {
|
|
|
- sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Value, "%d" ,ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].EvBatterySoc );// 0~100%
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
- else if(gunType[gun_index] == 'G')
|
|
|
- {
|
|
|
- for (int index = 0; index < GB_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
|
|
|
- {
|
|
|
- sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Value, "%d" ,ShmSysConfigAndInfo->SysInfo.GbChargingData[index].EvBatterySoc );// 0~100%
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Context,ReadingContextStr[ReadingContext_Transaction_End]);
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Format,ValueFormatStr[Raw]);
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Measurand,MeasurandStr[SoC/*Energy_Reactive_Export_Register*/]);
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Phase,PhaseStr[L3_N]);
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Location,LocationStr[Location_Outlet]);
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Unit,UnitOfMeasureStr[UnitOfMeasure_Percent/*UnitOfMeasure_kWh*/]);
|
|
|
-
|
|
|
- } // END FOR DC CASE
|
|
|
-
|
|
|
- if((gunType[gun_index] == 'J')||(gunType[gun_index] == 'U')||(gunType[gun_index] == 'E')||(gunType[gun_index] == 'G'))
|
|
|
- {
|
|
|
- sprintf(queuedata,"[%d,\"%s\",\"StopTransaction\",{\"idTag\":\"%s\",\"meterStop\":%d,\"timestamp\":\"%s\",\"transactionId\":%d,\"reason\":\"%s\",\"transactionData\":[{\"timestamp\":\"%s\",\"sampledValue\":[{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"}]}]}]"
|
|
|
-
|
|
|
- ,MESSAGE_TYPE_CALL
|
|
|
- ,guid
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].IdTag
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].MeterStop
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].Timestamp
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionId
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].StopReason
|
|
|
- ,(const char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].TimeStamp
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Value
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Context
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Format
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Measurand
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Phase
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Location
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Unit
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Value
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Context
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Format
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Measurand
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Phase
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Location
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Unit
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Value
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Context
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Format
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Measurand
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Phase
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Location
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Unit
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Value
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Context
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Format
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Measurand
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Phase
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Location
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Unit
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Value
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Context
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Format
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Measurand
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Phase
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Location
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Unit
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Value
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Context
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Format
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Measurand
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Phase
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Location
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Unit
|
|
|
- );
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- sprintf(queuedata,"[%d,\"%s\",\"StopTransaction\",{\"idTag\":\"%s\",\"meterStop\":%d,\"timestamp\":\"%s\",\"transactionId\":%d,\"reason\":\"%s\",\"transactionData\":[{\"timestamp\":\"%s\",\"sampledValue\":[{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"}]}]}]"
|
|
|
-
|
|
|
- ,MESSAGE_TYPE_CALL
|
|
|
- ,guid
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].IdTag
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].MeterStop
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].Timestamp
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionId
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].StopReason
|
|
|
- ,(const char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].TimeStamp
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Value
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Context
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Format
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Measurand
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Phase
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Location
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Unit
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Value
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Context
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Format
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Measurand
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Phase
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Location
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Unit
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Value
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Context
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Format
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Measurand
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Phase
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Location
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Unit
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Value
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Context
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Format
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Measurand
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Phase
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Location
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Unit
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Value
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Context
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Format
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Measurand
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Phase
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Location
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Unit
|
|
|
- );
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
-#if 1 // for TempStopTransaction
|
|
|
- //Delete TempStopTransaction
|
|
|
- if((access("/Storage/OCPP/TempStopTransaction",F_OK))!=-1)
|
|
|
- {
|
|
|
- remove("/Storage/OCPP/TempStopTransaction"); // remove file "TempStopTransaction"
|
|
|
- }
|
|
|
-#endif
|
|
|
-
|
|
|
- sprintf(tempdata, "StopTransaction,%d", (gun_index));
|
|
|
- if(hashmap_operation(HASH_OP_ADD, guid, tempdata) == 1)
|
|
|
- {
|
|
|
- result = PASS;
|
|
|
- DEBUG_INFO("StopTransaction mapitem pass\n");
|
|
|
- }
|
|
|
- queue_operation(4, guid, queuedata );//addq(guid, queuedata); ---> remove temporally
|
|
|
-
|
|
|
- if(GetTransactionQueueNum() == 1)
|
|
|
- {
|
|
|
- LWS_Send(queuedata);
|
|
|
- }
|
|
|
-
|
|
|
- //----------------------------replace queue StopTransaction TransactionId ---------------------------//
|
|
|
- int gettransactionId = GetTransactionId(gun_index+1, (char*)ShmOCPP16Data->StartTransaction[gun_index].IdTag);
|
|
|
-
|
|
|
- if((ShmOCPP16Data->StopTransaction[gun_index].TransactionId != 0) && (gettransactionId != 0))
|
|
|
- {
|
|
|
- SetTransactionIdZero(ShmOCPP16Data->StopTransaction[gun_index].TransactionId);
|
|
|
- }
|
|
|
-
|
|
|
- //for test
|
|
|
- //ShmOCPP16Data->CpMsg.bits[gun_index].StopTransactionReq = 0;
|
|
|
-
|
|
|
- return result;
|
|
|
-}
|
|
|
-
|
|
|
-int sendMeterValuesRequest(int gun_index)
|
|
|
-{
|
|
|
- mtrace();
|
|
|
- int result = FAIL;
|
|
|
-// char message[1500]={0};
|
|
|
- char guid[37]={0};
|
|
|
- //int idx_sample=0;
|
|
|
- //int length = 0;
|
|
|
- char tempdata[65]={0};
|
|
|
- int tempIndex = 0;
|
|
|
-
|
|
|
- DEBUG_INFO("sendMeterValuesRequest...\n");
|
|
|
-
|
|
|
- if((ShmOCPP16Data->StartTransaction[gun_index].ResponseTransactionId == 0)&&(ShmOCPP16Data->CsMsg.bits[gun_index].TriggerMessageReq == 0)) // no TransactionId
|
|
|
- {
|
|
|
- DEBUG_ERROR("NOT SENT METER Vlaue\n");
|
|
|
-
|
|
|
- return result;
|
|
|
- }
|
|
|
-
|
|
|
- if(ShmOCPP16Data->CsMsg.bits[gun_index].TriggerMessageReq == 1)
|
|
|
- {
|
|
|
- ShmOCPP16Data->CsMsg.bits[gun_index].TriggerMessageReq = 0;
|
|
|
- }
|
|
|
-
|
|
|
- memset(queuedata, 0, sizeof(queuedata));
|
|
|
- //set value
|
|
|
- ShmOCPP16Data->MeterValues[gun_index].ConnectorId = gun_index + 1; // gun start from 1~
|
|
|
- ShmOCPP16Data->MeterValues[gun_index].TransactionId = ShmOCPP16Data->StartTransaction[gun_index].ResponseTransactionId;
|
|
|
-
|
|
|
- random_uuid(guid);
|
|
|
-
|
|
|
- //UTC Date time
|
|
|
- struct timeval tmnow;
|
|
|
- struct tm *tm;
|
|
|
- char buf[28];//, usec_buf[6];
|
|
|
- gettimeofday(&tmnow, NULL);
|
|
|
-
|
|
|
- time_t t;
|
|
|
- t = time(NULL);
|
|
|
- /*UTC time and date*/
|
|
|
- tm = gmtime(&t);
|
|
|
- strftime(buf,28,"%Y-%m-%dT%H:%M:%SZ", tm);
|
|
|
- strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].TimeStamp, buf);
|
|
|
-
|
|
|
- DEBUG_INFO( "ShmSysConfigAndInfo->SysConfig.ModelName[0]=%c\n", ShmSysConfigAndInfo->SysConfig.ModelName[0]);
|
|
|
-
|
|
|
- //idx_sample=0;
|
|
|
- //********************************(1)Current.Export************************************************/
|
|
|
- //J: CHAdeMO U: CCS1 combo E: CCS2 combo G: GBT DC
|
|
|
-
|
|
|
- if(gunType[gun_index] == 'J')
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
- {
|
|
|
- tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tempIndex = gun_index;
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < CHAdeMO_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
|
|
|
- {
|
|
|
- sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargingCurrent );
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Phase, PhaseStr[L3_N]);
|
|
|
- }
|
|
|
- else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
- {
|
|
|
- tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tempIndex = gun_index;
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < CCS_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
|
|
|
- {
|
|
|
- sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargingCurrent );
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Phase, PhaseStr[L3_N]);
|
|
|
- }
|
|
|
- else if(gunType[gun_index] == 'G')
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
- {
|
|
|
- tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tempIndex = gun_index;
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < GB_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
|
|
|
- {
|
|
|
- sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargingCurrent );
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Phase, PhaseStr[L3_N]);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
|
|
|
- {
|
|
|
- tempIndex = 2;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tempIndex = gun_index;
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < AC_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
|
|
|
- {
|
|
|
- sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PresentChargingCurrent );
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Phase, PhaseStr[L1_N]);
|
|
|
- }
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Context, ReadingContextStr[ReadingContext_Sample_Periodic]);
|
|
|
- strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Format, ValueFormatStr[Raw]);
|
|
|
- strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Measurand, MeasurandStr[Current_Import]);
|
|
|
- //strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Phase, PhaseStr[L1_N]);
|
|
|
- strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Location, LocationStr[Location_Outlet]);
|
|
|
- strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Unit,UnitOfMeasureStr[UnitOfMeasure_A]);
|
|
|
-
|
|
|
-
|
|
|
- //idx_sample=1;
|
|
|
- //********************************(2)Energy.Active.Import.Register ************************************************/
|
|
|
- //J: CHAdeMO U: CCS1 combo E: CCS2 combo G: GBT DC
|
|
|
-
|
|
|
- if(gunType[gun_index] == 'J')
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
- {
|
|
|
- tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tempIndex = gun_index;
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < CHAdeMO_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
|
|
|
- {
|
|
|
- sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PowerConsumption );
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Phase, PhaseStr[L3_N]);
|
|
|
- }
|
|
|
- else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
- {
|
|
|
- tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tempIndex = gun_index;
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < CCS_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
|
|
|
- {
|
|
|
- sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PowerConsumption );
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Phase, PhaseStr[L3_N]);
|
|
|
- }
|
|
|
- else if(gunType[gun_index] == 'G')
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
- {
|
|
|
- tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tempIndex = gun_index;
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < GB_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
|
|
|
- {
|
|
|
- sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PowerConsumption );
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Phase, PhaseStr[L3_N]);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
|
|
|
- {
|
|
|
- tempIndex = 2;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tempIndex = gun_index;
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < AC_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
|
|
|
- {
|
|
|
- sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PowerConsumption );
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Phase, PhaseStr[L1_N]);
|
|
|
- }
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Context, ReadingContextStr[ReadingContext_Sample_Periodic]);
|
|
|
- strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Format, ValueFormatStr[Raw]);
|
|
|
- strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Measurand, MeasurandStr[Energy_Active_Import_Register]);
|
|
|
- //strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Phase, PhaseStr[L1_N]);
|
|
|
- strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Location, LocationStr[Location_Outlet]);
|
|
|
- strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Unit,UnitOfMeasureStr[UnitOfMeasure_kWh]);
|
|
|
-
|
|
|
-
|
|
|
- //idx_sample=2;
|
|
|
- //****************************************************(3)Energy.Active.Export.Interval*********************************************/
|
|
|
- //J: CHAdeMO U: CCS1 combo E: CCS2 combo G: GBT DC
|
|
|
-
|
|
|
- if(gunType[gun_index] == 'J')
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
- {
|
|
|
- tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tempIndex = gun_index;
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < CHAdeMO_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
|
|
|
- {
|
|
|
- sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargedEnergy );
|
|
|
- }
|
|
|
- } // END OF FOR CHAdeMO_QUANTITY
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Phase, PhaseStr[L3_N]);
|
|
|
- }
|
|
|
- else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
- {
|
|
|
- tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tempIndex = gun_index;
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < CCS_QUANTITY; index++)
|
|
|
- {
|
|
|
- // printf("ShmSysConfigAndInfo->SysInfo.CcsChargingData[%d].Index=%d\n",index, ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index );
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
|
|
|
- {
|
|
|
- //ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargedEnergy = 100.0;
|
|
|
- sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargedEnergy );
|
|
|
- }
|
|
|
- } // END OF CCS_QUANTITY
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Phase, PhaseStr[L3_N]);
|
|
|
- }
|
|
|
- else if(gunType[gun_index] == 'G')
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
- {
|
|
|
- tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tempIndex = gun_index;
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < GB_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
|
|
|
- {
|
|
|
- sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargedEnergy);
|
|
|
- }
|
|
|
- } // END OF GB_QUANTITY
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Phase, PhaseStr[L3_N]);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
|
|
|
- {
|
|
|
- tempIndex = 2;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tempIndex = gun_index;
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < AC_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
|
|
|
- {
|
|
|
- sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PresentChargedEnergy );
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Phase, PhaseStr[L1_N]);
|
|
|
- }
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Context, ReadingContextStr[ReadingContext_Sample_Periodic]);
|
|
|
- strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Format, ValueFormatStr[Raw]);
|
|
|
- strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Measurand, MeasurandStr[Energy_Active_Import_Interval]);
|
|
|
- //strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Phase, PhaseStr[L1_N]);
|
|
|
- strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Location, LocationStr[Location_Outlet]);
|
|
|
- strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Unit,UnitOfMeasureStr[UnitOfMeasure_kWh]);
|
|
|
-
|
|
|
- //idx_sample=3;
|
|
|
- //********************************(4)Power.Active.Export************************************************/
|
|
|
- //J : CHAdeMO U: CCS1 combo E: CCS2 combo G: GBT DC
|
|
|
-
|
|
|
- if(gunType[gun_index] == 'J')
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
- {
|
|
|
- tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tempIndex = gun_index;
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < CHAdeMO_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
|
|
|
- {
|
|
|
- sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Value, "%.1f" , ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargingPower);
|
|
|
- }
|
|
|
- } // END OF FOR
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Phase, PhaseStr[L3_N]);
|
|
|
- }
|
|
|
- else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
- {
|
|
|
- tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tempIndex = gun_index;
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < CCS_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
|
|
|
- {
|
|
|
- sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Value, "%.1f" , ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargingPower);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Phase, PhaseStr[L3_N]);
|
|
|
- }
|
|
|
- else if(gunType[gun_index] == 'G')
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
- {
|
|
|
- tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tempIndex = gun_index;
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < GB_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
|
|
|
- {
|
|
|
- //ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargingPower = 100.0;
|
|
|
- sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Value, "%.1f" , ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargingPower);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Phase, PhaseStr[L3_N]);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
|
|
|
- {
|
|
|
- tempIndex = 2;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tempIndex = gun_index;
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < AC_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
|
|
|
- {
|
|
|
- sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Value, "%.1f" , ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PresentChargingPower);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Phase, PhaseStr[L1_N]);
|
|
|
- }
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Context, ReadingContextStr[ReadingContext_Sample_Periodic]);
|
|
|
- strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Format, ValueFormatStr[Raw]);
|
|
|
- strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Measurand, MeasurandStr[Power_Active_Import]);
|
|
|
- //strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Phase, PhaseStr[L1_N]);
|
|
|
- strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Location, LocationStr[Location_Outlet]);
|
|
|
- strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Unit,UnitOfMeasureStr[UnitOfMeasure_kW]);
|
|
|
-
|
|
|
-
|
|
|
- //idx_sample=4;
|
|
|
- //***********************************************(5)VOLTAGE******************************************************/
|
|
|
- //J : CHAdeMO U: CCS1 combo E: CCS2 combo G: GBT DC
|
|
|
-
|
|
|
- if(gunType[gun_index] == 'J')
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
- {
|
|
|
- tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tempIndex = gun_index;
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < CHAdeMO_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
|
|
|
- {
|
|
|
- sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargingVoltage );
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Phase, PhaseStr[L3_N]);
|
|
|
- }
|
|
|
- else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
- {
|
|
|
- tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tempIndex = gun_index;
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < CCS_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
|
|
|
- {
|
|
|
- sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargingVoltage );
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Phase, PhaseStr[L3_N]);
|
|
|
- }
|
|
|
- else if(gunType[gun_index] == 'G')
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
- {
|
|
|
- tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tempIndex = gun_index;
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < GB_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
|
|
|
- {
|
|
|
- sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargingVoltage );
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Phase, PhaseStr[L3_N]);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
|
|
|
- {
|
|
|
- tempIndex = 2;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tempIndex = gun_index;
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < AC_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
|
|
|
- {
|
|
|
- sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PresentChargingVoltage );
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Phase, PhaseStr[L1_N]);
|
|
|
- }
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Context, ReadingContextStr[ReadingContext_Sample_Periodic]);
|
|
|
- strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Format, ValueFormatStr[Raw]);
|
|
|
- strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Measurand, MeasurandStr[Voltage]);
|
|
|
- // strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Phase, PhaseStr[L1_N]);
|
|
|
- strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Location, LocationStr[Location_Outlet]);
|
|
|
- strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Unit,UnitOfMeasureStr[UnitOfMeasure_V]);
|
|
|
-
|
|
|
-
|
|
|
- if((gunType[gun_index] == 'J')||(gunType[gun_index] == 'U')||(gunType[gun_index] == 'E')||(gunType[gun_index] == 'G'))
|
|
|
- {
|
|
|
- //idx_sample=5;
|
|
|
- //sampledValue = NULL;
|
|
|
- //***********************************************(6)SOC******************************************************/
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
- {
|
|
|
- tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tempIndex = gun_index;
|
|
|
- }
|
|
|
-
|
|
|
- if(gunType[gun_index] == 'J')
|
|
|
- {
|
|
|
- //tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
-
|
|
|
- for (int index = 0; index < CHAdeMO_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
|
|
|
- {
|
|
|
- sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[5].Value, "%d" ,ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].EvBatterySoc );
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
|
|
|
- {
|
|
|
- //tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
-
|
|
|
- for (int index = 0; index < CCS_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
|
|
|
- {
|
|
|
- sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[5].Value, "%d" ,ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].EvBatterySoc );
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
- else if(gunType[gun_index] == 'G')
|
|
|
- {
|
|
|
- //tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
-
|
|
|
- for (int index = 0; index < GB_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
|
|
|
- {
|
|
|
- sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[5].Value, "%d" ,ShmSysConfigAndInfo->SysInfo.GbChargingData[index].EvBatterySoc );
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[5].Context, ReadingContextStr[ReadingContext_Sample_Periodic]);
|
|
|
- strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[5].Format, ValueFormatStr[Raw]);
|
|
|
- strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[5].Measurand, MeasurandStr[SoC]);
|
|
|
- strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[5].Phase, PhaseStr[L3_N]);
|
|
|
- strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[5].Location, LocationStr[Location_Outlet]);
|
|
|
- strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[5].Unit,UnitOfMeasureStr[UnitOfMeasure_Percent]);
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- if((gunType[gun_index] == 'J')||(gunType[gun_index] == 'U')||(gunType[gun_index] == 'E')||(gunType[gun_index] == 'G'))
|
|
|
- {
|
|
|
- sprintf(queuedata,"[%d,\"%s\",\"MeterValues\",{\"connectorId\":%d,\"transactionId\":%d,\"meterValue\":[{\"timestamp\":\"%s\",\"sampledValue\":[{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"}]}]}]"
|
|
|
- ,MESSAGE_TYPE_CALL
|
|
|
- ,guid
|
|
|
- ,ShmOCPP16Data->MeterValues[gun_index].ConnectorId
|
|
|
- ,ShmOCPP16Data->MeterValues[gun_index].TransactionId
|
|
|
- ,(const char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].TimeStamp
|
|
|
- ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Value
|
|
|
- ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Context
|
|
|
- ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Format
|
|
|
- ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Measurand
|
|
|
- ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Phase
|
|
|
- ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Location
|
|
|
- ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Unit
|
|
|
- ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Value
|
|
|
- ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Context
|
|
|
- ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Format
|
|
|
- ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Measurand
|
|
|
- ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Phase
|
|
|
- ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Location
|
|
|
- ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Unit
|
|
|
- ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Value
|
|
|
- ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Context
|
|
|
- ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Format
|
|
|
- ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Measurand
|
|
|
- ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Phase
|
|
|
- ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Location
|
|
|
- ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Unit
|
|
|
- ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Value
|
|
|
- ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Context
|
|
|
- ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Format
|
|
|
- ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Measurand
|
|
|
- ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Phase
|
|
|
- ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Location
|
|
|
- ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Unit
|
|
|
- ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Value
|
|
|
- ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Context
|
|
|
- ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Format
|
|
|
- ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Measurand
|
|
|
- ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Phase
|
|
|
- ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Location
|
|
|
- ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Unit
|
|
|
- ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[5].Value
|
|
|
- ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[5].Context
|
|
|
- ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[5].Format
|
|
|
- ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[5].Measurand
|
|
|
- ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[5].Phase
|
|
|
- ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[5].Location
|
|
|
- ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[5].Unit
|
|
|
-
|
|
|
- );
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- sprintf(queuedata,"[%d,\"%s\",\"MeterValues\",{\"connectorId\":%d,\"transactionId\":%d,\"meterValue\":[{\"timestamp\":\"%s\",\"sampledValue\":[{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"}]}]}]"
|
|
|
- ,MESSAGE_TYPE_CALL
|
|
|
- ,guid
|
|
|
- ,ShmOCPP16Data->MeterValues[gun_index].ConnectorId
|
|
|
- ,ShmOCPP16Data->MeterValues[gun_index].TransactionId
|
|
|
- ,(const char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].TimeStamp
|
|
|
- ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Value
|
|
|
- ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Context
|
|
|
- ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Format
|
|
|
- ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Measurand
|
|
|
- ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Phase
|
|
|
- ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Location
|
|
|
- ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Unit
|
|
|
- ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Value
|
|
|
- ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Context
|
|
|
- ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Format
|
|
|
- ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Measurand
|
|
|
- ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Phase
|
|
|
- ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Location
|
|
|
- ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Unit
|
|
|
- ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Value
|
|
|
- ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Context
|
|
|
- ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Format
|
|
|
- ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Measurand
|
|
|
- ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Phase
|
|
|
- ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Location
|
|
|
- ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Unit
|
|
|
- ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Value
|
|
|
- ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Context
|
|
|
- ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Format
|
|
|
- ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Measurand
|
|
|
- ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Phase
|
|
|
- ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Location
|
|
|
- ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Unit
|
|
|
- ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Value
|
|
|
- ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Context
|
|
|
- ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Format
|
|
|
- ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Measurand
|
|
|
- ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Phase
|
|
|
- ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Location
|
|
|
- ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Unit
|
|
|
-
|
|
|
- );
|
|
|
- }
|
|
|
-
|
|
|
- // Put request guid to hash map
|
|
|
- sprintf(tempdata, "MeterValues,%d", (gun_index));
|
|
|
- if(hashmap_operation(HASH_OP_ADD, guid, tempdata) == 1)//if(hashmap_operation(0,NULL/*hashMap*/, mapItem[0].key_string, mapItem[0].key_value/*mapItem*/, (void**)(&mapItem)/*(void**)(&mapItem)*/) == MAP_OK/*hashmap_put(hashMap, mapItem->key_string, mapItem) == MAP_OK*/)
|
|
|
- {
|
|
|
- result = PASS;
|
|
|
- DEBUG_INFO("MeterValues mapitem pass\n");
|
|
|
- }
|
|
|
- queue_operation(4, guid, queuedata );//addq(guid, queuedata); ---> remove temporally
|
|
|
-
|
|
|
- if(GetTransactionQueueNum() == 1)
|
|
|
- {
|
|
|
- LWS_Send(queuedata);
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- return result;
|
|
|
-}
|
|
|
-
|
|
|
-//==========================================
|
|
|
-// send confirm routine
|
|
|
-//==========================================
|
|
|
-int sendCancelReservationConfirmation(char *uuid,char *payload)
|
|
|
-{
|
|
|
- mtrace();
|
|
|
- int result = FAIL;
|
|
|
- char message[100]={0};
|
|
|
-
|
|
|
- DEBUG_INFO("sendCancelReservationConfirmation...\n");
|
|
|
- sprintf(message,"[%d,\"%s\",{\"status\":\"%s\"}]",MESSAGE_TYPE_CALLRESULT,uuid, payload);
|
|
|
- LWS_Send(message);
|
|
|
- result = TRUE;
|
|
|
- ShmOCPP16Data->CsMsg.bits[0].CancelReservationConf = 0;
|
|
|
- return result;
|
|
|
-}
|
|
|
-
|
|
|
-int sendChangeAvailabilityConfirmation(char *uuid,char *payload)
|
|
|
-{
|
|
|
- mtrace();
|
|
|
- int result = FAIL;
|
|
|
- char message[100]={0};
|
|
|
- DEBUG_INFO("sendChangeAvailabilityConfirmation...\n");
|
|
|
- sprintf(message,"[%d,\"%s\",{\"status\":\"%s\"}]",MESSAGE_TYPE_CALLRESULT,uuid, payload);
|
|
|
- LWS_Send(message);
|
|
|
- result = TRUE;
|
|
|
-
|
|
|
- return result;
|
|
|
-}
|
|
|
-
|
|
|
-int sendChangeConfigurationConfirmation(char *uuid,char *payload)
|
|
|
-{
|
|
|
- mtrace();
|
|
|
- int result = FAIL;
|
|
|
- char message[100]={0};
|
|
|
-
|
|
|
- DEBUG_INFO("sendChangeConfigurationConfirmation...\n");
|
|
|
- sprintf(message,"[%d,\"%s\",{\"status\":\"%s\"}]",MESSAGE_TYPE_CALLRESULT,uuid, payload);
|
|
|
- LWS_Send(message);
|
|
|
- result = TRUE;
|
|
|
-
|
|
|
- return result;
|
|
|
-}
|
|
|
-
|
|
|
-int sendClearCacheConfirmation(char *uuid,char *payload)
|
|
|
-{
|
|
|
- mtrace();
|
|
|
- int result = FAIL;
|
|
|
- char message[500]={0};
|
|
|
-
|
|
|
- DEBUG_INFO("sendClearCacheConfirmation...\n");
|
|
|
- sprintf(message,"[%d,\"%s\",{\"%s\":\"%s\"}]",MESSAGE_TYPE_CALLRESULT, uuid, "status", payload);
|
|
|
- LWS_Send(message);
|
|
|
-
|
|
|
- return result;
|
|
|
-}
|
|
|
-
|
|
|
-int sendClearChargingProfileConfirmation(char *uuid,char *payload)
|
|
|
-{
|
|
|
- mtrace();
|
|
|
- int result = FAIL;
|
|
|
-
|
|
|
- char message[500]={0};
|
|
|
-
|
|
|
- DEBUG_INFO("sendClearChargingProfileConfirmation...\n");
|
|
|
- sprintf(message,"[%d,\"%s\",{\"%s\":\"%s\"}]",MESSAGE_TYPE_CALLRESULT, uuid, "status", payload);
|
|
|
- LWS_Send(message);
|
|
|
-
|
|
|
- return result;
|
|
|
-}
|
|
|
-
|
|
|
-int sendDataTransferConfirmation(char *uuid,char *payload)
|
|
|
-{
|
|
|
- mtrace();
|
|
|
- char statusStr[20]={0};
|
|
|
- char dataStr[10]={0};
|
|
|
- char sstr[20]={0};
|
|
|
- int c = 0;
|
|
|
- char *loc;
|
|
|
- int result = FAIL;
|
|
|
-
|
|
|
- DEBUG_INFO("sendDataTransferConfirmation...\n");
|
|
|
- /**********************status**************************/
|
|
|
- loc = strstr(payload, "status");
|
|
|
- memset(sstr ,0, sizeof(sstr) );
|
|
|
- c = 0;
|
|
|
- while (loc[3+strlen("status")+c] != '\"')
|
|
|
- {
|
|
|
- sstr[c] = loc[3+strlen("status")+c];
|
|
|
- c++;
|
|
|
- }
|
|
|
- sstr[c] = '\0';
|
|
|
- strcpy(statusStr, sstr);
|
|
|
-
|
|
|
-
|
|
|
- /**********************data**************************/
|
|
|
- loc = strstr(payload, "data");
|
|
|
- memset(sstr ,0, sizeof(sstr) );
|
|
|
- c = 0;
|
|
|
- while (loc[3+strlen("data")+c] != '\"')
|
|
|
- {
|
|
|
- sstr[c] = loc[3+strlen("data")+c];
|
|
|
- c++;
|
|
|
- }
|
|
|
- sstr[c] = '\0';
|
|
|
- strcpy(dataStr, sstr);
|
|
|
-
|
|
|
- return result;
|
|
|
-}
|
|
|
-
|
|
|
-int sendGetCompositeScheduleConfirmation(char *uuid, char *payload, int connectorIdInt, int nPeriod)
|
|
|
-{
|
|
|
- mtrace();
|
|
|
- int result = FAIL;
|
|
|
- char message[1000]={0};
|
|
|
- int CompositeScheduleIndex = 0;
|
|
|
-
|
|
|
- DEBUG_INFO("sendGetCompositeScheduleConfirmation...\n");
|
|
|
-
|
|
|
- CompositeScheduleIndex = (connectorIdInt > 0) ?(connectorIdInt -1) : 0;
|
|
|
- if(nPeriod == 0)
|
|
|
- {
|
|
|
- if(strcmp((const char *)ShmOCPP16Data->GetCompositeSchedule[CompositeScheduleIndex].ResponseChargingSchedule.StartSchedule,"")==0)
|
|
|
- {
|
|
|
- sprintf(message,"[%d,\"%s\",{\"status\":\"%s\",\"connectorId\":%d}]"
|
|
|
- ,MESSAGE_TYPE_CALLRESULT
|
|
|
- ,uuid
|
|
|
- ,payload
|
|
|
- ,connectorIdInt);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- sprintf(message,"[%d,\"%s\",{\"status\":\"%s\",\"connectorId\":%d,\"scheduleStart\":\"%s\",\"chargingSchedule\":{\"duration\":%d,\"startSchedule\":\"%s\",\"chargingRateUnit\":\"%s\",\"chargingSchedulePeriod\":[{\"startPeriod\":0,\"limit\":0,\"numberPhases\":3}]}}]"
|
|
|
- ,MESSAGE_TYPE_CALLRESULT
|
|
|
- ,uuid
|
|
|
- ,payload
|
|
|
- ,connectorIdInt
|
|
|
- ,ShmOCPP16Data->GetCompositeSchedule[CompositeScheduleIndex].ResponseChargingSchedule.StartSchedule
|
|
|
- ,ShmOCPP16Data->GetCompositeSchedule[CompositeScheduleIndex].ResponseChargingSchedule.Duration
|
|
|
- ,ShmOCPP16Data->GetCompositeSchedule[CompositeScheduleIndex].ResponseChargingSchedule.StartSchedule
|
|
|
- ,ShmOCPP16Data->GetCompositeSchedule[CompositeScheduleIndex].ResponseChargingSchedule.ChargingRateUnit);
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- sprintf(message,"[%d,\"%s\",{\"status\":\"%s\",\"connectorId\":%d,\"scheduleStart\":\"%s\",\"chargingSchedule\":{\"duration\":%d,\"startSchedule\":\"%s\",\"chargingRateUnit\":\"%s\",\"chargingSchedulePeriod\":["
|
|
|
- ,MESSAGE_TYPE_CALLRESULT
|
|
|
- ,uuid
|
|
|
- ,payload
|
|
|
- ,connectorIdInt
|
|
|
- ,ShmOCPP16Data->GetCompositeSchedule[CompositeScheduleIndex].ResponseChargingSchedule.StartSchedule
|
|
|
- ,ShmOCPP16Data->GetCompositeSchedule[CompositeScheduleIndex].ResponseChargingSchedule.Duration
|
|
|
- ,ShmOCPP16Data->GetCompositeSchedule[CompositeScheduleIndex].ResponseChargingSchedule.StartSchedule
|
|
|
- ,ShmOCPP16Data->GetCompositeSchedule[CompositeScheduleIndex].ResponseChargingSchedule.ChargingRateUnit);
|
|
|
-
|
|
|
- for(int idx_sample=0;idx_sample< nPeriod;idx_sample++)
|
|
|
- {
|
|
|
- if (idx_sample == 0)
|
|
|
- {
|
|
|
- sprintf(message + strlen(message), "{\"startPeriod\":%d,\"limit\":%.1f,\"numberPhases\":%d}"
|
|
|
- , ShmOCPP16Data->GetCompositeSchedule[CompositeScheduleIndex].ResponseChargingSchedule.ChargingSchedulePeriod[idx_sample].StartPeriod
|
|
|
- , ShmOCPP16Data->GetCompositeSchedule[CompositeScheduleIndex].ResponseChargingSchedule.ChargingSchedulePeriod[idx_sample].Limit
|
|
|
- , ShmOCPP16Data->GetCompositeSchedule[CompositeScheduleIndex].ResponseChargingSchedule.ChargingSchedulePeriod[idx_sample].NumberPhases );
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- sprintf(message + strlen(message), ",{\"startPeriod\":%d,\"limit\":%.1f,\"numberPhases\":%d}"
|
|
|
- , ShmOCPP16Data->GetCompositeSchedule[CompositeScheduleIndex].ResponseChargingSchedule.ChargingSchedulePeriod[idx_sample].StartPeriod
|
|
|
- , ShmOCPP16Data->GetCompositeSchedule[CompositeScheduleIndex].ResponseChargingSchedule.ChargingSchedulePeriod[idx_sample].Limit
|
|
|
- , ShmOCPP16Data->GetCompositeSchedule[CompositeScheduleIndex].ResponseChargingSchedule.ChargingSchedulePeriod[idx_sample].NumberPhases );
|
|
|
- }
|
|
|
- }
|
|
|
- sprintf(message + strlen(message), "]}}]");
|
|
|
- }
|
|
|
-
|
|
|
- LWS_Send(message);
|
|
|
- result = TRUE;
|
|
|
- return result;
|
|
|
-}
|
|
|
-
|
|
|
-int sendGetConfigurationConfirmation(char *uuid)
|
|
|
-{
|
|
|
- mtrace();
|
|
|
- int result = FAIL;
|
|
|
- int MaxKeySupported = 0;
|
|
|
- int sentConfigurationNumber= 0;
|
|
|
- int sentunConfigurationNumber= 0;
|
|
|
- char message[4000]={0};
|
|
|
-
|
|
|
- DEBUG_INFO("sendGetConfigurationConfirmation...\n");
|
|
|
-
|
|
|
- MaxKeySupported = atoi((const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[GetConfigurationMaxKeys].ItemData);
|
|
|
-
|
|
|
- //DEBUG_INFO("MaxKeySupported=%d\n",MaxKeySupported);
|
|
|
-
|
|
|
- sprintf(message,"[%d,\"%s\",{\"configurationKey\":["
|
|
|
- ,MESSAGE_TYPE_CALLRESULT
|
|
|
- ,uuid );
|
|
|
-
|
|
|
- //configuration key
|
|
|
- for(int idx_sample=0;idx_sample< MaxKeySupported/*43*/;idx_sample++)
|
|
|
- {
|
|
|
- if(strcmp((const char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[idx_sample].Key, "")!= 0)
|
|
|
- {
|
|
|
- if (sentConfigurationNumber == 0)
|
|
|
- {
|
|
|
- sprintf(message + strlen(message), "{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}"
|
|
|
- , ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[idx_sample].Key
|
|
|
- , atoi((const char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[idx_sample].ReadOnly) == 1 ? "true":"false"
|
|
|
- , ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[idx_sample].Value );
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- sprintf(message + strlen(message), ", {\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}"
|
|
|
- , ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[idx_sample].Key
|
|
|
- , atoi((const char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[idx_sample].ReadOnly) == 1 ? "true":"false"
|
|
|
- , ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[idx_sample].Value );
|
|
|
- }
|
|
|
-
|
|
|
- sentConfigurationNumber = sentConfigurationNumber + 1;
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- sprintf(message + strlen(message), "]");
|
|
|
-
|
|
|
-
|
|
|
- if(UnknownKeynum != 0)
|
|
|
- {
|
|
|
- sprintf(message + strlen(message), ",\"unknownKey\":[");
|
|
|
- //unkown key
|
|
|
- for(int idx_sample=0;idx_sample< UnknownKeynum ;idx_sample++)
|
|
|
- {
|
|
|
- // json_object *jstring1 = json_object_new_string((const char *)((ShmOCPP16Data->GetConfiguration.ResponseUnknownKey + idx_sample)->Item));
|
|
|
-
|
|
|
- DEBUG_INFO("unkown key:%s\n", ShmOCPP16Data->GetConfiguration.ResponseUnknownKey[idx_sample].Item);
|
|
|
-
|
|
|
- if(sentunConfigurationNumber == 0)
|
|
|
- {
|
|
|
- sprintf(message + strlen(message), "\"%s\""
|
|
|
- , ShmOCPP16Data->GetConfiguration.ResponseUnknownKey[idx_sample].Item );
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- sprintf(message + strlen(message), ",\"%s\""
|
|
|
- , ShmOCPP16Data->GetConfiguration.ResponseUnknownKey[idx_sample].Item );
|
|
|
- }
|
|
|
- sentunConfigurationNumber = sentunConfigurationNumber + 1;
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- sprintf(message + strlen(message), "]");
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- sprintf(message + strlen(message), "}]");
|
|
|
-
|
|
|
- LWS_Send(message);
|
|
|
-
|
|
|
- return result;
|
|
|
-}
|
|
|
-
|
|
|
-int sendGetDiagnosticsConfirmation(char *uuid,char *payload)
|
|
|
-{
|
|
|
- mtrace();
|
|
|
- int result = FAIL;
|
|
|
- char message[400]={0};
|
|
|
-
|
|
|
- DEBUG_INFO("sendGetDiagnosticsConfirmation...\n");
|
|
|
-
|
|
|
- if(strcmp(payload,"")==0)
|
|
|
- {
|
|
|
- sprintf(message,"[%d,\"%s\",{}]",MESSAGE_TYPE_CALLRESULT, uuid);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- sprintf(message,"[%d,\"%s\",{\"fileName\":\"%s\"}]", MESSAGE_TYPE_CALLRESULT, uuid, payload);
|
|
|
- }
|
|
|
- LWS_Send(message);
|
|
|
- result = TRUE;
|
|
|
-
|
|
|
- return result;
|
|
|
-}
|
|
|
-
|
|
|
-int sendGetLocalListVersionConfirmation(char *uuid,char *payload)
|
|
|
-{
|
|
|
- mtrace();
|
|
|
- int result = FAIL;
|
|
|
- char message[80]={0};
|
|
|
-
|
|
|
- DEBUG_INFO("sendGetLocalListVersionConfirmation...\n");
|
|
|
- sprintf(message,"[%d,\"%s\",{\"listVersion\":%d}]",MESSAGE_TYPE_CALLRESULT, uuid, ShmOCPP16Data->GetLocalListVersion.ResponseListVersion);
|
|
|
- LWS_Send(message);
|
|
|
- result = TRUE;
|
|
|
-
|
|
|
- return result;
|
|
|
-}
|
|
|
-
|
|
|
-int sendRemoteStartConfirmation(char *uuid,char *payload)
|
|
|
-{
|
|
|
- mtrace();
|
|
|
- int result = FAIL;
|
|
|
- char message[80]={0};
|
|
|
-
|
|
|
- DEBUG_INFO("sendRemoteStartConfirmation...\n");
|
|
|
- sprintf(message,"[%d,\"%s\",{\"status\":\"%s\"}]",MESSAGE_TYPE_CALLRESULT, uuid, payload);
|
|
|
- LWS_Send(message);
|
|
|
- result = TRUE;
|
|
|
-
|
|
|
- return result;
|
|
|
-}
|
|
|
-
|
|
|
-int sendRemoteStopTransactionConfirmation(char *uuid,char *payload)
|
|
|
-{
|
|
|
- mtrace();
|
|
|
- int result = FAIL;
|
|
|
- char message[80]={0};
|
|
|
-
|
|
|
- DEBUG_INFO("sendRemoteStopTransactionConfirmation...\n");
|
|
|
- sprintf(message,"[%d,\"%s\",{\"status\":\"%s\"}]",MESSAGE_TYPE_CALLRESULT, uuid, payload);
|
|
|
- LWS_Send(message);
|
|
|
- result = TRUE;
|
|
|
-
|
|
|
- return result;
|
|
|
-}
|
|
|
-
|
|
|
-int sendReserveNowTransactionConfirmation(char *uuid,char *payload)
|
|
|
-{
|
|
|
- mtrace();
|
|
|
- int result = FAIL;
|
|
|
- char message[80]={0};
|
|
|
-// [3,"287d837d-809e-41ea-8385-fdab7f72a01c",{"status":"Accepted"}]
|
|
|
-
|
|
|
- DEBUG_INFO("sendReserveNowTransactionConfirmation...\n");
|
|
|
- sprintf(message,"[%d,\"%s\",{\"status\":\"%s\"}]",MESSAGE_TYPE_CALLRESULT, uuid, payload);
|
|
|
- LWS_Send(message);
|
|
|
- result = TRUE;
|
|
|
-
|
|
|
- return result;
|
|
|
-}
|
|
|
-
|
|
|
-int sendResetConfirmation(char *uuid,char *payload)
|
|
|
-{
|
|
|
- mtrace();
|
|
|
- int result = FAIL;
|
|
|
- //[ 3, "6f88d461-4d17-462c-a69b-1f7a8c5b12df", { "status": 0 } ]
|
|
|
- char message[80]={0};
|
|
|
-
|
|
|
- ShmOCPP16Data->MsMsg.bits.ResetConf = 0;
|
|
|
-
|
|
|
- sprintf(message,"[%d,\"%s\",{\"status\":\"%s\"}]",MESSAGE_TYPE_CALLRESULT, uuid, payload);
|
|
|
- LWS_Send(message);
|
|
|
- result = TRUE;
|
|
|
-
|
|
|
- return result;
|
|
|
-}
|
|
|
-
|
|
|
-int sendSendLocalListConfirmation(char *uuid,char *payload)
|
|
|
-{
|
|
|
- mtrace();
|
|
|
- int result = FAIL;
|
|
|
- char message[500]={0};
|
|
|
-// [ 3, "1571284266109", { "status": "Accepted" } ]
|
|
|
- sprintf(message,"[%d,\"%s\",{\"%s\":\"%s\"}]",MESSAGE_TYPE_CALLRESULT, uuid, "status", payload);
|
|
|
- LWS_Send(message);
|
|
|
- result = TRUE;
|
|
|
-
|
|
|
- return result;
|
|
|
-}
|
|
|
-
|
|
|
-int sendSetChargingProfileConfirmation(char *uuid,char *payload)
|
|
|
-{
|
|
|
- mtrace();
|
|
|
- int result = FAIL;
|
|
|
-//[3,"5748585f-8524-4fa6-9b4f-4a7eca750b90",{"status":"NotSupported"}]
|
|
|
- char message[80]={0};
|
|
|
-
|
|
|
- DEBUG_INFO("sendSetChargingProfileConfirmation...\n");
|
|
|
- sprintf(message,"[%d,\"%s\",{\"status\":\"%s\"}]",MESSAGE_TYPE_CALLRESULT, uuid, payload);
|
|
|
- LWS_Send(message);
|
|
|
- result = TRUE;
|
|
|
-
|
|
|
- return result;
|
|
|
-}
|
|
|
-
|
|
|
-int sendTriggerMessageConfirmation(char *uuid,char *payload)
|
|
|
-{
|
|
|
- mtrace();
|
|
|
- int result = FAIL;
|
|
|
- char message[80]={0};
|
|
|
-
|
|
|
- DEBUG_INFO("sendTriggerMessageConfirmation...\n");
|
|
|
- sprintf(message,"[%d,\"%s\",{\"status\":\"%s\"}]",MESSAGE_TYPE_CALLRESULT, uuid, payload);
|
|
|
- LWS_Send(message);
|
|
|
- result = TRUE;
|
|
|
-
|
|
|
- return result;
|
|
|
-}
|
|
|
-
|
|
|
-int sendUnlockConnectorConfirmation(char *uuid,char *payload)
|
|
|
-{
|
|
|
- mtrace();
|
|
|
- int result = FAIL;
|
|
|
- char message[80]={0};
|
|
|
-
|
|
|
-//[ 3, "ba1cbd49-2a76-493a-8f76-fa23e7606532", { "status": "Unlocked" } ]
|
|
|
- DEBUG_INFO("sendUnlockConnectorConfirmation...\n");
|
|
|
- sprintf(message,"[%d,\"%s\",{\"status\":\"%s\"}]",MESSAGE_TYPE_CALLRESULT, uuid, payload);
|
|
|
- LWS_Send(message);
|
|
|
- result = TRUE;
|
|
|
-
|
|
|
- return result;
|
|
|
-}
|
|
|
-
|
|
|
-int sendUpdateFirmwareConfirmation(char *uuid)
|
|
|
-{
|
|
|
- mtrace();
|
|
|
- int result = FAIL;
|
|
|
-
|
|
|
- char message[60]={0};
|
|
|
-
|
|
|
- //[ 3, "ba1cbd49-2a76-493a-8f76-fa23e7606532", { "status": "Unlocked" } ]
|
|
|
- DEBUG_INFO("sendUpdateFirmwareConfirmation...\n");
|
|
|
- sprintf(message,"[%d,\"%s\",{}]",MESSAGE_TYPE_CALLRESULT, uuid);
|
|
|
- LWS_Send(message);
|
|
|
- result = TRUE;
|
|
|
-
|
|
|
- return result;
|
|
|
-}
|
|
|
-
|
|
|
-
|
|
|
-//==========================================
|
|
|
-// send CallError routine
|
|
|
-//==========================================
|
|
|
-void SendCallError(char *uniqueId, char *action, char *errorCode, char *errorDescription)
|
|
|
-{
|
|
|
- mtrace();
|
|
|
- char message[220]={0};
|
|
|
-
|
|
|
- DEBUG_INFO("An error occurred. Sending this information: uniqueId {}: action: {}, errorCore: {}, errorDescription: {}\n", uniqueId, action, errorCode, errorDescription);
|
|
|
-
|
|
|
- sprintf(message,"[%d,\"%s\",\"%s\",\"%s\",{}]",MESSAGE_TYPE_CALLERROR, uniqueId, errorCode, errorDescription);
|
|
|
- LWS_Send(message);
|
|
|
-}
|
|
|
-
|
|
|
-
|
|
|
-//==========================================
|
|
|
-// Handle server request routine Start
|
|
|
-//==========================================
|
|
|
-int handleCancelReservationRequest(char *uuid, char *payload)
|
|
|
-{
|
|
|
- mtrace();
|
|
|
- int result = FAIL;
|
|
|
- int gunNO = 0;
|
|
|
- int reservationIdInt =0;
|
|
|
- char comfirmstr[20];
|
|
|
- DEBUG_INFO("handleCancelReservationRequest...\n");
|
|
|
-
|
|
|
- json_object *CancelReservation;
|
|
|
- CancelReservation = json_tokener_parse(payload);
|
|
|
- if(!is_error(CancelReservation))
|
|
|
- {
|
|
|
- // Required data
|
|
|
- reservationIdInt = json_object_get_int(json_object_object_get(CancelReservation, "reservationId"));
|
|
|
- }
|
|
|
- json_object_put(CancelReservation);
|
|
|
-
|
|
|
-
|
|
|
- memset(comfirmstr, 0, sizeof comfirmstr);
|
|
|
- sprintf(comfirmstr, "%s", CancelReservationStatusStr[CancelReservationStatus_Rejected]);
|
|
|
-
|
|
|
- //0: Booting, 1: idle, 2: authorizing, 3: preparing, 4: charging, 5: terminating, 6: alarm, 7: fault, 8: Reserved, 9: maintain
|
|
|
- //check Transaction active
|
|
|
- //J: CHAdeMO U: CCS1 combo E: CCS2 combo G: GBT DC
|
|
|
- for (int index = 0; index < CHAdeMO_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].ReservationId == reservationIdInt)
|
|
|
- {
|
|
|
- sprintf(comfirmstr, "%s", CancelReservationStatusStr[CancelReservationStatus_Accepted] );
|
|
|
- sprintf((char *)ShmOCPP16Data->CancelReservation[ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index].ResponseStatus, "%s", comfirmstr );
|
|
|
-
|
|
|
- if(gunType[2] == 'J')
|
|
|
- {
|
|
|
- gunNO = ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index + 1;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- gunNO = ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index;
|
|
|
- }
|
|
|
-
|
|
|
- ShmOCPP16Data->CsMsg.bits[gunNO].CancelReservationReq = 1;
|
|
|
- goto end;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < CCS_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].ReservationId == reservationIdInt)
|
|
|
- {
|
|
|
- sprintf(comfirmstr, "%s", CancelReservationStatusStr[CancelReservationStatus_Accepted] );
|
|
|
- sprintf((char *)ShmOCPP16Data->CancelReservation[ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index].ResponseStatus, "%s", comfirmstr );
|
|
|
- if((gunType[2] == 'U') || (gunType[2] == 'E'))
|
|
|
- {
|
|
|
- gunNO = ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index + 1;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- gunNO = ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index;
|
|
|
- }
|
|
|
-
|
|
|
- ShmOCPP16Data->CsMsg.bits[gunNO].CancelReservationReq = 1;
|
|
|
- goto end;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- for (int index = 0; index < GB_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].ReservationId == reservationIdInt)
|
|
|
- {
|
|
|
- sprintf(comfirmstr, "%s", CancelReservationStatusStr[CancelReservationStatus_Accepted] );
|
|
|
- sprintf((char *)ShmOCPP16Data->CancelReservation[ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index].ResponseStatus, "%s", comfirmstr );
|
|
|
- if(gunType[2] == 'G')
|
|
|
- {
|
|
|
- gunNO = ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index + 1;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- gunNO = ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index;
|
|
|
- }
|
|
|
-
|
|
|
- ShmOCPP16Data->CsMsg.bits[gunNO].CancelReservationReq = 1;
|
|
|
- goto end;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- for (int index = 0; index < AC_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].ReservationId == reservationIdInt)
|
|
|
- {
|
|
|
- sprintf(comfirmstr, "%s", CancelReservationStatusStr[CancelReservationStatus_Accepted] );
|
|
|
- sprintf((char *)ShmOCPP16Data->CancelReservation[ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index].ResponseStatus, "%s", comfirmstr );
|
|
|
-
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
|
|
|
- {
|
|
|
- gunNO = 1; //ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index ;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- gunNO = ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index;
|
|
|
- }
|
|
|
-
|
|
|
- ShmOCPP16Data->CsMsg.bits[gunNO].CancelReservationReq = 1;
|
|
|
- goto end;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- //The reservationId does NOT match the reservationId
|
|
|
- sendCancelReservationConfirmation(uuid, comfirmstr);
|
|
|
-
|
|
|
-end:
|
|
|
- // Fill in ocpp packet uuid
|
|
|
- strcpy((char *)ShmOCPP16Data->CancelReservation[gunNO].guid, uuid);
|
|
|
-
|
|
|
- return result;
|
|
|
-}
|
|
|
-
|
|
|
-int handleChangeAvailabilityRequest(char *uuid, char *payload)
|
|
|
-{
|
|
|
- mtrace();
|
|
|
- int result = FAIL;
|
|
|
- int gunIndex = 0;
|
|
|
- char typeStr[16]={0};
|
|
|
- char comfirmstr[20];
|
|
|
- int specificId = FALSE;
|
|
|
-
|
|
|
- DEBUG_INFO("handleChangeAvailabilityRequest...\n");
|
|
|
-
|
|
|
- json_object *ChangeAvailability;
|
|
|
- ChangeAvailability = json_tokener_parse(payload);
|
|
|
-
|
|
|
- if(!is_error(ChangeAvailability))
|
|
|
- {
|
|
|
- // Required data
|
|
|
- gunIndex = json_object_get_int(json_object_object_get(ChangeAvailability, "connectorId"));
|
|
|
- sprintf((char*)typeStr, "%s", json_object_get_string(json_object_object_get(ChangeAvailability, "type")));
|
|
|
- }
|
|
|
- json_object_put(ChangeAvailability);
|
|
|
-
|
|
|
-
|
|
|
- if(gunIndex != 0)
|
|
|
- {
|
|
|
- ShmOCPP16Data->ChangeAvailability[gunIndex - 1].ConnectorId= gunIndex;
|
|
|
- sprintf((char *)ShmOCPP16Data->ChangeAvailability[gunIndex - 1].Type, "%s", typeStr);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- ShmOCPP16Data->ChangeAvailability[0].ConnectorId= gunIndex;
|
|
|
- sprintf((char *)ShmOCPP16Data->ChangeAvailability[0].Type, "%s", typeStr);
|
|
|
- }
|
|
|
-
|
|
|
- memset(comfirmstr, 0, sizeof comfirmstr);
|
|
|
- sprintf(comfirmstr, "%s", AvailabilityStatusStr[Rejected] );
|
|
|
-
|
|
|
- if((gunIndex == 0) || ((gunIndex - 1) < gunTotalNumber/*(CHAdeMO_QUANTITY+ CCS_QUANTITY + GB_QUANTITY)*/))
|
|
|
- {
|
|
|
- specificId = TRUE;
|
|
|
- }
|
|
|
-
|
|
|
- if(specificId == FALSE)
|
|
|
- goto end;
|
|
|
-
|
|
|
- if(strcmp((const char *)typeStr, AvailabilityTypeStr[Inoperative]) == 0)
|
|
|
- {
|
|
|
-
|
|
|
- //----------------------gunIndex is 0 ------------------------------------------------//
|
|
|
- if(gunIndex == 0)
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D') // 'D' means DC
|
|
|
- {
|
|
|
- for(int i=0; i < gunTotalNumber; i++)
|
|
|
- {
|
|
|
- for (int index = 0; index < CHAdeMO_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (gunType[i] == 'J')
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_RESERVATION) // S_PRECHARGE
|
|
|
- {
|
|
|
- sprintf(comfirmstr, "%s", AvailabilityStatusStr[Rejected] );
|
|
|
- goto end;
|
|
|
- }
|
|
|
- else if((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_AUTHORIZING) ||
|
|
|
- (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_PREPARING) ||
|
|
|
- (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_CHARGING) ||
|
|
|
- (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_TERMINATING) ||
|
|
|
- (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_COMPLETE)) // S_CHARGING
|
|
|
- {
|
|
|
- sprintf(comfirmstr, "%s", AvailabilityStatusStr[Scheduled] );
|
|
|
- goto end;
|
|
|
- }
|
|
|
- }
|
|
|
- }//END FOR CHAdeMO_QUANTITY
|
|
|
-
|
|
|
- for (int index = 0; index < CCS_QUANTITY; index++)
|
|
|
- {
|
|
|
- if ((gunType[i] == 'U')||(gunType[i] == 'E'))
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_RESERVATION)// S_PRECHARGE
|
|
|
- {
|
|
|
- sprintf(comfirmstr, "%s", AvailabilityStatusStr[Rejected] );
|
|
|
- goto end;
|
|
|
- }
|
|
|
- else if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_AUTHORIZING) ||
|
|
|
- (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_PREPARING) ||
|
|
|
- (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_CHARGING) ||
|
|
|
- (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_TERMINATING) ||
|
|
|
- (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_COMPLETE)) // S_CHARGING
|
|
|
- {
|
|
|
- sprintf(comfirmstr, "%s", AvailabilityStatusStr[Scheduled] );
|
|
|
- goto end;
|
|
|
- }
|
|
|
- }
|
|
|
- }//END FOR CCS_QUANTITY
|
|
|
-
|
|
|
- for (int index = 0; index < GB_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (gunType[i] == 'G')
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_RESERVATION) // S_PRECHARGE
|
|
|
- {
|
|
|
- sprintf(comfirmstr, "%s", AvailabilityStatusStr[Rejected] );
|
|
|
- goto end;
|
|
|
- }
|
|
|
- else if((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_AUTHORIZING) ||
|
|
|
- (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_PREPARING) ||
|
|
|
- (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_CHARGING) ||
|
|
|
- (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_TERMINATING) ||
|
|
|
- (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_COMPLETE)) // S_CHARGING
|
|
|
- {
|
|
|
- sprintf(comfirmstr, "%s", AvailabilityStatusStr[Scheduled] );
|
|
|
- goto end;
|
|
|
- }
|
|
|
- }
|
|
|
- }// END FOR GB_QUANTITY
|
|
|
-
|
|
|
- for (int index = 0; index < AC_QUANTITY; index++)
|
|
|
- {
|
|
|
- if ((gunType[i] > '0')&&(gunType[i] <= '9'))
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_RESERVATION) // S_PRECHARGE
|
|
|
- {
|
|
|
- sprintf(comfirmstr, "%s", AvailabilityStatusStr[Rejected] );
|
|
|
- goto end;
|
|
|
- }
|
|
|
- else if((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_AUTHORIZING) ||
|
|
|
- (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_PREPARING) ||
|
|
|
- (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_CHARGING) ||
|
|
|
- (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_TERMINATING) ||
|
|
|
- (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_COMPLETE)) // S_CHARGING
|
|
|
- {
|
|
|
- sprintf(comfirmstr, "%s", AvailabilityStatusStr[Scheduled] );
|
|
|
- goto end;
|
|
|
- }
|
|
|
- }
|
|
|
- }//END FOR AC_QUANTITY
|
|
|
- }// END FOR gunTotalNumber
|
|
|
- }
|
|
|
- else if (ShmSysConfigAndInfo->SysConfig.ModelName[0]=='A') //'A' means AC
|
|
|
- {
|
|
|
- for(int i=0; i < gunTotalNumber; i++)
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysInfo.AcChargingData[i].SystemStatus == SYS_MODE_RESERVATION) // S_PRECHARGE
|
|
|
- {
|
|
|
- sprintf(comfirmstr, "%s", AvailabilityStatusStr[Rejected] );
|
|
|
- goto end;
|
|
|
- }
|
|
|
- else if((ShmSysConfigAndInfo->SysInfo.AcChargingData[i].SystemStatus == SYS_MODE_AUTHORIZING) ||
|
|
|
- (ShmSysConfigAndInfo->SysInfo.AcChargingData[i].SystemStatus == SYS_MODE_PREPARING) ||
|
|
|
- (ShmSysConfigAndInfo->SysInfo.AcChargingData[i].SystemStatus == SYS_MODE_CHARGING) ||
|
|
|
- (ShmSysConfigAndInfo->SysInfo.AcChargingData[i].SystemStatus == SYS_MODE_TERMINATING) ||
|
|
|
- (ShmSysConfigAndInfo->SysInfo.AcChargingData[i].SystemStatus == SYS_MODE_COMPLETE)) // S_CHARGING
|
|
|
- {
|
|
|
- sprintf(comfirmstr, "%s", AvailabilityStatusStr[Scheduled] );
|
|
|
- goto end;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- sprintf(comfirmstr, "%s", AvailabilityStatusStr[Accepted] );
|
|
|
- goto end;
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- //----------------------gunIndex is not 0 ------------------------------------------------//
|
|
|
-
|
|
|
- //check Transaction active
|
|
|
- for (int index = 0; index < CHAdeMO_QUANTITY; index++)
|
|
|
- {
|
|
|
- if ((gunIndex > 0)&&(gunType[gunIndex-1] == 'J'))
|
|
|
- {
|
|
|
- if((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_RESERVATION) ) // S_PRECHARGE
|
|
|
- {
|
|
|
- sprintf(comfirmstr, "%s", AvailabilityStatusStr[Rejected] );
|
|
|
- goto end;
|
|
|
- }
|
|
|
- else if((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_AUTHORIZING) ||
|
|
|
- (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_PREPARING) ||
|
|
|
- (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_CHARGING) ||
|
|
|
- (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_TERMINATING) ||
|
|
|
- (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_COMPLETE)) // S_CHARGING
|
|
|
- {
|
|
|
- sprintf(comfirmstr, "%s", AvailabilityStatusStr[Scheduled] );
|
|
|
- goto end;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- DEBUG_INFO("ShmSysConfigAndInfo->SysInfo.ChademoChargingData[%d].SystemStatus = %d\n",index, ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus);
|
|
|
- sprintf(comfirmstr, "%s", AvailabilityStatusStr[Accepted] );
|
|
|
- goto end;
|
|
|
- }
|
|
|
- }
|
|
|
- }//END FOR CHAdeMO_QUANTITY
|
|
|
-
|
|
|
- for (int index = 0; index < CCS_QUANTITY; index++)
|
|
|
- {
|
|
|
- if ((gunIndex > 0)&&((gunType[gunIndex - 1] == 'U')||(gunType[gunIndex - 1] == 'E')))
|
|
|
- {
|
|
|
- if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_RESERVATION) )// S_PRECHARGE
|
|
|
- {
|
|
|
- sprintf(comfirmstr, "%s", AvailabilityStatusStr[Rejected] );
|
|
|
- goto end;
|
|
|
- }
|
|
|
- else if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_AUTHORIZING) ||
|
|
|
- (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_PREPARING) ||
|
|
|
- (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_CHARGING) ||
|
|
|
- (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_TERMINATING) ||
|
|
|
- (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_COMPLETE)) // S_CHARGING
|
|
|
- {
|
|
|
- sprintf(comfirmstr, "%s", AvailabilityStatusStr[Scheduled] );
|
|
|
- goto end;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- DEBUG_INFO("ShmSysConfigAndInfo->SysInfo.CcsChargingData[%d].SystemStatus=%d\n",index, ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus);
|
|
|
- sprintf(comfirmstr, "%s", AvailabilityStatusStr[Accepted] );
|
|
|
- goto end;
|
|
|
- }
|
|
|
- }
|
|
|
- }//END FOR CCS_QUANTITY
|
|
|
-
|
|
|
- for (int index = 0; index < GB_QUANTITY; index++)
|
|
|
- {
|
|
|
- if ((gunIndex > 0)&&(gunType[gunIndex-1] == 'G'))
|
|
|
- {
|
|
|
- if((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_RESERVATION)) // S_PRECHARGE
|
|
|
- {
|
|
|
- sprintf(comfirmstr, "%s", AvailabilityStatusStr[Rejected] );
|
|
|
- goto end;
|
|
|
- }
|
|
|
- else if((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_AUTHORIZING) ||
|
|
|
- (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_PREPARING) ||
|
|
|
- (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_CHARGING) ||
|
|
|
- (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_TERMINATING) ||
|
|
|
- (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_COMPLETE)) // S_CHARGING
|
|
|
- {
|
|
|
- sprintf(comfirmstr, "%s", AvailabilityStatusStr[Scheduled] );
|
|
|
- goto end;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- DEBUG_INFO("ShmSysConfigAndInfo->SysInfo.GbChargingData[%d].SystemStatus=%d\n",index,ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus);
|
|
|
- sprintf(comfirmstr, "%s", AvailabilityStatusStr[Accepted] );
|
|
|
- goto end;
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- }
|
|
|
- }// END FOR GB_QUANTITY
|
|
|
-
|
|
|
- for (int index = 0; index < AC_QUANTITY; index++)
|
|
|
- {
|
|
|
- if ((gunIndex > 0)&&((gunType[gunIndex-1] > '0')&&(gunType[gunIndex-1] <= '9')))
|
|
|
- {
|
|
|
- if((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_RESERVATION)) // S_PRECHARGE
|
|
|
- {
|
|
|
- sprintf(comfirmstr, "%s", AvailabilityStatusStr[Rejected] );
|
|
|
- goto end;
|
|
|
- }
|
|
|
- else if((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_AUTHORIZING) ||
|
|
|
- (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_PREPARING) ||
|
|
|
- (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_CHARGING) ||
|
|
|
- (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_TERMINATING) ||
|
|
|
- (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_COMPLETE)) // S_CHARGING
|
|
|
- {
|
|
|
- sprintf(comfirmstr, "%s", AvailabilityStatusStr[Scheduled] );
|
|
|
- goto end;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- DEBUG_INFO("ShmSysConfigAndInfo->SysInfo.AcChargingData[%d].SystemStatus=%d\n",index, ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus);
|
|
|
- sprintf(comfirmstr, "%s", AvailabilityStatusStr[Accepted] );
|
|
|
- goto end;
|
|
|
- }
|
|
|
- }
|
|
|
- }//END FOR AC_QUANTITY
|
|
|
-
|
|
|
- }//END FOR AvailabilityTypeStr[Inoperative]
|
|
|
-
|
|
|
-
|
|
|
- if(strcmp((const char *)typeStr, AvailabilityTypeStr[Operative]) == 0)
|
|
|
- {
|
|
|
- //----------------------gunIndex is 0 ------------------------------------------------//
|
|
|
- if(gunIndex == 0)
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D') // 'D' means DC
|
|
|
- {
|
|
|
- for(int i=0; i < gunTotalNumber; i++)
|
|
|
- {
|
|
|
- for (int index = 0; index < CHAdeMO_QUANTITY; index++)
|
|
|
- {
|
|
|
- if ((gunType[i] == 'J' ) &&(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_FAULT)) //S_FAULT //(((gunIndex == 0)|| ((gunIndex > 0)&&(gunType[gunIndex-1] == 'J')) ) &&(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus != SYS_MODE_FAULT)) //S_FAULT
|
|
|
- {
|
|
|
- sprintf(comfirmstr, "%s", AvailabilityStatusStr[Rejected] );
|
|
|
- goto end;
|
|
|
- }
|
|
|
- }//END FOR CHAdeMO_QUANTITY
|
|
|
-
|
|
|
- for (int index = 0; index < CCS_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (((gunType[i] == 'U')||(gunType[i] == 'E'))&&(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_FAULT)) //S_FAULT//(((gunIndex == 0)|| ((gunIndex > 0)&&((gunType[gunIndex - 1] == 'U')||(gunType[gunIndex - 1] == 'E'))) )&&(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus != SYS_MODE_FAULT)) //S_FAULT
|
|
|
- {
|
|
|
- sprintf(comfirmstr, "%s", AvailabilityStatusStr[Rejected] );
|
|
|
- goto end;
|
|
|
- }
|
|
|
- }//END FOR CCS_QUANTITY
|
|
|
-
|
|
|
- for (int index = 0; index < GB_QUANTITY; index++)
|
|
|
- {
|
|
|
- if ((gunType[i] == 'G')&&(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_FAULT)) //S_FAULT //(((gunIndex == 0)|| ((gunIndex > 0)&&(gunType[gunIndex-1] == 'G')))&&(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus != SYS_MODE_FAULT)) //S_FAULT
|
|
|
- {
|
|
|
- //ShmOCPP16Data->CsMsg.bits[gunIndex - 1].ChangeAvailabilityReq = 1;
|
|
|
- sprintf(comfirmstr, "%s", AvailabilityStatusStr[Rejected] );
|
|
|
- goto end;
|
|
|
- }
|
|
|
- }// END FOR GB_QUANTITY
|
|
|
-
|
|
|
- for (int index = 0; index < AC_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (((gunType[i] > '0')&&(gunType[i] <= '9')) &&(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_FAULT)) //S_FAULT // (((gunIndex == 0)|| ((gunIndex > 0)&&((gunType[gunIndex-1] > '0')&&(gunType[gunIndex-1] <= '9')))) &&(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus != SYS_MODE_FAULT)) //S_FAULT
|
|
|
- {
|
|
|
- sprintf(comfirmstr, "%s", AvailabilityStatusStr[Rejected] );
|
|
|
- goto end;
|
|
|
- }
|
|
|
- }//END FOR CHAdeMO_QUANTITY
|
|
|
-
|
|
|
- }// END FOR gunTotalNumber
|
|
|
- }
|
|
|
- else if (ShmSysConfigAndInfo->SysConfig.ModelName[0]=='A') //'A' means AC
|
|
|
- {
|
|
|
- for(int i=0; i < gunTotalNumber; i++)
|
|
|
- {
|
|
|
- for (int index = 0; index < AC_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (((gunType[i] > '0')&&(gunType[i] <= '9')) &&(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_FAULT)) //S_FAULT // (((gunIndex == 0)|| ((gunIndex > 0)&&((gunType[gunIndex-1] > '0')&&(gunType[gunIndex-1] <= '9')))) &&(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus != SYS_MODE_FAULT)) //S_FAULT
|
|
|
- {
|
|
|
- sprintf(comfirmstr, "%s", AvailabilityStatusStr[Rejected] );
|
|
|
- goto end;
|
|
|
- }
|
|
|
- }//END FOR CHAdeMO_QUANTITY
|
|
|
-
|
|
|
- } // END FOR gunTotalNumber
|
|
|
- }
|
|
|
-
|
|
|
- sprintf(comfirmstr, "%s", AvailabilityStatusStr[Accepted] );
|
|
|
- goto end;
|
|
|
- }
|
|
|
-
|
|
|
- //----------------------gunIndex is not 0 ------------------------------------------------//
|
|
|
- //check Transaction active
|
|
|
- for (int index = 0; index < CHAdeMO_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (((gunIndex > 0)&&(gunType[gunIndex-1] == 'J') ) &&(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus != SYS_MODE_FAULT)) //S_FAULT
|
|
|
- {
|
|
|
- sprintf(comfirmstr, "%s", AvailabilityStatusStr[Accepted] );
|
|
|
- goto end;
|
|
|
- }
|
|
|
- }//END FOR CHAdeMO_QUANTITY
|
|
|
-
|
|
|
- for (int index = 0; index < CCS_QUANTITY; index++)
|
|
|
- {
|
|
|
- if ((((gunIndex > 0)&&((gunType[gunIndex - 1] == 'U')||(gunType[gunIndex - 1] == 'E'))) )&&(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus != SYS_MODE_FAULT)) //S_FAULT
|
|
|
- {
|
|
|
- sprintf(comfirmstr, "%s", AvailabilityStatusStr[Accepted] );
|
|
|
- goto end;
|
|
|
- }
|
|
|
- }//END FOR CCS_QUANTITY
|
|
|
-
|
|
|
- for (int index = 0; index < GB_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (((gunIndex > 0)&&(gunType[gunIndex-1] == 'G'))&&(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus != SYS_MODE_FAULT)) //S_FAULT
|
|
|
- {
|
|
|
- sprintf(comfirmstr, "%s", AvailabilityStatusStr[Accepted] );
|
|
|
- goto end;
|
|
|
- }
|
|
|
- }// END FOR GB_QUANTITY
|
|
|
-
|
|
|
- for (int index = 0; index < AC_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (((gunIndex > 0)&&((gunType[gunIndex-1] > '0')&&(gunType[gunIndex-1] <= '9'))) &&(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus != SYS_MODE_FAULT)) //S_FAULT
|
|
|
- {
|
|
|
- sprintf(comfirmstr, "%s", AvailabilityStatusStr[Accepted] );
|
|
|
- goto end;
|
|
|
- }
|
|
|
- }//END FOR AC_QUANTITY
|
|
|
- }//END FOR AvailabilityTypeStr[Operative]
|
|
|
-
|
|
|
-end:
|
|
|
- if(gunIndex != 0)
|
|
|
- {
|
|
|
- sprintf((char *)ShmOCPP16Data->ChangeAvailability[gunIndex - 1].ResponseStatus, "%s", comfirmstr );
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- sprintf((char *)ShmOCPP16Data->ChangeAvailability[0].ResponseStatus, "%s", comfirmstr );
|
|
|
- }
|
|
|
-
|
|
|
- if(gunIndex != 0)
|
|
|
- {
|
|
|
- if(strstr(comfirmstr, AvailabilityStatusStr[Rejected]) == NULL)
|
|
|
- ShmOCPP16Data->CsMsg.bits[gunIndex - 1].ChangeAvailabilityReq = 1;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- if(strstr(comfirmstr, AvailabilityStatusStr[Rejected]) == NULL)
|
|
|
- {
|
|
|
- for(int i=0; i < gunTotalNumber/*(CHAdeMO_QUANTITY+ CCS_QUANTITY + GB_QUANTITY)*/; i++)
|
|
|
- ShmOCPP16Data->CsMsg.bits[i].ChangeAvailabilityReq = 1;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- sendChangeAvailabilityConfirmation(uuid, comfirmstr);
|
|
|
-
|
|
|
- return result;
|
|
|
-}
|
|
|
-
|
|
|
-int handleChangeConfigurationRequest(char *uuid, char *payload)
|
|
|
-{
|
|
|
- mtrace();
|
|
|
- int result = FAIL;
|
|
|
- char keystr[40]={0};
|
|
|
- char valuestr[100]={0};
|
|
|
- char comfirmstr[20]={0};
|
|
|
-
|
|
|
- DEBUG_INFO("handleChangeConfigurationRequest...\n");
|
|
|
- json_object *ChangeConfiguration;
|
|
|
- ChangeConfiguration = json_tokener_parse(payload);
|
|
|
- if(!is_error(ChangeConfiguration))
|
|
|
- {
|
|
|
- // Required data
|
|
|
- sprintf((char*)keystr, "%s", json_object_get_string(json_object_object_get(ChangeConfiguration, "key")));
|
|
|
- sprintf((char*)valuestr, "%s", json_object_get_string(json_object_object_get(ChangeConfiguration, "value")));
|
|
|
- }
|
|
|
- json_object_put(ChangeConfiguration);
|
|
|
-
|
|
|
-
|
|
|
- if((uuid==NULL) || (payload ==NULL) )
|
|
|
- {
|
|
|
- DEBUG_ERROR("Payload is null\n");
|
|
|
- sprintf(comfirmstr, "%s", ConfigurationStatusStr[ConfigurationStatus_Rejected] );
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- int status = setKeyValue(keystr, valuestr);
|
|
|
-
|
|
|
- switch(status)
|
|
|
- {
|
|
|
- case ConfigurationStatus_Accepted:
|
|
|
- sprintf(comfirmstr, "%s", ConfigurationStatusStr[ConfigurationStatus_Accepted]);
|
|
|
- ShmOCPP16Data->MsMsg.bits.ChangeConfigurationReq = 1;
|
|
|
- StoreConfigurationTable();
|
|
|
- break;
|
|
|
-
|
|
|
- case ConfigurationStatus_Rejected:
|
|
|
- sprintf(comfirmstr, "%s", ConfigurationStatusStr[ConfigurationStatus_Rejected] );
|
|
|
- break;
|
|
|
-
|
|
|
- case RebootRequired:
|
|
|
- sprintf(comfirmstr, "%s", ConfigurationStatusStr[RebootRequired]);
|
|
|
- StoreConfigurationTable();
|
|
|
- break;
|
|
|
-
|
|
|
- case NotSupported:
|
|
|
- sprintf(comfirmstr, "%s", ConfigurationStatusStr[NotSupported] );
|
|
|
- break;
|
|
|
-
|
|
|
- default:
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- sendChangeConfigurationConfirmation(uuid, comfirmstr);
|
|
|
- ShmOCPP16Data->MsMsg.bits.ChangeConfigurationConf = 1;
|
|
|
- if((strcmp(keystr,"WebSocketPingInterval")==0)&&(strcmp(comfirmstr,"Accepted")==0))
|
|
|
- {
|
|
|
- ChageWebSocketPingInterval(atoi(valuestr));
|
|
|
- }
|
|
|
-
|
|
|
- return result;
|
|
|
-}
|
|
|
-
|
|
|
-int handleClearCacheRequest(char *uuid, char *payload)
|
|
|
-{
|
|
|
- mtrace();
|
|
|
- int result = FAIL;
|
|
|
- char comfirmstr[20];
|
|
|
- int fd;
|
|
|
- char rmFileCmd[100]={0};
|
|
|
- struct stat stats;
|
|
|
- DEBUG_INFO("handleClearCacheRequest...\n");
|
|
|
- stat("/Storage/OCPP", &stats);
|
|
|
-
|
|
|
- // Check for directory existence
|
|
|
- if (S_ISDIR(stats.st_mode) == 1)
|
|
|
- {}
|
|
|
- else
|
|
|
- {
|
|
|
- DEBUG_INFO("\n OCPP directory not exist, create dir \n");
|
|
|
- sprintf(rmFileCmd,"mkdir -p %s","/Storage/OCPP");
|
|
|
- system(rmFileCmd);
|
|
|
- }
|
|
|
-
|
|
|
- memset(rmFileCmd, 0, sizeof rmFileCmd);
|
|
|
- if((access(AuthorizationCache_JSON,F_OK))!=-1)
|
|
|
- {
|
|
|
- DEBUG_INFO("AuthorizationCache file exist.\n");
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- DEBUG_INFO("AuthorizationCache file not exist\n");
|
|
|
- FILE *log = fopen(AuthorizationCache_JSON, "w+");
|
|
|
-
|
|
|
- if(log == NULL)
|
|
|
- {
|
|
|
- DEBUG_INFO("AuthorizationCache file is NULL\n");
|
|
|
- sprintf(comfirmstr, "%s", ClearCacheStatusStr[ClearCacheStatus_Rejected] );
|
|
|
- goto end;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- fclose(log);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- if((fd = open(AuthorizationCache_JSON,O_RDWR)) < 0)
|
|
|
- {
|
|
|
- DEBUG_INFO("open AuthorizationCache file failed\n");
|
|
|
- sprintf(comfirmstr, "%s", ClearCacheStatusStr[ClearCacheStatus_Rejected] );
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- DEBUG_INFO("open AuthorizationCache file successful\n");
|
|
|
- ftruncate(fd,0);
|
|
|
- lseek(fd,0,SEEK_SET);
|
|
|
- close(fd);
|
|
|
- sprintf(comfirmstr, "%s", ClearCacheStatusStr[ClearCacheStatus_Accepted] );
|
|
|
- }
|
|
|
-
|
|
|
-end:
|
|
|
- sendClearCacheConfirmation(uuid, comfirmstr);
|
|
|
- return result;
|
|
|
-}
|
|
|
-
|
|
|
-int handleClearChargingProfileRequest(char *uuid, char *payload)
|
|
|
-{
|
|
|
- mtrace();
|
|
|
- int result = FAIL;
|
|
|
- int resultRename;
|
|
|
- int connectorIdInt, chargingProfileIdInt, stackLevelInt;
|
|
|
- char chargingProfilePurposeStr[26]={0};
|
|
|
- int tempconnectorIdInt, tempchargingProfileIdInt, tempstackLevelInt;
|
|
|
- char tempchargingProfilePurposeStr[26]={0};
|
|
|
- char sstr[160]={0};
|
|
|
- char str[100]={0};
|
|
|
- int c = 0;
|
|
|
- char *loc;
|
|
|
- char fname[200]={0};
|
|
|
- char comfirmstr[20]={0};
|
|
|
- char word[1600]={0};
|
|
|
- int clearflag = FALSE;
|
|
|
- int chargingProfileIdIsNULL = FALSE;
|
|
|
- int connectorIsNULL = FALSE;
|
|
|
- int chargingProfilePurposeIsNULL = FALSE;
|
|
|
- int stackLevelIsNULL = FALSE;
|
|
|
- //int GotoEnd = FALSE;
|
|
|
- FILE *fptr1, *fptr2;
|
|
|
- char temp[] = "/Storage/OCPP/ClearChargingProfiletemp.json"; // Create temp file
|
|
|
- int n_chargingProfile=0;
|
|
|
- int isEmptyFile = FALSE;
|
|
|
- char sLineWord[1600]={0};
|
|
|
- char chargingProfiles[10][100]={0};
|
|
|
- int ChargeProfileCount = 0;
|
|
|
- char ch;
|
|
|
- connectorIdInt = chargingProfileIdInt = stackLevelInt = 0;
|
|
|
- DEBUG_INFO("handleClearChargingProfileRequest...\n");
|
|
|
- json_object *ClearChargingProfile;
|
|
|
- ClearChargingProfile = json_tokener_parse(payload);
|
|
|
- if(!is_error(ClearChargingProfile))
|
|
|
- {
|
|
|
- // Optional data
|
|
|
- if(json_object_object_get(ClearChargingProfile, "id") != NULL)
|
|
|
- chargingProfileIdInt = json_object_get_int(json_object_object_get(ClearChargingProfile, "id"));
|
|
|
- else
|
|
|
- chargingProfileIdIsNULL = TRUE;
|
|
|
-
|
|
|
- if(json_object_object_get(ClearChargingProfile, "connectorId") != NULL)
|
|
|
- connectorIdInt = json_object_get_int(json_object_object_get(ClearChargingProfile, "connectorId"));
|
|
|
- else
|
|
|
- connectorIsNULL = TRUE;
|
|
|
-
|
|
|
- if(json_object_object_get(ClearChargingProfile, "chargingProfilePurpose") != NULL)
|
|
|
- sprintf((char*)chargingProfilePurposeStr, "%s", json_object_get_string(json_object_object_get(ClearChargingProfile, "chargingProfilePurpose")));
|
|
|
- else
|
|
|
- chargingProfilePurposeIsNULL = TRUE;
|
|
|
-
|
|
|
- if(json_object_object_get(ClearChargingProfile, "stackLevel") != NULL)
|
|
|
- stackLevelInt = json_object_get_int(json_object_object_get(ClearChargingProfile, "stackLevel"));
|
|
|
- else
|
|
|
- stackLevelIsNULL = TRUE;
|
|
|
- }
|
|
|
- json_object_put(ClearChargingProfile);
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- if(connectorIsNULL == FALSE)
|
|
|
- {
|
|
|
- switch(connectorIdInt)
|
|
|
- {
|
|
|
- case 0:
|
|
|
-
|
|
|
- if(chargingProfilePurposeIsNULL == TRUE)
|
|
|
- {
|
|
|
- int l = 0;
|
|
|
- strcpy(fname, ChargePointMaxProfile_JSON);
|
|
|
- if((access(fname,F_OK))!=-1)
|
|
|
- {
|
|
|
- strcpy(chargingProfiles[l], fname);
|
|
|
- l = l + 1;
|
|
|
- }
|
|
|
-
|
|
|
- strcpy(fname, TxDefaultProfile_0_JSON);
|
|
|
- if((access(fname,F_OK))!=-1)
|
|
|
- {
|
|
|
- strcpy(chargingProfiles[l], fname);
|
|
|
- l = l + 1;
|
|
|
- }
|
|
|
- ChargeProfileCount = l;
|
|
|
-
|
|
|
- }
|
|
|
- else if((chargingProfilePurposeIsNULL == FALSE)&&(strcmp(chargingProfilePurposeStr,"ChargePointMaxProfile")==0))
|
|
|
- {
|
|
|
- strcpy(fname, ChargePointMaxProfile_JSON);
|
|
|
- if((access(fname,F_OK))!=-1)
|
|
|
- {
|
|
|
- strcpy(chargingProfiles[0], fname);
|
|
|
- ChargeProfileCount = 1;
|
|
|
- }
|
|
|
- }
|
|
|
- else if((chargingProfilePurposeIsNULL == FALSE)&&(strcmp(chargingProfilePurposeStr,"TxDefaultProfile")==0))
|
|
|
- {
|
|
|
- strcpy(fname, TxDefaultProfile_0_JSON);
|
|
|
- if((access(fname,F_OK))!=-1)
|
|
|
- {
|
|
|
- strcpy(chargingProfiles[0], fname);
|
|
|
- ChargeProfileCount = 1;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- break;
|
|
|
-
|
|
|
- default:
|
|
|
- if(chargingProfilePurposeIsNULL == TRUE)
|
|
|
- {
|
|
|
- int m = 0;
|
|
|
- memset(fname, 0, sizeof fname);
|
|
|
- sprintf(fname, "/Storage/OCPP/TxDefaultProfile_%d.json", connectorIdInt);
|
|
|
- if((access(fname,F_OK))!=-1)
|
|
|
- {
|
|
|
- strcpy(chargingProfiles[m], fname);
|
|
|
- m = m + 1;
|
|
|
- }
|
|
|
-
|
|
|
- memset(fname, 0, sizeof fname);
|
|
|
- sprintf(fname, "/Storage/OCPP/TxProfile_%d.json", connectorIdInt);
|
|
|
- if((access(fname,F_OK))!=-1)
|
|
|
- {
|
|
|
- strcpy(chargingProfiles[m], fname);
|
|
|
- m = m + 1;
|
|
|
- }
|
|
|
-
|
|
|
- ChargeProfileCount = m;
|
|
|
- }
|
|
|
- else if((chargingProfilePurposeIsNULL == FALSE)&&(strcmp(chargingProfilePurposeStr,"TxDefaultProfile")==0))
|
|
|
- {
|
|
|
- //strcpy(fname, TxDefaultProfile_1_JSON);
|
|
|
- sprintf(fname, "/Storage/OCPP/TxDefaultProfile_%d.json", connectorIdInt);
|
|
|
- if((access(fname,F_OK))!=-1)
|
|
|
- {
|
|
|
- strcpy(chargingProfiles[0], fname);
|
|
|
- ChargeProfileCount = 1;
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
- else if((chargingProfilePurposeIsNULL == FALSE)&&(strcmp(chargingProfilePurposeStr,"TxProfile")==0))
|
|
|
- {
|
|
|
- sprintf(fname, "/Storage/OCPP/TxProfile_%d.json", connectorIdInt);
|
|
|
- if((access(fname,F_OK))!=-1)
|
|
|
- {
|
|
|
- strcpy(chargingProfiles[0], fname);
|
|
|
- ChargeProfileCount = 1;
|
|
|
- }
|
|
|
- //strcpy(fname, TxProfile_1_JSON);
|
|
|
- }
|
|
|
- //strcpy(fname, ChargePointMaxProfile_JSON );
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
- else // Check all Charging Profiles
|
|
|
- {
|
|
|
- int i = 0;
|
|
|
- char fnametemp[200]={0};
|
|
|
- ChargeProfileCount = 0;
|
|
|
- //Check ChargePointMaxProfile.json exit
|
|
|
- if((access("/Storage/OCPP/ChargePointMaxProfile.json",F_OK))!=-1)
|
|
|
- {
|
|
|
- strcpy(chargingProfiles[i], "/Storage/OCPP/ChargePointMaxProfile.json");
|
|
|
- i = i + 1;
|
|
|
- }
|
|
|
-
|
|
|
- //Check TxDefaultProfile_0.json exit
|
|
|
- if((access("/Storage/OCPP/TxDefaultProfile_0.json",F_OK))!=-1)
|
|
|
- {
|
|
|
- strcpy(chargingProfiles[i], "/Storage/OCPP/TxDefaultProfile_0.json");
|
|
|
- i = i + 1;
|
|
|
- }
|
|
|
-
|
|
|
- //Check TxDefaultProfile_%d.json
|
|
|
- for(int j=1; j <= gunTotalNumber; j++)
|
|
|
- {
|
|
|
- memset(fnametemp, 0, sizeof fnametemp);
|
|
|
- sprintf(fnametemp, "/Storage/OCPP/TxDefaultProfile_%d.json", j);
|
|
|
- if((access(fnametemp,F_OK))!=-1)
|
|
|
- {
|
|
|
- strcpy(chargingProfiles[i], fnametemp);
|
|
|
- i = i + 1;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- //Check TxProfile_%d.json
|
|
|
- for(int j=1; j <= gunTotalNumber; j++)
|
|
|
- {
|
|
|
- memset(fnametemp, 0, sizeof fnametemp);
|
|
|
- sprintf(fnametemp, "/Storage/OCPP/TxProfile_%d.json", j);
|
|
|
- if((access(fnametemp,F_OK))!=-1)
|
|
|
- {
|
|
|
- strcpy(chargingProfiles[i], fnametemp);
|
|
|
- i = i + 1;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- ChargeProfileCount = i;
|
|
|
- }// End connectorIsNULL is TRUE
|
|
|
-
|
|
|
- if(ChargeProfileCount == 0)
|
|
|
- {
|
|
|
- sprintf(comfirmstr, "%s", ClearChargingProfileStatusStr[ClearChargingProfileStatus_Unknown] );
|
|
|
- goto end;
|
|
|
- }
|
|
|
-
|
|
|
- if(connectorIsNULL == FALSE && (connectorIdInt != 0) && ( (connectorIdInt-1) > gunTotalNumber) )
|
|
|
- {
|
|
|
- sprintf(comfirmstr, "%s", ClearChargingProfileStatusStr[ClearChargingProfileStatus_Unknown] );
|
|
|
- goto end;
|
|
|
- }
|
|
|
-
|
|
|
- if((connectorIsNULL == FALSE) && (connectorIdInt == 0) )
|
|
|
- {
|
|
|
- memset(str, 0, sizeof str);
|
|
|
- // clear temp file
|
|
|
- sprintf(str,"rm -f %s",temp);
|
|
|
- system(str);
|
|
|
-
|
|
|
- for(int k=0; k < ChargeProfileCount; k++)
|
|
|
- {
|
|
|
- memset(str, 0, sizeof str);
|
|
|
- //clear file in C
|
|
|
- sprintf(str,"rm -f %s",chargingProfiles[k]);
|
|
|
- system(str);
|
|
|
- }
|
|
|
-
|
|
|
- sprintf(comfirmstr, "%s", ClearChargingProfileStatusStr[ClearChargingProfileStatus_Accepted] );
|
|
|
- goto end;
|
|
|
- }
|
|
|
- else if(connectorIsNULL == TRUE)
|
|
|
- {
|
|
|
- for(int k=0; k < ChargeProfileCount; k++)
|
|
|
- {
|
|
|
- fptr1 = fopen(chargingProfiles[k], "r");
|
|
|
- fptr2 = fopen("/Storage/OCPP/ClearChargingProfiletemp.json", "w+");
|
|
|
-
|
|
|
- //Check Charging Profile Count
|
|
|
- while(fscanf(fptr1, "%s", word) != EOF)
|
|
|
- {
|
|
|
- //DEBUG_INFO("word=%s\n",word);
|
|
|
- if(strstr(word, "chargingProfileId")!= NULL)
|
|
|
- {
|
|
|
- //DEBUG_INFO("test chargingProfileId \n");
|
|
|
- n_chargingProfile = n_chargingProfile + 1;
|
|
|
- //DEBUG_INFO("chargingProfileId Found\n");
|
|
|
- }
|
|
|
- }
|
|
|
- rewind(fptr1);
|
|
|
-
|
|
|
- //search Charging Profile Element
|
|
|
- //int i= 0;
|
|
|
- while ( fgets( sLineWord, sizeof sLineWord, fptr1 ) != NULL )
|
|
|
- {
|
|
|
- //------------------------tempconnectorIdInt------------------------//
|
|
|
- loc = strstr(sLineWord, "connectorId");
|
|
|
- c = 0;
|
|
|
- memset(sstr ,0, sizeof(sstr) );
|
|
|
- while (loc[strlen("connectorId")+2+c] != ',')
|
|
|
- {
|
|
|
- sstr[c] = loc[strlen("connectorId")+2+c];
|
|
|
- c++;
|
|
|
- }
|
|
|
- sstr[c] = '\0';
|
|
|
- tempconnectorIdInt = atoi(sstr);
|
|
|
- printf("file's gun number is %d\n", tempconnectorIdInt);
|
|
|
-
|
|
|
- //--------------------------chargingProfileId--------------------//
|
|
|
- c = 0;
|
|
|
- loc = strstr(sLineWord, "chargingProfileId");
|
|
|
- memset(sstr ,0, sizeof(sstr) );
|
|
|
- while (loc[strlen("chargingProfileId")+2+c] != ',')
|
|
|
- {
|
|
|
- sstr[c] = loc[strlen("chargingProfileId")+2+c];
|
|
|
- //printf("i=%d sstr=%c\n",c, sstr[c]);
|
|
|
- c++;
|
|
|
- }
|
|
|
- sstr[c] = '\0';
|
|
|
- tempchargingProfileIdInt = atoi(sstr);
|
|
|
-
|
|
|
- //stackLevel
|
|
|
- c = 0;
|
|
|
- loc = strstr(sLineWord, "stackLevel");
|
|
|
- memset(sstr ,0, sizeof(sstr) );
|
|
|
- while (loc[strlen("stackLevel")+2+c] != ',')
|
|
|
- {
|
|
|
- sstr[c] = loc[strlen("stackLevel")+2+c];
|
|
|
- //printf("i=%d sstr=%c\n",c, sstr[c]);
|
|
|
- c++;
|
|
|
- }
|
|
|
- sstr[c] = '\0';
|
|
|
- tempstackLevelInt = atoi(sstr);
|
|
|
-
|
|
|
- c = 0;
|
|
|
- loc = strstr(sLineWord, "chargingProfilePurpose");
|
|
|
- memset(sstr ,0, sizeof(sstr) );
|
|
|
- while (loc[3+strlen("chargingProfilePurpose")+c] != '\"')
|
|
|
- {
|
|
|
- sstr[c] = loc[3+strlen("chargingProfilePurpose")+c];
|
|
|
- c++;
|
|
|
- }
|
|
|
- sstr[c] = '\0';
|
|
|
- strcpy(tempchargingProfilePurposeStr, sstr);
|
|
|
-
|
|
|
- if((chargingProfileIdIsNULL == FALSE)&&(tempchargingProfileIdInt == chargingProfileIdInt))
|
|
|
- {
|
|
|
- //------- not write to fptr2-------//
|
|
|
- sprintf(comfirmstr, "%s", ClearChargingProfileStatusStr[ClearChargingProfileStatus_Accepted] );
|
|
|
- //clearflag = TRUE;
|
|
|
- }
|
|
|
- else if((chargingProfilePurposeIsNULL == FALSE)&&(strcmp(tempchargingProfilePurposeStr, chargingProfilePurposeStr) == 0))
|
|
|
- {
|
|
|
- //------- not write to fptr2-------//
|
|
|
- sprintf(comfirmstr, "%s", ClearChargingProfileStatusStr[ClearChargingProfileStatus_Accepted] );
|
|
|
- }
|
|
|
- else if((stackLevelIsNULL == FALSE) &&(tempstackLevelInt == stackLevelInt))
|
|
|
- {
|
|
|
- //------- not write to fptr2-------//
|
|
|
- sprintf(comfirmstr, "%s", ClearChargingProfileStatusStr[ClearChargingProfileStatus_Accepted] );
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- fprintf(fptr2, sLineWord);//writing data into file
|
|
|
- }
|
|
|
-
|
|
|
- memset(sLineWord, 0, sizeof sLineWord);
|
|
|
-
|
|
|
- } //End of while ( fgets( sLineWord, sizeof sLineWord, fptr1 ) != NULL )
|
|
|
-
|
|
|
- if(clearflag == TRUE)
|
|
|
- {
|
|
|
- fclose(fptr1);
|
|
|
- fclose(fptr2);
|
|
|
-
|
|
|
- sprintf(str,"rm -f %s",chargingProfiles[k]);
|
|
|
- system(str);
|
|
|
-
|
|
|
- // clear temp file
|
|
|
- sprintf(str,"rm -f %s",temp);
|
|
|
- system(str);
|
|
|
-
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- fclose(fptr1);
|
|
|
- fclose(fptr2);
|
|
|
-
|
|
|
- memset(str, 0, sizeof str);
|
|
|
- sprintf(str,"rm -f %s",chargingProfiles[k]);
|
|
|
- system(str);
|
|
|
-
|
|
|
- resultRename = rename(temp, chargingProfiles[k]);
|
|
|
-
|
|
|
- if(resultRename == 0)
|
|
|
- {
|
|
|
- DEBUG_INFO("File ChargingProfile renamed successfully");
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- DEBUG_INFO("Error: unable to rename the ChargingProfile file");
|
|
|
- }
|
|
|
-
|
|
|
- if(comfirmstr[0]== 0)
|
|
|
- {
|
|
|
- sprintf(comfirmstr, "%s", ClearChargingProfileStatusStr[ClearChargingProfileStatus_Unknown] );
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- //Check chargingProfile is empty file
|
|
|
- /*------ Read the file ----------------*/
|
|
|
- fptr1=fopen(chargingProfiles[k],"r");
|
|
|
- ch=fgetc(fptr1);
|
|
|
- rewind(fptr1);
|
|
|
- memset(sLineWord, 0, sizeof sLineWord);
|
|
|
- if(ch!=EOF)
|
|
|
- {
|
|
|
- while (fgets( sLineWord, sizeof sLineWord, fptr1) != NULL)
|
|
|
- {
|
|
|
- str[strlen(sLineWord) - 1] = '\0'; // eat the newline fgets() stores
|
|
|
-
|
|
|
- if(sLineWord[0]=='\0')
|
|
|
- {
|
|
|
- isEmptyFile = TRUE;
|
|
|
- break;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- isEmptyFile = FALSE;
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- fclose(fptr1);
|
|
|
-
|
|
|
- if(isEmptyFile == TRUE)
|
|
|
- {
|
|
|
- memset(str, 0, sizeof str);
|
|
|
- sprintf(str,"rm -f %s",chargingProfiles[k]);
|
|
|
- system(str);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- }// End of while(int k=0; k < ChargePointCount; k++)
|
|
|
- }
|
|
|
- else if((connectorIsNULL == FALSE) && (connectorIdInt != 0) )
|
|
|
- {
|
|
|
- DEBUG_INFO("ChargeProfileCount = %d\n", ChargeProfileCount);
|
|
|
- for(int k=0; k < ChargeProfileCount; k++)
|
|
|
- {
|
|
|
- fptr1 = fopen(chargingProfiles[k], "r");
|
|
|
- fptr2 = fopen(temp, "w+");
|
|
|
- //Check Charging Profile Count
|
|
|
- while(fscanf(fptr1, "%s", word) != EOF)
|
|
|
- {
|
|
|
- //DEBUG_INFO("word=%s\n",word);
|
|
|
- if(strstr(word, "chargingProfileId")!= NULL)
|
|
|
- {
|
|
|
- n_chargingProfile = n_chargingProfile + 1;
|
|
|
- }
|
|
|
- }
|
|
|
- rewind(fptr1);
|
|
|
- //search Charging Profile Element
|
|
|
- //int i= 0;
|
|
|
- while ( fgets( sLineWord, sizeof sLineWord, fptr1 ) != NULL )
|
|
|
- {
|
|
|
- //*************************tempconnectorIdInt*********************************/
|
|
|
- loc = strstr(sLineWord, "connectorId");
|
|
|
- c = 0;
|
|
|
- memset(sstr ,0, sizeof(sstr) );
|
|
|
- while (loc[strlen("connectorId")+2+c] != ',')
|
|
|
- {
|
|
|
- sstr[c] = loc[strlen("connectorId")+2+c];
|
|
|
- c++;
|
|
|
- }
|
|
|
- sstr[c] = '\0';
|
|
|
- tempconnectorIdInt = atoi(sstr);
|
|
|
-
|
|
|
- //chargingProfileId
|
|
|
- c = 0;
|
|
|
- loc = strstr(sLineWord, "chargingProfileId");
|
|
|
- memset(sstr ,0, sizeof(sstr) );
|
|
|
- while (loc[strlen("chargingProfileId")+2+c] != ',')
|
|
|
- {
|
|
|
- sstr[c] = loc[strlen("chargingProfileId")+2+c];
|
|
|
- //printf("i=%d sstr=%c\n",c, sstr[c]);
|
|
|
- c++;
|
|
|
- }
|
|
|
- sstr[c] = '\0';
|
|
|
- tempchargingProfileIdInt = atoi(sstr);
|
|
|
-
|
|
|
- //stackLevel
|
|
|
- c = 0;
|
|
|
- loc = strstr(sLineWord, "stackLevel");
|
|
|
- memset(sstr ,0, sizeof(sstr) );
|
|
|
- while (loc[strlen("stackLevel")+2+c] != ',')
|
|
|
- {
|
|
|
- sstr[c] = loc[strlen("stackLevel")+2+c];
|
|
|
- //printf("i=%d sstr=%c\n",c, sstr[c]);
|
|
|
- c++;
|
|
|
- }
|
|
|
- sstr[c] = '\0';
|
|
|
- tempstackLevelInt = atoi(sstr);
|
|
|
-
|
|
|
- c = 0;
|
|
|
- loc = strstr(sLineWord, "chargingProfilePurpose");
|
|
|
- memset(sstr ,0, sizeof(sstr) );
|
|
|
- while (loc[3+strlen("chargingProfilePurpose")+c] != '\"')
|
|
|
- {
|
|
|
- sstr[c] = loc[3+strlen("chargingProfilePurpose")+c];
|
|
|
- c++;
|
|
|
- }
|
|
|
- sstr[c] = '\0';
|
|
|
- strcpy(tempchargingProfilePurposeStr, sstr);
|
|
|
-
|
|
|
- if((chargingProfileIdIsNULL == FALSE)&&(tempchargingProfileIdInt == chargingProfileIdInt))
|
|
|
- {
|
|
|
- //------- not write to fptr2-------//
|
|
|
- sprintf(comfirmstr, "%s", ClearChargingProfileStatusStr[ClearChargingProfileStatus_Accepted] );
|
|
|
- //clearflag = TRUE;
|
|
|
- }
|
|
|
- else if((stackLevelIsNULL == FALSE) &&(tempstackLevelInt == stackLevelInt))
|
|
|
- {
|
|
|
- //------- not write to fptr2-------//
|
|
|
- sprintf(comfirmstr, "%s", ClearChargingProfileStatusStr[ClearChargingProfileStatus_Accepted] );
|
|
|
- }
|
|
|
- else if(stackLevelIsNULL == TRUE)
|
|
|
- {
|
|
|
- //Clear Whole File
|
|
|
- sprintf(comfirmstr, "%s", ClearChargingProfileStatusStr[ClearChargingProfileStatus_Accepted] );
|
|
|
- clearflag = TRUE;
|
|
|
- break;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- fprintf(fptr2, sLineWord);//writing data into file
|
|
|
- }
|
|
|
-
|
|
|
- memset(sLineWord, 0, sizeof sLineWord);
|
|
|
- }
|
|
|
-
|
|
|
- if(clearflag == TRUE)
|
|
|
- {
|
|
|
- fclose(fptr1);
|
|
|
- fclose(fptr2);
|
|
|
-
|
|
|
- sprintf(str,"rm -f %s",chargingProfiles[k]);
|
|
|
- system(str);
|
|
|
-
|
|
|
- // clear temp file
|
|
|
- sprintf(str,"rm -f %s",temp);
|
|
|
- system(str);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- fclose(fptr1);
|
|
|
- fclose(fptr2);
|
|
|
-
|
|
|
- sprintf(str,"rm -f %s",chargingProfiles[k]);
|
|
|
- system(str);
|
|
|
-
|
|
|
- resultRename = rename(temp, chargingProfiles[k]);
|
|
|
-
|
|
|
- if(resultRename == 0)
|
|
|
- {
|
|
|
- DEBUG_INFO("File ChargingProfile renamed successfully");
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- DEBUG_INFO("Error: unable to rename the ChargingProfile file");
|
|
|
- }
|
|
|
-
|
|
|
- if(comfirmstr[0]== 0)
|
|
|
- {
|
|
|
- sprintf(comfirmstr, "%s", ClearChargingProfileStatusStr[ClearChargingProfileStatus_Unknown] );
|
|
|
- }
|
|
|
-
|
|
|
- //Check chargingProfile is empty file
|
|
|
- /*------ Read the file ----------------*/
|
|
|
- fptr1=fopen(chargingProfiles[k],"r");
|
|
|
- ch=fgetc(fptr1);
|
|
|
- rewind(fptr1);
|
|
|
- memset(sLineWord, 0, sizeof sLineWord);
|
|
|
- if(ch!=EOF)
|
|
|
- {
|
|
|
- while (fgets( sLineWord, sizeof sLineWord, fptr1) != NULL)
|
|
|
- {
|
|
|
- str[strlen(sLineWord) - 1] = '\0'; // eat the newline fgets() stores
|
|
|
-
|
|
|
- if(sLineWord[0]=='\0')
|
|
|
- {
|
|
|
- isEmptyFile = TRUE;
|
|
|
- break;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- isEmptyFile = FALSE;
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- fclose(fptr1);
|
|
|
-
|
|
|
- if(isEmptyFile == TRUE)
|
|
|
- {
|
|
|
- memset(str, 0, sizeof str);
|
|
|
- sprintf(str,"rm -f %s",chargingProfiles[k]);
|
|
|
- system(str);
|
|
|
- }
|
|
|
- /*------- End of reading ---------------*/
|
|
|
- }
|
|
|
-
|
|
|
- } // while(int k=0; k < ChargeProfileCount; k++)
|
|
|
-
|
|
|
- }// (connectorIsNULL == FALSE) && (connectorIdInt != 0)
|
|
|
-
|
|
|
-end:
|
|
|
- sendClearChargingProfileConfirmation(uuid, comfirmstr);
|
|
|
-
|
|
|
- return result;
|
|
|
-}
|
|
|
-
|
|
|
-int handleDataTransferRequest(char *uuid, char *payload)
|
|
|
-{
|
|
|
- mtrace();
|
|
|
- int result = FAIL;
|
|
|
- //Payload={"vendorId":"Phihong","messageId":"MSGID","data":"Data1"}
|
|
|
- char tempvendorId[255]={0};
|
|
|
- char tempmessageId[50]={0};
|
|
|
- char tempdata[50]={0};
|
|
|
- char message[80]={0};
|
|
|
-
|
|
|
- DEBUG_INFO("handleDataTransferRequest...\n");
|
|
|
- if((uuid != NULL) && (payload != NULL))
|
|
|
- {
|
|
|
- json_object *DataTransfer;
|
|
|
- DataTransfer = json_tokener_parse(payload);
|
|
|
-
|
|
|
- if(!is_error(DataTransfer))
|
|
|
- {
|
|
|
- // Required data
|
|
|
- sprintf((char*)tempvendorId, "%s", json_object_get_string(json_object_object_get(DataTransfer, "vendorId")));
|
|
|
-
|
|
|
- // Optional data
|
|
|
- if(json_object_object_get(DataTransfer, "messageId") != NULL)
|
|
|
- sprintf((char*)tempmessageId, "%s", json_object_get_string(json_object_object_get(DataTransfer, "messageId")));
|
|
|
-
|
|
|
- if(json_object_object_get(DataTransfer, "data") != NULL)
|
|
|
- sprintf((char*)tempdata, "%s", json_object_get_string(json_object_object_get(DataTransfer, "data")));
|
|
|
-
|
|
|
- result = PASS;
|
|
|
- }
|
|
|
- json_object_put(DataTransfer);
|
|
|
-
|
|
|
-
|
|
|
- sprintf(message,"[%d,\"%s\",{\"status\":\"%s\",\"data\":\"vendorId-%s messageId-%s data-%s\"}]",MESSAGE_TYPE_CALLRESULT, uuid, "Rejected", tempvendorId, tempmessageId, tempdata );
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- char guid[37]={0};
|
|
|
- random_uuid(guid);
|
|
|
-
|
|
|
- //[2,"1577349264923","DataTransfer",{"vendorId":"Phihong","messageId":"MSGID","data":"Data1"}]
|
|
|
- sprintf(message,"[%d,\"%s\",\"%s\",{\"vendorId\":\"Phihong\",\"messageId\":\"MSGID\",\"data\":\"Data1\"}]",MESSAGE_TYPE_CALL, guid, "DataTransfer");
|
|
|
- }
|
|
|
-
|
|
|
- LWS_Send(message);
|
|
|
- return result;
|
|
|
-}
|
|
|
-
|
|
|
-int handleGetCompositeScheduleRequest(char *uuid, char *payload)
|
|
|
-{
|
|
|
- mtrace();
|
|
|
- int result = FAIL;
|
|
|
- int connectorIdInt, durationInt;
|
|
|
- char chargingRateUnitStr[4]={0};
|
|
|
- char comfirmstr[20];
|
|
|
- int confirmPeriods = 0;
|
|
|
-
|
|
|
- DEBUG_INFO("handleGetCompositeScheduleRequest...\n");
|
|
|
- json_object *GetCompositeSchedule;
|
|
|
- GetCompositeSchedule = json_tokener_parse(payload);
|
|
|
- if(!is_error(GetCompositeSchedule))
|
|
|
- {
|
|
|
- // Required data
|
|
|
- connectorIdInt= json_object_get_int(json_object_object_get(GetCompositeSchedule, "connectorId"));
|
|
|
- durationInt = json_object_get_int(json_object_object_get(GetCompositeSchedule, "duration"));
|
|
|
-
|
|
|
- // Optional data
|
|
|
- if(json_object_object_get(GetCompositeSchedule, "chargingRateUnit") != NULL)
|
|
|
- sprintf((char*)chargingRateUnitStr, "%s", json_object_get_string(json_object_object_get(GetCompositeSchedule, "chargingRateUnit")));
|
|
|
- }
|
|
|
- json_object_put(GetCompositeSchedule);
|
|
|
-
|
|
|
- memset(ShmOCPP16Data->GetCompositeSchedule, 0, sizeof(struct StructChargingSchedulePeriod)*gunTotalNumber);
|
|
|
- if((connectorIdInt == 0) ||
|
|
|
- ((connectorIdInt > 0) && ((connectorIdInt -1) < gunTotalNumber)))
|
|
|
- {
|
|
|
- int gun_index = (connectorIdInt==0?0:connectorIdInt-1);
|
|
|
- struct StructChargingProfile tmpProfile[1];
|
|
|
-
|
|
|
- checkCompositeSchedule(connectorIdInt, durationInt, &tmpProfile[0]);
|
|
|
- for(int idx=0;idx<ARRAY_SIZE(ShmOCPP16Data->GetCompositeSchedule[gun_index].ResponseChargingSchedule.ChargingSchedulePeriod);idx++)
|
|
|
- {
|
|
|
- DEBUG_INFO("Smart Period-%02d start: %d\n", idx, tmpProfile[0].ChargingSchedule.ChargingSchedulePeriod[idx].StartPeriod);
|
|
|
- DEBUG_INFO("Smart Period-%02d limit: %f\n", idx, tmpProfile[0].ChargingSchedule.ChargingSchedulePeriod[idx].Limit);
|
|
|
- }
|
|
|
- ShmOCPP16Data->GetCompositeSchedule[gun_index].ResponseConnectorId = connectorIdInt;
|
|
|
- memcpy(&ShmOCPP16Data->GetCompositeSchedule[gun_index].ResponseChargingSchedule, &tmpProfile[0].ChargingSchedule, sizeof(struct StructChargingSchedule));
|
|
|
- memcpy(&ShmOCPP16Data->GetCompositeSchedule[gun_index].ResponseScheduleStart ,&tmpProfile[0].ChargingSchedule.StartSchedule, ARRAY_SIZE(tmpProfile[0].ChargingSchedule.StartSchedule));
|
|
|
-
|
|
|
- for(int idx=0;idx<ARRAY_SIZE(ShmOCPP16Data->GetCompositeSchedule[gun_index].ResponseChargingSchedule.ChargingSchedulePeriod);idx++)
|
|
|
- {
|
|
|
- DEBUG_INFO("Composite Period-%02d start: %d\n", idx, ShmOCPP16Data->GetCompositeSchedule[gun_index].ResponseChargingSchedule.ChargingSchedulePeriod[idx].StartPeriod);
|
|
|
- DEBUG_INFO("Composite Period-%02d limit: %f\n", idx, ShmOCPP16Data->GetCompositeSchedule[gun_index].ResponseChargingSchedule.ChargingSchedulePeriod[idx].Limit);
|
|
|
-
|
|
|
- if((ShmOCPP16Data->GetCompositeSchedule[gun_index].ResponseChargingSchedule.ChargingSchedulePeriod[idx].StartPeriod==0) &&
|
|
|
- (ShmOCPP16Data->GetCompositeSchedule[gun_index].ResponseChargingSchedule.ChargingSchedulePeriod[idx].Limit==0))
|
|
|
- {
|
|
|
- confirmPeriods = idx;
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
- sprintf(comfirmstr, "%s", GetCompositeScheduleStatusStr[GetCompositeScheduleStatus_Accepted] );
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- sprintf(comfirmstr, "%s", GetCompositeScheduleStatusStr[GetCompositeScheduleStatus_Rejected] );
|
|
|
- }
|
|
|
-
|
|
|
- sendGetCompositeScheduleConfirmation(uuid, comfirmstr, connectorIdInt, confirmPeriods);
|
|
|
-
|
|
|
- return result;
|
|
|
-}
|
|
|
-
|
|
|
-int handleGetConfigurationRequest(char *uuid, char *payload)
|
|
|
-{
|
|
|
- mtrace();
|
|
|
- int result = FAIL;
|
|
|
- int MaxKeySupported = 0;
|
|
|
- int n_keys = 0;
|
|
|
- char requestKey[43][50]={0};
|
|
|
-
|
|
|
- DEBUG_INFO("handleGetConfigurationRequest...\n");
|
|
|
- json_object *GetConfiguration;
|
|
|
- GetConfiguration = json_tokener_parse(payload);
|
|
|
-
|
|
|
- if(!is_error(GetConfiguration))
|
|
|
- {
|
|
|
- // Optional data
|
|
|
- if(json_object_object_get(GetConfiguration, "key") != NULL)
|
|
|
- {
|
|
|
- for(int idx=0;idx<json_object_array_length(json_object_object_get(GetConfiguration, "key"));idx++)
|
|
|
- {
|
|
|
- sprintf((char*)requestKey[idx], "%s", json_object_get_string(json_object_array_get_idx(json_object_object_get(GetConfiguration, "key"), idx)));
|
|
|
- n_keys = idx + 1;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- json_object_put(GetConfiguration);
|
|
|
-
|
|
|
- UnknownKeynum = 0;
|
|
|
- memset( (void *)unknownkey, 0, sizeof(unknownkey));
|
|
|
-
|
|
|
- MaxKeySupported = GetConfigurationMaxKeysNUM;
|
|
|
- memset(ShmOCPP16Data->GetConfiguration.Key, 0 ,sizeof(struct StructConfigurationKeyItems)*MaxKeySupported);
|
|
|
- memset(ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey, 0, sizeof(struct StructConfigurationKey)*MaxKeySupported);
|
|
|
-
|
|
|
- if(n_keys != 0)
|
|
|
- {
|
|
|
- for(int i=0;i<n_keys;i++)
|
|
|
- {
|
|
|
- getKeyValue(requestKey[i]);
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- DEBUG_INFO("There is no key in Message, get all configuration\n");
|
|
|
- getKeyValue("");
|
|
|
- }
|
|
|
-
|
|
|
- processUnkownKey();
|
|
|
- sendGetConfigurationConfirmation(uuid);
|
|
|
-
|
|
|
- return result;
|
|
|
-}
|
|
|
-
|
|
|
-static char fnamePlusPath[100]={0};
|
|
|
-static char fnamePWithNoPath[60]={0};
|
|
|
-void checkUploadLog(void)
|
|
|
-{
|
|
|
- FILE *fp;
|
|
|
- /* Open the command for reading. */
|
|
|
- fp = popen("find /mnt/ -type f -name \"*.zip\" |xargs ls -t", "r");
|
|
|
- if (fp == NULL) {
|
|
|
- printf("Failed to run command\n" );
|
|
|
- exit(1);
|
|
|
- }
|
|
|
-
|
|
|
- int ftppathlen = 0;
|
|
|
- memset(fnamePlusPath, 0, sizeof(fnamePlusPath));
|
|
|
- int i = 0;
|
|
|
- /* Read the output a line at a time - output it. */
|
|
|
- while (fgets(fnamePlusPath, sizeof(fnamePlusPath), fp) != NULL) {
|
|
|
- if(i==0)
|
|
|
- {
|
|
|
- ftppathlen = strlen(fnamePlusPath);
|
|
|
- printf("%s\n", fnamePlusPath);
|
|
|
- fnamePlusPath[ftppathlen]='\0';
|
|
|
- break;
|
|
|
- }
|
|
|
- i= i+1;
|
|
|
- }
|
|
|
-
|
|
|
- /* close */
|
|
|
- pclose(fp);
|
|
|
-
|
|
|
- for(int k=0; k< sizeof(fnamePlusPath); k++)
|
|
|
- {
|
|
|
- if((fnamePlusPath[k]=='\n') || (fnamePlusPath[k]=='r'))
|
|
|
- {
|
|
|
- fnamePlusPath[k]='\0';
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- i=1;
|
|
|
- //char fname[60]={0};
|
|
|
- while(i < ftppathlen)
|
|
|
- {
|
|
|
- int len=ftppathlen-i;
|
|
|
- if(fnamePlusPath[len]== 47) // '/' ascll code: 47
|
|
|
- {
|
|
|
- printf("compare '/' all right\n");
|
|
|
- break;
|
|
|
- }
|
|
|
- i=i+1;
|
|
|
- }
|
|
|
-
|
|
|
- memset(fnamePWithNoPath, 0, sizeof(fnamePWithNoPath));
|
|
|
- strncpy(fnamePWithNoPath, fnamePlusPath+(ftppathlen-i+1), i+1);
|
|
|
- fnamePWithNoPath[i+1] = '\0';
|
|
|
-
|
|
|
- for(int j=0; j< sizeof(fnamePWithNoPath); j++)
|
|
|
- {
|
|
|
- if((fnamePWithNoPath[j]=='\n') || (fnamePWithNoPath[j]=='r'))
|
|
|
- {
|
|
|
- fnamePWithNoPath[j]='\0';
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- FILE* fp1 = fopen(fnamePlusPath, "r");
|
|
|
- if (fp1)
|
|
|
- {
|
|
|
- printf("testfuc : fnamePlusPath=%s exist.\n", fnamePlusPath);
|
|
|
- // file exists
|
|
|
- fclose(fp1);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- // file doesn't exist
|
|
|
- printf("testfuc : fnamePlusPath=%s not exist!\n", fnamePlusPath);
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-int handleGetDiagnosticsRequest(char *uuid, char *payload)
|
|
|
-{
|
|
|
- mtrace();
|
|
|
- int result = FAIL;
|
|
|
- char cmdBuf[512];
|
|
|
- char fName[258];
|
|
|
- time_t CurrentTime;
|
|
|
- struct tm *tm;
|
|
|
-
|
|
|
- pthread_t th_Status;
|
|
|
- CurrentTime = time(NULL);
|
|
|
- tm = localtime(&CurrentTime);
|
|
|
- sprintf(fName ,"%s-%s-%04d%02d%02d%02d%02d%02d.zip", ShmSysConfigAndInfo->SysConfig.ModelName, ShmSysConfigAndInfo->SysConfig.SerialNumber, (tm->tm_year+1900), (tm->tm_mon+1),tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec);
|
|
|
- sendGetDiagnosticsConfirmation(uuid, fName);
|
|
|
- system("exec /root/logPackTools 'log' 6");
|
|
|
- sprintf(cmdBuf, "mv /mnt/log.zip /mnt/%s", fName);
|
|
|
- system(cmdBuf);
|
|
|
- checkUploadLog();
|
|
|
-
|
|
|
- pthread_create(&th_Status, NULL, GetDiagnosticsProcess, stringtrimspace(payload));
|
|
|
-
|
|
|
- return result;
|
|
|
-}
|
|
|
-
|
|
|
-void* GetDiagnosticsProcess(void* data)
|
|
|
-{
|
|
|
- pthread_detach(pthread_self());
|
|
|
- mtrace();
|
|
|
- int retriesInt=0, retryIntervalInt=0;
|
|
|
- char locationstr[100]={0}, startTimestr[30]={0}, stopTimestr[30]={0} ;
|
|
|
- int retriesIsNULL,retryIntervalIsNULL, startTimeIsNULL, stopTimeIsNULL;
|
|
|
- char protocol[10]={0}, user[50]={0},password[50]={0},host[50]={0}, path[50]={0}, ftppath[60]={0},host1[50]={0},path1[50]={0};
|
|
|
- int port=0;
|
|
|
- char sstr[260]={ 0 };
|
|
|
- int c = 0;
|
|
|
- char *loc;
|
|
|
- int isSuccess = FALSE;
|
|
|
- char ftpbuf[200]={0};
|
|
|
- char * pch;
|
|
|
-
|
|
|
- char str[300]={ 0 };
|
|
|
- strcpy(str,(const char*)data);
|
|
|
-
|
|
|
- retriesIsNULL = retryIntervalIsNULL = startTimeIsNULL = stopTimeIsNULL = FALSE;
|
|
|
-
|
|
|
- DEBUG_INFO("GetDiagnosticsProcess...%s\n", str);
|
|
|
- sendDiagnosticsStatusNotificationRequest(DiagnosticsStatusStr[DiagnosticsStatus_Uploading]);
|
|
|
-
|
|
|
- //****************location*******************/
|
|
|
- c = 0;
|
|
|
- memset(sstr ,0, sizeof(sstr) );
|
|
|
- loc = strstr(str, "location");
|
|
|
- while (loc[3+strlen("location")+c] != '\"')
|
|
|
- {
|
|
|
- sstr[c] = loc[3+strlen("location")+c];
|
|
|
- c++;
|
|
|
- }
|
|
|
- sstr[c] = '\0';
|
|
|
- strcpy(locationstr,sstr);
|
|
|
- //strcpy(locationstr,"http://test.evsocket.phihong.com.cn:9001/UploadFiles/Diagnostics/");
|
|
|
-
|
|
|
- if(strcmp(locationstr,"")==0)
|
|
|
- {
|
|
|
- DEBUG_INFO("location is <Empty>!\n");
|
|
|
- sendDiagnosticsStatusNotificationRequest(DiagnosticsStatusStr[DiagnosticsStatus_UploadFailed]);
|
|
|
- goto end;
|
|
|
- }
|
|
|
-
|
|
|
- //****************retries*******************/
|
|
|
- c = 0;
|
|
|
- loc = strstr(str, "retries");
|
|
|
- if(loc == NULL)
|
|
|
- {
|
|
|
- retriesIsNULL = TRUE;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- while ((loc[strlen("retries")+2+c] != ',')&&(loc[strlen("retries")+2+c] != '}'))
|
|
|
- {
|
|
|
- sstr[c] = loc[strlen("retries")+2+c];
|
|
|
- c++;
|
|
|
- }
|
|
|
- sstr[c] = '\0';
|
|
|
- retriesInt = atoi(sstr);
|
|
|
- }
|
|
|
-
|
|
|
- if(retriesIsNULL == TRUE)
|
|
|
- {
|
|
|
- retriesInt = 3; // If this field is not present, it is left to Charge Point to decide how many times it wants to retry.
|
|
|
- }
|
|
|
-
|
|
|
- //****************retryInterval*******************/
|
|
|
- c = 0;
|
|
|
- loc = strstr(str, "retryInterval");
|
|
|
- if(loc == NULL)
|
|
|
- {
|
|
|
- retryIntervalIsNULL = TRUE;
|
|
|
- retryIntervalInt = 30; // if this field is not present, it is left to Charge Point to decide how long to wait between attempts.
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- while ((loc[strlen("retryInterval")+2+c] != ',')&&(loc[strlen("retries")+2+c] != '}'))
|
|
|
- {
|
|
|
- sstr[c] = loc[strlen("retryInterval")+2+c];
|
|
|
- c++;
|
|
|
- }
|
|
|
- sstr[c] = '\0';
|
|
|
- retryIntervalInt = atoi(sstr);
|
|
|
- }
|
|
|
-
|
|
|
- //****************startTime*******************/
|
|
|
- c = 0;
|
|
|
- memset(sstr ,0, sizeof(sstr) );
|
|
|
- loc = strstr(str, "startTime");
|
|
|
- if(loc == NULL)
|
|
|
- {
|
|
|
- startTimeIsNULL = TRUE;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- while (loc[3+strlen("startTime")+c] != '\"')
|
|
|
- {
|
|
|
- sstr[c] = loc[3+strlen("startTime")+c];
|
|
|
- c++;
|
|
|
- }
|
|
|
- sstr[c] = '\0';
|
|
|
- strcpy(startTimestr,sstr);
|
|
|
- }
|
|
|
-
|
|
|
- //****************stopTime*******************/
|
|
|
- c = 0;
|
|
|
- memset(sstr ,0, sizeof(sstr) );
|
|
|
- loc = strstr(str, "stopTime");
|
|
|
- if(loc == NULL)
|
|
|
- {
|
|
|
- stopTimeIsNULL = TRUE;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- while (loc[3+strlen("stopTime")+c] != '\"')
|
|
|
- {
|
|
|
- sstr[c] = loc[3+strlen("stopTime")+c];
|
|
|
- c++;
|
|
|
- }
|
|
|
- sstr[c] = '\0';
|
|
|
- strcpy(stopTimestr,sstr);
|
|
|
- }
|
|
|
-
|
|
|
- memset(protocol, 0, sizeof(protocol));
|
|
|
- memset(user, 0, sizeof(user) );
|
|
|
- memset(password, 0, sizeof(password));
|
|
|
- memset(host, 0, sizeof(host));
|
|
|
-
|
|
|
- memset(path, 0, sizeof(path));
|
|
|
- memset(ftppath, 0, sizeof(ftppath));
|
|
|
- memset(host1, 0, sizeof(host1));
|
|
|
- memset(path1, 0, sizeof(path1));
|
|
|
- /*location: ftp://user:password@host:port/path*/
|
|
|
-
|
|
|
- //DEBUG_INFO("fnamePlusPath =%s\n",fnamePlusPath);
|
|
|
- if((access(fnamePlusPath,F_OK))!=-1)
|
|
|
- {
|
|
|
- DEBUG_INFO("fnamePlusPath exist.\n");
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- DEBUG_INFO("fnamePlusPath not exist!\n");
|
|
|
- sendDiagnosticsStatusNotificationRequest(DiagnosticsStatusStr[DiagnosticsStatus_UploadFailed]);
|
|
|
- goto end;
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- pch=strchr(locationstr,'@');
|
|
|
-
|
|
|
- if(pch==NULL)
|
|
|
- {
|
|
|
- sscanf(locationstr,
|
|
|
- "%[^:]:%*2[/]%[^:]:%i/%[a-zA-Z0-9._/-]",
|
|
|
- protocol, host, &port, path);
|
|
|
- strcpy(user,"anonymous");
|
|
|
- strcpy(password,"");
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- //DEBUG_INFO("pch=%s\n", pch);
|
|
|
- sscanf(locationstr,"%[^:]:%*2[/]%[^:]:%[^@]@%[^:]:%i/%199[^\n]",
|
|
|
- protocol, user, password, host, &port, path);
|
|
|
- }
|
|
|
-
|
|
|
- if((strcmp(protocol,"ftp")!=0)&&(strcmp(protocol,"http")!=0))
|
|
|
- {
|
|
|
- DEBUG_INFO("protocol is not ftp/http ! \n");
|
|
|
- sendDiagnosticsStatusNotificationRequest(DiagnosticsStatusStr[DiagnosticsStatus_UploadFailed]);
|
|
|
- goto end;
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- if(strncmp(locationstr,"http", 4) == 0)
|
|
|
- {
|
|
|
- sscanf(locationstr,"%[^:]:%*2[/]%[^/]/%199[^\n]", protocol, host, path);
|
|
|
-
|
|
|
- sprintf(ftppath,"/%s", path);
|
|
|
-
|
|
|
- do{
|
|
|
- isSuccess = httpUploadFile(host, ftppath, fnamePlusPath, locationstr);
|
|
|
- sleep(retryIntervalInt);
|
|
|
- }while((isSuccess == 0)&&(retriesInt > 0 && retriesInt --));
|
|
|
-
|
|
|
- if(!isSuccess)
|
|
|
- {
|
|
|
- DEBUG_INFO("Diagnostics fail.\n");
|
|
|
- sendDiagnosticsStatusNotificationRequest(DiagnosticsStatusStr[DiagnosticsStatus_UploadFailed]);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- DEBUG_INFO("sendDiagnosticsStatusNotificationRequest Uploaded\n");
|
|
|
- sendDiagnosticsStatusNotificationRequest(DiagnosticsStatusStr[DiagnosticsStatus_Uploaded]);
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- sscanf(host,"%[^/]%s",host1, path1);
|
|
|
- sprintf(ftppath,"%s", path1);
|
|
|
-
|
|
|
- int ftppathlen=strlen(ftppath);
|
|
|
- int i=1;
|
|
|
- char filenametemp[50];
|
|
|
- while(i < ftppathlen)
|
|
|
- {
|
|
|
- int len=ftppathlen-i;
|
|
|
- if(ftppath[len]== 47) // '/' ascll code: 47
|
|
|
- {
|
|
|
- DEBUG_INFO("find '/' all right\n");
|
|
|
- break;
|
|
|
- }
|
|
|
- i=i+1;
|
|
|
- }
|
|
|
-
|
|
|
- memset(filenametemp, 0, sizeof(filenametemp));
|
|
|
- strncpy(filenametemp, ftppath+(ftppathlen-i+1), i+1);
|
|
|
- filenametemp[i+1] = 0;
|
|
|
- memset(ftpbuf, 0, sizeof(ftpbuf));
|
|
|
-
|
|
|
- if(port == 0)
|
|
|
- port = 21;
|
|
|
-
|
|
|
- do{
|
|
|
- isSuccess = ftpFile(host1, user, password, port, ftppath, fnamePlusPath, fnamePWithNoPath);
|
|
|
- sleep(retryIntervalInt);
|
|
|
- }while((!isSuccess)&&(retriesInt > 0 && retriesInt --));
|
|
|
-
|
|
|
- if(!isSuccess)
|
|
|
- {
|
|
|
- DEBUG_INFO("Diagnostics fail.\n");
|
|
|
- sendDiagnosticsStatusNotificationRequest(DiagnosticsStatusStr[DiagnosticsStatus_UploadFailed]);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- DEBUG_INFO("sendDiagnosticsStatusNotificationRequest Uploaded\n");
|
|
|
- sendDiagnosticsStatusNotificationRequest(DiagnosticsStatusStr[DiagnosticsStatus_Uploaded]);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
-end:
|
|
|
- DiagnosticsStatusNotificationStatus = DIAGNOSTIC_STATUS_IDLE;
|
|
|
- pthread_exit(NULL);
|
|
|
-}
|
|
|
-
|
|
|
-int handleGetLocalListVersionRequest(char *uuid, char *payload)
|
|
|
-{
|
|
|
- mtrace();
|
|
|
- int result = FAIL;
|
|
|
- DEBUG_INFO("handle GetLocalListVersionRequest\n");
|
|
|
-
|
|
|
- if(strcmp((const char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemData, "FALSE") == 0)
|
|
|
- {
|
|
|
- DEBUG_INFO("LocalAuthListEnabled is FALSE \n");
|
|
|
- localversion = -1;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- DEBUG_INFO("handle GetLocalListVersionRequest OCPP_getListVerion \n");
|
|
|
- OCPP_getListVerion();
|
|
|
- }
|
|
|
-
|
|
|
- //from db.OCPP_getListVerion
|
|
|
- ShmOCPP16Data->GetLocalListVersion.ResponseListVersion = localversion;
|
|
|
- //ShmOCPP16Data->MsMsg.bits.GetLocalListVersionReq = 1;
|
|
|
- sendGetLocalListVersionConfirmation(uuid,"");
|
|
|
- //ShmOCPP16Data->MsMsg.bits.GetLocalListVersionConf = 1;
|
|
|
-
|
|
|
- return result;
|
|
|
-}
|
|
|
-
|
|
|
-int handleRemoteStartRequest(char *uuid, char *payload)
|
|
|
-{
|
|
|
- mtrace();
|
|
|
- int result = FAIL;
|
|
|
- int connectorIdInt=0, chargingProfileIdInt=0, transactionIdInt=0, stackLevelInt=0,
|
|
|
- durationInt=0, startPeriodInt[10]={0}, numberPhasesInt[10]={0};
|
|
|
- int tempIndex = 0;
|
|
|
- char idTagstr[20]={0}, chargingProfilePurposestr[30]={0}, chargingProfileKindstr[14]={0}, recurrencyKindstr[10]={0},
|
|
|
- validFromstr[30]={0}, validTostr[30]={0}, startSchedulestr[30]={0}, chargingRateUnitstr[4]={0};
|
|
|
- int connectorIdIsNULL,chargingProfileIsNULL,transactionIdIsNULL,recurrencyKindIsNULL,validFromIsNULL,validToIsNULL,durationIsNULL,startScheduleIsNULL,minChargingRateIsNULL,numberPhasesIsNULL;
|
|
|
- float minChargingRateflaot=0.0, limitflaot[10]={0.0};
|
|
|
- int chargingSchedulePeriodCount = 0;
|
|
|
- char sstr[30]={ 0 },sstrtemp[1600]={ 0 };//sstr[200]={ 0 };
|
|
|
- int c = 0;
|
|
|
- char *loc;
|
|
|
- char comfirmstr[20]={0};
|
|
|
-
|
|
|
- DEBUG_INFO("handleRemoteStartRequest ...\n");
|
|
|
- if(server_pending == TRUE)
|
|
|
- {
|
|
|
- return 0;
|
|
|
- }
|
|
|
-
|
|
|
- connectorIdIsNULL = chargingProfileIsNULL = transactionIdIsNULL = recurrencyKindIsNULL = validFromIsNULL = validToIsNULL = durationIsNULL = startScheduleIsNULL = minChargingRateIsNULL = numberPhasesIsNULL= FALSE;
|
|
|
-
|
|
|
- strcpy(sstrtemp, stringtrimspace(payload));
|
|
|
-
|
|
|
- //**********connectorId****************/
|
|
|
- c = 0;
|
|
|
- memset(sstr ,0, sizeof(sstr) );
|
|
|
- loc = strstr(sstrtemp, "connectorId");
|
|
|
- if(loc == NULL)
|
|
|
- {
|
|
|
- connectorIdIsNULL = TRUE;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- while ((loc[strlen("connectorId")+2+c] != '}') && (loc[strlen("connectorId")+2+c] != ','))
|
|
|
- {
|
|
|
- sstr[c] = loc[strlen("connectorId")+2+c];
|
|
|
- //printf("i=%d sstr=%c\n",c, sstr[c]);
|
|
|
- c++;
|
|
|
- }
|
|
|
- sstr[c] = '\0';
|
|
|
- connectorIdInt = atoi(sstr);
|
|
|
- }
|
|
|
-
|
|
|
- if(connectorIdIsNULL == TRUE) // Number of the connector on which to start the transaction. connectorId SHALL be > 0
|
|
|
- {
|
|
|
- strcpy(comfirmstr, RemoteStartStopStatusStr[RemoteStartStopStatus_Rejected]);
|
|
|
- goto end;
|
|
|
- }
|
|
|
-
|
|
|
- //****************idTag*******************/
|
|
|
- c = 0;
|
|
|
- memset(sstr ,0, sizeof(sstr) );
|
|
|
- loc = strstr(sstrtemp, "idTag");
|
|
|
- while (loc[3+strlen("idTag")+c] != '\"')
|
|
|
- {
|
|
|
- sstr[c] = loc[3+strlen("idTag")+c];
|
|
|
- c++;
|
|
|
- }
|
|
|
- sstr[c] = '\0';
|
|
|
- strcpy(idTagstr,sstr);
|
|
|
-
|
|
|
- //****************chargingProfile*******************/
|
|
|
- c = 0;
|
|
|
- memset(sstr ,0, sizeof(sstr) );
|
|
|
- loc = strstr(sstrtemp, "chargingProfile");
|
|
|
- if(loc == NULL)
|
|
|
- {
|
|
|
- chargingProfileIsNULL = TRUE;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- //****************chargingProfileId*******************/
|
|
|
- c=0;
|
|
|
- loc = strstr(sstrtemp, "chargingProfileId");
|
|
|
- memset(sstr ,0, sizeof(sstr) );
|
|
|
- while ((loc[strlen("chargingProfileId")+2+c] != '}') && (loc[strlen("chargingProfileId")+2+c] != ','))
|
|
|
- {
|
|
|
- sstr[c] = loc[strlen("chargingProfileId")+2+c];
|
|
|
- //printf("i=%d sstr=%c\n",c, sstr[c]);
|
|
|
- c++;
|
|
|
- }
|
|
|
- sstr[c] = '\0';
|
|
|
- chargingProfileIdInt = atoi(sstr);
|
|
|
-
|
|
|
- //****************transactionId*******************/
|
|
|
-
|
|
|
- loc = strstr(sstrtemp, "transactionId");
|
|
|
- if(loc == NULL)
|
|
|
- {
|
|
|
- transactionIdIsNULL = TRUE;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- c=0;
|
|
|
- memset(sstr ,0, sizeof(sstr) );
|
|
|
- while ((loc[strlen("transactionId")+2+c] != '}') && (loc[strlen("transactionId")+2+c] != ','))
|
|
|
- {
|
|
|
- sstr[c] = loc[strlen("transactionId")+2+c];
|
|
|
- //printf("i=%d sstr=%c\n",c, sstr[c]);
|
|
|
- c++;
|
|
|
- }
|
|
|
- sstr[c] = '\0';
|
|
|
- transactionIdInt = atoi(sstr);
|
|
|
- }
|
|
|
-
|
|
|
- //****************stackLevel*******************/
|
|
|
- c=0;
|
|
|
- loc = strstr(sstrtemp, "stackLevel");
|
|
|
- memset(sstr ,0, sizeof(sstr) );
|
|
|
- while ((loc[strlen("stackLevel")+2+c] != '}') && (loc[strlen("stackLevel")+2+c] != ','))
|
|
|
- {
|
|
|
- sstr[c] = loc[strlen("stackLevel")+2+c];
|
|
|
- //printf("i=%d sstr=%c\n",c, sstr[c]);
|
|
|
- c++;
|
|
|
- }
|
|
|
- sstr[c] = '\0';
|
|
|
- stackLevelInt = atoi(sstr);
|
|
|
-
|
|
|
- //****************chargingProfilePurpose*******************/
|
|
|
- c = 0;
|
|
|
- memset(sstr ,0, sizeof(sstr) );
|
|
|
- loc = strstr(sstrtemp, "chargingProfilePurpose");
|
|
|
- while (loc[3+strlen("chargingProfilePurpose")+c] != '\"')
|
|
|
- {
|
|
|
- sstr[c] = loc[3+strlen("chargingProfilePurpose")+c];
|
|
|
- c++;
|
|
|
- }
|
|
|
- sstr[c] = '\0';
|
|
|
- strcpy(chargingProfilePurposestr,sstr);
|
|
|
-
|
|
|
- //****************chargingProfileKind*******************/
|
|
|
- c = 0;
|
|
|
- memset(sstr ,0, sizeof(sstr) );
|
|
|
- loc = strstr(sstrtemp, "chargingProfileKind");
|
|
|
- while (loc[3+strlen("chargingProfileKind")+c] != '\"')
|
|
|
- {
|
|
|
- sstr[c] = loc[3+strlen("chargingProfileKind")+c];
|
|
|
- c++;
|
|
|
- }
|
|
|
- sstr[c] = '\0';
|
|
|
- strcpy(chargingProfileKindstr,sstr);
|
|
|
-
|
|
|
- //****************recurrencyKind*******************/
|
|
|
- loc = strstr(sstrtemp, "recurrencyKind");
|
|
|
- if(loc == NULL)
|
|
|
- {
|
|
|
- recurrencyKindIsNULL = TRUE;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- c = 0;
|
|
|
- memset(sstr ,0, sizeof(sstr) );
|
|
|
- while (loc[3+strlen("recurrencyKind")+c] != '\"')
|
|
|
- {
|
|
|
- sstr[c] = loc[3+strlen("recurrencyKind")+c];
|
|
|
- c++;
|
|
|
- }
|
|
|
- sstr[c] = '\0';
|
|
|
- strcpy(recurrencyKindstr,sstr);
|
|
|
- }
|
|
|
-
|
|
|
- //****************validFrom*******************/
|
|
|
- loc = strstr(sstrtemp, "validFrom");
|
|
|
- if(loc == NULL)
|
|
|
- {
|
|
|
- validFromIsNULL = TRUE;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- c = 0;
|
|
|
- memset(sstr ,0, sizeof(sstr) );
|
|
|
- while (loc[3+strlen("validFrom")+c] != '\"')
|
|
|
- {
|
|
|
- sstr[c] = loc[3+strlen("validFrom")+c];
|
|
|
- c++;
|
|
|
- }
|
|
|
- sstr[c] = '\0';
|
|
|
- strcpy(validFromstr,sstr);
|
|
|
- }
|
|
|
-
|
|
|
- //****************validTo*******************/
|
|
|
- loc = strstr(sstrtemp, "validTo");
|
|
|
- if(loc == NULL)
|
|
|
- {
|
|
|
- validToIsNULL = TRUE;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- c = 0;
|
|
|
- memset(sstr ,0, sizeof(sstr) );
|
|
|
- while (loc[3+strlen("validTo")+c] != '\"')
|
|
|
- {
|
|
|
- sstr[c] = loc[3+strlen("validTo")+c];
|
|
|
- c++;
|
|
|
- }
|
|
|
- sstr[c] = '\0';
|
|
|
- strcpy(validTostr,sstr);
|
|
|
- }
|
|
|
-
|
|
|
- //****************chargingSchedule*******************/
|
|
|
- loc = strstr(sstrtemp, "chargingSchedule");
|
|
|
- if(loc != NULL)
|
|
|
- {
|
|
|
- //****************duration*******************/
|
|
|
- loc = strstr(sstrtemp, "duration");
|
|
|
-
|
|
|
- if(loc == NULL)
|
|
|
- {
|
|
|
- durationIsNULL = TRUE;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- c=0;
|
|
|
- memset(sstr ,0, sizeof(sstr) );
|
|
|
- while ((loc[strlen("duration")+2+c] != '}') && (loc[strlen("duration")+2+c] != ','))
|
|
|
- {
|
|
|
- sstr[c] = loc[strlen("duration")+2+c];
|
|
|
- //printf("i=%d sstr=%c\n",c, sstr[c]);
|
|
|
- c++;
|
|
|
- }
|
|
|
- sstr[c] = '\0';
|
|
|
- durationInt = atoi(sstr);
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- //****************startSchedule******************/
|
|
|
- loc = strstr(sstrtemp, "startSchedule");
|
|
|
- if(loc == NULL)
|
|
|
- {
|
|
|
- startScheduleIsNULL = TRUE;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- c = 0;
|
|
|
- memset(sstr ,0, sizeof(sstr) );
|
|
|
- while (loc[3+strlen("startSchedule")+c] != '\"')
|
|
|
- {
|
|
|
- sstr[c] = loc[3+strlen("startSchedule")+c];
|
|
|
- c++;
|
|
|
- }
|
|
|
- sstr[c] = '\0';
|
|
|
- strcpy(startSchedulestr,sstr);
|
|
|
- }
|
|
|
-
|
|
|
- //****************chargingRateUnit*******************/
|
|
|
- c = 0;
|
|
|
- memset(sstr ,0, sizeof(sstr) );
|
|
|
- loc = strstr(sstrtemp, "chargingRateUnit");
|
|
|
- while (loc[3+strlen("chargingRateUnit")+c] != '\"')
|
|
|
- {
|
|
|
- sstr[c] = loc[3+strlen("chargingRateUnit")+c];
|
|
|
- c++;
|
|
|
- }
|
|
|
- sstr[c] = '\0';
|
|
|
- strcpy(chargingRateUnitstr,sstr);
|
|
|
-
|
|
|
- //****************minChargingRate*******************/
|
|
|
- loc = strstr(sstrtemp, "minChargingRate");
|
|
|
- if(loc == NULL)
|
|
|
- {
|
|
|
- minChargingRateIsNULL = TRUE;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- c=0;
|
|
|
- memset(sstr ,0, sizeof(sstr) );
|
|
|
- while ((loc[strlen("minChargingRate")+2+c] != '}') && (loc[strlen("minChargingRate")+2+c] != ','))
|
|
|
- {
|
|
|
- sstr[c] = loc[strlen("minChargingRate")+2+c];
|
|
|
- //printf("i=%d sstr=%c\n",c, sstr[c]);
|
|
|
- c++;
|
|
|
- }
|
|
|
- sstr[c] = '\0';
|
|
|
- minChargingRateflaot = atof(sstr);
|
|
|
- }
|
|
|
-
|
|
|
- //****************chargingSchedulePeriod count*******************/
|
|
|
- int what_len = strlen("startPeriod");
|
|
|
-
|
|
|
- char *where = sstrtemp;
|
|
|
-
|
|
|
-
|
|
|
- while ((where = strstr(where, "startPeriod"))) {
|
|
|
- where += what_len;
|
|
|
- chargingSchedulePeriodCount++;
|
|
|
- }
|
|
|
-
|
|
|
- where = sstrtemp;
|
|
|
-
|
|
|
- for(int periodNums=0; periodNums < chargingSchedulePeriodCount; periodNums++)
|
|
|
- {
|
|
|
- //****************startPeriod*******************/
|
|
|
- c=0;
|
|
|
- loc = strstr(where, "startPeriod");
|
|
|
- memset(sstr ,0, sizeof(sstr) );
|
|
|
- while ((loc[strlen("startPeriod")+2+c] != '}') && (loc[strlen("startPeriod")+2+c] != ','))
|
|
|
- {
|
|
|
- sstr[c] = loc[strlen("startPeriod")+2+c];
|
|
|
- //printf("i=%d sstr=%c\n",c, sstr[c]);
|
|
|
- c++;
|
|
|
- }
|
|
|
- sstr[c] = '\0';
|
|
|
- startPeriodInt[periodNums] = atoi(sstr);
|
|
|
-
|
|
|
- //****************limit*******************/
|
|
|
- c=0;
|
|
|
- loc = strstr(where, "limit");
|
|
|
- memset(sstr ,0, sizeof(sstr) );
|
|
|
- while ((loc[strlen("limit")+2+c] != '}') && (loc[strlen("limit")+2+c] != ','))
|
|
|
- {
|
|
|
- sstr[c] = loc[strlen("limit")+2+c];
|
|
|
- //printf("i=%d sstr=%c\n",c, sstr[c]);
|
|
|
- c++;
|
|
|
- }
|
|
|
- sstr[c] = '\0';
|
|
|
- limitflaot[periodNums] = atof(sstr);
|
|
|
-
|
|
|
- //****************numberPhases*******************/
|
|
|
- loc = strstr(where, "numberPhases");
|
|
|
- if(loc == NULL)
|
|
|
- {
|
|
|
- numberPhasesIsNULL = TRUE;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- c=0;
|
|
|
- memset(sstr ,0, sizeof(sstr) );
|
|
|
- while ((loc[strlen("numberPhases")+2+c] != '}') && (loc[strlen("numberPhases")+2+c] != ','))
|
|
|
- {
|
|
|
- sstr[c] = loc[strlen("numberPhases")+2+c];
|
|
|
- //printf("i=%d sstr=%c\n",c, sstr[c]);
|
|
|
- c++;
|
|
|
- }
|
|
|
- sstr[c] = '\0';
|
|
|
- numberPhasesInt[periodNums] = atoi(sstr);
|
|
|
- }
|
|
|
-
|
|
|
- where = loc;
|
|
|
-
|
|
|
- } // END FOR chargingSchedulePeriodCount
|
|
|
- }// END IF chargingSchedule
|
|
|
-
|
|
|
- } // END chargingProfile
|
|
|
-
|
|
|
- /*
|
|
|
-
|
|
|
- enum _SYSTEM_STATUS
|
|
|
- {
|
|
|
- S_BOOTING = 0,
|
|
|
- S_IDLE, = 1
|
|
|
- S_AUTHORIZING, =2
|
|
|
- S_REASSIGN_CHECK, =3
|
|
|
- S_REASSIGN, =4
|
|
|
- S_PRECHARGE, =5
|
|
|
- S_PREPARING_FOR_EV, =6
|
|
|
- S_PREPARING_FOR_EVSE, =7
|
|
|
- S_CHARGING, =8
|
|
|
- S_TERMINATING, =9
|
|
|
- S_COMPLETE, =10
|
|
|
- S_ALARM, =11
|
|
|
- S_FAULT =12
|
|
|
- }
|
|
|
- */
|
|
|
- if((connectorIdIsNULL == FALSE)&&(connectorIdInt > 0) && ((connectorIdInt -1) <= gunTotalNumber/*(CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY)*/))
|
|
|
- {
|
|
|
- sprintf((char *)ShmOCPP16Data->RemoteStartTransaction[connectorIdInt -1].IdTag, "%s" , idTagstr);
|
|
|
- ShmOCPP16Data->RemoteStartTransaction[connectorIdInt -1].ChargingProfile.TransactionId = transactionIdInt;
|
|
|
- //0: Booting, 1: idle, 2: authorizing, 3: preparing, 4: charging, 5: terminating, 6: alarm, 7: fault 8: Reserved
|
|
|
-
|
|
|
- //check Transaction active
|
|
|
- if(gunType[connectorIdInt -1] == 'J')
|
|
|
- {
|
|
|
-
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
- {
|
|
|
- tempIndex = ((connectorIdInt -1) == 2) ? 1: 0;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tempIndex = connectorIdInt -1;
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < CHAdeMO_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex )
|
|
|
- {
|
|
|
-
|
|
|
- if((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].ReservationId != -1)&&(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].ReservationId >= 0)&&(strcmp((const char *)ShmOCPP16Data->ReserveNow[index].IdTag, idTagstr) == 0))
|
|
|
- {
|
|
|
- //Reserved
|
|
|
- DEBUG_INFO("Reserved now !!!The idTag matches the idTag of Reservation!!!\n");
|
|
|
- }
|
|
|
- else if((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].ReservationId != -1)&&(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].ReservationId >= 0)&&(strcmp((const char *)ShmOCPP16Data->ReserveNow[index].IdTag, idTagstr) != 0))
|
|
|
- {
|
|
|
- //Reserved
|
|
|
- DEBUG_INFO("Reserved now !!! The idTag does NOT match the idTag of Reservation!!! Reject it!!!\n");
|
|
|
- strcpy(comfirmstr, RemoteStartStopStatusStr[RemoteStartStopStatus_Rejected]);
|
|
|
- goto end;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- if((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus != SYS_MODE_IDLE) //S_IDLE
|
|
|
- && (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus != SYS_MODE_PREPARING ) //S_PRECHARGE
|
|
|
- && (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus != SYS_MODE_PREPARE_FOR_EV ) //S_PREPARING_FOR_EV
|
|
|
- && (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus != SYS_MODE_PREPARE_FOR_EVSE )) // S_PREPARING_FOR_EVSE
|
|
|
- {
|
|
|
- strcpy(comfirmstr, RemoteStartStopStatusStr[RemoteStartStopStatus_Rejected]);
|
|
|
- goto end;
|
|
|
- }
|
|
|
- }//END FOR ELSE
|
|
|
- }
|
|
|
- }// END FOR CHAdeMO_QUANTITY
|
|
|
-
|
|
|
- }
|
|
|
- else if((gunType[connectorIdInt -1] == 'U')||(gunType[connectorIdInt -1] == 'E'))
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
- {
|
|
|
- tempIndex = ((connectorIdInt -1) == 2) ? 1: 0;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tempIndex = connectorIdInt -1;
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < CCS_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
|
|
|
- {
|
|
|
- if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].ReservationId != -1)&&(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].ReservationId >= 0)&&(strcmp((const char *)ShmOCPP16Data->ReserveNow[index].IdTag, idTagstr) == 0))
|
|
|
- {
|
|
|
- //Reserved
|
|
|
- DEBUG_INFO("Reserved now !!!The idTag matches the idTag of Reservation!!!\n");
|
|
|
- }
|
|
|
- else if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].ReservationId != -1)&&(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].ReservationId >= 0)&&(strcmp((const char *)ShmOCPP16Data->ReserveNow[index].IdTag, idTagstr) != 0))
|
|
|
- {
|
|
|
- //Reserved
|
|
|
- DEBUG_INFO("Reserved now !!! The idTag does NOT match the idTag of Reservation!!! Reject it!!!\n");
|
|
|
- strcpy(comfirmstr, RemoteStartStopStatusStr[RemoteStartStopStatus_Rejected]);
|
|
|
- goto end;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus != SYS_MODE_IDLE) //S_IDLE
|
|
|
- && (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus != SYS_MODE_PREPARING) //S_PRECHARGE
|
|
|
- && (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus != SYS_MODE_PREPARE_FOR_EV) //S_PREPARING_FOR_EV
|
|
|
- && (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus != SYS_MODE_PREPARE_FOR_EVSE)) // S_PREPARING_FOR_EVSE
|
|
|
- {
|
|
|
- strcpy(comfirmstr, RemoteStartStopStatusStr[RemoteStartStopStatus_Rejected]);
|
|
|
- goto end;
|
|
|
- }
|
|
|
-
|
|
|
- }// END FOR ELSE
|
|
|
- }
|
|
|
- }// END FOR CCS_QUANTITY
|
|
|
- }
|
|
|
- else if(gunType[connectorIdInt -1] == 'G')
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
- {
|
|
|
- tempIndex = ((connectorIdInt -1) == 2) ? 1: 0;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tempIndex = connectorIdInt -1;
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < GB_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex )
|
|
|
- {
|
|
|
- if((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].ReservationId != -1)&&(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].ReservationId >= 0)&&(strcmp((const char *)ShmOCPP16Data->ReserveNow[index].IdTag, idTagstr) == 0))
|
|
|
- {
|
|
|
- //Reserved
|
|
|
- DEBUG_INFO("Reserved now !!!The idTag matches the idTag of Reservation!!!\n");
|
|
|
- }
|
|
|
- else if((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].ReservationId != -1)&&(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].ReservationId >= 0)&&(strcmp((const char *)ShmOCPP16Data->ReserveNow[index].IdTag, idTagstr) != 0))
|
|
|
- {
|
|
|
- //Reserved
|
|
|
- DEBUG_INFO("Reserved now !!! The idTag does NOT match the idTag of Reservation!!! Reject it!!!\n");
|
|
|
- strcpy(comfirmstr, RemoteStartStopStatusStr[RemoteStartStopStatus_Rejected]);
|
|
|
- goto end;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- if((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus != SYS_MODE_IDLE) //S_IDLE
|
|
|
- && (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus != SYS_MODE_PREPARING) //S_PRECHARGE
|
|
|
- && (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus != SYS_MODE_PREPARE_FOR_EV) //S_PREPARING_FOR_EV
|
|
|
- && (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus != SYS_MODE_PREPARE_FOR_EVSE)) // S_PREPARING_FOR_EVSE
|
|
|
- {
|
|
|
- strcpy(comfirmstr, RemoteStartStopStatusStr[RemoteStartStopStatus_Rejected]);
|
|
|
- goto end;
|
|
|
- }
|
|
|
-
|
|
|
- }// END FOR ELSE
|
|
|
- }
|
|
|
- } // END FOR GB_QUANTITY
|
|
|
-
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D') // 'D' means DC
|
|
|
- {
|
|
|
- tempIndex = 2;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tempIndex = connectorIdInt -1;
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < AC_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex )
|
|
|
- {
|
|
|
-
|
|
|
- if((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].ReservationId != -1)&&(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].ReservationId >= 0)&&(strcmp((const char *)ShmOCPP16Data->ReserveNow[index].IdTag, idTagstr) == 0))
|
|
|
- {
|
|
|
- //Reserved
|
|
|
- DEBUG_INFO("Reserved now !!!The idTag matches the idTag of Reservation!!!\n");
|
|
|
- }
|
|
|
- else if((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].ReservationId != -1)&&(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].ReservationId >= 0)&&(strcmp((const char *)ShmOCPP16Data->ReserveNow[index].IdTag, idTagstr) != 0))
|
|
|
- {
|
|
|
- //Reserved
|
|
|
- DEBUG_INFO("Reserved now !!! The idTag does NOT match the idTag of Reservation!!! Reject it!!!\n");
|
|
|
- strcpy(comfirmstr, RemoteStartStopStatusStr[RemoteStartStopStatus_Rejected]);
|
|
|
- goto end;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- if((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus != SYS_MODE_IDLE) //S_IDLE
|
|
|
- && (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus != SYS_MODE_PREPARING) //S_PRECHARGE
|
|
|
- && (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus != SYS_MODE_PREPARE_FOR_EV) //S_PREPARING_FOR_EV
|
|
|
- && (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus != SYS_MODE_PREPARE_FOR_EVSE)) // S_PREPARING_FOR_EVSE
|
|
|
- {
|
|
|
- strcpy(comfirmstr, RemoteStartStopStatusStr[RemoteStartStopStatus_Rejected]);
|
|
|
- goto end;
|
|
|
- }
|
|
|
-
|
|
|
- }//END FOR ELSE
|
|
|
- }
|
|
|
- }// END FOR AC_QUANTITY
|
|
|
- }
|
|
|
-
|
|
|
- if(chargingProfileIsNULL == FALSE)
|
|
|
- {
|
|
|
- //ChargingProfile
|
|
|
- ShmOCPP16Data->RemoteStartTransaction[connectorIdInt -1].ChargingProfile.ChargingProfileId = chargingProfileIdInt;
|
|
|
- sprintf((char *)ShmOCPP16Data->RemoteStartTransaction[connectorIdInt -1].ChargingProfile.ChargingProfileKind, "%s" ,chargingProfileKindstr);
|
|
|
- sprintf((char *)ShmOCPP16Data->RemoteStartTransaction[connectorIdInt -1].ChargingProfile.ChargingProfilePurpose, "%s" ,chargingProfilePurposestr);
|
|
|
-
|
|
|
- if(recurrencyKindIsNULL == FALSE) //OPTION
|
|
|
- sprintf((char *)ShmOCPP16Data->RemoteStartTransaction[connectorIdInt -1].ChargingProfile.RecurrencyKind, "%s" ,recurrencyKindstr);
|
|
|
-
|
|
|
- ShmOCPP16Data->RemoteStartTransaction[connectorIdInt -1].ChargingProfile.StackLevel = stackLevelInt;
|
|
|
-
|
|
|
- if(transactionIdIsNULL == FALSE) // OPTION
|
|
|
- ShmOCPP16Data->RemoteStartTransaction[connectorIdInt -1].ChargingProfile.TransactionId = transactionIdInt;
|
|
|
-
|
|
|
- if(validFromIsNULL == FALSE) // OPTION
|
|
|
- sprintf((char *)ShmOCPP16Data->RemoteStartTransaction[connectorIdInt -1].ChargingProfile.ValidFrom, "%s" ,validFromstr);
|
|
|
-
|
|
|
- if(validToIsNULL == FALSE) //OPTION
|
|
|
- sprintf((char *)ShmOCPP16Data->RemoteStartTransaction[connectorIdInt -1].ChargingProfile.ValidTo, "%s" ,validTostr);
|
|
|
-
|
|
|
- //ChargingSchedule
|
|
|
- sprintf((char *)ShmOCPP16Data->RemoteStartTransaction[connectorIdInt -1].ChargingProfile.ChargingSchedule.ChargingRateUnit, "%s" ,chargingRateUnitstr);
|
|
|
-
|
|
|
- if(durationIsNULL == FALSE) //OPTION
|
|
|
- ShmOCPP16Data->RemoteStartTransaction[connectorIdInt -1].ChargingProfile.ChargingSchedule.Duration = durationInt;
|
|
|
-
|
|
|
- if(minChargingRateIsNULL == FALSE) //OPTION
|
|
|
- ShmOCPP16Data->RemoteStartTransaction[connectorIdInt -1].ChargingProfile.ChargingSchedule.MinChargingRate = minChargingRateflaot;
|
|
|
-
|
|
|
- if(startScheduleIsNULL == FALSE) //OPTION
|
|
|
- sprintf((char *)ShmOCPP16Data->RemoteStartTransaction[connectorIdInt -1].ChargingProfile.ChargingSchedule.StartSchedule, "%s" ,startSchedulestr);
|
|
|
-
|
|
|
-
|
|
|
- for(int periodNums=0; periodNums < chargingSchedulePeriodCount; periodNums++)
|
|
|
- {
|
|
|
- //ChargingSchedulePeriod
|
|
|
- ShmOCPP16Data->RemoteStartTransaction[connectorIdInt -1].ChargingProfile.ChargingSchedule.ChargingSchedulePeriod[periodNums].Limit = limitflaot[periodNums] ;
|
|
|
-
|
|
|
- if(numberPhasesIsNULL == FALSE)
|
|
|
- {
|
|
|
- ShmOCPP16Data->RemoteStartTransaction[connectorIdInt -1].ChargingProfile.ChargingSchedule.ChargingSchedulePeriod[periodNums].NumberPhases = numberPhasesInt[periodNums];
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- ShmOCPP16Data->RemoteStartTransaction[connectorIdInt -1].ChargingProfile.ChargingSchedule.ChargingSchedulePeriod[periodNums].StartPeriod = startPeriodInt[periodNums];
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- if(strcmp(chargingProfilePurposestr, ChargingProfilePurposeTypeStr[TxProfile]) == 0)
|
|
|
- {
|
|
|
- ShmOCPP16Data->CsMsg.bits[connectorIdInt -1].RemoteStartTransactionReq = 1;
|
|
|
- strcpy(comfirmstr, RemoteStartStopStatusStr[RemoteStartStopStatus_Accepted]);
|
|
|
-
|
|
|
-
|
|
|
- //memset idTag
|
|
|
- memset((char *)ShmOCPP16Data->StartTransaction[connectorIdInt -1].IdTag,0, 20);
|
|
|
- strcpy((char *)ShmOCPP16Data->StartTransaction[connectorIdInt -1].IdTag, idTagstr);
|
|
|
-
|
|
|
-
|
|
|
- memset((char *)ShmOCPP16Data->StopTransaction[connectorIdInt -1].IdTag,0, 20);
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[connectorIdInt -1].IdTag, idTagstr);
|
|
|
-
|
|
|
-
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- strcpy(comfirmstr, RemoteStartStopStatusStr[RemoteStartStopStatus_Rejected]);
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- ShmOCPP16Data->CsMsg.bits[connectorIdInt -1].RemoteStartTransactionReq = 1;
|
|
|
- strcpy(comfirmstr, RemoteStartStopStatusStr[RemoteStartStopStatus_Accepted]);
|
|
|
-
|
|
|
-
|
|
|
- //memset idTag
|
|
|
- memset((char *)ShmOCPP16Data->StartTransaction[connectorIdInt -1].IdTag,0, 20);
|
|
|
- strcpy((char *)ShmOCPP16Data->StartTransaction[connectorIdInt -1].IdTag, idTagstr);
|
|
|
-
|
|
|
- memset((char *)ShmOCPP16Data->StopTransaction[connectorIdInt -1].IdTag,0, 20);
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[connectorIdInt -1].IdTag, idTagstr);
|
|
|
-
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- strcpy(comfirmstr, RemoteStartStopStatusStr[RemoteStartStopStatus_Rejected]);
|
|
|
- //sprintf((char *)ShmOCPP16Data->RemoteStartTransaction[connectorIdInt -1].ResponseStatus, "%s" ,comfirmstr);
|
|
|
- }
|
|
|
-
|
|
|
-end:
|
|
|
- if(connectorIdIsNULL == FALSE)
|
|
|
- ShmOCPP16Data->RemoteStartTransaction[connectorIdInt -1].ConnectorId = connectorIdInt;
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->RemoteStartTransaction[connectorIdInt -1].IdTag, idTagstr);
|
|
|
- sprintf((char *)ShmOCPP16Data->RemoteStartTransaction[connectorIdInt -1].ResponseStatus, "%s" ,comfirmstr);
|
|
|
-
|
|
|
- //OCPP send RemoteStartConfirmation by first.
|
|
|
- sendRemoteStartConfirmation(uuid, comfirmstr);
|
|
|
-
|
|
|
- return result;
|
|
|
-}
|
|
|
-
|
|
|
-int handleRemoteStopTransactionRequest(char *uuid, char *payload)
|
|
|
-{
|
|
|
- mtrace();
|
|
|
- int result = FAIL;
|
|
|
- int match = FALSE;
|
|
|
- int GunNO = 0;
|
|
|
- int tempIndex = 0;
|
|
|
- int transactionIdInt=0;
|
|
|
- int transactionIdIsNULL= FALSE;
|
|
|
- char sstr[16]={ 0 },sstrtemp[50]={ 0 };//sstr[200]={ 0 };
|
|
|
- int c = 0;
|
|
|
- char *loc;
|
|
|
- char comfirmstr[20];
|
|
|
-
|
|
|
-//[2,"ff522854-0dea-436e-87ba-23a229269994","RemoteStopTransaction",{"transactionId":1373618380}]
|
|
|
- DEBUG_INFO("handleRemoteStopTransactionRequest...\n");
|
|
|
-
|
|
|
- if(server_pending == TRUE)
|
|
|
- {
|
|
|
- return 0;
|
|
|
- }
|
|
|
-
|
|
|
- strcpy(sstrtemp, stringtrimspace(payload));
|
|
|
-
|
|
|
- c=0;
|
|
|
- loc = strstr(sstrtemp, "transactionId");
|
|
|
-
|
|
|
- if(loc == NULL)
|
|
|
- {
|
|
|
- transactionIdIsNULL= TRUE;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- memset(sstr ,0, sizeof(sstr) );
|
|
|
- while ((loc[strlen("transactionId")+2+c] != '}') && (loc[strlen("transactionId")+2+c] != ','))
|
|
|
- {
|
|
|
- sstr[c] = loc[strlen("transactionId")+2+c];
|
|
|
- //printf("i=%d sstr=%c\n",c, sstr[c]);
|
|
|
- c++;
|
|
|
- }
|
|
|
- sstr[c] = '\0';
|
|
|
- transactionIdInt = atoi(sstr);
|
|
|
- }
|
|
|
-
|
|
|
- if(transactionIdIsNULL == FALSE)
|
|
|
- {
|
|
|
-
|
|
|
- for(int gun_index=0;gun_index < gunTotalNumber;gun_index++)
|
|
|
- {
|
|
|
- if(ShmOCPP16Data->StartTransaction[gun_index].ResponseTransactionId == transactionIdInt)
|
|
|
- {
|
|
|
- //check Transaction active
|
|
|
- if(gunType[gun_index] == 'J')
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
- {
|
|
|
- tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tempIndex = gun_index;
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < CHAdeMO_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
|
|
|
- {
|
|
|
- if((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_CHARGING) || (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_TERMINATING)) // SYS_MODE_CHARGING, SYS_MODE_TERMINATING
|
|
|
- {
|
|
|
- match = TRUE;
|
|
|
- GunNO = gun_index;
|
|
|
- }
|
|
|
- }
|
|
|
- }// END FOR CHAdeMO_QUANTITY
|
|
|
-
|
|
|
- }
|
|
|
- else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
- {
|
|
|
- tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tempIndex = gun_index;
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < CCS_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
|
|
|
- {
|
|
|
- if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_CHARGING) || (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_TERMINATING) ) // SYS_MODE_CHARGING, SYS_MODE_TERMINATING
|
|
|
- {
|
|
|
- match = TRUE;
|
|
|
- GunNO = gun_index;
|
|
|
- }
|
|
|
- }
|
|
|
- }// END FOR CCS_QUANTITY
|
|
|
- }
|
|
|
- else if(gunType[gun_index] == 'G')
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
- {
|
|
|
- tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tempIndex = gun_index;
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < GB_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
|
|
|
- {
|
|
|
- if((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_CHARGING) || (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_TERMINATING)) // SYS_MODE_CHARGING, SYS_MODE_TERMINATING
|
|
|
- {
|
|
|
- match = TRUE;
|
|
|
- GunNO = gun_index;
|
|
|
- }
|
|
|
- }
|
|
|
- }// END FOR GB_QUANTITY
|
|
|
-
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D') // 'D' means DC
|
|
|
- {
|
|
|
- tempIndex = 2;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tempIndex = gun_index;
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < AC_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
|
|
|
- {
|
|
|
- if((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_CHARGING) || (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_TERMINATING)) // SYS_MODE_CHARGING, SYS_MODE_TERMINATING
|
|
|
- {
|
|
|
- match = TRUE;
|
|
|
- GunNO = gun_index;
|
|
|
- }
|
|
|
- }
|
|
|
- }// END FOR CHAdeMO_QUANTITY
|
|
|
-
|
|
|
- } // END FOR AC ELSE
|
|
|
-
|
|
|
- }// CHECK IF ResponseTransactionId == transactionIdInt
|
|
|
-
|
|
|
- }//END FOR
|
|
|
-
|
|
|
- if( match == TRUE)
|
|
|
- {
|
|
|
- ShmOCPP16Data->CsMsg.bits[GunNO].RemoteStopTransactionReq = 1; // inform csu of StopTransaction
|
|
|
- strcpy(comfirmstr, RemoteStartStopStatusStr[RemoteStartStopStatus_Accepted]);
|
|
|
- sprintf((char *)ShmOCPP16Data->RemoteStopTransaction[GunNO].ResponseStatus, "%s" ,comfirmstr);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- strcpy(comfirmstr, RemoteStartStopStatusStr[RemoteStartStopStatus_Rejected]);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- sendRemoteStopTransactionConfirmation(uuid, comfirmstr);
|
|
|
- return result;
|
|
|
-}
|
|
|
-
|
|
|
-int handleReserveNowTransactionRequest(char *uuid, char *payload)
|
|
|
-{
|
|
|
- mtrace();
|
|
|
- int result = FAIL;
|
|
|
- int connectorIdInt=0, reservationIdInt=0;
|
|
|
- int tempIndex = 0;
|
|
|
- char expiryDatestr[30]={0}, idTagstr[20]={0},parentIdTagstr[20]={0};
|
|
|
- char comfirmstr[20]={0};
|
|
|
- char sstr[180]={ 0 },sstrtemp[200]={ 0 };
|
|
|
- int c = 0;
|
|
|
- char *loc;
|
|
|
- //char *ptr;
|
|
|
-
|
|
|
- DEBUG_INFO("handleReserveNowTransactionRequest ...\n");
|
|
|
-
|
|
|
- strcpy(sstrtemp, stringtrimspace(payload));
|
|
|
- //***(1)connectorId ****/
|
|
|
- c=0;
|
|
|
- loc = strstr(sstrtemp, "connectorId");
|
|
|
- memset(sstr ,0, sizeof(sstr) );
|
|
|
- while ((loc != NULL) &&(loc[strlen("connectorId")+2+c] != ',') && (loc[strlen("connectorId")+2+c] != '}'))
|
|
|
- {
|
|
|
- sstr[c] = loc[strlen("connectorId")+2+c];
|
|
|
- //printf("i=%d sstr=%c\n",c, sstr[c]);
|
|
|
- c++;
|
|
|
- }
|
|
|
- sstr[c] = '\0';
|
|
|
- connectorIdInt = atoi(sstr);
|
|
|
-
|
|
|
- //***(2)expiryDate ****/
|
|
|
- loc = strstr(sstrtemp, "expiryDate");
|
|
|
- memset(sstr ,0, sizeof(sstr) );
|
|
|
- c = 0;
|
|
|
- while ((loc != NULL) &&(loc[3+strlen("expiryDate")+c] != '\"'))
|
|
|
- {
|
|
|
- sstr[c] = loc[3+strlen("expiryDate")+c];
|
|
|
- c++;
|
|
|
- }
|
|
|
- sstr[c] = '\0';
|
|
|
- strcpy(expiryDatestr, sstr);
|
|
|
-
|
|
|
- //***(3)idTag ****/
|
|
|
- loc = strstr(sstrtemp, "idTag");
|
|
|
- memset(sstr ,0, sizeof(sstr) );
|
|
|
- c = 0;
|
|
|
- while ((loc != NULL) &&(loc[3+strlen("idTag")+c] != '\"'))
|
|
|
- {
|
|
|
- sstr[c] = loc[3+strlen("idTag")+c];
|
|
|
- c++;
|
|
|
- }
|
|
|
- sstr[c] = '\0';
|
|
|
- strcpy(idTagstr, sstr);
|
|
|
-
|
|
|
- //***(4)parentIdTag ****/
|
|
|
- loc = strstr(sstrtemp, "parentIdTag");
|
|
|
- memset(sstr ,0, sizeof(sstr) );
|
|
|
- c = 0;
|
|
|
-
|
|
|
- if(loc == NULL)
|
|
|
- {
|
|
|
- strcpy(parentIdTagstr, "");
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- while ((loc != NULL) &&(loc[3+strlen("parentIdTag")+c] != '\"'))
|
|
|
- {
|
|
|
- sstr[c] = loc[3+strlen("parentIdTag")+c];
|
|
|
- c++;
|
|
|
- }
|
|
|
- sstr[c] = '\0';
|
|
|
- strcpy(parentIdTagstr, sstr);
|
|
|
- }
|
|
|
-
|
|
|
- //***(5)reservationId ****/
|
|
|
- c=0;
|
|
|
- loc = strstr(sstrtemp, "reservationId");
|
|
|
- memset(sstr ,0, sizeof(sstr) );
|
|
|
- while ((loc != NULL) &&((loc[strlen("reservationId")+2+c] != '}') && (loc[strlen("reservationId")+2+c] != ',')))
|
|
|
- {
|
|
|
- sstr[c] = loc[strlen("reservationId")+2+c];
|
|
|
- //printf("i=%d sstr=%c\n",c, sstr[c]);
|
|
|
- c++;
|
|
|
- }
|
|
|
- sstr[c] = '\0';
|
|
|
- reservationIdInt = atoi(sstr);
|
|
|
-
|
|
|
- strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Rejected]);
|
|
|
-
|
|
|
- /*
|
|
|
- enum SYSTEM_STATUS
|
|
|
- {
|
|
|
- SYS_MODE_BOOTING = 0,
|
|
|
- SYS_MODE_IDLE = 1,
|
|
|
- SYS_MODE_AUTHORIZING = 2,
|
|
|
- SYS_MODE_MODE_REASSIGN_CHECK = 3,
|
|
|
- SYS_MODE_REASSIGN = 4,
|
|
|
- SYS_MODE_PREPARING = 5,
|
|
|
- SYS_MODE_PREPARE_FOR_EV = 6,
|
|
|
- SYS_MODE_PREPARE_FOR_EVSE = 7,
|
|
|
- SYS_MODE_CHARGING = 8,
|
|
|
- SYS_MODE_TERMINATING = 9,
|
|
|
- SYS_MODE_COMPLETE = 10,
|
|
|
- SYS_MODE_ALARM = 11,
|
|
|
- SYS_MODE_FAULT = 12,
|
|
|
- SYS_MODE_RESERVATION = 13,
|
|
|
- SYS_MODE_BOOKING = 14,
|
|
|
- SYS_MODE_MAINTAIN = 15,
|
|
|
- SYS_MODE_DEBUG = 16,
|
|
|
- SYS_MODE_CCS_PRECHARGE_STEP0 = 17,
|
|
|
- SYS_MODE_CCS_PRECHARGE_STEP1 = 18,
|
|
|
- SYS_MODE_UPDATE = 19
|
|
|
- };
|
|
|
- */
|
|
|
- if((connectorIdInt == 0) &&(strcmp((const char *)ShmOCPP16Data->ConfigurationTable.ReservationProfile[ReserveConnectorZeroSupported].ItemData, "FALSE") == 0)) //For OCTT Test case
|
|
|
- {
|
|
|
- strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Rejected]);
|
|
|
- goto end;
|
|
|
- }
|
|
|
-
|
|
|
- if((connectorIdInt > 0) && ((connectorIdInt -1) <= gunTotalNumber))
|
|
|
- {
|
|
|
- //check Transaction active
|
|
|
- if(gunType[connectorIdInt -1] == 'J')
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
- {
|
|
|
- tempIndex = (((connectorIdInt -1)==2) ? 1: 0);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tempIndex = connectorIdInt -1;
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < CHAdeMO_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
|
|
|
- {
|
|
|
- if(reservationIdInt != ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].ReservationId)
|
|
|
- {
|
|
|
- if((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus != SYS_MODE_FAULT)&&(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus != SYS_MODE_ALARM)) //S_FAULT
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_IDLE) //S_IDLE
|
|
|
- {
|
|
|
- ShmOCPP16Data->CsMsg.bits[connectorIdInt-1].ReserveNowReq = 1;
|
|
|
- strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Accepted]);
|
|
|
- }
|
|
|
- else if((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_MAINTAIN)||(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_DEBUG) || (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_UPDATE)) //S_TERMINATING //else if((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == 11) || (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == '9'))
|
|
|
- {
|
|
|
- strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Unavailable]);
|
|
|
-
|
|
|
- }
|
|
|
- else if((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_PREPARING) || (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_RESERVATION) ) //S_PRECHARGE
|
|
|
- {
|
|
|
- strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Occupied]);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Rejected]);
|
|
|
- }
|
|
|
- }
|
|
|
- else if((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_FAULT) || (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_ALARM) || (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_TERMINATING)) // SYS_MODE_FAULT, SYS_MODE_ALARM, SYS_MODE_TERMINATING ---> SuspendedEV
|
|
|
- {
|
|
|
- strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Faulted]);
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- //replace reservation
|
|
|
- ShmOCPP16Data->CsMsg.bits[connectorIdInt-1].ReserveNowReq = 1;
|
|
|
- strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Accepted]);
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
- } // END FOR CHAdeMO_QUANTITY
|
|
|
-
|
|
|
- }
|
|
|
- else if((gunType[connectorIdInt -1] == 'U')||(gunType[connectorIdInt -1] == 'E'))
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
- {
|
|
|
- tempIndex = (((connectorIdInt -1)==2) ? 1: 0);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tempIndex = connectorIdInt -1;
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < CCS_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
|
|
|
- {
|
|
|
-
|
|
|
- if(reservationIdInt != ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].ReservationId)
|
|
|
- {
|
|
|
- //SystemStatus: 0: Booting, 1: idle, 2: authorizing, 3: preparing, 4: charging, 5: terminating, 6: alarm, 7: fault, 8: Reserved, 9: maintain
|
|
|
- if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus != SYS_MODE_FAULT)&&(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus != SYS_MODE_ALARM)) //S_FAULT
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_IDLE) //S_IDLE
|
|
|
- {
|
|
|
- ShmOCPP16Data->CsMsg.bits[connectorIdInt-1].ReserveNowReq = 1;
|
|
|
- strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Accepted]);
|
|
|
- }
|
|
|
- else if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_MAINTAIN) ||(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_DEBUG) || (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_UPDATE)) //S_TERMINATING //else if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == '6') || (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == '9'))
|
|
|
- {
|
|
|
- strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Unavailable]);
|
|
|
- }
|
|
|
- else if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_PREPARING) || (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_RESERVATION)) //S_PRECHARGE
|
|
|
- {
|
|
|
- strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Occupied]);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Rejected]);
|
|
|
- }
|
|
|
- }
|
|
|
- else if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus ==SYS_MODE_FAULT) || (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus ==SYS_MODE_ALARM) ||(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_TERMINATING)) //SYS_MODE_FAUL, SYS_MODE_TERMINATING ---> SuspendedEV
|
|
|
- {
|
|
|
- strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Faulted]);
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- //replace reservation
|
|
|
- ShmOCPP16Data->CsMsg.bits[connectorIdInt-1].ReserveNowReq = 1;
|
|
|
- strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Accepted]);
|
|
|
- }
|
|
|
- }
|
|
|
- } // END FOR CCS_QUANTITY
|
|
|
-
|
|
|
- }
|
|
|
- else if(gunType[connectorIdInt -1] == 'G')
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
- {
|
|
|
- tempIndex = (((connectorIdInt -1)==2) ? 1: 0);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tempIndex = connectorIdInt -1;
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < GB_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
|
|
|
- {
|
|
|
-
|
|
|
- if(reservationIdInt != ShmSysConfigAndInfo->SysInfo.GbChargingData[index].ReservationId)
|
|
|
- {
|
|
|
- //SystemStatus: 0: Booting, 1: idle, 2: authorizing, 3: preparing, 4: charging, 5: terminating, 6: alarm, 7: fault, 8: Reserved, 9: maintain
|
|
|
- if((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus != SYS_MODE_FAULT)&&(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus != SYS_MODE_ALARM)) //SYS_MODE_FAULT, SYS_MODE_ALARM
|
|
|
- {
|
|
|
-
|
|
|
- if(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_IDLE) //S_IDLE
|
|
|
- {
|
|
|
- ShmOCPP16Data->CsMsg.bits[connectorIdInt-1].ReserveNowReq = 1;
|
|
|
- strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Accepted]);
|
|
|
- }
|
|
|
- else if((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_MAINTAIN) || (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_DEBUG) || (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_UPDATE)) //S_TERMINATING //else if((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == '6') || (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == '9'))
|
|
|
- {
|
|
|
- strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Unavailable]);
|
|
|
- }
|
|
|
- else if((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_PREPARING) || (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_RESERVATION) ) //S_PRECHARGE
|
|
|
- {
|
|
|
- strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Occupied]);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Rejected]);
|
|
|
- }
|
|
|
- }
|
|
|
- else if((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus ==SYS_MODE_FAULT) || (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus ==SYS_MODE_ALARM) || (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus ==SYS_MODE_TERMINATING)) //SYS_MODE_FAULT, SYS_MODE_ALARM ,SYS_MODE_TERMINATING ---> SuspendedEV
|
|
|
- {
|
|
|
- strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Faulted]);
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- //replace reservation
|
|
|
- ShmOCPP16Data->CsMsg.bits[connectorIdInt-1].ReserveNowReq = 1;
|
|
|
- strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Accepted]);
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
- }// END FOR GB_QUANTITY
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D') // 'D' means DC
|
|
|
- {
|
|
|
- tempIndex = 2;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tempIndex = (connectorIdInt -1);
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < AC_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
|
|
|
- {
|
|
|
-
|
|
|
- if(reservationIdInt != ShmSysConfigAndInfo->SysInfo.AcChargingData[index].ReservationId)
|
|
|
- {
|
|
|
-
|
|
|
- if((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus != SYS_MODE_FAULT)&&(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus != SYS_MODE_ALARM)) //SYS_MODE_FAULT, SYS_MODE_ALARM
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_IDLE) //S_IDLE
|
|
|
- {
|
|
|
- if((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PilotState == CP_STATE_B) ||(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PilotState == CP_STATE_C) || (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PilotState == CP_STATE_D))
|
|
|
- {
|
|
|
- strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Occupied]);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- ShmOCPP16Data->CsMsg.bits[connectorIdInt-1].ReserveNowReq = 1;
|
|
|
- strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Accepted]);
|
|
|
- }
|
|
|
- }
|
|
|
- else if((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_MAINTAIN) ||(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_DEBUG) || (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_UPDATE)) //S_TERMINATING //else if((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == 11) || (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == '9'))
|
|
|
- {
|
|
|
- strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Unavailable]);
|
|
|
-
|
|
|
- }
|
|
|
- else if((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_PREPARING) || (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_RESERVATION) ) //S_PRECHARGE
|
|
|
- {
|
|
|
- strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Occupied]);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Rejected]);
|
|
|
- }
|
|
|
- }
|
|
|
- else if((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_FAULT) ||(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_ALARM) || (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_TERMINATING)) //SYS_MODE_FAULT, SYS_MODE_ALARM, SYS_MODE_TERMINATING ---> SuspendedEV
|
|
|
- {
|
|
|
- strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Faulted]);
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- //replace reservation
|
|
|
- ShmOCPP16Data->CsMsg.bits[connectorIdInt-1].ReserveNowReq = 1;
|
|
|
- strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Accepted]);
|
|
|
- }
|
|
|
- }
|
|
|
- } // END FOR AC_QUANTITY
|
|
|
- }
|
|
|
-
|
|
|
- sprintf((char *)ShmOCPP16Data->ReserveNow[connectorIdInt-1].ResponseStatus, "%s" ,comfirmstr);
|
|
|
- }
|
|
|
- else if(connectorIdInt == 0)
|
|
|
- {
|
|
|
- //check Transaction active
|
|
|
- for (int index = 0; index < CHAdeMO_QUANTITY; index++)
|
|
|
- {
|
|
|
- if(reservationIdInt != ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].ReservationId)
|
|
|
- {
|
|
|
- if((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_MAINTAIN) || (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_DEBUG) || (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_UPDATE)) //S_TERMINATING //else if((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == 11) || (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == '9'))
|
|
|
- {
|
|
|
- strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Unavailable]);
|
|
|
- goto end;
|
|
|
- }
|
|
|
- else if(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_PREPARING) //S_PRECHARGE
|
|
|
- {
|
|
|
- strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Occupied]);
|
|
|
- goto end;
|
|
|
- }
|
|
|
- else if((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_FAULT) || (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_ALARM) || (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_TERMINATING)) //SYS_MODE_FAULT, SYS_MODE_TERMINATING ---> SuspendedEV
|
|
|
- {
|
|
|
- strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Faulted]);
|
|
|
- goto end;
|
|
|
- }
|
|
|
- else if(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus != SYS_MODE_IDLE) //S_IDLE
|
|
|
- {
|
|
|
- strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Rejected]);
|
|
|
- goto end;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- }// END FOR CHAdeMO_QUANTITY
|
|
|
-
|
|
|
- for (int index = 0; index < CCS_QUANTITY; index++)
|
|
|
- {
|
|
|
- if(reservationIdInt != ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].ReservationId)
|
|
|
- {
|
|
|
- if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_MAINTAIN)||(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_DEBUG) || (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_UPDATE)) //S_TERMINATING //else if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == '6') || (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == '9'))
|
|
|
- {
|
|
|
- strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Unavailable]);
|
|
|
- goto end;
|
|
|
- }
|
|
|
- else if(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_PREPARING) //SYS_MODE_PREPARING
|
|
|
- {
|
|
|
- strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Occupied]);
|
|
|
- goto end;
|
|
|
- }
|
|
|
- else if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus ==SYS_MODE_FAULT) || (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus ==SYS_MODE_ALARM) || (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus ==SYS_MODE_TERMINATING)) //SYS_MODE_FAULT, SYS_MODE_TERMINATING ---> SuspendedEV
|
|
|
- {
|
|
|
- strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Faulted]);
|
|
|
- goto end;
|
|
|
- }
|
|
|
- else if(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus != SYS_MODE_IDLE) //S_IDLE
|
|
|
- {
|
|
|
- strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Rejected]);
|
|
|
- goto end;
|
|
|
- }
|
|
|
- }
|
|
|
- } // END FOR CCS_QUANTITY
|
|
|
-
|
|
|
- for (int index = 0; index < GB_QUANTITY; index++)
|
|
|
- {
|
|
|
- if(reservationIdInt != ShmSysConfigAndInfo->SysInfo.GbChargingData[index].ReservationId)
|
|
|
- {
|
|
|
- if((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_MAINTAIN)||(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_DEBUG) || (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_UPDATE)) //S_TERMINATING //else if((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == '6') || (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == '9'))
|
|
|
- {
|
|
|
- strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Unavailable]);
|
|
|
- goto end;
|
|
|
- }
|
|
|
- else if(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_PREPARING) //S_PRECHARGE
|
|
|
- {
|
|
|
- strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Occupied]);
|
|
|
- goto end;
|
|
|
- }
|
|
|
- else if((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus ==SYS_MODE_FAULT) || (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus ==SYS_MODE_ALARM) || (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus ==SYS_MODE_TERMINATING) ) //SYS_MODE_FAULT, SYS_MODE_TERMINATING ---> SuspendedEV
|
|
|
- {
|
|
|
- strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Faulted]);
|
|
|
- goto end;
|
|
|
- }
|
|
|
- else if(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus != SYS_MODE_IDLE) //S_IDLE
|
|
|
- {
|
|
|
- strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Rejected]);
|
|
|
- goto end;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- } // END FOR GB_QUANTITY
|
|
|
-
|
|
|
- for (int index = 0; index < AC_QUANTITY; index++)
|
|
|
- {
|
|
|
- if(reservationIdInt != ShmSysConfigAndInfo->SysInfo.AcChargingData[index].ReservationId)
|
|
|
- {
|
|
|
- if((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_MAINTAIN) || (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_DEBUG) || (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_UPDATE)) //S_TERMINATING //else if((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == 11) || (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == '9'))
|
|
|
- {
|
|
|
- strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Unavailable]);
|
|
|
- goto end;
|
|
|
- }
|
|
|
- else if(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_PREPARING) //S_PRECHARGE
|
|
|
- {
|
|
|
- strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Occupied]);
|
|
|
- goto end;
|
|
|
- }
|
|
|
- else if((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_FAULT) || (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_ALARM) || (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_TERMINATING)) //SYS_MODE_FAULT, SYS_MODE_TERMINATING ---> SuspendedEV
|
|
|
- {
|
|
|
- strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Faulted]);
|
|
|
- goto end;
|
|
|
- }
|
|
|
- if(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_IDLE) //S_IDLE
|
|
|
- {
|
|
|
- if((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PilotState == CP_STATE_B) ||(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PilotState == CP_STATE_C) || (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PilotState == CP_STATE_D))
|
|
|
- {
|
|
|
- strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Occupied]);
|
|
|
- goto end;
|
|
|
- }
|
|
|
- }
|
|
|
- else if(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus != SYS_MODE_IDLE) //S_IDLE
|
|
|
- {
|
|
|
- strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Rejected]);
|
|
|
- goto end;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- }// END FOR AC_QUANTITY
|
|
|
-
|
|
|
- //The connectorId is 0
|
|
|
- ShmOCPP16Data->CsMsg.bits[0].ReserveNowReq = 1;
|
|
|
- strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Accepted]);
|
|
|
- sprintf((char *)ShmOCPP16Data->ReserveNow[0].ResponseStatus, "%s" ,comfirmstr);
|
|
|
- ShmOCPP16Data->ReserveNow[0].ConnectorId = connectorIdInt;
|
|
|
- sprintf((char *)ShmOCPP16Data->ReserveNow[0].ExpiryDate, "%s" , expiryDatestr);
|
|
|
- sprintf((char *)ShmOCPP16Data->ReserveNow[0].IdTag, "%s" , idTagstr);
|
|
|
- sprintf((char *)ShmOCPP16Data->ReserveNow[0].ParentIdTag, "%s" , parentIdTagstr);
|
|
|
- ShmOCPP16Data->ReserveNow[0].ReservationId = reservationIdInt;
|
|
|
- strcpy((char *)ShmOCPP16Data->ReserveNow[0].guid, uuid);
|
|
|
-
|
|
|
- result = TRUE;
|
|
|
- return result;
|
|
|
-
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Rejected]);
|
|
|
- sprintf((char *)ShmOCPP16Data->ReserveNow[connectorIdInt-1].ResponseStatus, "%s" ,comfirmstr);
|
|
|
- }
|
|
|
-
|
|
|
- if(strcmp(comfirmstr,"Accepted") == 0)
|
|
|
- {
|
|
|
- ShmOCPP16Data->ReserveNow[connectorIdInt-1].ConnectorId = connectorIdInt;
|
|
|
- sprintf((char *)ShmOCPP16Data->ReserveNow[connectorIdInt-1].ExpiryDate, "%s" , expiryDatestr);
|
|
|
- sprintf((char *)ShmOCPP16Data->ReserveNow[connectorIdInt-1].IdTag, "%s" , idTagstr);
|
|
|
- sprintf((char *)ShmOCPP16Data->ReserveNow[connectorIdInt-1].ParentIdTag, "%s" , parentIdTagstr);
|
|
|
- ShmOCPP16Data->ReserveNow[connectorIdInt-1].ReservationId = reservationIdInt;
|
|
|
- strcpy((char *)ShmOCPP16Data->ReserveNow[connectorIdInt-1].guid, uuid);
|
|
|
-
|
|
|
- result = TRUE;
|
|
|
- return result;
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
-end:
|
|
|
- sendReserveNowTransactionConfirmation(uuid,comfirmstr);
|
|
|
- //ShmOCPP16Data->CsMsg.bits[connectorIdInt-1].ReserveNowConf = 1;
|
|
|
-
|
|
|
- return result;
|
|
|
-}
|
|
|
-
|
|
|
-int handleResetRequest(char *uuid, char *payload)
|
|
|
-{
|
|
|
- mtrace();
|
|
|
- int result = FAIL;
|
|
|
-
|
|
|
- char sstr[10]={0},sstrtemp[30]={ 0 };
|
|
|
- char typestr[10]={0};
|
|
|
- char comfirmstr[20]={0};
|
|
|
- int c = 0;
|
|
|
- char *loc;
|
|
|
-
|
|
|
- DEBUG_INFO("handleResetRequest...\n");
|
|
|
-
|
|
|
- strcpy(sstrtemp, stringtrimspace(payload));
|
|
|
- loc = strstr(sstrtemp, "type");
|
|
|
- memset(sstr ,0, sizeof(sstr) );
|
|
|
- c = 0;
|
|
|
- while (loc[3+strlen("type")+c] != '\"')
|
|
|
- {
|
|
|
- sstr[c] = loc[3+strlen("type")+c];
|
|
|
- c++;
|
|
|
- }
|
|
|
- sstr[c] = '\0';
|
|
|
- strcpy(typestr,sstr);
|
|
|
-
|
|
|
- sprintf((char *)ShmOCPP16Data->Reset.Type, "%s" ,typestr);
|
|
|
- if((strcmp(typestr, ResetTypeStr[Hard])==0) || (strcmp(typestr, ResetTypeStr[Soft])==0))
|
|
|
- {
|
|
|
- ShmOCPP16Data->MsMsg.bits.ResetReq = 1;
|
|
|
- strcpy((char *)ShmOCPP16Data->Reset.guid, uuid);
|
|
|
- result = TRUE;
|
|
|
- return result;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- strcpy(comfirmstr, ResetStatusStr[ResetStatus_Rejected]);
|
|
|
- sprintf((char *)ShmOCPP16Data->Reset.ResponseStatus, "%s" ,comfirmstr);
|
|
|
- goto errorend;
|
|
|
- }
|
|
|
-
|
|
|
-errorend:
|
|
|
- sendResetConfirmation(uuid, comfirmstr);
|
|
|
- return result;
|
|
|
-}
|
|
|
-
|
|
|
-int handleSendLocalListRequest(char *uuid, char *payload)
|
|
|
-{
|
|
|
- mtrace();
|
|
|
- int result = FAIL;
|
|
|
- int listVersionInt;
|
|
|
- //char *updateTypestr, *idTagstr, *expiryDatestr, *parentIdTagstr, *statusstr;
|
|
|
- char listsearch[]="listVersion";
|
|
|
- char updateTypesearch[]="updateType";
|
|
|
- char localAuthorizationListsearch[]="localAuthorizationList";
|
|
|
- char sstr[60500]={ 0 },sstrtemp[60500]={ 0 };//sstr[200]={ 0 };
|
|
|
- char CardList[500][160]={0};
|
|
|
- char updateTypestr[15]={0};
|
|
|
- char idTagstr[20]={0};
|
|
|
- char parentIdTag[20]={0};
|
|
|
- char expiryDate[30]={0};
|
|
|
- char idTagstatus[16]={0};
|
|
|
- int c = 0;
|
|
|
- int i = 0;
|
|
|
- char *delim1 = "}";
|
|
|
- char * pch;
|
|
|
- char *loc;
|
|
|
- //char *ptr;
|
|
|
- char comfirmstr[20];
|
|
|
- //int n_localAuthorizations = 0;
|
|
|
- int checkState_Faulted = FALSE;
|
|
|
-
|
|
|
- DEBUG_INFO("handleSendLocalListRequest...\n");
|
|
|
-
|
|
|
- if(strcmp((const char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemData, "FALSE") == 0) //For OCTT Test case
|
|
|
- {
|
|
|
- strcpy(comfirmstr, UpdateStatusStr[UpdateStatus_NotSupported]);
|
|
|
- goto end;
|
|
|
- }
|
|
|
-
|
|
|
- //check Charge Point state
|
|
|
- for (int index = 0; index < CHAdeMO_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_FAULT) //S_FAULT ---> Faulted
|
|
|
- {
|
|
|
- checkState_Faulted = TRUE; //OCPP Status: Faulted
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < CCS_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_FAULT) //S_FAULT ---> Faulted
|
|
|
- {
|
|
|
- checkState_Faulted = TRUE; //OCPP Status
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < GB_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_FAULT) //S_FAULT ---> Faulted
|
|
|
- {
|
|
|
- checkState_Faulted = TRUE; //OCPP Status: Faulted
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- //check Charge Point state
|
|
|
- for (int index = 0; index < AC_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_FAULT) //S_FAULT ---> Faulted
|
|
|
- {
|
|
|
- checkState_Faulted = TRUE; //OCPP Status: Faulted
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- if(checkState_Faulted == TRUE)
|
|
|
- {
|
|
|
- strcpy(comfirmstr, UpdateStatusStr[UpdateStatus_Failed]);
|
|
|
- goto end;
|
|
|
- }
|
|
|
-
|
|
|
- //Filter payload space
|
|
|
- strcpy(sstrtemp, stringtrimspace(payload));
|
|
|
-
|
|
|
- //listVersion
|
|
|
- c = 0;
|
|
|
- loc = strstr(sstrtemp, listsearch);
|
|
|
- while ((loc[strlen("listVersion")+2+c] != ',')&&(loc[strlen("listVersion")+2+c] != '}'))
|
|
|
- {
|
|
|
- sstr[c] = loc[strlen("listVersion")+2+c];
|
|
|
- c++;
|
|
|
- }
|
|
|
- sstr[c] = '\0';
|
|
|
- listVersionInt = atoi(sstr);
|
|
|
-
|
|
|
-
|
|
|
- ShmOCPP16Data->SendLocalList.ListVersion = listVersionInt;
|
|
|
-
|
|
|
- //updateType
|
|
|
- loc = strstr(sstrtemp, updateTypesearch);
|
|
|
- c = 0;
|
|
|
- while (loc[3+strlen(updateTypesearch)+c] != '\"')
|
|
|
- {
|
|
|
- sstr[c] = loc[3+strlen(updateTypesearch)+c];
|
|
|
- c++;
|
|
|
- }
|
|
|
- sstr[c] = '\0';
|
|
|
- strcpy(updateTypestr, sstr);
|
|
|
- sprintf((char *)ShmOCPP16Data->SendLocalList.UpdateType, "%s", updateTypestr);
|
|
|
-
|
|
|
- //localAuthorizationList
|
|
|
- memset(sstr ,0, sizeof(sstr) );
|
|
|
- loc = strstr(sstrtemp, localAuthorizationListsearch);
|
|
|
- if(loc != NULL) // localAuthorizationList is not NULL
|
|
|
- {
|
|
|
- //Check UpdateType
|
|
|
- if(strcmp(updateTypestr, UpdateTypeStr[Full]) == 0)
|
|
|
- {
|
|
|
- //Local list full update
|
|
|
- printf("Local list full update.\n");
|
|
|
-
|
|
|
- OCPP_getListVerion();
|
|
|
-
|
|
|
- if(listVersionInt < localversion )//if(listVersionInt <= localversion ) for OCTT Case ---remove temporally
|
|
|
- {
|
|
|
- strcpy(comfirmstr, UpdateStatusStr[UpdateStatus_Failed]);
|
|
|
- goto end;
|
|
|
- }
|
|
|
-
|
|
|
- OCPP_cleanLocalList();
|
|
|
-
|
|
|
- }
|
|
|
- else if(strcmp(updateTypestr, UpdateTypeStr[Differential]) == 0)
|
|
|
- {
|
|
|
- //Local list different update
|
|
|
- printf("Local list different update.\n");
|
|
|
-
|
|
|
- OCPP_getListVerion();
|
|
|
-
|
|
|
- if(listVersionInt < localversion )//if(listVersionInt <= localversion ) for OCTT Case ---remove temporally
|
|
|
- {
|
|
|
- strcpy(comfirmstr, UpdateStatusStr[UpdateStatus_VersionMismatch]);
|
|
|
- goto end;
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- strcpy(comfirmstr, UpdateStatusStr[UpdateStatus_NotSupported]);
|
|
|
- goto end;
|
|
|
- }
|
|
|
-
|
|
|
- c = 0;
|
|
|
- while (loc[3+strlen(localAuthorizationListsearch)+c] != ']')
|
|
|
- {
|
|
|
- sstr[c] = loc[3+strlen(localAuthorizationListsearch)+c];
|
|
|
- //printf("i=%d sstr=%c\n",c, sstr[c]);
|
|
|
- c++;
|
|
|
- }
|
|
|
- sstr[c] = '\0';
|
|
|
-
|
|
|
- //DEBUG_INFO("sstr=%s\n", sstr);
|
|
|
-
|
|
|
- //parsing strings to words
|
|
|
- i = 0;
|
|
|
- pch = strtok(sstr,delim1);
|
|
|
- while (pch != NULL)
|
|
|
- {
|
|
|
- strcpy(CardList[i], pch);
|
|
|
- //DEBUG_INFO("CardList[i]=%s\n", CardList[i]);
|
|
|
- pch = strtok (NULL, delim1);
|
|
|
- i = i + 1;
|
|
|
- }
|
|
|
-
|
|
|
- //DEBUG_INFO("listVersionInt=%s\n", sstr);
|
|
|
- //local Authorizations List Numbers
|
|
|
- //n_localAuthorizations = i;
|
|
|
- ShmOCPP16Data->SendLocalList.ListVersion = listVersionInt;
|
|
|
-
|
|
|
- memset(ShmOCPP16Data->SendLocalList.LocalAuthorizationList, 0 , sizeof(struct StructLocalAuthorizationList)* 500);
|
|
|
-
|
|
|
- c= 0;
|
|
|
- while(c < i) // i is CardList Number
|
|
|
- {
|
|
|
- //Search "IdToken"
|
|
|
- memset(sstr ,0, sizeof(sstr) );
|
|
|
- loc = strstr(CardList[c], "idTag");
|
|
|
- int j = 0;
|
|
|
- while (loc[3+strlen("idTag")+j] != '\"')
|
|
|
- {
|
|
|
- sstr[j] = loc[3+strlen("idTag")+j];
|
|
|
- //printf("i=%d sstr=%c\n",c, sstr[j]);
|
|
|
- j++;
|
|
|
- }
|
|
|
- sstr[j] = '\0';
|
|
|
- strcpy(idTagstr, sstr);
|
|
|
- //DEBUG_INFO("idTagstr=%s\n", idTagstr);
|
|
|
-
|
|
|
- //Search "expiryDate"
|
|
|
- memset(sstr ,0, sizeof(sstr) );
|
|
|
- loc = strstr(CardList[c], "expiryDate");
|
|
|
- j = 0;
|
|
|
- if(loc != NULL)
|
|
|
- {
|
|
|
- while (loc[3+strlen("expiryDate")+j] != '\"')
|
|
|
- {
|
|
|
- sstr[j] = loc[3+strlen("expiryDate")+j];
|
|
|
- //printf("i=%d sstr=%c\n",c, sstr[j]);
|
|
|
- j++;
|
|
|
- }
|
|
|
- sstr[j] = '\0';
|
|
|
- strcpy(expiryDate, sstr);
|
|
|
-
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- strcpy(expiryDate, "");
|
|
|
- }
|
|
|
-
|
|
|
- //DEBUG_INFO("expiryDate=%s\n", expiryDate);
|
|
|
-
|
|
|
- //Search "parentIdTag"
|
|
|
- memset(sstr ,0, sizeof(sstr) );
|
|
|
- loc = strstr(CardList[c], "parentIdTag");
|
|
|
- j = 0;
|
|
|
- if(loc != NULL)
|
|
|
- {
|
|
|
- while (loc[3+strlen("parentIdTag")+j] != '\"')
|
|
|
- {
|
|
|
- sstr[j] = loc[3+strlen("parentIdTag")+j];
|
|
|
- //printf("i=%d sstr=%c\n",c, sstr[j]);
|
|
|
- j++;
|
|
|
- }
|
|
|
- sstr[j] = '\0';
|
|
|
- strcpy(parentIdTag, sstr);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- strcpy(parentIdTag, "");
|
|
|
- }
|
|
|
-
|
|
|
- //DEBUG_INFO("parentIdTag=%s\n", parentIdTag);
|
|
|
-
|
|
|
-
|
|
|
- //Search "status"
|
|
|
- memset(sstr ,0, sizeof(sstr) );
|
|
|
- loc = strstr(CardList[c], "status");
|
|
|
- j = 0;
|
|
|
- while (loc[3+strlen("status")+j] != '\"')
|
|
|
- {
|
|
|
- sstr[j] = loc[3+strlen("status")+j];
|
|
|
- //printf("i=%d sstr=%c\n",c, sstr[j]);
|
|
|
- j++;
|
|
|
- }
|
|
|
- sstr[j] = '\0';
|
|
|
- strcpy(idTagstatus, sstr);
|
|
|
-
|
|
|
- //DEBUG_INFO("idTagstatus=%s\n", idTagstatus);
|
|
|
-
|
|
|
- OCPP_getIdTag(idTagstr);
|
|
|
- //OCPP_getIdTag("test"); For Test
|
|
|
- //DEBUG_INFO("idTagAuthorization=%s\n",idTagAuthorization);
|
|
|
- //DEBUG_INFO("updateTypestr=%s\n",updateTypestr);
|
|
|
-
|
|
|
- if(strcmp(updateTypestr, UpdateTypeStr[Full]) == 0)
|
|
|
- {
|
|
|
- //Local list full update
|
|
|
- DEBUG_INFO("Local list full update.\n");
|
|
|
- // update list
|
|
|
- OCPP_addLocalList_1(listVersionInt, idTagstr, parentIdTag, expiryDate, idTagstatus);
|
|
|
- //DEBUG_INFO("Local list full update. 1\n");
|
|
|
- //OCPP_get_TableAuthlocalAllData();
|
|
|
- //DEBUG_INFO("Local list full update. 2\n");
|
|
|
- }
|
|
|
- else if(strcmp(updateTypestr, UpdateTypeStr[Differential]) == 0)
|
|
|
- {
|
|
|
- OCPP_addLocalList_1(listVersionInt, idTagstr, parentIdTag, expiryDate, idTagstatus); // update or add
|
|
|
- }
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->SendLocalList.LocalAuthorizationList[c].IdTag, idTagstr);
|
|
|
- strcpy((char *)ShmOCPP16Data->SendLocalList.LocalAuthorizationList[c].IdTagInfo.ExpiryDate, expiryDate);
|
|
|
- strcpy((char *)ShmOCPP16Data->SendLocalList.LocalAuthorizationList[c].IdTagInfo.ParentIdTag, parentIdTag);
|
|
|
- strcpy((char *)ShmOCPP16Data->SendLocalList.LocalAuthorizationList[c].IdTagInfo.Status, idTagstatus);
|
|
|
-
|
|
|
- c++;
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- //Check UpdateType
|
|
|
- if(strcmp(updateTypestr, UpdateTypeStr[Full]) == 0)
|
|
|
- {
|
|
|
- //Local list full update
|
|
|
- DEBUG_INFO("If no (empty) localAuthorizationList is given and the updateType is Full, all identifications are removed from the list. \n");
|
|
|
- OCPP_cleanLocalList();
|
|
|
- strcpy(comfirmstr, UpdateStatusStr[UpdateStatus_Accepted]);
|
|
|
- goto end;
|
|
|
- }
|
|
|
-
|
|
|
- if(strcmp(updateTypestr, UpdateTypeStr[Differential]) == 0)
|
|
|
- {
|
|
|
- //Local list different update
|
|
|
- DEBUG_INFO("Requesting a Differential update without (empty) localAuthorizationList will have no effect on the list\n");
|
|
|
- strcpy(comfirmstr, UpdateStatusStr[UpdateStatus_Accepted]);
|
|
|
- goto end;
|
|
|
-
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- strcpy(comfirmstr, UpdateStatusStr[UpdateStatus_Accepted]);
|
|
|
-
|
|
|
-end:
|
|
|
-
|
|
|
- sendSendLocalListConfirmation(uuid, comfirmstr);
|
|
|
- //ShmOCPP16Data->MsMsg.bits.SendLocalListConf = 1;
|
|
|
-
|
|
|
- return result;
|
|
|
-}
|
|
|
-
|
|
|
-#define MAX 200
|
|
|
-int handleSetChargingProfileRequest(char *uuid, char *payload)
|
|
|
-{
|
|
|
- mtrace();
|
|
|
- int result = FAIL;
|
|
|
- int connectorIdInt=0, chargingProfileIdInt=0, transactionIdInt=0,stackLevelInt=0, durationInt=0, startPeriodInt[10]={0}, numberPhasesInt[10]={0};
|
|
|
- int tempconnectorIdInt=0, tempchargingProfileIdInt=0, tempstackLevelInt=0;
|
|
|
- char chargingProfilePurposeStr[30]={0};
|
|
|
- char chargingProfileKindStr[16]={0};
|
|
|
- char recurrencyKindStr[10]={0};
|
|
|
- char validFromStr[30]={0}, validToStr[30]={0}, startScheduleStr[30]={0}, chargingRateUnitStr[6]={0};
|
|
|
- float minChargingRateFloat = 0.0, limitflaot[10] = {0.0};
|
|
|
- int chargingSchedulePeriodCount = 0;
|
|
|
- //int updateflag = FALSE;
|
|
|
- char comfirmstr[20]={0};
|
|
|
- int meet= FALSE;
|
|
|
- char sstr[10]={0},sstrtemp[1600]={ 0 };
|
|
|
- int c = 0;
|
|
|
- char *loc;
|
|
|
- FILE *fptr1;//, *fptr2;
|
|
|
- //int lno=0;//, linectr = 0;
|
|
|
- //int modifyflag = FALSE;
|
|
|
- char filename[MAX]={0};
|
|
|
- char tempfile[] = "/Storage/OCPP/SetChargingProfiletemp.json";
|
|
|
- //int resultRename=0;
|
|
|
- char rmFileCmd[50]={0};
|
|
|
- char tempchargingProfilePurposeStr[30]={0};
|
|
|
- char word[1600]={0};
|
|
|
- int n_chargingProfile = 0;
|
|
|
-
|
|
|
-
|
|
|
-//[2,"d65bcbca-0b07-49c1-b679-e6c6ff9f5627","SetChargingProfile",{"connectorId":0,"csChargingProfiles":{"chargingProfileId":1,"transactionId":0,"stackLevel":0,"chargingProfilePurpose":"TxDefaultProfile","chargingProfileKind":"Absolute","recurrencyKind":"Daily","validFrom":"2019-07-01T02:39:55.000Z","validTo":"2019-07-04T02:39:55.000Z","chargingSchedule":{"duration":86400,"startSchedule":"2019-07-01T02:39:55.000Z","chargingRateUnit":"A","chargingSchedulePeriod":[{"startPeriod":0,"limit":20.0,"numberPhases":3},{"startPeriod":300,"limit":10.0,"numberPhases":3},{"startPeriod":600,"limit":20.0,"numberPhases":3},{"startPeriod":1200,"limit":10.0,"numberPhases":3},{"startPeriod":1800,"limit":20.0,"numberPhases":3},{"startPeriod":2400,"limit":10.0,"numberPhases":3},{"startPeriod":3000,"limit":20.0,"numberPhases":3}],"minChargingRate":20.1}}}]
|
|
|
- DEBUG_INFO("handleSetChargingProfileRequest\n");
|
|
|
-
|
|
|
- connectorIdInt = chargingProfileIdInt = transactionIdInt = stackLevelInt = 0;
|
|
|
-
|
|
|
- //Filter string space
|
|
|
- strcpy(sstrtemp, stringtrimspace(payload));
|
|
|
-
|
|
|
- //*********************connectorId***************************/
|
|
|
- loc = strstr(sstrtemp, "connectorId");
|
|
|
- c = 0;
|
|
|
- memset(sstr ,0, sizeof(sstr) );
|
|
|
- while (loc[strlen("connectorId")+2+c] != ',')
|
|
|
- {
|
|
|
- sstr[c] = loc[strlen("connectorId")+2+c];
|
|
|
- c++;
|
|
|
- }
|
|
|
- sstr[c] = '\0';
|
|
|
- connectorIdInt = atoi(sstr);
|
|
|
-
|
|
|
- if(connectorIdInt == 0) // an overall limit for the Charge Point.
|
|
|
- {
|
|
|
- ShmOCPP16Data->SetChargingProfile[0].ConnectorId = connectorIdInt;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- ShmOCPP16Data->SetChargingProfile[connectorIdInt -1].ConnectorId = connectorIdInt;
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- //DEBUG_INFO("handleSetChargingProfileRequest -1\n");
|
|
|
- //*********************chargingProfileId***************************/
|
|
|
- loc = strstr(sstrtemp, "chargingProfileId");
|
|
|
- c = 0;
|
|
|
- memset(sstr ,0, sizeof(sstr) );
|
|
|
- while (loc[strlen("chargingProfileId")+2+c] != ',')
|
|
|
- {
|
|
|
- sstr[c] = loc[strlen("chargingProfileId")+2+c];
|
|
|
- c++;
|
|
|
- }
|
|
|
- sstr[c] = '\0';
|
|
|
- chargingProfileIdInt = atoi(sstr);
|
|
|
-
|
|
|
- if(connectorIdInt == 0) // an overall limit for the Charge Point.
|
|
|
- {
|
|
|
- ShmOCPP16Data->SetChargingProfile[0].ChargingProfile.ChargingProfileId = chargingProfileIdInt;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- ShmOCPP16Data->SetChargingProfile[connectorIdInt -1].ChargingProfile.ChargingProfileId = chargingProfileIdInt;
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- //DEBUG_INFO("handleSetChargingProfileRequest -2\n");
|
|
|
- //*********************transactionId***************************/
|
|
|
- loc = strstr(sstrtemp, "transactionId");
|
|
|
-
|
|
|
- if(loc != NULL)
|
|
|
- {
|
|
|
- c = 0;
|
|
|
- memset(sstr ,0, sizeof(sstr) );
|
|
|
- while (loc[strlen("transactionId")+2+c] != ',')
|
|
|
- {
|
|
|
- sstr[c] = loc[strlen("transactionId")+2+c];
|
|
|
- c++;
|
|
|
- }
|
|
|
- sstr[c] = '\0';
|
|
|
- transactionIdInt = atoi(sstr);
|
|
|
-
|
|
|
-
|
|
|
- if(connectorIdInt == 0) // an overall limit for the Charge Point.
|
|
|
- {
|
|
|
- ShmOCPP16Data->SetChargingProfile[0].ChargingProfile.TransactionId = transactionIdInt;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- ShmOCPP16Data->SetChargingProfile[connectorIdInt -1].ChargingProfile.TransactionId = transactionIdInt;
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- //DEBUG_INFO("handleSetChargingProfileRequest -3\n");
|
|
|
- //*********************stackLevel***************************/
|
|
|
- loc = strstr(sstrtemp, "stackLevel");
|
|
|
- c = 0;
|
|
|
- memset(sstr ,0, sizeof(sstr) );
|
|
|
- while (loc[strlen("stackLevel")+2+c] != ',')
|
|
|
- {
|
|
|
- sstr[c] = loc[strlen("stackLevel")+2+c];
|
|
|
- c++;
|
|
|
- }
|
|
|
- sstr[c] = '\0';
|
|
|
- stackLevelInt = atoi(sstr);
|
|
|
-
|
|
|
- if(connectorIdInt == 0) // an overall limit for the Charge Point.
|
|
|
- {
|
|
|
- ShmOCPP16Data->SetChargingProfile[0].ChargingProfile.StackLevel = stackLevelInt;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- ShmOCPP16Data->SetChargingProfile[connectorIdInt -1].ChargingProfile.StackLevel = stackLevelInt;
|
|
|
- }
|
|
|
-
|
|
|
- //DEBUG_INFO("handleSetChargingProfileRequest -4\n");
|
|
|
- //*********************chargingProfilePurpose***************************/
|
|
|
- loc = strstr(sstrtemp, "chargingProfilePurpose");
|
|
|
- c = 0;
|
|
|
- memset(sstr ,0, sizeof(sstr) );
|
|
|
- while (loc[3+strlen("chargingProfilePurpose")+c] != '\"')
|
|
|
- {
|
|
|
- sstr[c] = loc[3+strlen("chargingProfilePurpose")+c];
|
|
|
- //printf("i=%d sstr=%c\n",c, sstr[c]);
|
|
|
- c++;
|
|
|
- }
|
|
|
- sstr[c] = '\0';
|
|
|
- strcpy(chargingProfilePurposeStr,sstr);
|
|
|
- //DEBUG_INFO("chargingProfilePurposeStr=%s\n",chargingProfilePurposeStr);
|
|
|
-
|
|
|
- if(connectorIdInt == 0) // an overall limit for the Charge Point.
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->SetChargingProfile[0].ChargingProfile.ChargingProfilePurpose, chargingProfilePurposeStr);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->SetChargingProfile[connectorIdInt -1].ChargingProfile.ChargingProfilePurpose, chargingProfilePurposeStr);
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- //DEBUG_INFO("handleSetChargingProfileRequest -6\n");
|
|
|
- //*********************chargingProfileKind***************************/
|
|
|
- loc = strstr(sstrtemp, "chargingProfileKind");
|
|
|
- c = 0;
|
|
|
- memset(sstr ,0, sizeof(sstr) );
|
|
|
- while (loc[3+strlen("chargingProfileKind")+c] != '\"')
|
|
|
- {
|
|
|
- sstr[c] = loc[3+strlen("chargingProfileKind")+c];
|
|
|
- //printf("i=%d sstr=%c\n",c, sstr[c]);
|
|
|
- c++;
|
|
|
- }
|
|
|
- sstr[c] = '\0';
|
|
|
- strcpy(chargingProfileKindStr,sstr);
|
|
|
-
|
|
|
- if(connectorIdInt == 0) // an overall limit for the Charge Point.
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->SetChargingProfile[0].ChargingProfile.ChargingProfileKind, chargingProfileKindStr);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->SetChargingProfile[connectorIdInt -1].ChargingProfile.ChargingProfileKind, chargingProfileKindStr);
|
|
|
- }
|
|
|
-
|
|
|
- //DEBUG_INFO("handleSetChargingProfileRequest -7\n");
|
|
|
- //*********************recurrencyKind***************************/
|
|
|
- loc = strstr(sstrtemp, "recurrencyKind");
|
|
|
- if(loc != NULL)
|
|
|
- {
|
|
|
-
|
|
|
- c = 0;
|
|
|
- memset(sstr ,0, sizeof(sstr) );
|
|
|
- while (loc[3+strlen("recurrencyKind")+c] != '\"')
|
|
|
- {
|
|
|
- sstr[c] = loc[3+strlen("recurrencyKind")+c];
|
|
|
- //printf("i=%d sstr=%c\n",c, sstr[c]);
|
|
|
- c++;
|
|
|
- }
|
|
|
- sstr[c] = '\0';
|
|
|
- strcpy(recurrencyKindStr,sstr);
|
|
|
-
|
|
|
- if(connectorIdInt == 0) // an overall limit for the Charge Point.
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->SetChargingProfile[0].ChargingProfile.RecurrencyKind, recurrencyKindStr);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->SetChargingProfile[connectorIdInt -1].ChargingProfile.RecurrencyKind, recurrencyKindStr);
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- if(connectorIdInt == 0) // an overall limit for the Charge Point.
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->SetChargingProfile[0].ChargingProfile.RecurrencyKind, "");
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->SetChargingProfile[connectorIdInt -1].ChargingProfile.RecurrencyKind, "");
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- //DEBUG_INFO("handleSetChargingProfileRequest -8\n");
|
|
|
- //*********************validFrom***************************/
|
|
|
- loc = strstr(sstrtemp, "validFrom");
|
|
|
- if(loc != NULL)
|
|
|
- {
|
|
|
- c = 0;
|
|
|
- memset(sstr ,0, sizeof(sstr) );
|
|
|
- while (loc[3+strlen("validFrom")+c] != '\"')
|
|
|
- {
|
|
|
- sstr[c] = loc[3+strlen("validFrom")+c];
|
|
|
- //printf("i=%d sstr=%c\n",c, sstr[c]);
|
|
|
- c++;
|
|
|
- }
|
|
|
- sstr[c] = '\0';
|
|
|
- strcpy(validFromStr,sstr);
|
|
|
-
|
|
|
- if(connectorIdInt == 0) // an overall limit for the Charge Point.
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->SetChargingProfile[0].ChargingProfile.ValidFrom, validFromStr);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->SetChargingProfile[connectorIdInt -1].ChargingProfile.ValidFrom, validFromStr);
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- if(connectorIdInt == 0) // an overall limit for the Charge Point.
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->SetChargingProfile[0].ChargingProfile.ValidFrom, "");
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->SetChargingProfile[connectorIdInt -1].ChargingProfile.ValidFrom, "");
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- //DEBUG_INFO("handleSetChargingProfileRequest -9\n");
|
|
|
- //*********************validTo***************************/
|
|
|
- loc = strstr(sstrtemp, "validTo");
|
|
|
- if(loc != NULL)
|
|
|
- {
|
|
|
- c = 0;
|
|
|
- memset(sstr ,0, sizeof(sstr) );
|
|
|
- while (loc[3+strlen("validTo")+c] != '\"')
|
|
|
- {
|
|
|
- sstr[c] = loc[3+strlen("validTo")+c];
|
|
|
- //printf("i=%d sstr=%c\n",c, sstr[c]);
|
|
|
- c++;
|
|
|
- }
|
|
|
- sstr[c] = '\0';
|
|
|
- strcpy(validToStr,sstr);
|
|
|
-
|
|
|
- if(connectorIdInt == 0) // an overall limit for the Charge Point.
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->SetChargingProfile[0].ChargingProfile.ValidTo, validToStr);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->SetChargingProfile[connectorIdInt -1].ChargingProfile.ValidTo, validToStr);
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- if(connectorIdInt == 0) // an overall limit for the Charge Point.
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->SetChargingProfile[0].ChargingProfile.ValidTo, "");
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->SetChargingProfile[connectorIdInt -1].ChargingProfile.ValidTo, "");
|
|
|
-
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- //DEBUG_INFO("handleSetChargingProfileRequest -10\n");
|
|
|
- //*********************duration***************************/
|
|
|
- loc = strstr(sstrtemp, "duration");
|
|
|
- if(loc != NULL)
|
|
|
- {
|
|
|
- c = 0;
|
|
|
- memset(sstr ,0, sizeof(sstr) );
|
|
|
- while (loc[strlen("duration")+2+c] != ',')
|
|
|
- {
|
|
|
- sstr[c] = loc[strlen("duration")+2+c];
|
|
|
- c++;
|
|
|
- }
|
|
|
- sstr[c] = '\0';
|
|
|
- durationInt = atoi(sstr);
|
|
|
-
|
|
|
- if(connectorIdInt == 0) // an overall limit for the Charge Point.
|
|
|
- {
|
|
|
- ShmOCPP16Data->SetChargingProfile[0].ChargingProfile.ChargingSchedule.Duration = durationInt;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- ShmOCPP16Data->SetChargingProfile[connectorIdInt -1].ChargingProfile.ChargingSchedule.Duration = durationInt;
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- if(connectorIdInt == 0) // an overall limit for the Charge Point.
|
|
|
- {
|
|
|
- ShmOCPP16Data->SetChargingProfile[0].ChargingProfile.ChargingSchedule.Duration = 0;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- ShmOCPP16Data->SetChargingProfile[connectorIdInt -1].ChargingProfile.ChargingSchedule.Duration = 0;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- //DEBUG_INFO("handleSetChargingProfileRequest -11\n");
|
|
|
- //*********************startSchedule***************************/
|
|
|
- loc = strstr(sstrtemp, "startSchedule");
|
|
|
- if(loc != NULL)
|
|
|
- {
|
|
|
- c = 0;
|
|
|
- memset(sstr ,0, sizeof(sstr) );
|
|
|
- while (loc[3+strlen("startSchedule")+c] != '\"')
|
|
|
- {
|
|
|
- sstr[c] = loc[3+strlen("startSchedule")+c];
|
|
|
- //printf("i=%d sstr=%c\n",c, sstr[c]);
|
|
|
- c++;
|
|
|
- }
|
|
|
- sstr[c] = '\0';
|
|
|
- strcpy(startScheduleStr,sstr);
|
|
|
-
|
|
|
- if(connectorIdInt == 0) // an overall limit for the Charge Point.
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->SetChargingProfile[0].ChargingProfile.ChargingSchedule.StartSchedule,startScheduleStr);
|
|
|
-
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->SetChargingProfile[connectorIdInt -1].ChargingProfile.ChargingSchedule.StartSchedule,startScheduleStr);
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- if(connectorIdInt == 0) // an overall limit for the Charge Point.
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->SetChargingProfile[0].ChargingProfile.ChargingSchedule.StartSchedule,"");
|
|
|
-
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->SetChargingProfile[connectorIdInt -1].ChargingProfile.ChargingSchedule.StartSchedule,"");
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- //DEBUG_INFO("handleSetChargingProfileRequest -12\n");
|
|
|
- //*********************chargingRateUnit***************************/
|
|
|
- loc = strstr(sstrtemp, "chargingRateUnit");
|
|
|
- if(loc != NULL)
|
|
|
- {
|
|
|
- c = 0;
|
|
|
- memset(sstr ,0, sizeof(sstr) );
|
|
|
- while (loc[3+strlen("chargingRateUnit")+c] != '\"')
|
|
|
- {
|
|
|
- sstr[c] = loc[3+strlen("chargingRateUnit")+c];
|
|
|
- //printf("i=%d sstr=%c\n",c, sstr[c]);
|
|
|
- c++;
|
|
|
- }
|
|
|
- sstr[c] = '\0';
|
|
|
- strcpy(chargingRateUnitStr,sstr);
|
|
|
-
|
|
|
- if(connectorIdInt == 0) // an overall limit for the Charge Point.
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->SetChargingProfile[0].ChargingProfile.ChargingSchedule.ChargingRateUnit,chargingRateUnitStr);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->SetChargingProfile[connectorIdInt -1].ChargingProfile.ChargingSchedule.ChargingRateUnit,chargingRateUnitStr);
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- //DEBUG_INFO("handleSetChargingProfileRequest -13\n");
|
|
|
- //****************chargingSchedulePeriod count start*******************/
|
|
|
- int what_len = strlen("startPeriod");
|
|
|
-
|
|
|
- char tempChargingProfile[1600]={0};
|
|
|
- strcpy(tempChargingProfile,(const char*)sstrtemp);
|
|
|
- char *where = tempChargingProfile;
|
|
|
- if (what_len)
|
|
|
- {
|
|
|
- while ((where = strstr(where, "startPeriod"))) {
|
|
|
- where += what_len;
|
|
|
- chargingSchedulePeriodCount++;
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- if( chargingSchedulePeriodCount > atoi((const char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleMaxPeriods].ItemData))
|
|
|
- {
|
|
|
- sprintf(comfirmstr, "%s", ChargingProfileStatusStr[ChargingProfileStatus_Rejected] );
|
|
|
- goto end;
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- //DEBUG_INFO("chargingSchedulePeriodCount=%d\n",chargingSchedulePeriodCount);
|
|
|
- //where = payload;
|
|
|
- int templength = 0;
|
|
|
- //int searchstart = 0;
|
|
|
- for(int periodNums=0; periodNums < chargingSchedulePeriodCount; periodNums++)
|
|
|
- {
|
|
|
- //****************startPeriod*******************/
|
|
|
- c=0;
|
|
|
- loc = strstr(tempChargingProfile + templength, "startPeriod");
|
|
|
- memset(sstr ,0, sizeof(sstr) );
|
|
|
- while ((loc[strlen("startPeriod")+2+c] != '}') && (loc[strlen("startPeriod")+2+c] != ','))
|
|
|
- {
|
|
|
- sstr[c] = loc[strlen("startPeriod")+2+c];
|
|
|
- //printf("i=%d sstr=%c\n",c, sstr[c]);
|
|
|
- c++;
|
|
|
- }
|
|
|
- sstr[c] = '\0';
|
|
|
- startPeriodInt[periodNums] = atoi(sstr);
|
|
|
- //DEBUG_INFO("sstr=%d\n",atoi(sstr));
|
|
|
- //DEBUG_INFO("handleSetChargingProfileRequest -13 -1 -1\n");
|
|
|
- if(connectorIdInt == 0) // an overall limit for the Charge Point.
|
|
|
- {
|
|
|
- ShmOCPP16Data->SetChargingProfile[0].ChargingProfile.ChargingSchedule.ChargingSchedulePeriod[periodNums].StartPeriod = startPeriodInt[periodNums];
|
|
|
-
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- ShmOCPP16Data->SetChargingProfile[connectorIdInt -1].ChargingProfile.ChargingSchedule.ChargingSchedulePeriod[periodNums].StartPeriod = startPeriodInt[periodNums];
|
|
|
- }
|
|
|
-
|
|
|
- templength = strlen("startPeriod")+2+c;
|
|
|
-
|
|
|
- //DEBUG_INFO("handleSetChargingProfileRequest -13 -2\n");
|
|
|
- //****************limit*******************/
|
|
|
- c=0;
|
|
|
- loc = strstr(tempChargingProfile + templength, "limit");
|
|
|
- memset(sstr ,0, sizeof(sstr) );
|
|
|
- while ((loc[strlen("limit")+2+c] != '}') && (loc[strlen("limit")+2+c] != ','))
|
|
|
- {
|
|
|
- sstr[c] = loc[strlen("limit")+2+c];
|
|
|
- //printf("i=%d sstr=%c\n",c, sstr[c]);
|
|
|
- c++;
|
|
|
- }
|
|
|
- sstr[c] = '\0';
|
|
|
- limitflaot[periodNums] = atof(sstr);
|
|
|
-
|
|
|
- if(connectorIdInt == 0) // an overall limit for the Charge Point.
|
|
|
- {
|
|
|
- ShmOCPP16Data->SetChargingProfile[0].ChargingProfile.ChargingSchedule.ChargingSchedulePeriod[periodNums].Limit = limitflaot[periodNums];
|
|
|
-
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- ShmOCPP16Data->SetChargingProfile[connectorIdInt -1].ChargingProfile.ChargingSchedule.ChargingSchedulePeriod[periodNums].Limit = limitflaot[periodNums];
|
|
|
- }
|
|
|
-
|
|
|
- templength = templength + strlen("limit")+2+c;
|
|
|
-
|
|
|
- //****************numberPhases*******************/
|
|
|
- loc = strstr(tempChargingProfile + templength, "numberPhases");
|
|
|
- if(loc != NULL)
|
|
|
- {
|
|
|
- c=0;
|
|
|
- memset(sstr ,0, sizeof(sstr) );
|
|
|
- while ((loc[strlen("numberPhases")+2+c] != '}') && (loc[strlen("numberPhases")+2+c] != ','))
|
|
|
- {
|
|
|
- sstr[c] = loc[strlen("numberPhases")+2+c];
|
|
|
- //printf("i=%d sstr=%c\n",c, sstr[c]);
|
|
|
- c++;
|
|
|
- }
|
|
|
- sstr[c] = '\0';
|
|
|
- numberPhasesInt[periodNums] = atoi(sstr);
|
|
|
-
|
|
|
- if(connectorIdInt == 0) // an overall limit for the Charge Point.
|
|
|
- {
|
|
|
- ShmOCPP16Data->SetChargingProfile[0].ChargingProfile.ChargingSchedule.ChargingSchedulePeriod[periodNums].NumberPhases = numberPhasesInt[periodNums];
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- ShmOCPP16Data->SetChargingProfile[connectorIdInt -1].ChargingProfile.ChargingSchedule.ChargingSchedulePeriod[periodNums].NumberPhases = numberPhasesInt[periodNums];
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- templength = templength + strlen("numberPhases")+2+c;
|
|
|
- }
|
|
|
-
|
|
|
- //where = loc;
|
|
|
- }
|
|
|
- //****************chargingSchedulePeriod count end*******************/
|
|
|
-
|
|
|
-
|
|
|
- //*********************minChargingRate***************************/
|
|
|
- loc = strstr(sstrtemp, "minChargingRate");
|
|
|
-
|
|
|
- if(loc != NULL)
|
|
|
- {
|
|
|
- c = 0;
|
|
|
- memset(sstr ,0, sizeof(sstr) );
|
|
|
- while ((loc[strlen("minChargingRate")+2+c] != ',')&&(loc[strlen("minChargingRate")+2+c] != '}'))
|
|
|
- {
|
|
|
- sstr[c] = loc[strlen("minChargingRate")+2+c];
|
|
|
- c++;
|
|
|
- }
|
|
|
- sstr[c] = '\0';
|
|
|
- minChargingRateFloat = atof(sstr);
|
|
|
-
|
|
|
- if(connectorIdInt == 0) // an overall limit for the Charge Point.
|
|
|
- {
|
|
|
- ShmOCPP16Data->SetChargingProfile[0].ChargingProfile.ChargingSchedule.MinChargingRate = minChargingRateFloat;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- ShmOCPP16Data->SetChargingProfile[connectorIdInt -1].ChargingProfile.ChargingSchedule.MinChargingRate = minChargingRateFloat;
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- if(connectorIdInt == 0) // an overall limit for the Charge Point.
|
|
|
- {
|
|
|
- ShmOCPP16Data->SetChargingProfile[0].ChargingProfile.ChargingSchedule.MinChargingRate = 0.0;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- ShmOCPP16Data->SetChargingProfile[connectorIdInt -1].ChargingProfile.ChargingSchedule.MinChargingRate = 0.0;
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- if(strcmp(chargingProfilePurposeStr, ChargingProfilePurposeTypeStr[ChargePointMaxProfile]) == 0)
|
|
|
- {
|
|
|
- DEBUG_INFO("chargingProfilePurposeStr is ChargePointMaxProfile !!! \n");
|
|
|
- if(connectorIdInt != 0)
|
|
|
- {
|
|
|
- sprintf(comfirmstr, "%s", ChargingProfileStatusStr[ChargingProfileStatus_Rejected] );
|
|
|
- goto end;
|
|
|
- }
|
|
|
-
|
|
|
- strcpy(filename, ChargePointMaxProfile_JSON );
|
|
|
- fptr1 = fopen(filename, "r");
|
|
|
- if (!fptr1)
|
|
|
- {
|
|
|
- //file not exist
|
|
|
- DEBUG_INFO("Unable to open the input file!!\n");
|
|
|
- fptr1 = fopen(filename, "w+");
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- //Check Charging Profile Count
|
|
|
- while(fscanf(fptr1, "%s", word) != EOF)
|
|
|
- {
|
|
|
- //DEBUG_INFO("word=%s\n",word);
|
|
|
- if(strstr(word, "chargingProfileId")!= NULL)
|
|
|
- {
|
|
|
- //DEBUG_INFO("test chargingProfileId \n");
|
|
|
- n_chargingProfile = n_chargingProfile + 1;
|
|
|
- //DEBUG_INFO("chargingProfileId Found\n");
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- fclose(fptr1);
|
|
|
-
|
|
|
- }
|
|
|
- else if(strcmp(chargingProfilePurposeStr, ChargingProfilePurposeTypeStr[TxDefaultProfile]) == 0)
|
|
|
- {
|
|
|
- DEBUG_INFO("chargingProfilePurposeStr is TxDefaultProfile !!! \n");
|
|
|
- if((connectorIdInt != 0) && (connectorIdInt > gunTotalNumber /*(CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY)*/))
|
|
|
- {
|
|
|
- sprintf(comfirmstr, "%s", ChargingProfileStatusStr[ChargingProfileStatus_Rejected] );
|
|
|
- goto end;
|
|
|
- }
|
|
|
-
|
|
|
- memset(filename, 0, sizeof filename);
|
|
|
- sprintf(filename, "/Storage/OCPP/TxDefaultProfile_%d.json", connectorIdInt);
|
|
|
-
|
|
|
- fptr1 = fopen(filename, "r");
|
|
|
- if (!fptr1)
|
|
|
- {
|
|
|
- //file not exist
|
|
|
- //DEBUG_INFO("Unable to open the input file!!\n");
|
|
|
- fptr1 = fopen(filename, "w+");
|
|
|
-
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- //Check Charging Profile Count
|
|
|
- while(fscanf(fptr1, "%s", word) != EOF)
|
|
|
- {
|
|
|
- //DEBUG_INFO("word=%s\n",word);
|
|
|
- if(strstr(word, "chargingProfileId")!= NULL)
|
|
|
- {
|
|
|
- //DEBUG_INFO("test chargingProfileId \n");
|
|
|
- n_chargingProfile = n_chargingProfile + 1;
|
|
|
- //DEBUG_INFO("chargingProfileId Found\n");
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- fclose(fptr1);
|
|
|
- }
|
|
|
- else if(strcmp(chargingProfilePurposeStr, ChargingProfilePurposeTypeStr[TxProfile]) == 0)
|
|
|
- {
|
|
|
- //printf("set chargingProfile 1-4\n");
|
|
|
- DEBUG_INFO("chargingProfilePurposeStr is TxProfile !!! \n");
|
|
|
-
|
|
|
- //---TxProfile SHALL only be set at Charge Point ConnectorId > 0. ---//
|
|
|
- if(connectorIdInt == 0)
|
|
|
- {
|
|
|
- sprintf(comfirmstr, "%s", ChargingProfileStatusStr[ChargingProfileStatus_Rejected] );
|
|
|
- goto end;
|
|
|
- }
|
|
|
-
|
|
|
- int tempIndex = 0;
|
|
|
- //check Transaction active
|
|
|
- if(gunType[connectorIdInt -1] == 'J')
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
- {
|
|
|
- tempIndex = (((connectorIdInt -1)==2) ? 1: 0);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tempIndex = connectorIdInt -1;
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < CHAdeMO_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_CHARGING) // S_CHARGING
|
|
|
- {
|
|
|
- if(transactionIdInt == ShmOCPP16Data->StartTransaction[connectorIdInt -1].ResponseTransactionId)
|
|
|
- {
|
|
|
- meet = TRUE;
|
|
|
- break;
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- }
|
|
|
- else if((gunType[connectorIdInt -1] == 'U')||(gunType[connectorIdInt -1] == 'E'))
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
- {
|
|
|
- tempIndex = (((connectorIdInt -1)==2) ? 1: 0);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tempIndex = connectorIdInt -1;
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < CCS_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_CHARGING) // S_CHARGING
|
|
|
- {
|
|
|
- if(transactionIdInt == ShmOCPP16Data->StartTransaction[connectorIdInt -1].ResponseTransactionId)
|
|
|
- {
|
|
|
- meet = TRUE;
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
- else if(gunType[connectorIdInt -1] == 'G')
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
- {
|
|
|
- tempIndex = (((connectorIdInt -1)==2) ? 1: 0);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tempIndex = connectorIdInt -1;
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < GB_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_CHARGING) // S_CHARGING
|
|
|
- {
|
|
|
- if(transactionIdInt == ShmOCPP16Data->StartTransaction[connectorIdInt -1].ResponseTransactionId)
|
|
|
- {
|
|
|
- meet = TRUE;
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
-
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D') // 'D' means DC
|
|
|
- {
|
|
|
- tempIndex = 2;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tempIndex = (connectorIdInt -1);
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < AC_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_CHARGING) // S_CHARGING
|
|
|
- {
|
|
|
- if(transactionIdInt == ShmOCPP16Data->StartTransaction[connectorIdInt -1].ResponseTransactionId)
|
|
|
- {
|
|
|
- meet = TRUE;
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- //check Transaction active
|
|
|
-
|
|
|
- if(meet == FALSE)
|
|
|
- {
|
|
|
- sprintf(comfirmstr, "%s", ChargingProfileStatusStr[ChargingProfileStatus_Rejected] );
|
|
|
- goto end;
|
|
|
- }
|
|
|
-
|
|
|
- if((connectorIdInt != 0) && (connectorIdInt > gunTotalNumber /*(CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY)*/))
|
|
|
- {
|
|
|
- sprintf(comfirmstr, "%s", ChargingProfileStatusStr[ChargingProfileStatus_Rejected] );
|
|
|
- goto end;
|
|
|
- }
|
|
|
-
|
|
|
- sprintf(filename, "/Storage/OCPP/TxProfile_%d.json", connectorIdInt);
|
|
|
-
|
|
|
- fptr1 = fopen(filename, "r");
|
|
|
- if (!fptr1)
|
|
|
- {
|
|
|
- //file not exist
|
|
|
- DEBUG_INFO("Unable to open the input file!!\n");
|
|
|
- fptr1 = fopen(filename, "w+");
|
|
|
-
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- //Check Charging Profile Count
|
|
|
- while(fscanf(fptr1, "%s", word) != EOF)
|
|
|
- {
|
|
|
- //DEBUG_INFO("word=%s\n",word);
|
|
|
- if(strstr(word, "chargingProfileId")!= NULL)
|
|
|
- {
|
|
|
- //DEBUG_INFO("test chargingProfileId \n");
|
|
|
- n_chargingProfile = n_chargingProfile + 1;
|
|
|
- //DEBUG_INFO("chargingProfileId Found\n");
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- fclose(fptr1);
|
|
|
- }
|
|
|
-
|
|
|
- // Check ChargeProfileMaxStackLevel
|
|
|
- if(n_chargingProfile >= atoi((const char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargeProfileMaxStackLevel].ItemData))
|
|
|
- {
|
|
|
- sprintf(comfirmstr, "%s", ChargingProfileStatusStr[ChargingProfileStatus_Rejected] );
|
|
|
- goto end;
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- //------------------------------Satrt: Check Configuration Key "MaxChargingProfilesInstalled" Logic---------------------------------------//
|
|
|
- {
|
|
|
- int i = 0;
|
|
|
- char fnametemp[200]={0};
|
|
|
- n_chargingProfile = 0;
|
|
|
- //Check ChargePointMaxProfile.json exit
|
|
|
- if((access("/Storage/OCPP/ChargePointMaxProfile.json",F_OK))!=-1)
|
|
|
- {
|
|
|
- fptr1 = fopen("/Storage/OCPP/ChargePointMaxProfile.json", "r");
|
|
|
- //Check Charging Profile Count
|
|
|
- while(fscanf(fptr1, "%s", word) != EOF)
|
|
|
- {
|
|
|
- //DEBUG_INFO("word=%s\n",word);
|
|
|
- if(strstr(word, "chargingProfileId")!= NULL)
|
|
|
- {
|
|
|
- //DEBUG_INFO("test chargingProfileId \n");
|
|
|
- n_chargingProfile = n_chargingProfile + 1;
|
|
|
- i = i + 1;
|
|
|
- //DEBUG_INFO("chargingProfileId Found\n");
|
|
|
- }
|
|
|
- memset(word, 0, sizeof word);
|
|
|
- }
|
|
|
- fclose(fptr1);
|
|
|
- DEBUG_INFO("ChargePointMaxProfile.json has %d charging Profile\n",i );
|
|
|
- }
|
|
|
-
|
|
|
- //Check TxDefaultProfile_0.json exit
|
|
|
- if((access("/Storage/OCPP/TxDefaultProfile_0.json",F_OK))!=-1)
|
|
|
- {
|
|
|
- i = 0;
|
|
|
- fptr1 = fopen("/Storage/OCPP/TxDefaultProfile_0.json", "r");
|
|
|
- //Check Charging Profile Count
|
|
|
- while(fscanf(fptr1, "%s", word) != EOF)
|
|
|
- {
|
|
|
- //DEBUG_INFO("word=%s\n",word);
|
|
|
- if(strstr(word, "chargingProfileId")!= NULL)
|
|
|
- {
|
|
|
- //DEBUG_INFO("test chargingProfileId \n");
|
|
|
- n_chargingProfile = n_chargingProfile + 1;
|
|
|
- i = i + 1;
|
|
|
- //DEBUG_INFO("chargingProfileId Found\n");
|
|
|
- }
|
|
|
- memset(word, 0, sizeof word);
|
|
|
- }
|
|
|
- fclose(fptr1);
|
|
|
- DEBUG_INFO("TxDefaultProfile_0.json has %d charging Profile\n",i );
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- //Check TxDefaultProfile_%d.json
|
|
|
- for(int j=1; j <= gunTotalNumber; j++)
|
|
|
- {
|
|
|
- memset(fnametemp, 0, sizeof fnametemp);
|
|
|
- sprintf(fnametemp, "/Storage/OCPP/TxDefaultProfile_%d.json", j);
|
|
|
- if((access(fnametemp,F_OK))!=-1)
|
|
|
- {
|
|
|
- i = 0;
|
|
|
- fptr1 = fopen(fnametemp, "r");
|
|
|
- //Check Charging Profile Count
|
|
|
- while(fscanf(fptr1, "%s", word) != EOF)
|
|
|
- {
|
|
|
- //DEBUG_INFO("word=%s\n",word);
|
|
|
- if(strstr(word, "chargingProfileId")!= NULL)
|
|
|
- {
|
|
|
- //DEBUG_INFO("test chargingProfileId \n");
|
|
|
- n_chargingProfile = n_chargingProfile + 1;
|
|
|
- i = i + 1;
|
|
|
- //DEBUG_INFO("chargingProfileId Found\n");
|
|
|
- }
|
|
|
- memset(word, 0, sizeof word);
|
|
|
- }
|
|
|
- fclose(fptr1);
|
|
|
- DEBUG_INFO("%s has %d charging Profile\n",fnametemp, i);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- //Check TxProfile_%d.json
|
|
|
- for(int j=1; j <= gunTotalNumber; j++)
|
|
|
- {
|
|
|
- memset(fnametemp, 0, sizeof fnametemp);
|
|
|
- sprintf(fnametemp, "/Storage/OCPP/TxProfile_%d.json", j);
|
|
|
- if((access(fnametemp,F_OK))!=-1)
|
|
|
- {
|
|
|
- i = 0;
|
|
|
- fptr1 = fopen(fnametemp, "r");
|
|
|
- //Check Charging Profile Count
|
|
|
- while(fscanf(fptr1, "%s", word) != EOF)
|
|
|
- {
|
|
|
- //DEBUG_INFO("word=%s\n",word);
|
|
|
- if(strstr(word, "chargingProfileId")!= NULL)
|
|
|
- {
|
|
|
- //DEBUG_INFO("test chargingProfileId \n");
|
|
|
- n_chargingProfile = n_chargingProfile + 1;
|
|
|
- i = i + 1;
|
|
|
- //DEBUG_INFO("chargingProfileId Found\n");
|
|
|
- }
|
|
|
- memset(word, 0, sizeof word);
|
|
|
- }
|
|
|
- fclose(fptr1);
|
|
|
- DEBUG_INFO("%s has %d charging Profile\n",fnametemp, i);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- if( n_chargingProfile > atoi((const char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[MaxChargingProfilesInstalled].ItemData))
|
|
|
- {
|
|
|
- sprintf(comfirmstr, "%s", ChargingProfileStatusStr[ChargingProfileStatus_Rejected] );
|
|
|
- goto end;
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
- //------------------------------End: Check Configuration Key "MaxChargingProfilesInstalled" Logic---------------------------------------//
|
|
|
-
|
|
|
- //**********************************Write to File********************************************************/
|
|
|
- FILE *infile;
|
|
|
- FILE *outfile;
|
|
|
-
|
|
|
- // open file for writing
|
|
|
- infile = fopen (filename, "r");
|
|
|
- outfile = fopen (tempfile, "w");
|
|
|
-
|
|
|
-
|
|
|
- int d =0;
|
|
|
- d = fgetc(infile);
|
|
|
- //DEBUG_INFO("d:%d\n",d);
|
|
|
- rewind(infile);
|
|
|
-
|
|
|
- //*璉 瘚 辣蝏 1嚗 0 */
|
|
|
- if(d == EOF)
|
|
|
- {
|
|
|
- //DEBUG_INFO("ChargingProfile content is NULL\n");
|
|
|
-
|
|
|
- fprintf(outfile,"%s\n",payload);
|
|
|
- sprintf(comfirmstr, "%s", ChargingProfileStatusStr[ChargingProfileStatus_Accepted] );
|
|
|
-
|
|
|
-
|
|
|
- fclose(infile);
|
|
|
- fclose(outfile);
|
|
|
-
|
|
|
- sprintf(rmFileCmd,"rm -f %s",filename);
|
|
|
- system(rmFileCmd);
|
|
|
-
|
|
|
- rename(tempfile, filename);
|
|
|
- sleep(1);
|
|
|
- //sprintf(rmFileCmd,"rm -f %s",tempfile);
|
|
|
- //system(rmFileCmd);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- char buf[1000]={0};
|
|
|
- int ChargingProfileAdded = FALSE;
|
|
|
-
|
|
|
- while (fgets(buf, sizeof(buf), infile) != NULL)
|
|
|
- {
|
|
|
- buf[strlen(buf) - 1] = '\0'; // eat the newline fgets() stores
|
|
|
- //*************************tempconnectorIdInt*********************************/
|
|
|
- loc = strstr(buf, "connectorId");
|
|
|
- c = 0;
|
|
|
- memset(sstr ,0, sizeof(sstr) );
|
|
|
- while (loc[strlen("connectorId")+2+c] != ',')
|
|
|
- {
|
|
|
- sstr[c] = loc[strlen("connectorId")+2+c];
|
|
|
- c++;
|
|
|
- }
|
|
|
- sstr[c] = '\0';
|
|
|
- tempconnectorIdInt = atoi(sstr);
|
|
|
-
|
|
|
-
|
|
|
- //*************************tempchargingProfileIdInt*********************************/
|
|
|
- loc = strstr(buf, "chargingProfileId");
|
|
|
- c = 0;
|
|
|
- memset(sstr ,0, sizeof(sstr) );
|
|
|
- while (loc[strlen("chargingProfileId")+2+c] != ',')
|
|
|
- {
|
|
|
- sstr[c] = loc[strlen("chargingProfileId")+2+c];
|
|
|
- c++;
|
|
|
- }
|
|
|
- sstr[c] = '\0';
|
|
|
- tempchargingProfileIdInt = atoi(sstr);
|
|
|
-
|
|
|
-
|
|
|
- //*************************tempstackLevelInt*********************************/
|
|
|
- loc = strstr(buf, "stackLevel");
|
|
|
- c = 0;
|
|
|
- memset(sstr ,0, sizeof(sstr) );
|
|
|
- while (loc[strlen("stackLevel")+2+c] != ',')
|
|
|
- {
|
|
|
- sstr[c] = loc[strlen("stackLevel")+2+c];
|
|
|
- c++;
|
|
|
- }
|
|
|
- sstr[c] = '\0';
|
|
|
- tempstackLevelInt = atoi(sstr);
|
|
|
-
|
|
|
-
|
|
|
- //*************************tempchargingProfilePurposeStr*********************************/
|
|
|
- loc = strstr(payload, "chargingProfilePurpose");
|
|
|
- c = 0;
|
|
|
- memset(sstr ,0, sizeof(sstr) );
|
|
|
- while (loc[3+strlen("chargingProfilePurpose")+c] != '\"')
|
|
|
- {
|
|
|
- sstr[c] = loc[3+strlen("chargingProfilePurpose")+c];
|
|
|
- //printf("i=%d sstr=%c\n",c, sstr[c]);
|
|
|
- c++;
|
|
|
- }
|
|
|
- sstr[c] = '\0';
|
|
|
- strcpy(tempchargingProfilePurposeStr,sstr);
|
|
|
-
|
|
|
- if((tempconnectorIdInt == connectorIdInt) && (tempchargingProfileIdInt == chargingProfileIdInt))
|
|
|
- {
|
|
|
- if((tempstackLevelInt == stackLevelInt) && (strcmp(tempchargingProfilePurposeStr, chargingProfilePurposeStr) == 0))
|
|
|
- {
|
|
|
- //DEBUG_INFO("update set chargingProfile to file -0\n");
|
|
|
- if(ChargingProfileAdded == FALSE)
|
|
|
- {
|
|
|
- fprintf(outfile,"%s\n",payload);
|
|
|
- ChargingProfileAdded = TRUE;
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- if(tempstackLevelInt < stackLevelInt)
|
|
|
- {
|
|
|
- if(ChargingProfileAdded == FALSE)
|
|
|
- {
|
|
|
- fprintf(outfile,"%s\n",payload);
|
|
|
- ChargingProfileAdded = TRUE;
|
|
|
- fprintf(outfile,"%s\n",buf);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- fprintf(outfile,"%s\n",buf);
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- if(ChargingProfileAdded == FALSE)
|
|
|
- {
|
|
|
- fprintf(outfile,"%s\n",buf);
|
|
|
- fprintf(outfile,"%s\n",payload);
|
|
|
- ChargingProfileAdded = TRUE;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- fprintf(outfile,"%s\n",buf);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- if(tempchargingProfileIdInt < chargingProfileIdInt)
|
|
|
- {
|
|
|
- if(ChargingProfileAdded == FALSE)
|
|
|
- {
|
|
|
- fprintf(outfile,"%s\n",payload);
|
|
|
- ChargingProfileAdded = TRUE;
|
|
|
- fprintf(outfile,"%s\n",buf);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- fprintf(outfile,"%s\n",buf);
|
|
|
- }
|
|
|
- }
|
|
|
- else if(tempstackLevelInt < stackLevelInt)
|
|
|
- {
|
|
|
- if(ChargingProfileAdded == FALSE)
|
|
|
- {
|
|
|
- fprintf(outfile,"%s\n",payload);
|
|
|
- ChargingProfileAdded = TRUE;
|
|
|
- fprintf(outfile,"%s\n",buf);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- fprintf(outfile,"%s\n",buf);
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- if(ChargingProfileAdded == FALSE)
|
|
|
- {
|
|
|
- fprintf(outfile,"%s\n",buf);
|
|
|
- fprintf(outfile,"%s\n",payload);
|
|
|
- ChargingProfileAdded = TRUE;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- fprintf(outfile,"%s\n",buf);
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- } // end of while loop
|
|
|
-
|
|
|
- fclose(infile);
|
|
|
- fclose(outfile);
|
|
|
-
|
|
|
- sprintf(rmFileCmd,"rm -f %s",filename);
|
|
|
- system(rmFileCmd);
|
|
|
-
|
|
|
- rename(tempfile, filename);
|
|
|
- sleep(1);
|
|
|
-
|
|
|
- result = TRUE;
|
|
|
- sprintf(comfirmstr, "%s", ChargingProfileStatusStr[ChargingProfileStatus_Accepted] );
|
|
|
- }
|
|
|
-
|
|
|
-end:
|
|
|
- sendSetChargingProfileConfirmation(uuid, comfirmstr);
|
|
|
- return result;
|
|
|
-
|
|
|
- return result;
|
|
|
-}
|
|
|
-
|
|
|
-int handleTriggerMessageRequest(char *uuid, char *payload)
|
|
|
-{
|
|
|
- mtrace();
|
|
|
- int result = FAIL;
|
|
|
- int connectorIdIsNULL = FALSE;
|
|
|
- int connectorIdInt =0;
|
|
|
- char sstr[40]={0},sstrtemp[100]={ 0 };
|
|
|
- char requestedMessagestr[40]={0};
|
|
|
- char comfirmstr[20]={0};
|
|
|
- int c = 0;
|
|
|
- char *loc;
|
|
|
-
|
|
|
- DEBUG_INFO("handleTriggerMessageRequest\n");
|
|
|
- //[2,"266e23f4-27a4-41cf-84cb-aadf56b9523f","TriggerMessage",{"requestedMessage":"DiagnosticsStatusNotification","connectorId":1}]
|
|
|
- strcpy(sstrtemp, stringtrimspace(payload));
|
|
|
-
|
|
|
- c = 0;
|
|
|
- loc = strstr(sstrtemp, "requestedMessage");
|
|
|
- while (loc[3+strlen("requestedMessage")+c] != '\"')
|
|
|
- {
|
|
|
- sstr[c] = loc[3+strlen("requestedMessage")+c];
|
|
|
- c++;
|
|
|
- }
|
|
|
- sstr[c] = '\0';
|
|
|
- strcpy(requestedMessagestr, sstr);
|
|
|
-
|
|
|
- c = 0;
|
|
|
- loc = strstr(sstrtemp, "connectorId");
|
|
|
- if(loc == NULL)
|
|
|
- {
|
|
|
- connectorIdIsNULL = TRUE;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- memset(sstr ,0, sizeof(sstr) );
|
|
|
- while ((loc[strlen("connectorId")+2+c] != ',')&&(loc[strlen("connectorId")+2+c] != '}'))
|
|
|
- {
|
|
|
- sstr[c] = loc[strlen("connectorId")+2+c];
|
|
|
- //printf("i=%d sstr=%c\n",c, sstr[c]);
|
|
|
- c++;
|
|
|
- }
|
|
|
- sstr[c] = '\0';
|
|
|
- connectorIdInt = atoi(sstr);
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- if(connectorIdIsNULL == FALSE && ((connectorIdInt > 0) && (connectorIdInt <= gunTotalNumber /*(CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY)*/ )))
|
|
|
- {
|
|
|
- //connectorIdInt = json_object_get_int(connectorId);
|
|
|
- sprintf((char *)ShmOCPP16Data->TriggerMessage[connectorIdInt -1].RequestedMessage, "%s" ,requestedMessagestr);
|
|
|
- ShmOCPP16Data->TriggerMessage[connectorIdInt -1].ConnectorId = connectorIdInt;
|
|
|
- //ShmOCPP16Data->CsMsg.bits[connectorIdInt -1].TriggerMessageReq = 1;
|
|
|
- sprintf(comfirmstr, "%s",TriggerMessageStatusStr[TriggerMessageStatus_Accepted] );
|
|
|
- sendTriggerMessageConfirmation(uuid,comfirmstr);
|
|
|
- }
|
|
|
- else if(connectorIdIsNULL == FALSE && ((connectorIdInt <= 0) || (connectorIdInt > gunTotalNumber /*(CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY)*/) ))
|
|
|
- {
|
|
|
- sprintf(comfirmstr, "%s",TriggerMessageStatusStr[TriggerMessageStatus_Rejected] );
|
|
|
- sendTriggerMessageConfirmation(uuid,comfirmstr);
|
|
|
- return TRUE;
|
|
|
- }
|
|
|
-
|
|
|
- if((strcmp(requestedMessagestr, MessageTriggerStr[FirmwareStatusNotification]) != 0) &&
|
|
|
- (strcmp(requestedMessagestr, MessageTriggerStr[DiagnosticsStatusNotification]) != 0) &&
|
|
|
- (strcmp(requestedMessagestr, MessageTriggerStr[BootNotification]) != 0 ) &&
|
|
|
- (strcmp(requestedMessagestr, MessageTriggerStr[Heartbeat]) != 0) &&
|
|
|
- (strcmp(requestedMessagestr, MessageTriggerStr[MeterValues]) != 0) &&
|
|
|
- (strcmp(requestedMessagestr, MessageTriggerStr[StatusNotification]) != 0 ))
|
|
|
- {
|
|
|
- sprintf(comfirmstr, "%s",TriggerMessageStatusStr[TriggerMessageStatus_NotImplemented] );
|
|
|
- sendTriggerMessageConfirmation(uuid,comfirmstr);
|
|
|
- return TRUE;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- sprintf(comfirmstr, "%s",TriggerMessageStatusStr[TriggerMessageStatus_Accepted] );
|
|
|
- sendTriggerMessageConfirmation(uuid,comfirmstr);
|
|
|
- }
|
|
|
-
|
|
|
- if( strcmp(requestedMessagestr, MessageTriggerStr[FirmwareStatusNotification]) == 0)
|
|
|
- {
|
|
|
- if((FirmwareStatusNotificationStatus != FIRMWARE_STATUS_DOWNLOADING) &&
|
|
|
- (FirmwareStatusNotificationStatus != FIRMWARE_STATUS_IDLE) &&
|
|
|
- (FirmwareStatusNotificationStatus != FIRMWARE_STATUS_INSTALLING) )
|
|
|
- {
|
|
|
- FirmwareStatusNotificationStatus = FIRMWARE_STATUS_IDLE;
|
|
|
- }
|
|
|
-
|
|
|
- sendFirmwareStatusNotificationRequest(FirmwareStatusStr[FirmwareStatusNotificationStatus]);
|
|
|
- //sprintf(comfirmstr, "%s",TriggerMessageStatusStr[TriggerMessageStatus_Accepted] );
|
|
|
-
|
|
|
- }
|
|
|
- else if(strcmp(requestedMessagestr, MessageTriggerStr[DiagnosticsStatusNotification]) == 0 )
|
|
|
- {
|
|
|
- //printf("DiagnosticsStatusStr[DiagnosticsStatus_Idle] =%s\n",DiagnosticsStatusStr[DiagnosticsStatus_Idle]);
|
|
|
- sendDiagnosticsStatusNotificationRequest(DiagnosticsStatusStr[DiagnosticsStatusNotificationStatus]);
|
|
|
- //sprintf(comfirmstr, "%s",TriggerMessageStatusStr[TriggerMessageStatus_Accepted] );
|
|
|
-
|
|
|
- }
|
|
|
- else if(strcmp(requestedMessagestr, MessageTriggerStr[BootNotification]) == 0 )
|
|
|
- {
|
|
|
- sendBootNotificationRequest();
|
|
|
- //sprintf(comfirmstr, "%s",TriggerMessageStatusStr[TriggerMessageStatus_Accepted] );
|
|
|
-
|
|
|
- }
|
|
|
- else if(strcmp(requestedMessagestr, MessageTriggerStr[Heartbeat]) == 0 )
|
|
|
- {
|
|
|
- sendHeartbeatRequest(connectorIdInt);
|
|
|
- //sprintf(comfirmstr, "%s",TriggerMessageStatusStr[TriggerMessageStatus_Accepted] );
|
|
|
- }
|
|
|
- else if (strcmp(requestedMessagestr, MessageTriggerStr[MeterValues]) == 0 )
|
|
|
- {
|
|
|
- if(connectorIdIsNULL == FALSE)
|
|
|
- {
|
|
|
- if((connectorIdInt > 0) && ((connectorIdInt -1) < gunTotalNumber))
|
|
|
- {
|
|
|
- ShmOCPP16Data->CsMsg.bits[connectorIdInt -1].TriggerMessageReq = 1;
|
|
|
- sendMeterValuesRequest(connectorIdInt -1);
|
|
|
- //sprintf(comfirmstr, "%s",TriggerMessageStatusStr[TriggerMessageStatus_Accepted] );
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- for(int idx=0;idx< gunTotalNumber;idx++)
|
|
|
- {
|
|
|
- ShmOCPP16Data->CsMsg.bits[idx].TriggerMessageReq = 1;
|
|
|
- sendMeterValuesRequest(idx);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- else if(strcmp(requestedMessagestr, MessageTriggerStr[StatusNotification]) == 0 )
|
|
|
- {
|
|
|
- if(connectorIdIsNULL == FALSE)
|
|
|
- {
|
|
|
- if((connectorIdInt > 0) && ((connectorIdInt -1) < gunTotalNumber))
|
|
|
- {
|
|
|
- sendStatusNotificationRequest(connectorIdInt -1);
|
|
|
- //sprintf(comfirmstr, "%s",TriggerMessageStatusStr[TriggerMessageStatus_Accepted] );
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- for(int idx=0;idx< gunTotalNumber;idx++)
|
|
|
- sendStatusNotificationRequest(idx);
|
|
|
-
|
|
|
- //sprintf(comfirmstr, "%s",TriggerMessageStatusStr[TriggerMessageStatus_Accepted] );
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- return result;
|
|
|
-}
|
|
|
-
|
|
|
-int handleUnlockConnectorRequest(char *uuid, char *payload)
|
|
|
-{
|
|
|
- mtrace();
|
|
|
- int result = FAIL;
|
|
|
- char sstr[6]={0},sstrtemp[50]={ 0 };
|
|
|
- int connectorIdInt =0;
|
|
|
- char comfirmstr[20]={0};
|
|
|
- int c = 0;
|
|
|
- int tempIndex = 0;
|
|
|
- char *loc;
|
|
|
-
|
|
|
-//[2,"ba1cbd49-2a76-493a-8f76-fa23e7606532","UnlockConnector",{"connectorId":1}]
|
|
|
- DEBUG_INFO("handleUnlockConnectorRequest ...\n");
|
|
|
-
|
|
|
- strcpy(sstrtemp, stringtrimspace(payload));
|
|
|
- c = 0;
|
|
|
- loc = strstr(sstrtemp, "connectorId");
|
|
|
- memset(sstr ,0, sizeof(sstr) );
|
|
|
- while (loc[strlen("connectorId")+2+c] != '}')
|
|
|
- {
|
|
|
- sstr[c] = loc[strlen("connectorId")+2+c];
|
|
|
- //printf("i=%d sstr=%c\n",c, sstr[c]);
|
|
|
- c++;
|
|
|
- }
|
|
|
- sstr[c] = '\0';
|
|
|
- connectorIdInt = atoi(sstr);
|
|
|
- DEBUG_INFO("\n unlock connectorIdInt=%d\n",connectorIdInt);
|
|
|
-
|
|
|
- if(gunTotalNumber == 0)
|
|
|
- {
|
|
|
- sprintf(comfirmstr, "%s", UnlockStatusStr[UnlockStatus_NotSupported] );
|
|
|
- goto end;
|
|
|
- }
|
|
|
- else if((connectorIdInt > gunTotalNumber/*CHAdeMO_QUANTITY+ CCS_QUANTITY + GB_QUANTITY*/) || (connectorIdInt <= 0))
|
|
|
- {
|
|
|
- //sprintf(comfirmstr, "%s", UnlockStatusStr[UnlockStatus_NotSupported] );
|
|
|
- sprintf(comfirmstr, "%s", UnlockStatusStr[UnlockStatus_NotSupported] );
|
|
|
- goto end;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- //check Transaction active
|
|
|
- if(gunType[connectorIdInt-1] == 'J')
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
- {
|
|
|
- tempIndex = (((connectorIdInt -1)==2) ? 1: 0);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tempIndex = connectorIdInt -1;
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < CHAdeMO_QUANTITY; index++)
|
|
|
- {
|
|
|
- if ((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex ) && ((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_CHARGING) || (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_IDLE) ))
|
|
|
- {
|
|
|
- //stop Transaction
|
|
|
- ShmOCPP16Data->CsMsg.bits[connectorIdInt-1].UnlockConnectorReq = 1;
|
|
|
-
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- else if((gunType[connectorIdInt-1] == 'U')||(gunType[connectorIdInt-1] == 'E'))
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
- {
|
|
|
- tempIndex = (((connectorIdInt -1)==2) ? 1: 0);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tempIndex = connectorIdInt -1;
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < CCS_QUANTITY; index++)
|
|
|
- {
|
|
|
- if ((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex ) && ((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_CHARGING) || (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_IDLE) ))
|
|
|
- {
|
|
|
- //stop Transaction
|
|
|
- ShmOCPP16Data->CsMsg.bits[connectorIdInt-1].UnlockConnectorReq = 1;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- else if(gunType[connectorIdInt-1] == 'G')
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
- {
|
|
|
- tempIndex = (((connectorIdInt -1)==2) ? 1: 0);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tempIndex = connectorIdInt -1;
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < GB_QUANTITY; index++)
|
|
|
- {
|
|
|
- if ((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex ) &&((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_CHARGING)||(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_IDLE)))
|
|
|
- {
|
|
|
- //stop Transaction
|
|
|
- ShmOCPP16Data->CsMsg.bits[connectorIdInt-1].UnlockConnectorReq = 1;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
|
|
|
- {
|
|
|
- tempIndex = 2;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tempIndex = connectorIdInt-1;
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < AC_QUANTITY; index++)
|
|
|
- {
|
|
|
- if ((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex ) && ((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_CHARGING) || (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_IDLE) ))
|
|
|
- {
|
|
|
- ShmOCPP16Data->CsMsg.bits[connectorIdInt-1].UnlockConnectorReq = 1;
|
|
|
-
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- ShmOCPP16Data->UnlockConnector[connectorIdInt-1].ConnectorId = connectorIdInt;
|
|
|
- strcpy((char *)ShmOCPP16Data->UnlockConnector[connectorIdInt-1].guid, uuid);
|
|
|
- result = TRUE;
|
|
|
- return result;
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
-end:
|
|
|
- //json_object_put(obj); --- remove temporally
|
|
|
- sendUnlockConnectorConfirmation(uuid, comfirmstr);
|
|
|
- return result;
|
|
|
-}
|
|
|
-
|
|
|
-static char UpdateFirmwarepayloadData[300]={0};
|
|
|
-int handleUpdateFirmwareRequest(char *uuid, char *payload)
|
|
|
-{
|
|
|
- mtrace();
|
|
|
- int result = FAIL;
|
|
|
- pthread_t t;
|
|
|
-
|
|
|
- sendUpdateFirmwareConfirmation(uuid);
|
|
|
- memset(UpdateFirmwarepayloadData, 0, 300);
|
|
|
- strcpy(UpdateFirmwarepayloadData, stringtrimspace(payload));
|
|
|
- pthread_create(&t, NULL, UpdateFirmwareProcess, stringtrimspace(payload));
|
|
|
- ////pthread_join(t, NULL); //
|
|
|
- //pthread_detach(t);
|
|
|
-
|
|
|
- //sendUpdateFirmwareConfirmation(uuid);
|
|
|
- ShmOCPP16Data->MsMsg.bits.UpdateFirmwareConf =1;
|
|
|
- //ShmOCPP16Data->MsMsg.bits.UpdateFirmwareReq = 1;
|
|
|
- return result;
|
|
|
-}
|
|
|
-
|
|
|
-void *UpdateFirmwareProcess(void *data)
|
|
|
-{
|
|
|
- pthread_detach(pthread_self());
|
|
|
- mtrace();
|
|
|
- int retriesInt =0, retryIntervalInt=0;
|
|
|
- char protocol[10], user[50],password[50],host[50], path[50], ftppath[60],host1[50],path1[20];
|
|
|
- int port=0;
|
|
|
- char locationstr[160]={0}, retrieveDatestr[30]={0};
|
|
|
- //char fname[50]="00000_2018-09-07 160902_CSULog.zip";
|
|
|
- //char comfirmstr[20];
|
|
|
- int isSuccess = 0;
|
|
|
- char ftpbuf[200];
|
|
|
- char temp[100];
|
|
|
- char * pch;
|
|
|
- int retriesISNULL=FALSE;
|
|
|
- int retryInterval=FALSE;
|
|
|
- int c = 0;
|
|
|
- //int i = 0;
|
|
|
- char *loc;
|
|
|
- char sstr[300]={ 0 };
|
|
|
- char str[300]={ 0 };
|
|
|
- //char *str = (char*) data; // ? ?頛詨鞈 ?
|
|
|
- DEBUG_INFO("handleUpdateFirmwareRequest ...\n");
|
|
|
- //DEBUG_INFO("packet=%s\n", (const char*)payloadData);
|
|
|
- strcpy(str,(const char*)UpdateFirmwarepayloadData);
|
|
|
- //***************location **************/
|
|
|
- loc = strstr(str, "location");
|
|
|
- memset(sstr ,0, sizeof(sstr) );
|
|
|
- c = 0;
|
|
|
- while (loc[3+strlen("location")+c] != '\"')
|
|
|
- {
|
|
|
- sstr[c] = loc[3+strlen("location")+c];
|
|
|
- c++;
|
|
|
- }
|
|
|
- sstr[c] = '\0';
|
|
|
- strcpy(locationstr, sstr);
|
|
|
-
|
|
|
- //***************retries**************/
|
|
|
- c = 0;
|
|
|
- loc = strstr(str, "retries");
|
|
|
- if(loc == NULL)
|
|
|
- {
|
|
|
- retriesISNULL=TRUE;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- memset(sstr ,0, sizeof(sstr) );
|
|
|
- while (loc[strlen("retries")+2+c] != ',')
|
|
|
- {
|
|
|
- sstr[c] = loc[strlen("retries")+2+c];
|
|
|
- //printf("i=%d sstr=%c\n",c, sstr[c]);
|
|
|
- c++;
|
|
|
- }
|
|
|
- sstr[c] = '\0';
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- if(retriesISNULL == FALSE)
|
|
|
- {
|
|
|
- retriesInt = atoi(sstr);
|
|
|
- }
|
|
|
-
|
|
|
- //***************retrieveDate **************/
|
|
|
- loc = strstr(str, "retrieveDate");
|
|
|
- memset(sstr ,0, sizeof(sstr) );
|
|
|
- c = 0;
|
|
|
- while (loc[3+strlen("retrieveDate")+c] != '\"')
|
|
|
- {
|
|
|
- sstr[c] = loc[3+strlen("retrieveDate")+c];
|
|
|
- c++;
|
|
|
- }
|
|
|
- sstr[c] = '\0';
|
|
|
- strcpy(retrieveDatestr, sstr);
|
|
|
-
|
|
|
- //***************retryInterval **************/
|
|
|
- c = 0;
|
|
|
- loc = strstr(str, "retryInterval");
|
|
|
- memset(sstr ,0, sizeof(sstr) );
|
|
|
- if(loc == NULL)
|
|
|
- {
|
|
|
- retryInterval=TRUE;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- while ((loc[strlen("retryInterval")+2+c] != ',') && (loc[strlen("retryInterval")+2+c] != '}'))
|
|
|
- {
|
|
|
- sstr[c] = loc[strlen("retryInterval")+2+c];
|
|
|
- //DEBUG_INFO("i=%d sstr=%c\n",c, sstr[c]);
|
|
|
- c++;
|
|
|
- }
|
|
|
- sstr[c] = '\0';
|
|
|
- }
|
|
|
-
|
|
|
- if(retryInterval==FALSE)
|
|
|
- {
|
|
|
- retryIntervalInt = atoi(sstr);
|
|
|
- }
|
|
|
-
|
|
|
- memset(ftppath, 0, sizeof(ftppath));
|
|
|
- memset(path, 0, sizeof(path));
|
|
|
-
|
|
|
- sendFirmwareStatusNotificationRequest(FirmwareStatusStr[FirmwareStatus_Downloading]);
|
|
|
- ShmOCPP16Data->MsMsg.bits.UpdateFirmwareReq = 1;
|
|
|
-
|
|
|
- if(strncmp(locationstr,"http", 4) == 0)
|
|
|
- {
|
|
|
- sscanf(locationstr,"%[^:]:%*2[/]%[^/]/%199[^\n]",
|
|
|
- protocol, host, path);
|
|
|
-
|
|
|
- //sscanf(locationstr,"%[^:]:%*2[/]%[^:]:%[^@]@%[^/]%199[^\n]",
|
|
|
- // protocol, user, password, host, path);
|
|
|
- sprintf(ftppath,"/%s", path);
|
|
|
-
|
|
|
- //DEBUG_INFO("protocol =%s\n",protocol);
|
|
|
-
|
|
|
- //DEBUG_INFO("host =%s\n",host);
|
|
|
-
|
|
|
- //DEBUG_INFO("path =%s\n",path);
|
|
|
- //DEBUG_INFO("ftppath=%s\n",ftppath);
|
|
|
- int ftppathlen=strlen(ftppath);
|
|
|
- int i=1;
|
|
|
- char filenametemp[50];
|
|
|
- while(i < ftppathlen)
|
|
|
- {
|
|
|
- int len=ftppathlen-i;
|
|
|
- if(ftppath[len]== 47) // '/' ascll code: 47
|
|
|
- {
|
|
|
- DEBUG_INFO("compare '/' all right\n");
|
|
|
- break;
|
|
|
- }
|
|
|
- i=i+1;
|
|
|
- }
|
|
|
-
|
|
|
- memset(filenametemp, 0, sizeof(filenametemp));
|
|
|
- strncpy(filenametemp, ftppath+(ftppathlen-i+1), i+1);
|
|
|
- filenametemp[i+1] = 0;
|
|
|
- //sendFirmwareStatusNotificationRequest(FirmwareStatusStr[FirmwareStatus_Downloading]);
|
|
|
-
|
|
|
-
|
|
|
- do{
|
|
|
- isSuccess = httpDownLoadFile(host, ftppath, filenametemp, locationstr);
|
|
|
- sleep(retryIntervalInt);
|
|
|
- }while((isSuccess == 0)&&(retriesInt > 0 && retriesInt --));
|
|
|
-
|
|
|
- // isSuccess = httpDownLoadFile(host, ftppath, filenametemp, locationstr);
|
|
|
-
|
|
|
- if(!isSuccess)
|
|
|
- {
|
|
|
- sendFirmwareStatusNotificationRequest(FirmwareStatusStr[FirmwareStatus_DownloadFailed]);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- //ShmOCPP16Data->MsMsg.bits.UpdateFirmwareReq = 1;
|
|
|
- sendFirmwareStatusNotificationRequest(FirmwareStatusStr[FirmwareStatus_Downloaded]);
|
|
|
- //isUpdateRequest = TRUE;
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
- else if(strncmp(locationstr,"ftp", 3) == 0) // ftp
|
|
|
- {
|
|
|
- memset(ftpbuf, 0, sizeof(ftpbuf));
|
|
|
- memset(temp, 0, sizeof(temp));
|
|
|
- //DEBUG_INFO("locationstr=%s\n",locationstr);
|
|
|
- strcpy(ftpbuf, locationstr/*"ftp://ipc_ui:pht2016@ftp.phihong.com.tw/DC/log/DemoDC1_2018-07-13_185011_PSULog.zip"*/ );
|
|
|
- int ftppathlen=strlen(ftpbuf);
|
|
|
- int i=1;
|
|
|
- char filenametemp[50];
|
|
|
- while(i < ftppathlen)
|
|
|
- {
|
|
|
- int len=ftppathlen-i;
|
|
|
- if(ftpbuf[len]== 47) // '/' ascll code: 47
|
|
|
- {
|
|
|
- DEBUG_INFO(" compare '/' all right\n");
|
|
|
- break;
|
|
|
- }
|
|
|
-
|
|
|
- i=i+1;
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- memset(filenametemp, 0, sizeof(filenametemp));
|
|
|
- strncpy(filenametemp, ftpbuf+(ftppathlen-i+1), i+1);
|
|
|
- filenametemp[i+1] = 0;
|
|
|
- strncpy(temp, ftpbuf, ftppathlen-i+1);
|
|
|
-
|
|
|
- pch=strchr(temp,'@');
|
|
|
- if(pch==NULL)
|
|
|
- {
|
|
|
- sscanf(temp,"%[^:]:%*2[/]%[^:]:%i/%[a-zA-Z0-9._/-]",
|
|
|
- protocol, host, &port, path);
|
|
|
- strcpy(user,"anonymous");
|
|
|
- strcpy(password,"");
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- sscanf(temp,"%[^:]:%*2[/]%[^:]:%[^@]@%[^:]:%i/%199[^\n]",
|
|
|
- protocol, user, password, host, &port, path);
|
|
|
- }
|
|
|
-
|
|
|
- sscanf(host,"%[^/]%s",host1, path1);
|
|
|
- sprintf(ftppath,"%s", path1);
|
|
|
-
|
|
|
- //DEBUG_INFO("protocol =%s\n",protocol);
|
|
|
- //DEBUG_INFO("user =%s\n",user);
|
|
|
- //DEBUG_INFO("password =%s\n",password);
|
|
|
- //DEBUG_INFO("host1 =%s\n",host1);
|
|
|
- //DEBUG_INFO("port =%d\n",port);
|
|
|
- //DEBUG_INFO("path1 =%s\n",path1);
|
|
|
- //DEBUG_INFO("ftppath=%s\n",ftppath);
|
|
|
-
|
|
|
- //ftpFile(host, user, password, port, ftppath, fname);
|
|
|
- //download firmware pthred
|
|
|
- if(port == 0)
|
|
|
- {
|
|
|
- port = 21;
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- //sendFirmwareStatusNotificationRequest(FirmwareStatusStr[FirmwareStatus_Downloading]);
|
|
|
-
|
|
|
- do{
|
|
|
- isSuccess = ftpDownLoadFile(host1, user, password, port, ftppath, filenametemp, locationstr);
|
|
|
- sleep(retryIntervalInt);
|
|
|
- }while((!isSuccess)&&(retriesInt > 0 && retriesInt --));
|
|
|
-
|
|
|
-
|
|
|
- if(!isSuccess)
|
|
|
- {
|
|
|
- //BulldogUtil.sleepMs(interval*1000);
|
|
|
- DEBUG_INFO("Update firmware request and download file fail.\n");
|
|
|
- sendFirmwareStatusNotificationRequest(FirmwareStatusStr[FirmwareStatus_DownloadFailed]);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- //ShmOCPP16Data->MsMsg.bits.UpdateFirmwareReq = 1;
|
|
|
- sendFirmwareStatusNotificationRequest(FirmwareStatusStr[FirmwareStatus_Downloaded]);
|
|
|
- //isUpdateRequest = TRUE;
|
|
|
- }
|
|
|
- ShmOCPP16Data->MsMsg.bits.UpdateFirmwareReq = 1;
|
|
|
-
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
-
|
|
|
- sendFirmwareStatusNotificationRequest(FirmwareStatusStr[FirmwareStatus_DownloadFailed]);
|
|
|
- //ShmOCPP16Data->MsMsg.bits.UpdateFirmwareReq = 1;
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- pthread_exit(NULL);
|
|
|
-
|
|
|
-}
|
|
|
-
|
|
|
-//==========================================
|
|
|
-// Handle server response routine
|
|
|
-//==========================================
|
|
|
-void handleAuthorizeResponse(char *payload, int gun_index)
|
|
|
-{
|
|
|
- mtrace();
|
|
|
- char expiryDatestr[30]={0};
|
|
|
- char parentIdTagstr[20]={0};
|
|
|
- char statusstr[20]={0};
|
|
|
- char expiryDatestrtemp[30]={0};
|
|
|
- char parentIdTagstrtemp[20]={0};
|
|
|
- char IdTagstrtemp[20]={0};
|
|
|
- char statusstrtemp[20]={0};
|
|
|
- int expiryDateISNULL=FALSE;
|
|
|
- int parentIdTagISNULL=FALSE;
|
|
|
- char sstr[160]={0};
|
|
|
- char* filename = AuthorizationCache_JSON;
|
|
|
- char tempfile[] = "/Storage/OCPP/Authorizetemp.json";
|
|
|
- char *loc;
|
|
|
- int resultRename=0;
|
|
|
- int responseIdTagInfoAsZero= 0;
|
|
|
- char rmFileCmd[50]={0};
|
|
|
-
|
|
|
- DEBUG_INFO("handleAuthorizeResponse...\n");
|
|
|
- json_object *Authorize;
|
|
|
- Authorize = json_tokener_parse(payload);
|
|
|
-
|
|
|
- if(!is_error(Authorize))
|
|
|
- {
|
|
|
- if(json_object_object_get(Authorize, "idTagInfo") != NULL)
|
|
|
- {
|
|
|
- // Required data
|
|
|
- sprintf((char *)statusstr, "%s", json_object_get_string(json_object_object_get(json_object_object_get(Authorize,"idTagInfo"), "status")));
|
|
|
-
|
|
|
- // Optional data
|
|
|
- if(json_object_object_get(json_object_object_get(Authorize,"idTagInfo"), "expiryDate") != NULL)
|
|
|
- sprintf((char *)expiryDatestr, "%s", json_object_get_string(json_object_object_get(json_object_object_get(Authorize,"idTagInfo"), "expiryDate")));
|
|
|
-
|
|
|
- if(json_object_object_get(json_object_object_get(Authorize,"idTagInfo"), "parentIdTag") != NULL)
|
|
|
- sprintf((char *)parentIdTagstr, "%s", json_object_get_string(json_object_object_get(json_object_object_get(Authorize,"idTagInfo"), "parentIdTag")));
|
|
|
- }
|
|
|
- }
|
|
|
- json_object_put(Authorize);
|
|
|
-
|
|
|
-
|
|
|
- if(expiryDateISNULL == FALSE)
|
|
|
- strcpy((char *)ShmOCPP16Data->Authorize.ResponseIdTagInfo.ExpiryDate, expiryDatestr);
|
|
|
-
|
|
|
- if(parentIdTagISNULL == FALSE)
|
|
|
- strcpy((char *)ShmOCPP16Data->Authorize.ResponseIdTagInfo.ParentIdTag, parentIdTagstr);
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->Authorize.ResponseIdTagInfo.Status, statusstr);
|
|
|
-
|
|
|
- //Update idTag information to authorization cache if supproted
|
|
|
- if((strcmp((const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizationCacheEnabled].ItemData, "TRUE") == 0) && (ShmOCPP16Data->Authorize.ResponseIdTagInfo.ParentIdTag != NULL) && (ShmOCPP16Data->Authorize.ResponseIdTagInfo.ExpiryDate != NULL) )
|
|
|
- {
|
|
|
- if((access(filename,F_OK))!=-1)
|
|
|
- {
|
|
|
- printf("AuthorizationCache exist.\n");
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- printf("AuthorizationCache not exist\n");
|
|
|
- FILE *log = fopen(filename, "w+");
|
|
|
-
|
|
|
- if(log == NULL)
|
|
|
- {
|
|
|
- printf("log is NULL\n");
|
|
|
- goto out;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- fclose(log);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- FILE *infile;
|
|
|
- FILE *outfile;
|
|
|
- // open file for writing
|
|
|
- infile = fopen (filename, "r");
|
|
|
- outfile = fopen (tempfile, "w");
|
|
|
-
|
|
|
-
|
|
|
- int c;
|
|
|
- c = fgetc(infile);
|
|
|
- //DEBUG_INFO("c:%d\n",c);
|
|
|
- rewind(infile);
|
|
|
-
|
|
|
- if(c == EOF)
|
|
|
- {
|
|
|
- DEBUG_INFO("Orignal File is NULL\n");
|
|
|
- if(ShmOCPP16Data->Authorize.ResponseIdTagInfo.ExpiryDate != NULL)
|
|
|
- {
|
|
|
- strcpy(expiryDatestrtemp, (const char *)ShmOCPP16Data->Authorize.ResponseIdTagInfo.ExpiryDate);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- strcpy(expiryDatestrtemp, "");
|
|
|
- }
|
|
|
-
|
|
|
- if(ShmOCPP16Data->Authorize.ResponseIdTagInfo.ParentIdTag != NULL)
|
|
|
- {
|
|
|
- strcpy(parentIdTagstrtemp, (const char *)ShmOCPP16Data->Authorize.ResponseIdTagInfo.ParentIdTag);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- strcpy(parentIdTagstrtemp, (const char *)ShmOCPP16Data->Authorize.IdTag);
|
|
|
- }
|
|
|
-
|
|
|
- strcpy(statusstrtemp, (const char *)ShmOCPP16Data->Authorize.ResponseIdTagInfo.Status);
|
|
|
-
|
|
|
- fprintf(outfile,"[{\"idTag\":\"%s\",\"idTagInfo\":{\"expiryDate\":\"%s\",\"parentIdTag\":\"%s\",\"status\":\"%s\"}}]\n",ShmOCPP16Data->Authorize.IdTag, expiryDatestrtemp, parentIdTagstrtemp, statusstrtemp);
|
|
|
- fclose(infile);
|
|
|
- fclose(outfile);
|
|
|
-
|
|
|
- sprintf(rmFileCmd,"rm -f %s",filename);
|
|
|
- system(rmFileCmd);
|
|
|
-
|
|
|
- resultRename = rename(tempfile, filename);
|
|
|
-
|
|
|
- if(resultRename == 0)
|
|
|
- {
|
|
|
- printf("File renamed successfully");
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- printf("Error: unable to rename the file");
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- char buf[160]={0};
|
|
|
-
|
|
|
- while (fgets(buf, sizeof(buf), infile) != NULL)
|
|
|
- {
|
|
|
- buf[strlen(buf) - 1] = '\0'; // eat the newline fgets() stores
|
|
|
-
|
|
|
- memset(expiryDatestr, 0, sizeof(expiryDatestrtemp));
|
|
|
- memset(parentIdTagstr,0, sizeof(parentIdTagstrtemp));
|
|
|
- memset(statusstr, 0, sizeof(statusstrtemp));
|
|
|
- memset(IdTagstrtemp, 0, sizeof(IdTagstrtemp));
|
|
|
- memset(expiryDatestrtemp, 0, sizeof(expiryDatestrtemp));
|
|
|
- memset(parentIdTagstrtemp, 0, sizeof(parentIdTagstrtemp));
|
|
|
- memset(statusstrtemp, 0, sizeof(statusstrtemp));
|
|
|
-
|
|
|
- //------------------IdTag-----------------------
|
|
|
- loc = strstr(buf, "idTag");
|
|
|
- memset(sstr ,0, sizeof(sstr) );
|
|
|
- c = 0;
|
|
|
- while (loc[3+strlen("idTag")+c] != '\"')
|
|
|
- {
|
|
|
- sstr[c] = loc[3+strlen("idTag")+c];
|
|
|
- c++;
|
|
|
- }
|
|
|
- sstr[c] = '\0';
|
|
|
- strcpy(IdTagstrtemp,sstr);
|
|
|
-
|
|
|
- //*********************expiryDate***************/
|
|
|
- loc = strstr(buf, "expiryDate");
|
|
|
- memset(sstr ,0, sizeof(sstr) );
|
|
|
- c = 0;
|
|
|
- while (loc[3+strlen("expiryDate")+c] != '\"')
|
|
|
- {
|
|
|
- sstr[c] = loc[3+strlen("expiryDate")+c];
|
|
|
- c++;
|
|
|
- }
|
|
|
- sstr[c] = '\0';
|
|
|
- strcpy(expiryDatestr,sstr);
|
|
|
-
|
|
|
- //*********************parentIdTag***************/
|
|
|
- loc = strstr(buf, "parentIdTag");
|
|
|
- memset(sstr ,0, sizeof(sstr) );
|
|
|
- c = 0;
|
|
|
- while (loc[3+strlen("parentIdTag")+c] != '\"')
|
|
|
- {
|
|
|
- sstr[c] = loc[3+strlen("parentIdTag")+c];
|
|
|
- c++;
|
|
|
- }
|
|
|
- sstr[c] = '\0';
|
|
|
- strcpy(parentIdTagstr,sstr);
|
|
|
-
|
|
|
- //*********************status***************/
|
|
|
- loc = strstr(buf, "status");
|
|
|
- memset(sstr ,0, sizeof(sstr) );
|
|
|
- c = 0;
|
|
|
- while (loc[3+strlen("status")+c] != '\"')
|
|
|
- {
|
|
|
- sstr[c] = loc[3+strlen("status")+c];
|
|
|
- c++;
|
|
|
- }
|
|
|
- sstr[c] = '\0';
|
|
|
- strcpy(statusstr,sstr);
|
|
|
-
|
|
|
- if(((ShmOCPP16Data->Authorize.ResponseIdTagInfo.ParentIdTag == NULL) || strcmp((const char *)ShmOCPP16Data->Authorize.ResponseIdTagInfo.ParentIdTag, "") == 0) || (strcmp((const char *)ShmOCPP16Data->Authorize.IdTag, IdTagstrtemp) == 0))
|
|
|
- {
|
|
|
- DEBUG_INFO("ShmOCPP16Data->Authorize.ResponseIdTagInfo.ParentIdTag is NULL\n");
|
|
|
- responseIdTagInfoAsZero = 1;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- DEBUG_INFO("ShmOCPP16Data->Authorize.ResponseIdTagInfo.ParentIdTag=%s\n",ShmOCPP16Data->Authorize.ResponseIdTagInfo.ParentIdTag);
|
|
|
- }
|
|
|
-
|
|
|
- if((responseIdTagInfoAsZero == 0)&&((strcmp(parentIdTagstr,(const char *)ShmOCPP16Data->Authorize.ResponseIdTagInfo.ParentIdTag) == 0)|| (strcmp(IdTagstrtemp,(const char *)ShmOCPP16Data->Authorize.IdTag) == 0)))
|
|
|
- {
|
|
|
- //modify item
|
|
|
-
|
|
|
- if(ShmOCPP16Data->Authorize.ResponseIdTagInfo.ExpiryDate != NULL)
|
|
|
- {
|
|
|
- strcpy(expiryDatestrtemp,(const char *)ShmOCPP16Data->Authorize.ResponseIdTagInfo.ExpiryDate);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- strcpy(expiryDatestrtemp, "");
|
|
|
- }
|
|
|
-
|
|
|
- if(ShmOCPP16Data->Authorize.ResponseIdTagInfo.ParentIdTag != NULL)
|
|
|
- {
|
|
|
- strcpy(parentIdTagstrtemp,(const char *)ShmOCPP16Data->Authorize.ResponseIdTagInfo.ParentIdTag);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- strcpy(parentIdTagstrtemp, parentIdTagstr);
|
|
|
- }
|
|
|
- strcpy(statusstrtemp,(const char *)ShmOCPP16Data->Authorize.ResponseIdTagInfo.Status);
|
|
|
-
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- //wrie original item
|
|
|
- strcpy(expiryDatestrtemp, expiryDatestr);
|
|
|
- strcpy(parentIdTagstrtemp, parentIdTagstr);
|
|
|
- strcpy(statusstrtemp, statusstr);
|
|
|
- }
|
|
|
-
|
|
|
- fprintf(outfile,"[{\"idTag\":\"%s\",\"idTagInfo\":{\"expiryDate\":\"%s\",\"parentIdTag\":\"%s\",\"status\":\"%s\"}}]\n",ShmOCPP16Data->Authorize.IdTag, expiryDatestrtemp, parentIdTagstrtemp, statusstrtemp);
|
|
|
- }
|
|
|
-
|
|
|
- fclose(infile);
|
|
|
- fclose(outfile);
|
|
|
-
|
|
|
- sprintf(rmFileCmd,"rm -f %s",filename);
|
|
|
- system(rmFileCmd);
|
|
|
-
|
|
|
- resultRename = rename(tempfile, filename);
|
|
|
-
|
|
|
- if(resultRename == 0)
|
|
|
- {
|
|
|
- DEBUG_INFO("File renamed successfully");
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- DEBUG_INFO("Error: unable to rename the file");
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
-out:
|
|
|
- ShmOCPP16Data->SpMsg.bits.AuthorizeReq = 0;
|
|
|
- ShmOCPP16Data->SpMsg.bits.AuthorizeConf = 1; // inform csu
|
|
|
- authorizeRetryTimes = 0;
|
|
|
-}
|
|
|
-
|
|
|
-char * strtrimc( char * s )
|
|
|
-{
|
|
|
- char * p1 = s;
|
|
|
- char * p2 = s;
|
|
|
- while(*p1 != '\0')
|
|
|
- {
|
|
|
- while(*p1 == ' ' || *p1 == '\t' || *p1 == '\"' || *p1 == '\n' || *p1 == '}' || *p1 == '\r')
|
|
|
- {
|
|
|
- if(*p1 != ',')
|
|
|
- {
|
|
|
- p1 ++;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- if(*p1 != ',')
|
|
|
- {
|
|
|
- * p2 ++ = *p1 ++;
|
|
|
- //printf("p2=%s\n",p2);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
- *p2 = '\0';
|
|
|
- return (s);
|
|
|
-}
|
|
|
-
|
|
|
-void handleBootNotificationResponse(char *payload, int gun_index)
|
|
|
-{
|
|
|
- mtrace();
|
|
|
- char statusStr[12]={0};
|
|
|
- char currentTimeStr[30]={0};
|
|
|
- int intervalInt = 0;
|
|
|
- struct tm tp;
|
|
|
- char buf[28]={0};
|
|
|
- char timebuf[50]={0};
|
|
|
-
|
|
|
- DEBUG_INFO("handleBootNotificationResponse...\n");
|
|
|
-
|
|
|
- json_object *BootNotification;
|
|
|
- BootNotification = json_tokener_parse(payload);
|
|
|
- if(!is_error(BootNotification))
|
|
|
- {
|
|
|
- // Required data
|
|
|
- sprintf((char *)currentTimeStr, "%s", json_object_get_string(json_object_object_get(BootNotification,"currentTime")));
|
|
|
- intervalInt = json_object_get_int(json_object_object_get(BootNotification,"interval"));
|
|
|
- sprintf((char *)statusStr, "%s", json_object_get_string(json_object_object_get(BootNotification,"status")));
|
|
|
- }
|
|
|
- json_object_put(BootNotification);
|
|
|
-
|
|
|
-
|
|
|
- ShmOCPP16Data->BootNotification.ResponseHeartbeatInterval = intervalInt;
|
|
|
- BootNotificationInterval = intervalInt;
|
|
|
- HeartBeatWaitTime = intervalInt;
|
|
|
-
|
|
|
- //write back to ShmOCPP16Data->BootNotification
|
|
|
- strcpy((char *)ShmOCPP16Data->BootNotification.ResponseCurrentTime, currentTimeStr);
|
|
|
- ShmOCPP16Data->BootNotification.ResponseHeartbeatInterval = intervalInt;
|
|
|
- strcpy((char *)ShmOCPP16Data->BootNotification.ResponseStatus, statusStr);
|
|
|
-
|
|
|
- if((strcmp(statusStr, RegistrationStatusStr[RegistrationStatus_Accepted]) == 0 ))
|
|
|
- {
|
|
|
- server_sign = TRUE;
|
|
|
- server_pending =FALSE;
|
|
|
-
|
|
|
- }
|
|
|
- else if(strcmp(statusStr, RegistrationStatusStr[RegistrationStatus_Pending]) == 0)
|
|
|
- {
|
|
|
- server_pending = TRUE;
|
|
|
- }
|
|
|
-
|
|
|
- strptime((const char *)ShmOCPP16Data->BootNotification.ResponseCurrentTime, "%Y-%m-%dT%H:%M:%S", &tp);
|
|
|
- tp.tm_isdst = -1;
|
|
|
- //time_t utc = mktime(&tp);
|
|
|
-
|
|
|
- strftime(buf, 28, "%Y-%m-%d %H:%M:%S", &tp);
|
|
|
- memset(timebuf, 0, sizeof timebuf);
|
|
|
- sprintf(timebuf,"date -s '%s'",buf);
|
|
|
- system(timebuf);
|
|
|
-
|
|
|
- clientTime.Heartbeat = time((time_t*)NULL) - (ShmOCPP16Data->BootNotification.ResponseHeartbeatInterval-5);
|
|
|
- //==============================================
|
|
|
- // RTC sync
|
|
|
- //==============================================
|
|
|
- system("/sbin/hwclock -w --systohc");
|
|
|
-
|
|
|
- ShmOCPP16Data->OcppConnStatus = 1; ////0: disconnected, 1: connected
|
|
|
- ShmOCPP16Data->SpMsg.bits.BootNotificationConf = 1;
|
|
|
-
|
|
|
- sendFirmwareVersionByDataTransfer();
|
|
|
-}
|
|
|
-
|
|
|
-void handleDataTransferResponse(char *payload, int gun_index)
|
|
|
-{
|
|
|
- char sstr[160]={0};//sstr[200]={ 0 };
|
|
|
- int c = 0;
|
|
|
- char *loc;
|
|
|
- DEBUG_INFO("handleDataTransferResponse ...\n");
|
|
|
- loc = strstr(payload, "status");
|
|
|
- printf("loc=%s\n",loc);
|
|
|
- c = 0;
|
|
|
- while (loc[3+strlen("status")+c] != '\"')
|
|
|
- {
|
|
|
- sstr[c] = loc[3+strlen("status")+c];
|
|
|
- //printf("i=%d sstr=%c\n",c, sstr[c]);
|
|
|
- c++;
|
|
|
- }
|
|
|
- sstr[c] = '\0';
|
|
|
-
|
|
|
- DEBUG_INFO(" DataTransferResponse=%s\n", sstr);
|
|
|
-
|
|
|
-}
|
|
|
-
|
|
|
-void handleDiagnosticsStatusNotificationResponse(char *payload, int gun_index)
|
|
|
-{
|
|
|
- DEBUG_INFO("handleDiagnosticsStatusNotificationResponse ...\n");
|
|
|
- //struct json_object *obj;
|
|
|
-// obj = json_tokener_parse(payload);
|
|
|
- ShmOCPP16Data->SpMsg.bits.DiagnosticsStatusNotificationReq = 0;
|
|
|
- ShmOCPP16Data->SpMsg.bits.DiagnosticsStatusNotificationConf = 1;
|
|
|
- //No fields are defined.
|
|
|
-}
|
|
|
-
|
|
|
-void handleFirmwareStatusNotificationResponse(char *payload, int gun_index)
|
|
|
-{
|
|
|
- DEBUG_INFO("handleFirmwareStatusNotificationResponse ...\n");
|
|
|
- //struct json_object *obj;
|
|
|
-// obj = json_tokener_parse(payload);
|
|
|
- ShmOCPP16Data->SpMsg.bits.FirmwareStatusNotificationReq = 0;
|
|
|
- ShmOCPP16Data->SpMsg.bits.FirmwareStatusNotificationConf = 1;
|
|
|
-
|
|
|
- //No fields are defined.
|
|
|
-}
|
|
|
-
|
|
|
-void handleHeartbeatResponse(char *payload, int gun_index)
|
|
|
-{
|
|
|
- mtrace();
|
|
|
- struct tm tp;
|
|
|
- char buf[28]={0};
|
|
|
- char timebuf[50]={0};
|
|
|
-
|
|
|
- DEBUG_INFO("handleHeartbeatResponse...\n");
|
|
|
- json_object *Heartbeat;
|
|
|
- Heartbeat = json_tokener_parse(payload);
|
|
|
- if(!is_error(Heartbeat))
|
|
|
- {
|
|
|
- // Required data
|
|
|
- sprintf((char *)ShmOCPP16Data->Heartbeat.ResponseCurrentTime, "%s", json_object_get_string(json_object_object_get(Heartbeat,"currentTime")));
|
|
|
-
|
|
|
- }
|
|
|
- json_object_put(BootNotification);
|
|
|
-
|
|
|
- if(FirstHeartBeat == 0)
|
|
|
- {
|
|
|
- FirstHeartBeat = 1;
|
|
|
- DEBUG_INFO("FirstHeartBeat \n");
|
|
|
- }
|
|
|
- HeartBeatWithNOResponse = 0;
|
|
|
-
|
|
|
-
|
|
|
- strptime((const char *)ShmOCPP16Data->Heartbeat.ResponseCurrentTime, "%Y-%m-%dT%H:%M:%S", &tp);
|
|
|
- tp.tm_isdst = -1;
|
|
|
- //time_t utc = mktime(&tp);
|
|
|
- strftime(buf, 28, "%Y-%m-%d %H:%M:%S", &tp);
|
|
|
- memset(timebuf, 0, sizeof timebuf);
|
|
|
- sprintf(timebuf,"date -s '%s'",buf);
|
|
|
- system(timebuf);
|
|
|
- //==============================================
|
|
|
- // RTC sync
|
|
|
- //==============================================
|
|
|
- system("/sbin/hwclock -w --systohc");
|
|
|
-
|
|
|
- //===============================================
|
|
|
- //Print Out HeartBeat log
|
|
|
- //===============================================
|
|
|
- {
|
|
|
- double diff_t;
|
|
|
- struct tm tp,tp1;
|
|
|
-
|
|
|
- // BootNotification Receive Time
|
|
|
-
|
|
|
- strptime((const char *)ShmOCPP16Data->BootNotification.ResponseCurrentTime, "%Y-%m-%dT%H:%M:%S", &tp);
|
|
|
- tp.tm_isdst = -1;
|
|
|
- time_t BootNotificationReceiveTime = mktime(&tp);
|
|
|
-
|
|
|
- //HeartBeat Receive Time
|
|
|
- strptime((const char *)ShmOCPP16Data->Heartbeat.ResponseCurrentTime, "%Y-%m-%dT%H:%M:%S", &tp1);
|
|
|
- tp1.tm_isdst = -1;
|
|
|
- time_t HeartBeatReceiveTime = mktime(&tp1);
|
|
|
-
|
|
|
- diff_t = difftime(HeartBeatReceiveTime, BootNotificationReceiveTime);
|
|
|
-
|
|
|
- printf("handleHeartbeatResponse differnt time=%f..\n",diff_t);
|
|
|
-
|
|
|
- if(((int)diff_t / 3600) > HeartBeatCountPerHour)
|
|
|
- {
|
|
|
- HeartBeatCountPerHour = (int)diff_t / 3600;
|
|
|
- DEBUG_INFO("handleHeartbeatResponse ...\n");
|
|
|
- DEBUG_INFO("After 1 hour, It will print out Heartbeat.\n");
|
|
|
- }
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-void handleMeterValuesResponse(char *payload, int gun_index)
|
|
|
-{
|
|
|
- mtrace();
|
|
|
- DEBUG_INFO("handleMeterValuesResponse...\n");
|
|
|
-}
|
|
|
-
|
|
|
-void handleStartTransactionResponse(char *payload, int gun_index)
|
|
|
-{
|
|
|
- mtrace();
|
|
|
- //int transactionIdInt = 0;
|
|
|
- FILE *outfile;
|
|
|
- char data[100]={0};
|
|
|
-
|
|
|
- DEBUG_INFO("handleStartTransactionResponse...\n");
|
|
|
-
|
|
|
- json_object *StartTransaction;
|
|
|
- StartTransaction = json_tokener_parse(payload);
|
|
|
-
|
|
|
- if(!is_error(StartTransaction))
|
|
|
- {
|
|
|
-
|
|
|
- // Required data
|
|
|
- sprintf((char *)ShmOCPP16Data->StartTransaction[gun_index].ResponseIdTagInfo.Status, "%s", json_object_get_string(json_object_object_get(json_object_object_get(StartTransaction,"idTagInfo"), "status")));
|
|
|
- ShmOCPP16Data->StartTransaction[gun_index].ResponseTransactionId = json_object_get_int(json_object_object_get(StartTransaction,"transactionId"));
|
|
|
-
|
|
|
- // Optional data
|
|
|
- if(json_object_object_get(json_object_object_get(StartTransaction,"idTagInfo"), "expiryDate") != NULL)
|
|
|
- sprintf((char *)ShmOCPP16Data->StartTransaction[gun_index].ResponseIdTagInfo.ExpiryDate, "%s", json_object_get_string(json_object_object_get(json_object_object_get(StartTransaction,"idTagInfo"), "expiryDate")));
|
|
|
-
|
|
|
- if(json_object_object_get(json_object_object_get(StartTransaction,"idTagInfo"), "parentIdTag") != NULL)
|
|
|
- sprintf((char *)ShmOCPP16Data->StartTransaction[gun_index].ResponseIdTagInfo.ParentIdTag, "%s", json_object_get_string(json_object_object_get(json_object_object_get(StartTransaction,"idTagInfo"), "parentIdTag")));
|
|
|
- }
|
|
|
- json_object_put(StartTransaction);
|
|
|
-
|
|
|
- ShmOCPP16Data->CpMsg.bits[gun_index].StartTransactionConf = 1;
|
|
|
- ShmOCPP16Data->CpMsg.bits[gun_index].StartTransactionReq = 0;
|
|
|
-
|
|
|
- //-----------Start : write to the Queue TransactionId file -----------------//
|
|
|
- if((access("/Storage/OCPP/QueueTransactionId",F_OK))!=-1)
|
|
|
- {}
|
|
|
- else
|
|
|
- {
|
|
|
- FILE *log = fopen("/Storage/OCPP/QueueTransactionId", "w+");
|
|
|
-
|
|
|
- if(log == NULL)
|
|
|
- {
|
|
|
- DEBUG_INFO("Can't Create File QueueTransactionId \n");
|
|
|
- return ;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- fclose(log);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- // open file for writing
|
|
|
- //-------------Start: write to the Queue TransactionId file------------------------------------------//
|
|
|
- if((ShmOCPP16Data->StartTransaction[gun_index].ConnectorId !=0)&&(strcmp((const char *)ShmOCPP16Data->StartTransaction[gun_index].IdTag,"")!=0)&&(ShmOCPP16Data->StartTransaction[gun_index].ResponseTransactionId !=0))
|
|
|
- {
|
|
|
- outfile = fopen ("/Storage/OCPP/QueueTransactionId", "a");
|
|
|
- sprintf(data,"%d,%s,%d\n", ShmOCPP16Data->StartTransaction[gun_index].ConnectorId , ShmOCPP16Data->StartTransaction[gun_index].IdTag, ShmOCPP16Data->StartTransaction[gun_index].ResponseTransactionId); // GunIndex, idtag, TransactionId
|
|
|
- fputs(data, outfile);
|
|
|
- fclose (outfile);
|
|
|
- }
|
|
|
-
|
|
|
- DEBUG_INFO("idTagInfo-expiryDate: %s\n", ShmOCPP16Data->StartTransaction[gun_index].ResponseIdTagInfo.ExpiryDate);
|
|
|
- DEBUG_INFO("idTagInfo-parentIdTag: %s\n", ShmOCPP16Data->StartTransaction[gun_index].ResponseIdTagInfo.ParentIdTag);
|
|
|
- DEBUG_INFO("idTagInfo-status: %s\n", ShmOCPP16Data->StartTransaction[gun_index].ResponseIdTagInfo.Status);
|
|
|
- DEBUG_INFO("transactionId: %d\n", ShmOCPP16Data->StartTransaction[gun_index].ResponseTransactionId);
|
|
|
-}
|
|
|
-
|
|
|
-void handleStatusNotificationResponse(char *payload, int gun_index)
|
|
|
-{
|
|
|
- mtrace();
|
|
|
- DEBUG_INFO("handleStatusNotificationResponse...\n");
|
|
|
-
|
|
|
- cpinitateMsg.bits[gun_index].StatusNotificationReq = 0;
|
|
|
- cpinitateMsg.bits[gun_index].StatusNotificationConf = 1;
|
|
|
-
|
|
|
-}
|
|
|
-
|
|
|
-void handleStopTransactionnResponse(char *payload, int gun_index)
|
|
|
-{
|
|
|
- mtrace();
|
|
|
- DEBUG_INFO("handleStopTransactionnResponse...\n");
|
|
|
- json_object *StopTransaction;
|
|
|
- StopTransaction = json_tokener_parse(payload);
|
|
|
-
|
|
|
- if(!is_error(StopTransaction))
|
|
|
- {
|
|
|
- // Optional data
|
|
|
- if(json_object_object_get(StopTransaction, "idTagInfo") != NULL)
|
|
|
- {
|
|
|
- sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].ResponseIdTagInfo.Status, "%s", json_object_get_string(json_object_object_get(json_object_object_get(StopTransaction,"idTagInfo"), "status")));
|
|
|
-
|
|
|
- if(json_object_object_get(json_object_object_get(StopTransaction,"idTagInfo"), "expiryDate") != NULL)
|
|
|
- sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].ResponseIdTagInfo.ExpiryDate, "%s", json_object_get_string(json_object_object_get(json_object_object_get(StopTransaction,"idTagInfo"), "expiryDate")));
|
|
|
-
|
|
|
- if(json_object_object_get(json_object_object_get(StopTransaction,"idTagInfo"), "parentIdTag") != NULL)
|
|
|
- sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].ResponseIdTagInfo.ParentIdTag, "%s", json_object_get_string(json_object_object_get(json_object_object_get(StopTransaction,"idTagInfo"), "parentIdTag")));
|
|
|
- }
|
|
|
- }
|
|
|
- json_object_put(StopTransaction);
|
|
|
-
|
|
|
-
|
|
|
- ShmOCPP16Data->CpMsg.bits[gun_index].StopTransactionConf = 1;
|
|
|
- ShmOCPP16Data->CpMsg.bits[gun_index].StopTransactionReq = 0;
|
|
|
-
|
|
|
- DEBUG_INFO("idTagInfo-expiryDate: %s\n", ShmOCPP16Data->StopTransaction[gun_index].ResponseIdTagInfo.ExpiryDate);
|
|
|
- DEBUG_INFO("idTagInfo-parentIdTag: %s\n", ShmOCPP16Data->StopTransaction[gun_index].ResponseIdTagInfo.ParentIdTag);
|
|
|
- DEBUG_INFO("idTagInfo-status: %s\n", ShmOCPP16Data->StopTransaction[gun_index].ResponseIdTagInfo.Status);
|
|
|
-}
|
|
|
-
|
|
|
-//==========================================
|
|
|
-// Handle Error routine
|
|
|
-//==========================================
|
|
|
-void handleError(char *id, char *errorCode, char *errorDescription,char *payload)
|
|
|
-{
|
|
|
- mtrace();
|
|
|
- #ifdef SystemLogMessage
|
|
|
- DEBUG_INFO("errorCode: %s\n", errorCode);
|
|
|
-
|
|
|
- DEBUG_INFO("errorDescription: %s\n", errorDescription);
|
|
|
-
|
|
|
- DEBUG_INFO("errorDetails: %s\n", payload);
|
|
|
- #endif
|
|
|
-
|
|
|
-}
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-//===============================================
|
|
|
-// Common routine
|
|
|
-//===============================================
|
|
|
-int initialConfigurationTable(void)
|
|
|
-{
|
|
|
- //clock_t start_t, end_t, total_t;
|
|
|
- FILE *fp;
|
|
|
- FILE *outfile;
|
|
|
- char str[200]={0};
|
|
|
- char sstr[100]={0};
|
|
|
- int c = 0;
|
|
|
- char *loc;
|
|
|
- DEBUG_INFO("initialConfigurationTable...\n");
|
|
|
- //start_t = clock();
|
|
|
- //printf("Starting of the program, start_t = %ld\n", start_t);
|
|
|
- memset(&(ShmOCPP16Data->ConfigurationTable), 0, sizeof(struct OCPP16ConfigurationTable) );
|
|
|
-
|
|
|
-
|
|
|
- if((access("/Storage/OCPP/OCPPConfiguration",F_OK))==-1)
|
|
|
- {
|
|
|
- outfile = fopen("/Storage/OCPP/OCPPConfiguration" , "w+");
|
|
|
- if(outfile == NULL)
|
|
|
- {
|
|
|
- DEBUG_INFO("Error opening file\n");
|
|
|
- return FALSE;
|
|
|
- }
|
|
|
-
|
|
|
- /*Core Profile*/
|
|
|
- //AllowOfflineTxForUnknownId
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[AllowOfflineTxForUnknownId].ItemAccessibility = 1;
|
|
|
- printf("AllowoddlineTXForUnknownId type: %d \n", ShmOCPP16Data->ConfigurationTable.CoreProfile[AllowOfflineTxForUnknownId].ItemAccessibility);
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AllowOfflineTxForUnknownId].ItemName, "AllowOfflineTxForUnknownId");
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AllowOfflineTxForUnknownId].ItemData, "FALSE" );
|
|
|
-
|
|
|
- fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","AllowOfflineTxForUnknownId", "false", "FALSE");
|
|
|
-
|
|
|
- //AuthorizationCacheEnabled
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizationCacheEnabled].ItemAccessibility = 1;
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizationCacheEnabled].ItemName, "AuthorizationCacheEnabled");
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizationCacheEnabled].ItemData, "FALSE" );
|
|
|
-
|
|
|
- fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","AuthorizationCacheEnabled", "false", "FALSE");
|
|
|
-
|
|
|
- //AuthorizeRemoteTxRequests
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizeRemoteTxRequests].ItemAccessibility = 0;
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizeRemoteTxRequests].ItemName, "AuthorizeRemoteTxRequests");
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizeRemoteTxRequests].ItemData, "FALSE" );
|
|
|
-
|
|
|
- fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","AuthorizeRemoteTxRequests", "true", "FALSE");
|
|
|
-
|
|
|
- //BlinkRepeat
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[BlinkRepeat].ItemAccessibility = 1;
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[BlinkRepeat].ItemName, "BlinkRepeat");
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[BlinkRepeat].ItemData, "0" );
|
|
|
-
|
|
|
- fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","BlinkRepeat", "false", "0");
|
|
|
-
|
|
|
- //ClockAlignedDataInterval
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[ClockAlignedDataInterval].ItemAccessibility = 1;
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ClockAlignedDataInterval].ItemName, "ClockAlignedDataInterval");
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ClockAlignedDataInterval].ItemData, "0" );
|
|
|
-
|
|
|
- fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","ClockAlignedDataInterval", "false", "0");
|
|
|
-
|
|
|
- //ConnectionTimeOut
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectionTimeOut].ItemAccessibility = 1;
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectionTimeOut].ItemName, "ConnectionTimeOut");
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectionTimeOut].ItemData, "180" );
|
|
|
-
|
|
|
- fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","ConnectionTimeOut", "false", "180");
|
|
|
-
|
|
|
- //GetConfigurationMaxKeys
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[GetConfigurationMaxKeys].ItemAccessibility =0;
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[GetConfigurationMaxKeys].ItemName, "GetConfigurationMaxKeys");
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[GetConfigurationMaxKeys].ItemData, "43" );
|
|
|
-
|
|
|
- fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","GetConfigurationMaxKeys", "true", "43");
|
|
|
-
|
|
|
- // HeartbeatInterval
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[HeartbeatInterval].ItemAccessibility = 1;
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[HeartbeatInterval].ItemName, "HeartbeatInterval");
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[HeartbeatInterval].ItemData, "10" );
|
|
|
-
|
|
|
- fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","HeartbeatInterval", "false", "10");
|
|
|
-
|
|
|
- // LightIntensity
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[LightIntensity].ItemAccessibility = 1;
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LightIntensity].ItemName, "LightIntensity");
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LightIntensity].ItemData, "0" );
|
|
|
-
|
|
|
- fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","LightIntensity", "false", "0");
|
|
|
-
|
|
|
-
|
|
|
- // LocalAuthorizeOffline
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalAuthorizeOffline].ItemAccessibility = 0;
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalAuthorizeOffline].ItemName, "LocalAuthorizeOffline");
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalAuthorizeOffline].ItemData, "TRUE" );
|
|
|
-
|
|
|
- fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","LocalAuthorizeOffline", "true", "TRUE");
|
|
|
-
|
|
|
- // LocalPreAuthorize
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalPreAuthorize].ItemAccessibility = 0;
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalPreAuthorize].ItemName, "LocalPreAuthorize");
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalPreAuthorize].ItemData, "FALSE" );
|
|
|
-
|
|
|
- fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","LocalPreAuthorize", "true", "FALSE");
|
|
|
-
|
|
|
- // MaxEnergyOnInvalidId
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[MaxEnergyOnInvalidId].ItemAccessibility = 1;
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MaxEnergyOnInvalidId].ItemName, "MaxEnergyOnInvalidId");
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MaxEnergyOnInvalidId].ItemData, "0" );
|
|
|
- ShmSysConfigAndInfo->SysConfig.OfflineMaxChargeEnergy = 0;
|
|
|
-
|
|
|
- fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","MaxEnergyOnInvalidId", "false", "0");
|
|
|
-
|
|
|
- // MeterValuesAlignedData
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedData].ItemAccessibility = 0;
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedData].ItemName, "MeterValuesAlignedData");
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedData].ItemData, "" );
|
|
|
-
|
|
|
- fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","MeterValuesAlignedData", "true", "");
|
|
|
-
|
|
|
- // MeterValuesAlignedDataMaxLength
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedDataMaxLength].ItemAccessibility = 0;
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedDataMaxLength].ItemName, "MeterValuesAlignedDataMaxLength");
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedDataMaxLength].ItemData, "5" );
|
|
|
-
|
|
|
- fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","MeterValuesAlignedDataMaxLength", "true", "5");
|
|
|
-
|
|
|
-
|
|
|
- // MeterValuesSampledData
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledData].ItemAccessibility = 0;
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledData].ItemName, "MeterValuesSampledData");
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledData].ItemData, "Current.Import,Energy.Active.Import.Register,Energy.Active.Import.Interval,Power.Active.Import,Voltage,SOC" );
|
|
|
-
|
|
|
- fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","MeterValuesSampledData", "true", "Current.Import,Energy.Active.Import.Register,Energy.Active.Import.Interval,Power.Active.Import,Voltage,SOC");
|
|
|
-
|
|
|
-
|
|
|
- // MeterValuesSampledDataMaxLength
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledDataMaxLength].ItemAccessibility = 0;
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledDataMaxLength].ItemName, "MeterValuesSampledDataMaxLength");
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledDataMaxLength].ItemData, "6" );
|
|
|
-
|
|
|
- fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","MeterValuesSampledDataMaxLength", "true", "6");
|
|
|
-
|
|
|
- // MeterValueSampleInterval
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValueSampleInterval].ItemAccessibility = 1;
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValueSampleInterval].ItemName, "MeterValueSampleInterval");
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValueSampleInterval].ItemData, "10" );
|
|
|
-
|
|
|
- fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","MeterValueSampleInterval", "false", "10");
|
|
|
-
|
|
|
- // MinimumStatusDuration
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[MinimumStatusDuration].ItemAccessibility = 1;
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MinimumStatusDuration].ItemName, "MinimumStatusDuration");
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MinimumStatusDuration].ItemData, "120" );
|
|
|
- server_cycle_Status = 120; //StatusNotification cycle
|
|
|
- fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","MinimumStatusDuration", "false", "120");
|
|
|
-
|
|
|
- // NumberOfConnectors
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[NumberOfConnectors].ItemAccessibility = 0;
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[NumberOfConnectors].ItemName, "NumberOfConnectors");
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
|
|
|
- {
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[NumberOfConnectors].ItemData, "%d", (CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY));
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[NumberOfConnectors].ItemData, "%d", AC_QUANTITY);
|
|
|
- }
|
|
|
-
|
|
|
- fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","NumberOfConnectors", "true", ShmOCPP16Data->ConfigurationTable.CoreProfile[NumberOfConnectors].ItemData);
|
|
|
-
|
|
|
- // ResetRetries
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[ResetRetries].ItemAccessibility = 1;
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ResetRetries].ItemName, "ResetRetries");
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ResetRetries].ItemData, "3" );
|
|
|
-
|
|
|
- fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","ResetRetries", "false", "3");
|
|
|
-
|
|
|
- // ConnectorPhaseRotation
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotation].ItemAccessibility = 1;
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotation].ItemName, "ConnectorPhaseRotation");
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotation].ItemData, "NotApplicable" );
|
|
|
-
|
|
|
- fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","ConnectorPhaseRotation", "false", "NotApplicable");
|
|
|
-
|
|
|
- // ConnectorPhaseRotationMaxLength
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotationMaxLength].ItemAccessibility = 0;
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotationMaxLength].ItemName, "ConnectorPhaseRotationMaxLength");
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotationMaxLength].ItemData, "1" );
|
|
|
-
|
|
|
- fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","ConnectorPhaseRotationMaxLength", "true", "1");
|
|
|
-
|
|
|
- // StopTransactionOnEVSideDisconnect
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnEVSideDisconnect].ItemAccessibility = 0;
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnEVSideDisconnect].ItemName, "StopTransactionOnEVSideDisconnect");
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnEVSideDisconnect].ItemData, "TRUE" );
|
|
|
-
|
|
|
- fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","StopTransactionOnEVSideDisconnect", "true", "TRUE");
|
|
|
-
|
|
|
- // StopTransactionOnInvalidId
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnInvalidId].ItemAccessibility = 0; //1;
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnInvalidId].ItemName, "StopTransactionOnInvalidId");
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnInvalidId].ItemData, "FALSE" );
|
|
|
-
|
|
|
- fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","StopTransactionOnInvalidId", "true", "FALSE");
|
|
|
-
|
|
|
- // StopTxnAlignedData
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedData].ItemAccessibility = 0;
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedData].ItemName, "StopTxnAlignedData");
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedData].ItemData, "Energy.Active.Import.Register" );
|
|
|
-
|
|
|
- fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","StopTxnAlignedData", "true", "Energy.Active.Import.Register");
|
|
|
-
|
|
|
- // StopTxnAlignedDataMaxLength
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedDataMaxLength].ItemAccessibility = 0;
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedDataMaxLength].ItemName, "StopTxnAlignedDataMaxLength");
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedDataMaxLength].ItemData, "0" );
|
|
|
-
|
|
|
- fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","StopTxnAlignedDataMaxLength", "true", "0");
|
|
|
-
|
|
|
- // StopTxnSampledData
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledData].ItemAccessibility = 0;
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledData].ItemName, "StopTxnSampledData");
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledData].ItemData, "Current.Import,Energy.Active.Import.Interval,Power.Active.Import,Voltage,SOC" );
|
|
|
-
|
|
|
- fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","StopTxnSampledData", "true", "Current.Import,Energy.Active.Import.Interval,Power.Active.Import,Voltage,SOC");
|
|
|
-
|
|
|
- // StopTxnSampledDataMaxLength
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledDataMaxLength].ItemAccessibility = 0;
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledDataMaxLength].ItemName, "StopTxnSampledDataMaxLength");
|
|
|
-
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
|
|
|
- {
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledDataMaxLength].ItemData, "%d", 6);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledDataMaxLength].ItemData, "%d", 5);
|
|
|
- }
|
|
|
-
|
|
|
- //strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledDataMaxLength].ItemData, "0" );
|
|
|
- fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","StopTxnSampledDataMaxLength", "true", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledDataMaxLength].ItemData);
|
|
|
-
|
|
|
- // SupportedFeatureProfiles
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfiles].ItemAccessibility = 0;
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfiles].ItemName, "SupportedFeatureProfiles");
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfiles].ItemData, "Core,FirmwareManagement,LocalAuthListManagement,Reservation,SmartCharging,RemoteTrigger" );
|
|
|
-
|
|
|
- fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","SupportedFeatureProfiles", "true", "Core,FirmwareManagement,LocalAuthListManagement,Reservation,SmartCharging,RemoteTrigger");
|
|
|
-
|
|
|
- // SupportedFeatureProfilesMaxLength
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfilesMaxLength].ItemAccessibility = 0;
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfilesMaxLength].ItemName, "SupportedFeatureProfilesMaxLength");
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfilesMaxLength].ItemData, "6" );
|
|
|
-
|
|
|
- fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","SupportedFeatureProfilesMaxLength", "true", "6");
|
|
|
-
|
|
|
- // TransactionMessageAttempts
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageAttempts].ItemAccessibility = 1;
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageAttempts].ItemName, "TransactionMessageAttempts");
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageAttempts].ItemData, "3" );
|
|
|
- TransactionMessageAttemptsValue = atoi((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageAttempts].ItemData);
|
|
|
-
|
|
|
- fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","TransactionMessageAttempts", "false", "3");
|
|
|
-
|
|
|
- // TransactionMessageRetryInterval
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageRetryInterval].ItemAccessibility = 1;
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageRetryInterval].ItemName, "TransactionMessageRetryInterval");
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageRetryInterval].ItemData, "60" );
|
|
|
- TransactionMessageRetryIntervalValue = atoi((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageRetryInterval].ItemData);
|
|
|
-
|
|
|
- fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","TransactionMessageRetryInterval", "false", "60");
|
|
|
-
|
|
|
- // UnlockConnectorOnEVSideDisconnect
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[UnlockConnectorOnEVSideDisconnect].ItemAccessibility = 0;
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[UnlockConnectorOnEVSideDisconnect].ItemName, "UnlockConnectorOnEVSideDisconnect");
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[UnlockConnectorOnEVSideDisconnect].ItemData, "TRUE" );
|
|
|
-
|
|
|
- fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","UnlockConnectorOnEVSideDisconnect", "true", "TRUE");
|
|
|
-
|
|
|
-
|
|
|
- // WebSocketPingInterval
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[WebSocketPingInterval].ItemAccessibility = 1;
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[WebSocketPingInterval].ItemName, "WebSocketPingInterval");
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[WebSocketPingInterval].ItemData, "30" );
|
|
|
-
|
|
|
- fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","WebSocketPingInterval", "false", "30");
|
|
|
-
|
|
|
- //* Local Auth List Management Profile*/
|
|
|
- #if 0
|
|
|
- //For OCTT Test Case
|
|
|
- ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemAccessibility = 1;
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemName, "LocalAuthorizationListEnabled");
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemData, "TRUE" );
|
|
|
- #endif
|
|
|
-
|
|
|
- #if 1
|
|
|
- //LocalAuthListEnabled
|
|
|
- ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemAccessibility = 1;
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemName, "LocalAuthListEnabled");
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemData, "TRUE" );
|
|
|
- fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","LocalAuthListEnabled", "false", "TRUE");
|
|
|
-
|
|
|
- #endif
|
|
|
-
|
|
|
- //LocalAuthListMaxLength
|
|
|
- ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListMaxLength].ItemAccessibility = 0;
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListMaxLength].ItemName, "LocalAuthListMaxLength");
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListMaxLength].ItemData, "500" );
|
|
|
-
|
|
|
- fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","LocalAuthListMaxLength", "true", "500");
|
|
|
-
|
|
|
- //SendLocalListMaxLength
|
|
|
- ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[SendLocalListMaxLength].ItemAccessibility = 0;
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[SendLocalListMaxLength].ItemName, "SendLocalListMaxLength");
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[SendLocalListMaxLength].ItemData, "500" );
|
|
|
-
|
|
|
- fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","SendLocalListMaxLength", "true", "500");
|
|
|
-
|
|
|
-
|
|
|
- //ReserveConnectorZeroSupported
|
|
|
- ShmOCPP16Data->ConfigurationTable.ReservationProfile[ReserveConnectorZeroSupported].ItemAccessibility = 0;
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.ReservationProfile[ReserveConnectorZeroSupported].ItemName, "ReserveConnectorZeroSupported");
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.ReservationProfile[ReserveConnectorZeroSupported].ItemData, "FALSE" );
|
|
|
-
|
|
|
- fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","ReserveConnectorZeroSupported", "true", "FALSE");
|
|
|
-
|
|
|
- //* Smart Charging Profile */
|
|
|
- //ChargeProfileMaxStackLevel
|
|
|
- ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargeProfileMaxStackLevel].ItemAccessibility = 0;
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargeProfileMaxStackLevel].ItemName, "ChargeProfileMaxStackLevel");
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargeProfileMaxStackLevel].ItemData, "3" );
|
|
|
-
|
|
|
- fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","ChargeProfileMaxStackLevel", "true", "3");
|
|
|
-
|
|
|
- // ChargingScheduleAllowedChargingRateUnit
|
|
|
- ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleAllowedChargingRateUnit].ItemAccessibility = 0;
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleAllowedChargingRateUnit].ItemName, "ChargingScheduleAllowedChargingRateUnit");
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleAllowedChargingRateUnit].ItemData, "Current" );
|
|
|
-
|
|
|
- fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","ChargingScheduleAllowedChargingRateUnit", "true", "Current");
|
|
|
-
|
|
|
-
|
|
|
- // ChargingScheduleMaxPeriods
|
|
|
- ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleMaxPeriods].ItemAccessibility = 0;
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleMaxPeriods].ItemName, "ChargingScheduleMaxPeriods");
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleMaxPeriods].ItemData, "10" );
|
|
|
-
|
|
|
- fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","ChargingScheduleMaxPeriods", "true", "10");
|
|
|
-
|
|
|
- // ConnectorSwitch3to1PhaseSupported
|
|
|
- ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ConnectorSwitch3to1PhaseSupported].ItemAccessibility = 0;
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ConnectorSwitch3to1PhaseSupported].ItemName, "ConnectorSwitch3to1PhaseSupported");
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ConnectorSwitch3to1PhaseSupported].ItemData, "TRUE" );
|
|
|
-
|
|
|
- fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","ConnectorSwitch3to1PhaseSupported", "true", "TRUE");
|
|
|
-
|
|
|
- // MaxChargingProfilesInstalled
|
|
|
- ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[MaxChargingProfilesInstalled].ItemAccessibility = 0;
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[MaxChargingProfilesInstalled].ItemName, "MaxChargingProfilesInstalled");
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[MaxChargingProfilesInstalled].ItemData, "3" );
|
|
|
-
|
|
|
- fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","MaxChargingProfilesInstalled", "true", "3");
|
|
|
-
|
|
|
- fclose(outfile);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- //DEBUG_INFO("../Storage/OCPP/OCPPConfiguration EXit\n");
|
|
|
- char keystr[60]={0};
|
|
|
- char readonlystr[10]={0};
|
|
|
- char valuestr[100]={0};
|
|
|
- fp = fopen("/Storage/OCPP/OCPPConfiguration" , "r");
|
|
|
- if(fp == NULL) {
|
|
|
- DEBUG_INFO("Error opening file");
|
|
|
- return FALSE;
|
|
|
- }
|
|
|
-
|
|
|
- while( fgets (str, sizeof(str), fp)!=NULL )
|
|
|
- {
|
|
|
- //DEBUG_INFO("Get Configuration \n");
|
|
|
-
|
|
|
- str[strlen(str) - 1] = '\0'; // eat the newline fgets() stores
|
|
|
- //*************************key*********************************/
|
|
|
- loc = strstr(str, "key");
|
|
|
- c = 0;
|
|
|
- memset(sstr ,0, sizeof(sstr) );
|
|
|
- while (loc[strlen("key")+3+c] != '\"')
|
|
|
- {
|
|
|
- sstr[c] = loc[strlen("key")+3+c];
|
|
|
- c++;
|
|
|
- }
|
|
|
- sstr[c] = '\0';
|
|
|
- strcpy(keystr,sstr);
|
|
|
-
|
|
|
-
|
|
|
- //*************************readonly*********************************/
|
|
|
- loc = strstr(str, "readonly");
|
|
|
- c = 0;
|
|
|
- memset(sstr ,0, sizeof(sstr) );
|
|
|
- while (loc[strlen("readonly")+2+c] != ',')
|
|
|
- {
|
|
|
- sstr[c] = loc[strlen("readonly")+2+c];
|
|
|
- c++;
|
|
|
- }
|
|
|
- sstr[c] = '\0';
|
|
|
- strcpy(readonlystr,sstr);
|
|
|
-
|
|
|
- //*************************value*********************************/
|
|
|
- loc = strstr(str, "value");
|
|
|
- c = 0;
|
|
|
- memset(sstr ,0, sizeof(sstr) );
|
|
|
- while (loc[strlen("value")+3+c] != '\"')
|
|
|
- {
|
|
|
- sstr[c] = loc[strlen("value")+3+c];
|
|
|
- c++;
|
|
|
- }
|
|
|
- sstr[c] = '\0';
|
|
|
- strcpy(valuestr,sstr);
|
|
|
-
|
|
|
-// DEBUG_INFO("keystr=%s\n",keystr);
|
|
|
-// DEBUG_INFO("readonlystr=%s\n",readonlystr);
|
|
|
-// DEBUG_INFO("valuestr=%s\n",valuestr);
|
|
|
-
|
|
|
- if(strcmp(keystr, "AllowOfflineTxForUnknownId") == 0)
|
|
|
- {
|
|
|
- //Charger.AllowOfflineTxForUnknownId = (value.toLowerCase().equals("true")?true:false);
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[AllowOfflineTxForUnknownId].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AllowOfflineTxForUnknownId].ItemData, "%s", valuestr );
|
|
|
-// DEBUG_INFO("AllowOfflineTxForUnknownId setting\n");
|
|
|
-// DEBUG_INFO("AllowOfflineTxForUnknownId setting\n");
|
|
|
- }
|
|
|
-
|
|
|
- if(strcmp(keystr, "AuthorizationCacheEnabled") == 0)
|
|
|
- {
|
|
|
- //Charger.AuthorizationCacheEnabled = (value.toLowerCase().equals("true")?true:false);
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizationCacheEnabled].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizationCacheEnabled].ItemData, "%s", valuestr );
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- if(strcmp(keystr, "AuthorizeRemoteTxRequests") == 0)
|
|
|
- {
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizeRemoteTxRequests].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizeRemoteTxRequests].ItemData, "%s", valuestr );
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- if(strcmp(keystr, "BlinkRepeat") == 0)
|
|
|
- {
|
|
|
- //Charger.BlinkRepeat = Integer.parseInt(value);
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[BlinkRepeat].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[BlinkRepeat].ItemData, "%d", atoi(valuestr) );
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- if(strcmp(keystr, "ClockAlignedDataInterval") == 0)
|
|
|
- {
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[ClockAlignedDataInterval].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ClockAlignedDataInterval].ItemData, "%d", atoi(valuestr) );
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- if(strcmp(keystr, "ConnectionTimeOut") == 0 )
|
|
|
- {
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectionTimeOut].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectionTimeOut].ItemData, "%d", atoi(valuestr));
|
|
|
- }
|
|
|
-
|
|
|
- if(strcmp(keystr, "GetConfigurationMaxKeys") == 0)
|
|
|
- {
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[GetConfigurationMaxKeys].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[GetConfigurationMaxKeys].ItemData, "%d", atoi(valuestr));
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- if(strcmp(keystr, "HeartbeatInterval") == 0)
|
|
|
- {
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[HeartbeatInterval].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[HeartbeatInterval].ItemData, "%d", atoi(valuestr));
|
|
|
- HeartBeatWaitTime = atoi(valuestr);
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- if(strcmp(keystr, "LightIntensity") == 0)
|
|
|
- {
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[LightIntensity].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LightIntensity].ItemData, "%d", atoi(valuestr));
|
|
|
- }
|
|
|
-
|
|
|
- if(strcmp(keystr, "LocalAuthorizeOffline") == 0)
|
|
|
- {
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalAuthorizeOffline].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalAuthorizeOffline].ItemData, "%s", valuestr );
|
|
|
- }
|
|
|
-
|
|
|
- if(strcmp(keystr, "LocalPreAuthorize") == 0)
|
|
|
- {
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalPreAuthorize].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalPreAuthorize].ItemData, "%s", valuestr );
|
|
|
- }
|
|
|
-
|
|
|
- if(strcmp(keystr, "MaxEnergyOnInvalidId") == 0)
|
|
|
- {
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[MaxEnergyOnInvalidId].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MaxEnergyOnInvalidId].ItemData, "%d", atoi(valuestr) );
|
|
|
- ShmSysConfigAndInfo->SysConfig.OfflineMaxChargeEnergy = atoi(valuestr)/1000;
|
|
|
- }
|
|
|
-
|
|
|
- if(strcmp(keystr, "MeterValuesAlignedData") == 0)
|
|
|
- {
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedData].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedData].ItemData, "%s", valuestr );
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- if(strcmp(keystr, "MeterValuesAlignedDataMaxLength") == 0)
|
|
|
- {
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedDataMaxLength].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedDataMaxLength].ItemData, "%d", atoi(valuestr));
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- if(strcmp(keystr, "MeterValuesSampledData") == 0 )
|
|
|
- {
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledData].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledData].ItemData, "%s", valuestr );
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- if(strcmp(keystr, "MeterValuesSampledDataMaxLength") == 0)
|
|
|
- {
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledDataMaxLength].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledDataMaxLength].ItemData, "%d", atoi(valuestr));
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- if(strcmp(keystr, "MeterValueSampleInterval") == 0)
|
|
|
- {
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValueSampleInterval].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValueSampleInterval].ItemData, "%d", atoi(valuestr));
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- if(strcmp(keystr, "MinimumStatusDuration") == 0)
|
|
|
- {
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[MinimumStatusDuration].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MinimumStatusDuration].ItemData, "%d", atoi(valuestr) );
|
|
|
- server_cycle_Status = atoi(valuestr); //StatusNotification cycle
|
|
|
- }
|
|
|
-
|
|
|
- if(strcmp(keystr, "NumberOfConnectors") == 0)
|
|
|
- {
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[NumberOfConnectors].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[NumberOfConnectors].ItemData, "%d", atoi(valuestr) );
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- if(strcmp(keystr, "ResetRetries") == 0)
|
|
|
- {
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[ResetRetries].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ResetRetries].ItemData, "%d", atoi(valuestr) );
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- if(strcmp(keystr, "ConnectorPhaseRotation") == 0)
|
|
|
- {
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotation].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotation].ItemData, "%s", valuestr );
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- if(strcmp(keystr, "ConnectorPhaseRotationMaxLength") == 0)
|
|
|
- {
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotationMaxLength].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotationMaxLength].ItemData, "%d", atoi(valuestr) );
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- if(strcmp(keystr, "StopTransactionOnEVSideDisconnect") == 0)
|
|
|
- {
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnEVSideDisconnect].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnEVSideDisconnect].ItemData, "%s", valuestr );
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- if(strcmp(keystr, "StopTransactionOnInvalidId") == 0)
|
|
|
- {
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnInvalidId].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnInvalidId].ItemData, "%s", valuestr );
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- if(strcmp(keystr, "StopTxnAlignedData") == 0)
|
|
|
- {
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedData].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedData].ItemData, "%s", valuestr );
|
|
|
- }
|
|
|
-
|
|
|
- if(strcmp(keystr, "StopTxnAlignedDataMaxLength") == 0)
|
|
|
- {
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedDataMaxLength].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedDataMaxLength].ItemData, "%d", atoi(valuestr) );
|
|
|
- }
|
|
|
-
|
|
|
- if(strcmp(keystr, "StopTxnSampledData") == 0)
|
|
|
- {
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledData].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledData].ItemData, "%s", valuestr );
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- if(strcmp(keystr, "StopTxnSampledDataMaxLength") == 0)
|
|
|
- {
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledDataMaxLength].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledDataMaxLength].ItemData, "%d", atoi(valuestr) );
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- if(strcmp(keystr, "SupportedFeatureProfiles") == 0)
|
|
|
- {
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfiles].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfiles].ItemData, "%s", valuestr );
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- if(strcmp(keystr, "SupportedFeatureProfilesMaxLength") == 0)
|
|
|
- {
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfilesMaxLength].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfilesMaxLength].ItemData, "%d", atoi(valuestr) );
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- if(strcmp(keystr, "TransactionMessageAttempts") == 0)
|
|
|
- {
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageAttempts].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageAttempts].ItemData, "%d", atoi(valuestr) );
|
|
|
- TransactionMessageAttemptsValue = atoi(valuestr);
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- if(strcmp(keystr, "TransactionMessageRetryInterval") == 0)
|
|
|
- {
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageRetryInterval].ItemAccessibility= (strcmp(readonlystr, "true")==0) ? 0 : 1;
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageRetryInterval].ItemData, "%d", atoi(valuestr) );
|
|
|
- TransactionMessageRetryIntervalValue = atoi(valuestr);
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- if(strcmp(keystr, "UnlockConnectorOnEVSideDisconnect") == 0)
|
|
|
- {
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[UnlockConnectorOnEVSideDisconnect].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[UnlockConnectorOnEVSideDisconnect].ItemData, "%s", valuestr );
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- if(strcmp(keystr, "WebSocketPingInterval") == 0)
|
|
|
- {
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[WebSocketPingInterval].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[WebSocketPingInterval].ItemData, "%d", atoi(valuestr) );
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- if(strcmp(keystr, "LocalAuthListEnabled") == 0)
|
|
|
- {
|
|
|
- ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemData, "%s", valuestr );
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- if(strcmp(keystr, "LocalAuthListMaxLength") == 0)
|
|
|
- {
|
|
|
- ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListMaxLength].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListMaxLength].ItemData, "%d", atoi(valuestr) );
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- if(strcmp(keystr, "SendLocalListMaxLength") == 0)
|
|
|
- {
|
|
|
- ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[SendLocalListMaxLength].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[SendLocalListMaxLength].ItemData, "%d", atoi(valuestr) );
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- if(strcmp(keystr, "ReserveConnectorZeroSupported") == 0)
|
|
|
- {
|
|
|
- ShmOCPP16Data->ConfigurationTable.ReservationProfile[ReserveConnectorZeroSupported].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.ReservationProfile[ReserveConnectorZeroSupported].ItemData, "%s", valuestr );
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- if(strcmp(keystr, "ChargeProfileMaxStackLevel") == 0)
|
|
|
- {
|
|
|
- ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargeProfileMaxStackLevel].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargeProfileMaxStackLevel].ItemData, "%d", atoi(valuestr) );
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- if(strcmp(keystr, "ChargingScheduleAllowedChargingRateUnit") == 0)
|
|
|
- {
|
|
|
- ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleAllowedChargingRateUnit].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleAllowedChargingRateUnit].ItemData, "%s", valuestr );
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- if(strcmp(keystr, "ChargingScheduleMaxPeriods") == 0)
|
|
|
- {
|
|
|
- ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleMaxPeriods].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleMaxPeriods].ItemData, "%d", atoi(valuestr) );
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- if(strcmp(keystr, "ConnectorSwitch3to1PhaseSupported") == 0)
|
|
|
- {
|
|
|
- ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ConnectorSwitch3to1PhaseSupported].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ConnectorSwitch3to1PhaseSupported].ItemData, "%s", valuestr);
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- if(strcmp(keystr, "MaxChargingProfilesInstalled") == 0)
|
|
|
- {
|
|
|
- ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[MaxChargingProfilesInstalled].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[MaxChargingProfilesInstalled].ItemData, "%d", atoi(valuestr) );
|
|
|
-
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- fclose(fp);
|
|
|
- }
|
|
|
-
|
|
|
- return 0;
|
|
|
-}
|
|
|
-
|
|
|
-
|
|
|
-void StoreConfigurationTable(void)
|
|
|
-{
|
|
|
- FILE *outfile;
|
|
|
- outfile = fopen("/Storage/OCPP/OCPPConfiguration" , "w+");
|
|
|
- if(outfile == NULL)
|
|
|
- {
|
|
|
- DEBUG_INFO("Error opening file");
|
|
|
- return ;
|
|
|
- }
|
|
|
-
|
|
|
- /*Core Profile*/
|
|
|
- //AllowOfflineTxForUnknownId
|
|
|
- /*
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[AllowOfflineTxForUnknownId].ItemAccessibility = 1;
|
|
|
- printf("AllowoddlineTXForUnknownId type: %d \n", ShmOCPP16Data->ConfigurationTable.CoreProfile[AllowOfflineTxForUnknownId].ItemAccessibility);
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AllowOfflineTxForUnknownId].ItemName, "AllowOfflineTxForUnknownId");
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AllowOfflineTxForUnknownId].ItemData, "TRUE" );
|
|
|
- */
|
|
|
-
|
|
|
- //DEBUG_INFO("data=%s\n",data);
|
|
|
- fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","AllowOfflineTxForUnknownId", "false", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AllowOfflineTxForUnknownId].ItemData);
|
|
|
-
|
|
|
- //AuthorizationCacheEnabled
|
|
|
- /*
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizationCacheEnabled].ItemAccessibility = 1;
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizationCacheEnabled].ItemName, "AuthorizationCacheEnabled");
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizationCacheEnabled].ItemData, "FALSE" );
|
|
|
- */
|
|
|
-
|
|
|
- fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","AuthorizationCacheEnabled", "false", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizationCacheEnabled].ItemData);
|
|
|
-
|
|
|
- //AuthorizeRemoteTxRequests
|
|
|
- /*
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizeRemoteTxRequests].ItemAccessibility = 0;
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizeRemoteTxRequests].ItemName, "AuthorizeRemoteTxRequests");
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizeRemoteTxRequests].ItemData, "TRUE" );
|
|
|
- */
|
|
|
-
|
|
|
- fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","AuthorizeRemoteTxRequests", "true", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizeRemoteTxRequests].ItemData);
|
|
|
-
|
|
|
- //BlinkRepeat
|
|
|
- /*
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[BlinkRepeat].ItemAccessibility = 1;
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[BlinkRepeat].ItemName, "BlinkRepeat");
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[BlinkRepeat].ItemData, "0" );
|
|
|
- */
|
|
|
-
|
|
|
- fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","BlinkRepeat", "false", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[BlinkRepeat].ItemData);
|
|
|
-
|
|
|
- //ClockAlignedDataInterval
|
|
|
- /*
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[ClockAlignedDataInterval].ItemAccessibility = 1;
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ClockAlignedDataInterval].ItemName, "ClockAlignedDataInterval");
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ClockAlignedDataInterval].ItemData, "0" );
|
|
|
- */
|
|
|
-
|
|
|
- fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","ClockAlignedDataInterval", "false", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ClockAlignedDataInterval].ItemData);
|
|
|
-
|
|
|
- //ConnectionTimeOut
|
|
|
- /*
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectionTimeOut].ItemAccessibility = 1;
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectionTimeOut].ItemName, "ConnectionTimeOut");
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectionTimeOut].ItemData, "180" );
|
|
|
- */
|
|
|
-
|
|
|
- fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","ConnectionTimeOut", "false", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectionTimeOut].ItemData);
|
|
|
-
|
|
|
- //GetConfigurationMaxKeys
|
|
|
- /*
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[GetConfigurationMaxKeys].ItemAccessibility =0;
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[GetConfigurationMaxKeys].ItemName, "GetConfigurationMaxKeys");
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[GetConfigurationMaxKeys].ItemData, "43" );
|
|
|
- */
|
|
|
-
|
|
|
- fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","GetConfigurationMaxKeys", "true", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[GetConfigurationMaxKeys].ItemData);
|
|
|
-
|
|
|
- // HeartbeatInterval
|
|
|
- /*
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[HeartbeatInterval].ItemAccessibility = 1;
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[HeartbeatInterval].ItemName, "HeartbeatInterval");
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[HeartbeatInterval].ItemData, "10" );
|
|
|
- */
|
|
|
-
|
|
|
- fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","HeartbeatInterval", "false", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[HeartbeatInterval].ItemData);
|
|
|
-
|
|
|
- // LightIntensity
|
|
|
- /*
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[LightIntensity].ItemAccessibility = 1;
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LightIntensity].ItemName, "LightIntensity");
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LightIntensity].ItemData, "0" );
|
|
|
- */
|
|
|
-
|
|
|
- fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","LightIntensity", "false", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LightIntensity].ItemData);
|
|
|
-
|
|
|
- // LocalAuthorizeOffline
|
|
|
- /*
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalAuthorizeOffline].ItemAccessibility = 0;
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalAuthorizeOffline].ItemName, "LocalAuthorizeOffline");
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalAuthorizeOffline].ItemData, "TRUE" );
|
|
|
- */
|
|
|
-
|
|
|
- fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","LocalAuthorizeOffline", "true", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalAuthorizeOffline].ItemData);
|
|
|
-
|
|
|
- // LocalPreAuthorize
|
|
|
- /*
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalPreAuthorize].ItemAccessibility = 0;
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalPreAuthorize].ItemName, "LocalPreAuthorize");
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalPreAuthorize].ItemData, "FALSE" );
|
|
|
- */
|
|
|
-
|
|
|
- fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","LocalPreAuthorize", "true", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalPreAuthorize].ItemData);
|
|
|
-
|
|
|
- // MaxEnergyOnInvalidId
|
|
|
- /*
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[MaxEnergyOnInvalidId].ItemAccessibility = 1;
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MaxEnergyOnInvalidId].ItemName, "MaxEnergyOnInvalidId");
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MaxEnergyOnInvalidId].ItemData, "0" );
|
|
|
- */
|
|
|
- //ShmSysConfigAndInfo->SysConfig.OfflineMaxChargeEnergy = 0;
|
|
|
-
|
|
|
- fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","MaxEnergyOnInvalidId", "false", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MaxEnergyOnInvalidId].ItemData);
|
|
|
-
|
|
|
- // MeterValuesAlignedData
|
|
|
- /*
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedData].ItemAccessibility = 1;
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedData].ItemName, "MeterValuesAlignedData");
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedData].ItemData, "Current.Export,Energy.Active.Export.Interval,Power.Active.Export,Voltage,SOC" );
|
|
|
- */
|
|
|
-
|
|
|
- fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","MeterValuesAlignedData", "true", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedData].ItemData);
|
|
|
-
|
|
|
- // MeterValuesAlignedDataMaxLength
|
|
|
- /*
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedDataMaxLength].ItemAccessibility = 0;
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedDataMaxLength].ItemName, "MeterValuesAlignedDataMaxLength");
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedDataMaxLength].ItemData, "5" );
|
|
|
- */
|
|
|
-
|
|
|
- fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","MeterValuesAlignedDataMaxLength", "true", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedDataMaxLength].ItemData);
|
|
|
-
|
|
|
-
|
|
|
- // MeterValuesSampledData
|
|
|
- /*
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledData].ItemAccessibility = 1;
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledData].ItemName, "MeterValuesSampledData");
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledData].ItemData, "Current.Export,Energy.Active.Export.Interval,Power.Active.Export,Voltage,SOC" );
|
|
|
- */
|
|
|
-
|
|
|
- fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","MeterValuesSampledData", "true", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledData].ItemData);
|
|
|
-
|
|
|
-
|
|
|
- // MeterValuesSampledDataMaxLength
|
|
|
- /*
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledDataMaxLength].ItemAccessibility = 0;
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledDataMaxLength].ItemName, "MeterValuesSampledDataMaxLength");
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledDataMaxLength].ItemData, "5" );
|
|
|
- */
|
|
|
-
|
|
|
- fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","MeterValuesSampledDataMaxLength", "true", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledDataMaxLength].ItemData);
|
|
|
-
|
|
|
- // MeterValueSampleInterval
|
|
|
- /*
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValueSampleInterval].ItemAccessibility = 1;
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValueSampleInterval].ItemName, "MeterValueSampleInterval");
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValueSampleInterval].ItemData, "10" );
|
|
|
- */
|
|
|
-
|
|
|
- fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","MeterValueSampleInterval", "false", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValueSampleInterval].ItemData);
|
|
|
-
|
|
|
- // MinimumStatusDuration
|
|
|
- /*
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[MinimumStatusDuration].ItemAccessibility = 1;
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MinimumStatusDuration].ItemName, "MinimumStatusDuration");
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MinimumStatusDuration].ItemData, "0" );
|
|
|
- */
|
|
|
-
|
|
|
- fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","MinimumStatusDuration", "false", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MinimumStatusDuration].ItemData);
|
|
|
-
|
|
|
- // NumberOfConnectors
|
|
|
- /*
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[NumberOfConnectors].ItemAccessibility = 0;
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[NumberOfConnectors].ItemName, "NumberOfConnectors");
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
|
|
|
- {
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[NumberOfConnectors].ItemData, "%d", (CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY));
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[NumberOfConnectors].ItemData, "%d", AC_QUANTITY);
|
|
|
- }
|
|
|
- */
|
|
|
-
|
|
|
- fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","NumberOfConnectors", "true", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[NumberOfConnectors].ItemData);
|
|
|
-
|
|
|
- // ResetRetries
|
|
|
- /*
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[ResetRetries].ItemAccessibility = 1;
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ResetRetries].ItemName, "ResetRetries");
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ResetRetries].ItemData, "3" );
|
|
|
- */
|
|
|
-
|
|
|
- fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","ResetRetries", "false", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ResetRetries].ItemData);
|
|
|
-
|
|
|
- // ConnectorPhaseRotation
|
|
|
- /*
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotation].ItemAccessibility = 1;
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotation].ItemName, "ConnectorPhaseRotation");
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotation].ItemData, "NotApplicable" );
|
|
|
- */
|
|
|
-
|
|
|
- fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","ConnectorPhaseRotation", "false", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotation].ItemData);
|
|
|
-
|
|
|
- // ConnectorPhaseRotationMaxLength
|
|
|
- /*
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotationMaxLength].ItemAccessibility = 0;
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotationMaxLength].ItemName, "ConnectorPhaseRotationMaxLength");
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotationMaxLength].ItemData, "1" );
|
|
|
- */
|
|
|
-
|
|
|
- fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","ConnectorPhaseRotationMaxLength", "true", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotationMaxLength].ItemData);
|
|
|
-
|
|
|
- // StopTransactionOnEVSideDisconnect
|
|
|
- /*
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnEVSideDisconnect].ItemAccessibility = 0;
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnEVSideDisconnect].ItemName, "StopTransactionOnEVSideDisconnect");
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnEVSideDisconnect].ItemData, "TRUE" );
|
|
|
- */
|
|
|
-
|
|
|
- fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","StopTransactionOnEVSideDisconnect", "true", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnEVSideDisconnect].ItemData);
|
|
|
-
|
|
|
- // StopTransactionOnInvalidId
|
|
|
- /*
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnInvalidId].ItemAccessibility = 0;
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnInvalidId].ItemName, "StopTransactionOnInvalidId");
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnInvalidId].ItemData, "FALSE" );
|
|
|
- */
|
|
|
-
|
|
|
- fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","StopTransactionOnInvalidId", "true", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnInvalidId].ItemData);
|
|
|
-
|
|
|
- // StopTxnAlignedData
|
|
|
- /*
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedData].ItemAccessibility = 1;
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedData].ItemName, "StopTxnAlignedData");
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedData].ItemData, "Energy.Active.Import.Register" );
|
|
|
- */
|
|
|
-
|
|
|
- fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","StopTxnAlignedData", "true", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedData].ItemData);
|
|
|
-
|
|
|
- // StopTxnAlignedDataMaxLength
|
|
|
- /*
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedDataMaxLength].ItemAccessibility = 0;
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedDataMaxLength].ItemName, "StopTxnAlignedDataMaxLength");
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedDataMaxLength].ItemData, "0" );
|
|
|
- */
|
|
|
-
|
|
|
- fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","StopTxnAlignedDataMaxLength", "true", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedDataMaxLength].ItemData);
|
|
|
-
|
|
|
- // StopTxnSampledData
|
|
|
- /*
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledData].ItemAccessibility = 1;
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledData].ItemName, "StopTxnSampledData");
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledData].ItemData, "Energy.Active.Import.Register" );
|
|
|
- */
|
|
|
-
|
|
|
- fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","StopTxnSampledData", "true", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledData].ItemData);
|
|
|
-
|
|
|
- // StopTxnSampledDataMaxLength
|
|
|
- /*
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledDataMaxLength].ItemAccessibility = 0;
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledDataMaxLength].ItemName, "StopTxnSampledDataMaxLength");
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledDataMaxLength].ItemData, "0" );
|
|
|
- */
|
|
|
-
|
|
|
- fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","StopTxnSampledDataMaxLength", "true", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledDataMaxLength].ItemData);
|
|
|
-
|
|
|
- // SupportedFeatureProfiles
|
|
|
- /*
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfiles].ItemAccessibility = 0;
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfiles].ItemName, "SupportedFeatureProfiles");
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfiles].ItemData, "Core,FirmwareManagement,LocalAuthListManagement,Reservation,SmartCharging,RemoteTrigger" );
|
|
|
- */
|
|
|
-
|
|
|
- fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","SupportedFeatureProfiles", "true", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfiles].ItemData);
|
|
|
-
|
|
|
- // SupportedFeatureProfilesMaxLength
|
|
|
- /*
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfilesMaxLength].ItemAccessibility = 0;
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfilesMaxLength].ItemName, "SupportedFeatureProfilesMaxLength");
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfilesMaxLength].ItemData, "6" );
|
|
|
- */
|
|
|
-
|
|
|
- fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","SupportedFeatureProfilesMaxLength", "true", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfilesMaxLength].ItemData);
|
|
|
-
|
|
|
- // TransactionMessageAttempts
|
|
|
- /*
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageAttempts].ItemAccessibility = 1;
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageAttempts].ItemName, "TransactionMessageAttempts");
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageAttempts].ItemData, "3" );
|
|
|
- */
|
|
|
-
|
|
|
- fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","TransactionMessageAttempts", "false", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageAttempts].ItemData);
|
|
|
-
|
|
|
- // TransactionMessageRetryInterval
|
|
|
- /*
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageRetryInterval].ItemAccessibility = 1;
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageRetryInterval].ItemName, "TransactionMessageRetryInterval");
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageRetryInterval].ItemData, "60" );
|
|
|
- */
|
|
|
-
|
|
|
- fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","TransactionMessageRetryInterval", "false", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageRetryInterval].ItemData);
|
|
|
-
|
|
|
- // UnlockConnectorOnEVSideDisconnect
|
|
|
- /*
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[UnlockConnectorOnEVSideDisconnect].ItemAccessibility = 0;
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[UnlockConnectorOnEVSideDisconnect].ItemName, "UnlockConnectorOnEVSideDisconnect");
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[UnlockConnectorOnEVSideDisconnect].ItemData, "TRUE" );
|
|
|
- */
|
|
|
-
|
|
|
- fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","UnlockConnectorOnEVSideDisconnect", "true", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[UnlockConnectorOnEVSideDisconnect].ItemData);
|
|
|
-
|
|
|
-
|
|
|
- // WebSocketPingInterval
|
|
|
- /*
|
|
|
- ShmOCPP16Data->ConfigurationTable.CoreProfile[WebSocketPingInterval].ItemAccessibility = 1;
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[WebSocketPingInterval].ItemName, "WebSocketPingInterval");
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[WebSocketPingInterval].ItemData, "30" );
|
|
|
- */
|
|
|
-
|
|
|
- fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","WebSocketPingInterval", "false", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[WebSocketPingInterval].ItemData);
|
|
|
-
|
|
|
- //* Local Auth List Management Profile*/
|
|
|
- //LocalAuthListEnabled
|
|
|
- /*
|
|
|
- ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemAccessibility = 1;
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemName, "LocalAuthListEnabled");
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemData, "TRUE" );
|
|
|
- */
|
|
|
- fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","LocalAuthListEnabled", "false", (char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemData);
|
|
|
-
|
|
|
- //LocalAuthListMaxLength
|
|
|
- /*
|
|
|
- ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListMaxLength].ItemAccessibility = 0;
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListMaxLength].ItemName, "LocalAuthListMaxLength");
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListMaxLength].ItemData, "500" );
|
|
|
- */
|
|
|
-
|
|
|
- fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","LocalAuthListMaxLength", "true", (char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListMaxLength].ItemData);
|
|
|
-
|
|
|
- //SendLocalListMaxLength
|
|
|
- /*
|
|
|
- ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[SendLocalListMaxLength].ItemAccessibility = 0;
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[SendLocalListMaxLength].ItemName, "SendLocalListMaxLength");
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[SendLocalListMaxLength].ItemData, "500" );
|
|
|
- */
|
|
|
-
|
|
|
- fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","SendLocalListMaxLength", "true", (char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[SendLocalListMaxLength].ItemData);
|
|
|
-
|
|
|
-
|
|
|
- //ReserveConnectorZeroSupported
|
|
|
- /*
|
|
|
- ShmOCPP16Data->ConfigurationTable.ReservationProfile[ReserveConnectorZeroSupported].ItemAccessibility = 0;
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.ReservationProfile[ReserveConnectorZeroSupported].ItemName, "ReserveConnectorZeroSupported");
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.ReservationProfile[ReserveConnectorZeroSupported].ItemData, "FALSE" );
|
|
|
- */
|
|
|
-
|
|
|
- fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","ReserveConnectorZeroSupported", "true", (char *)ShmOCPP16Data->ConfigurationTable.ReservationProfile[ReserveConnectorZeroSupported].ItemData);
|
|
|
-
|
|
|
- //* Smart Charging Profile */
|
|
|
- //ChargeProfileMaxStackLevel
|
|
|
- /*
|
|
|
- ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargeProfileMaxStackLevel].ItemAccessibility = 0;
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargeProfileMaxStackLevel].ItemName, "ChargeProfileMaxStackLevel");
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargeProfileMaxStackLevel].ItemData, "3" );
|
|
|
- */
|
|
|
-
|
|
|
- fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","ChargeProfileMaxStackLevel", "true", (char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargeProfileMaxStackLevel].ItemData);
|
|
|
-
|
|
|
- // ChargingScheduleAllowedChargingRateUnit
|
|
|
- /*
|
|
|
- ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleAllowedChargingRateUnit].ItemAccessibility = 0;
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleAllowedChargingRateUnit].ItemName, "ChargingScheduleAllowedChargingRateUnit");
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleAllowedChargingRateUnit].ItemData, "Current" );
|
|
|
- */
|
|
|
-
|
|
|
- fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","ChargingScheduleAllowedChargingRateUnit", "true", (char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleAllowedChargingRateUnit].ItemData);
|
|
|
-
|
|
|
- // ChargingScheduleMaxPeriods
|
|
|
- /*
|
|
|
- ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleMaxPeriods].ItemAccessibility = 0;
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleMaxPeriods].ItemName, "ChargingScheduleMaxPeriods");
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleMaxPeriods].ItemData, "10" );
|
|
|
- */
|
|
|
-
|
|
|
- fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","ChargingScheduleMaxPeriods", "true", (char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleMaxPeriods].ItemData);
|
|
|
-
|
|
|
- // ConnectorSwitch3to1PhaseSupported
|
|
|
- /*
|
|
|
- ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ConnectorSwitch3to1PhaseSupported].ItemAccessibility = 0;
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ConnectorSwitch3to1PhaseSupported].ItemName, "ConnectorSwitch3to1PhaseSupported");
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ConnectorSwitch3to1PhaseSupported].ItemData, "TRUE" );
|
|
|
- */
|
|
|
-
|
|
|
- fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","ConnectorSwitch3to1PhaseSupported", "true", (char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ConnectorSwitch3to1PhaseSupported].ItemData);
|
|
|
-
|
|
|
- // MaxChargingProfilesInstalled
|
|
|
- /*
|
|
|
- ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[MaxChargingProfilesInstalled].ItemAccessibility = 0;
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[MaxChargingProfilesInstalled].ItemName, "MaxChargingProfilesInstalled");
|
|
|
- strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[MaxChargingProfilesInstalled].ItemData, "3" );
|
|
|
- */
|
|
|
-
|
|
|
- fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","MaxChargingProfilesInstalled", "true", (char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[MaxChargingProfilesInstalled].ItemData);
|
|
|
-
|
|
|
- fclose(outfile);
|
|
|
-
|
|
|
-}
|
|
|
-
|
|
|
-
|
|
|
-void getKeyValue(char *keyReq)
|
|
|
-{
|
|
|
- int isEmpty = FALSE;
|
|
|
- int isKnowKey = FALSE;
|
|
|
-
|
|
|
- DEBUG_INFO("keyReq = %s\n", keyReq);
|
|
|
-
|
|
|
- if((keyReq == NULL) || (strlen(keyReq) == 0))
|
|
|
- isEmpty = TRUE;
|
|
|
-
|
|
|
- if(isEmpty || strcmp(keyReq, "AllowOfflineTxForUnknownId") == 0)
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_AllowOfflineTxForUnknownId].Item, "AllowOfflineTxForUnknownId");
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_AllowOfflineTxForUnknownId].Key, "AllowOfflineTxForUnknownId");
|
|
|
- if(ShmOCPP16Data->ConfigurationTable.CoreProfile[AllowOfflineTxForUnknownId].ItemAccessibility == 1)
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_AllowOfflineTxForUnknownId].ReadOnly, "0"/*"FALSE"*/);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_AllowOfflineTxForUnknownId].ReadOnly, "1"/*"TRUE"*/);
|
|
|
- }
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_AllowOfflineTxForUnknownId].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AllowOfflineTxForUnknownId].ItemData );
|
|
|
- isKnowKey = TRUE;
|
|
|
- }
|
|
|
-
|
|
|
- if(isEmpty || strcmp(keyReq, "AuthorizationCacheEnabled") == 0 )
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_AuthorizationCacheEnabled].Item, "AuthorizationCacheEnabled");
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_AuthorizationCacheEnabled].Key, "AuthorizationCacheEnabled");
|
|
|
- if(ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizationCacheEnabled].ItemAccessibility == 1)
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_AuthorizationCacheEnabled].ReadOnly, "0"/*"FALSE"*/);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_AuthorizationCacheEnabled].ReadOnly, "1"/*"TRUE"*/);
|
|
|
- }
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_AuthorizationCacheEnabled].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizationCacheEnabled].ItemData );
|
|
|
- isKnowKey = TRUE;
|
|
|
- }
|
|
|
-
|
|
|
- if(isEmpty || strcmp(keyReq, "AuthorizeRemoteTxRequests") == 0 )
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_AuthorizeRemoteTxRequests].Item, "AuthorizeRemoteTxRequests");
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_AuthorizeRemoteTxRequests].Key, "AuthorizeRemoteTxRequests");
|
|
|
-
|
|
|
- if(ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizeRemoteTxRequests].ItemAccessibility == 1)
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_AuthorizeRemoteTxRequests].ReadOnly, "0"/*"FALSE"*/);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_AuthorizeRemoteTxRequests].ReadOnly, "1"/*"TRUE"*/);
|
|
|
- }
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_AuthorizeRemoteTxRequests].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizeRemoteTxRequests].ItemData );
|
|
|
- isKnowKey = TRUE;
|
|
|
- }
|
|
|
-
|
|
|
- if(isEmpty || strcmp(keyReq, "BlinkRepeat") == 0 )
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_BlinkRepeat].Item, "BlinkRepeat");
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_BlinkRepeat].Key, "BlinkRepeat");
|
|
|
-
|
|
|
- if(ShmOCPP16Data->ConfigurationTable.CoreProfile[BlinkRepeat].ItemAccessibility == 1)
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_BlinkRepeat].ReadOnly, "0"/*"FALSE"*/);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_BlinkRepeat].ReadOnly, "1"/*"TRUE"*/);
|
|
|
- }
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_BlinkRepeat].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[BlinkRepeat].ItemData );
|
|
|
- isKnowKey = TRUE;
|
|
|
- }
|
|
|
-
|
|
|
- if(isEmpty || strcmp(keyReq, "ClockAlignedDataInterval") == 0 )
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_ClockAlignedDataInterval].Item, "ClockAlignedDataInterval");
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ClockAlignedDataInterval].Key, "ClockAlignedDataInterval");
|
|
|
-
|
|
|
- if(ShmOCPP16Data->ConfigurationTable.CoreProfile[ClockAlignedDataInterval].ItemAccessibility == 1)
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ClockAlignedDataInterval].ReadOnly, "0"/*"FALSE"*/);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ClockAlignedDataInterval].ReadOnly, "1"/*"TRUE"*/);
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ClockAlignedDataInterval].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ClockAlignedDataInterval].ItemData );
|
|
|
- isKnowKey = TRUE;
|
|
|
- }
|
|
|
-
|
|
|
- if(isEmpty || strcmp(keyReq, "ConnectionTimeOut") == 0 )
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_ConnectionTimeOut].Item, "ConnectionTimeOut");
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ConnectionTimeOut].Key, "ConnectionTimeOut");
|
|
|
-
|
|
|
- if(ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectionTimeOut].ItemAccessibility == 1)
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ConnectionTimeOut].ReadOnly, "0"/*"FALSE"*/);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ConnectionTimeOut].ReadOnly, "1"/*"TRUE"*/);
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ConnectionTimeOut].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectionTimeOut].ItemData );
|
|
|
- isKnowKey = TRUE;
|
|
|
- }
|
|
|
-
|
|
|
- if(isEmpty || strcmp(keyReq, "GetConfigurationMaxKeys") == 0 )
|
|
|
- {
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_GetConfigurationMaxKeys].Item, "GetConfigurationMaxKeys");
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_GetConfigurationMaxKeys].Key, "GetConfigurationMaxKeys");
|
|
|
-
|
|
|
- if(ShmOCPP16Data->ConfigurationTable.CoreProfile[GetConfigurationMaxKeys].ItemAccessibility == 1)
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_GetConfigurationMaxKeys].ReadOnly, "0"/*"FALSE"*/);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_GetConfigurationMaxKeys].ReadOnly, "1"/*"TRUE"*/);
|
|
|
- }
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_GetConfigurationMaxKeys].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[GetConfigurationMaxKeys].ItemData );
|
|
|
- isKnowKey = TRUE;
|
|
|
- }
|
|
|
-
|
|
|
- if(isEmpty || strcmp(keyReq, "HeartbeatInterval") == 0 )
|
|
|
- {
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_HeartbeatInterval].Item, "HeartbeatInterval");
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_HeartbeatInterval].Key, "HeartbeatInterval");
|
|
|
-
|
|
|
- if(ShmOCPP16Data->ConfigurationTable.CoreProfile[HeartbeatInterval].ItemAccessibility == 1)
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_HeartbeatInterval].ReadOnly, "0"/*"FALSE"*/);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_HeartbeatInterval].ReadOnly, "1"/*"TRUE"*/);
|
|
|
- }
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_HeartbeatInterval].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[HeartbeatInterval].ItemData );
|
|
|
- isKnowKey = TRUE;
|
|
|
- }
|
|
|
-
|
|
|
- if(isEmpty || strcmp(keyReq, "LightIntensity") == 0 )
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_LightIntensity].Item, "LightIntensity");
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_LightIntensity].Key, "LightIntensity");
|
|
|
-
|
|
|
- if(ShmOCPP16Data->ConfigurationTable.CoreProfile[LightIntensity].ItemAccessibility == 1)
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_LightIntensity].ReadOnly, "0"/*"FALSE"*/);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_LightIntensity].ReadOnly, "1"/*"TRUE"*/);
|
|
|
- }
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_LightIntensity].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LightIntensity].ItemData );
|
|
|
- isKnowKey = TRUE;
|
|
|
- }
|
|
|
-
|
|
|
- if(isEmpty || strcmp(keyReq, "LocalAuthorizeOffline") == 0 )
|
|
|
- {
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_LocalAuthorizeOffline].Item, "LocalAuthorizeOffline");
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_LocalAuthorizeOffline].Key, "LocalAuthorizeOffline");
|
|
|
-
|
|
|
- if(ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalAuthorizeOffline].ItemAccessibility == 1)
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_LocalAuthorizeOffline].ReadOnly, "0"/*"FALSE"*/);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_LocalAuthorizeOffline].ReadOnly, "1"/*"TRUE"*/);
|
|
|
- }
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_LocalAuthorizeOffline].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalAuthorizeOffline].ItemData );
|
|
|
- isKnowKey = TRUE;
|
|
|
- }
|
|
|
-
|
|
|
- if(isEmpty || strcmp(keyReq, "LocalPreAuthorize") == 0 )
|
|
|
- {
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_LocalPreAuthorize].Item, "LocalPreAuthorize");
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_LocalPreAuthorize].Key, "LocalPreAuthorize");
|
|
|
-
|
|
|
- if(ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalPreAuthorize].ItemAccessibility == 1)
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_LocalPreAuthorize].ReadOnly, "0"/*"FALSE"*/);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_LocalPreAuthorize].ReadOnly, "1"/*"TRUE"*/);
|
|
|
- }
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_LocalPreAuthorize].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalPreAuthorize].ItemData );
|
|
|
- isKnowKey = TRUE;
|
|
|
- }
|
|
|
-
|
|
|
- if(isEmpty || strcmp(keyReq, "MaxEnergyOnInvalidId") == 0 )
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_MaxEnergyOnInvalidId].Item, "MaxEnergyOnInvalidId");
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MaxEnergyOnInvalidId].Key, "MaxEnergyOnInvalidId");
|
|
|
-
|
|
|
- if(ShmOCPP16Data->ConfigurationTable.CoreProfile[MaxEnergyOnInvalidId].ItemAccessibility == 1)
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MaxEnergyOnInvalidId].ReadOnly, "0"/*"FALSE"*/);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MaxEnergyOnInvalidId].ReadOnly, "1"/*"TRUE"*/);
|
|
|
- }
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MaxEnergyOnInvalidId].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MaxEnergyOnInvalidId].ItemData );
|
|
|
- ShmSysConfigAndInfo->SysConfig.OfflineMaxChargeEnergy = atoi((const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MaxEnergyOnInvalidId].ItemData)/1000;
|
|
|
- isKnowKey = TRUE;
|
|
|
- }
|
|
|
-
|
|
|
- if(isEmpty || strcmp(keyReq, "MeterValuesAlignedData") == 0 )
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_MeterValuesAlignedData].Item, "MeterValuesAlignedData");
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MeterValuesAlignedData].Key, "MeterValuesAlignedData");
|
|
|
-
|
|
|
- if(ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedData].ItemAccessibility == 1)
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MeterValuesAlignedData].ReadOnly, "0"/*"FALSE"*/);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MeterValuesAlignedData].ReadOnly, "1"/*"TRUE"*/);
|
|
|
- }
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MeterValuesAlignedData].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedData].ItemData );
|
|
|
- isKnowKey = TRUE;
|
|
|
- }
|
|
|
-
|
|
|
- if(isEmpty || strcmp(keyReq, "MeterValuesAlignedDataMaxLength") == 0 )
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_MeterValuesAlignedDataMaxLength].Item, "MeterValuesAlignedDataMaxLength");
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MeterValuesAlignedDataMaxLength].Key, "MeterValuesAlignedDataMaxLength");
|
|
|
-
|
|
|
- if(ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedDataMaxLength].ItemAccessibility == 1)
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MeterValuesAlignedDataMaxLength].ReadOnly, "0"/*"FALSE"*/);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MeterValuesAlignedDataMaxLength].ReadOnly, "1"/*"TRUE"*/);
|
|
|
- }
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MeterValuesAlignedDataMaxLength].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedDataMaxLength].ItemData );
|
|
|
- isKnowKey = TRUE;
|
|
|
- }
|
|
|
-
|
|
|
- if(isEmpty || strcmp(keyReq, "MeterValuesSampledData") == 0 )
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_MeterValuesSampledData].Item, "MeterValuesSampledData");
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MeterValuesSampledData].Key, "MeterValuesSampledData");
|
|
|
-
|
|
|
- if(ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledData].ItemAccessibility == 1)
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MeterValuesSampledData].ReadOnly, "0"/*"FALSE"*/);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MeterValuesSampledData].ReadOnly, "1"/*"TRUE"*/);
|
|
|
- }
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MeterValuesSampledData].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledData].ItemData );
|
|
|
- isKnowKey = TRUE;
|
|
|
- }
|
|
|
-
|
|
|
- if(isEmpty || strcmp(keyReq, "MeterValuesSampledDataMaxLength") == 0 )
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_MeterValuesSampledDataMaxLength].Item, "MeterValuesSampledDataMaxLength");
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MeterValuesSampledDataMaxLength].Key, "MeterValuesSampledDataMaxLength");
|
|
|
-
|
|
|
- if(ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledDataMaxLength].ItemAccessibility == 1)
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MeterValuesSampledDataMaxLength].ReadOnly, "0"/*"FALSE"*/);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MeterValuesSampledDataMaxLength].ReadOnly, "1"/*"TRUE"*/);
|
|
|
- }
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MeterValuesSampledDataMaxLength].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledDataMaxLength].ItemData );
|
|
|
- isKnowKey = TRUE;
|
|
|
- }
|
|
|
-
|
|
|
- if(isEmpty || strcmp(keyReq, "MeterValueSampleInterval") == 0 )
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_MeterValueSampleInterval].Item, "MeterValueSampleInterval");
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MeterValueSampleInterval].Key, "MeterValueSampleInterval");
|
|
|
-
|
|
|
- if(ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValueSampleInterval].ItemAccessibility == 1)
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MeterValueSampleInterval].ReadOnly, "0"/*"FALSE"*/);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MeterValueSampleInterval].ReadOnly, "1"/*"TRUE"*/);
|
|
|
- }
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MeterValueSampleInterval].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValueSampleInterval].ItemData );
|
|
|
- isKnowKey = TRUE;
|
|
|
- }
|
|
|
-
|
|
|
- if(isEmpty || strcmp(keyReq, "MinimumStatusDuration") == 0 )
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_MinimumStatusDuration].Item, "MinimumStatusDuration");
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MinimumStatusDuration].Key, "MinimumStatusDuration");
|
|
|
-
|
|
|
- if(ShmOCPP16Data->ConfigurationTable.CoreProfile[MinimumStatusDuration].ItemAccessibility == 1)
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MinimumStatusDuration].ReadOnly, "0"/*"FALSE"*/);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MinimumStatusDuration].ReadOnly, "1"/*"TRUE"*/);
|
|
|
- }
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MinimumStatusDuration].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[17].ItemData );
|
|
|
- isKnowKey = TRUE;
|
|
|
- }
|
|
|
-
|
|
|
- if(isEmpty || strcmp(keyReq, "NumberOfConnectors") == 0 )
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_NumberOfConnectors].Item, "NumberOfConnectors");
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_NumberOfConnectors].Key, "NumberOfConnectors");
|
|
|
-
|
|
|
- if(ShmOCPP16Data->ConfigurationTable.CoreProfile[NumberOfConnectors].ItemAccessibility == 1)
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_NumberOfConnectors].ReadOnly, "0"/*"FALSE"*/);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_NumberOfConnectors].ReadOnly, "1"/*"TRUE"*/);
|
|
|
- }
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_NumberOfConnectors].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[NumberOfConnectors].ItemData );
|
|
|
- isKnowKey = TRUE;
|
|
|
- }
|
|
|
-
|
|
|
- if(isEmpty || strcmp(keyReq, "ResetRetries") == 0 )
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_ResetRetries].Item, "ResetRetries");
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ResetRetries].Key, "ResetRetries");
|
|
|
-
|
|
|
- if(ShmOCPP16Data->ConfigurationTable.CoreProfile[ResetRetries].ItemAccessibility == 1)
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ResetRetries].ReadOnly, "0"/*"FALSE"*/);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ResetRetries].ReadOnly, "1"/*"TRUE"*/);
|
|
|
- }
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ResetRetries].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ResetRetries].ItemData );
|
|
|
- isKnowKey = TRUE;
|
|
|
- }
|
|
|
-
|
|
|
- if(isEmpty || strcmp(keyReq, "ConnectorPhaseRotation") == 0 )
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_ConnectorPhaseRotation].Item, "ConnectorPhaseRotation");
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ConnectorPhaseRotation].Key, "ConnectorPhaseRotation");
|
|
|
-
|
|
|
- if(ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotation].ItemAccessibility == 1)
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ConnectorPhaseRotation].ReadOnly, "0"/*"FALSE"*/);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ConnectorPhaseRotation].ReadOnly, "1"/*"TRUE"*/);
|
|
|
- }
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ConnectorPhaseRotation].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotation].ItemData );
|
|
|
- isKnowKey = TRUE;
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- if(isEmpty || strcmp(keyReq, "ConnectorPhaseRotationMaxLength") == 0 )
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_ConnectorPhaseRotationMaxLength].Item, "ConnectorPhaseRotationMaxLength");
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ConnectorPhaseRotationMaxLength].Key, "ConnectorPhaseRotationMaxLength");
|
|
|
-
|
|
|
- if(ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotationMaxLength].ItemAccessibility == 1)
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ConnectorPhaseRotationMaxLength].ReadOnly, "0"/*"FALSE"*/);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ConnectorPhaseRotationMaxLength].ReadOnly, "1"/*"TRUE"*/);
|
|
|
- }
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ConnectorPhaseRotationMaxLength].Value,(const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotationMaxLength].ItemData );
|
|
|
- isKnowKey = TRUE;
|
|
|
- }
|
|
|
-
|
|
|
- if(isEmpty || strcmp(keyReq, "StopTransactionOnEVSideDisconnect") == 0 )
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_StopTransactionOnEVSideDisconnect].Item, "StopTransactionOnEVSideDisconnect");
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTransactionOnEVSideDisconnect].Key, "StopTransactionOnEVSideDisconnect");
|
|
|
-
|
|
|
- if(ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnEVSideDisconnect].ItemAccessibility == 1)
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTransactionOnEVSideDisconnect].ReadOnly, "0"/*"FALSE"*/);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTransactionOnEVSideDisconnect].ReadOnly, "1"/*"TRUE"*/);
|
|
|
- }
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTransactionOnEVSideDisconnect].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnEVSideDisconnect].ItemData );
|
|
|
- isKnowKey = TRUE;
|
|
|
- }
|
|
|
-
|
|
|
- if(isEmpty || strcmp(keyReq, "StopTransactionOnInvalidId") == 0 )
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_StopTransactionOnInvalidId].Item, "StopTransactionOnInvalidId");
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTransactionOnInvalidId].Key, "StopTransactionOnInvalidId");
|
|
|
-
|
|
|
- if(ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnInvalidId].ItemAccessibility == 1)
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTransactionOnInvalidId].ReadOnly, "0"/*"FALSE"*/);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTransactionOnInvalidId].ReadOnly, "1"/*"TRUE"*/);
|
|
|
- }
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTransactionOnInvalidId].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnInvalidId].ItemData );
|
|
|
- isKnowKey = TRUE;
|
|
|
- }
|
|
|
-
|
|
|
- if(isEmpty || strcmp(keyReq, "StopTxnAlignedData") == 0 )
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_StopTxnAlignedData].Item, "StopTxnAlignedData");
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTxnAlignedData].Key, "StopTxnAlignedData");
|
|
|
-
|
|
|
- if(ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedData].ItemAccessibility == 1)
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTxnAlignedData].ReadOnly, "0"/*"FALSE"*/);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTxnAlignedData].ReadOnly, "1"/*"TRUE"*/);
|
|
|
- }
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTxnAlignedData].Value,(const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedData].ItemData );
|
|
|
- isKnowKey = TRUE;
|
|
|
- }
|
|
|
-
|
|
|
- if(isEmpty || strcmp(keyReq, "StopTxnAlignedDataMaxLength") == 0 )
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_StopTxnAlignedDataMaxLength].Item, "StopTxnAlignedDataMaxLength");
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTxnAlignedDataMaxLength].Key, "StopTxnAlignedDataMaxLength");
|
|
|
-
|
|
|
- if(ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedDataMaxLength].ItemAccessibility == 1)
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTxnAlignedDataMaxLength].ReadOnly, "0"/*"FALSE"*/);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTxnAlignedDataMaxLength].ReadOnly, "1"/*"TRUE"*/);
|
|
|
- }
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTxnAlignedDataMaxLength].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedDataMaxLength].ItemData );
|
|
|
- isKnowKey = TRUE;
|
|
|
- }
|
|
|
-
|
|
|
- if(isEmpty || strcmp(keyReq, "StopTxnSampledData") == 0 )
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_StopTxnSampledData].Item, "StopTxnSampledData");
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTxnSampledData].Key, "StopTxnSampledData");
|
|
|
-
|
|
|
- if(ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledData].ItemAccessibility == 1)
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTxnSampledData].ReadOnly, "0"/*"FALSE"*/);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTxnSampledData].ReadOnly, "1"/*"TRUE"*/);
|
|
|
- }
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTxnSampledData].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledData].ItemData );
|
|
|
- isKnowKey = TRUE;
|
|
|
- }
|
|
|
-
|
|
|
- if(isEmpty || strcmp(keyReq, "StopTxnSampledDataMaxLength") == 0 )
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_StopTxnSampledDataMaxLength].Item, "StopTxnSampledDataMaxLength");
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTxnSampledDataMaxLength].Key, "StopTxnSampledDataMaxLength");
|
|
|
-
|
|
|
- if(ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledDataMaxLength].ItemAccessibility == 1)
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTxnSampledDataMaxLength].ReadOnly, "0"/*"FALSE"*/);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTxnSampledDataMaxLength].ReadOnly, "1"/*"TRUE"*/);
|
|
|
- }
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTxnSampledDataMaxLength].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledDataMaxLength].ItemData );
|
|
|
- isKnowKey = TRUE;
|
|
|
- }
|
|
|
-
|
|
|
- if(isEmpty || strcmp(keyReq, "SupportedFeatureProfiles") == 0 )
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_SupportedFeatureProfiles].Item, "SupportedFeatureProfiles");
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_SupportedFeatureProfiles].Key, "SupportedFeatureProfiles");
|
|
|
-
|
|
|
- if(ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfiles].ItemAccessibility == 1)
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_SupportedFeatureProfiles].ReadOnly, "0"/*"FALSE"*/);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_SupportedFeatureProfiles].ReadOnly, "1"/*"TRUE"*/);
|
|
|
- }
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_SupportedFeatureProfiles].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfiles].ItemData );
|
|
|
- isKnowKey = TRUE;
|
|
|
- }
|
|
|
-
|
|
|
- if(isEmpty || strcmp(keyReq, "SupportedFeatureProfilesMaxLength") == 0 )
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_SupportedFeatureProfilesMaxLength].Item, "SupportedFeatureProfilesMaxLength");
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_SupportedFeatureProfilesMaxLength].Key, "SupportedFeatureProfilesMaxLength");
|
|
|
-
|
|
|
- if(ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfilesMaxLength].ItemAccessibility == 1)
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_SupportedFeatureProfilesMaxLength].ReadOnly, "0"/*"FALSE"*/);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_SupportedFeatureProfilesMaxLength].ReadOnly, "1"/*"TRUE"*/);
|
|
|
- }
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_SupportedFeatureProfilesMaxLength].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfilesMaxLength].ItemData );
|
|
|
- isKnowKey = TRUE;
|
|
|
- }
|
|
|
-
|
|
|
- if(isEmpty || strcmp(keyReq, "TransactionMessageAttempts") == 0 )
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_TransactionMessageAttempts].Item, "TransactionMessageAttempts");
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_TransactionMessageAttempts].Key, "TransactionMessageAttempts");
|
|
|
-
|
|
|
- if(ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageAttempts].ItemAccessibility == 1)
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_TransactionMessageAttempts].ReadOnly, "0"/*"FALSE"*/);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_TransactionMessageAttempts].ReadOnly, "1"/*"TRUE"*/);
|
|
|
- }
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_TransactionMessageAttempts].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageAttempts].ItemData );
|
|
|
- isKnowKey = TRUE;
|
|
|
- }
|
|
|
-
|
|
|
- if(isEmpty || strcmp(keyReq, "TransactionMessageRetryInterval") == 0 )
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_TransactionMessageRetryInterval].Item, "TransactionMessageRetryInterval");
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_TransactionMessageRetryInterval].Key, "TransactionMessageRetryInterval");
|
|
|
-
|
|
|
- if(ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageRetryInterval].ItemAccessibility == 1)
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_TransactionMessageRetryInterval].ReadOnly, "0"/*"FALSE"*/);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_TransactionMessageRetryInterval].ReadOnly, "1"/*"TRUE"*/);
|
|
|
- }
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_TransactionMessageRetryInterval].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageRetryInterval].ItemData );
|
|
|
- isKnowKey = TRUE;
|
|
|
- }
|
|
|
-
|
|
|
- if(isEmpty || strcmp(keyReq, "UnlockConnectorOnEVSideDisconnect") == 0 )
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_UnlockConnectorOnEVSideDisconnect].Item, "UnlockConnectorOnEVSideDisconnect");
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_UnlockConnectorOnEVSideDisconnect].Key, "UnlockConnectorOnEVSideDisconnect");
|
|
|
-
|
|
|
- if(ShmOCPP16Data->ConfigurationTable.CoreProfile[UnlockConnectorOnEVSideDisconnect].ItemAccessibility == 1)
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_UnlockConnectorOnEVSideDisconnect].ReadOnly, "0"/*"FALSE"*/);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_UnlockConnectorOnEVSideDisconnect].ReadOnly, "1"/*"TRUE"*/);
|
|
|
- }
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_UnlockConnectorOnEVSideDisconnect].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[UnlockConnectorOnEVSideDisconnect].ItemData );
|
|
|
- isKnowKey = TRUE;
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- if(isEmpty || strcmp(keyReq, "WebSocketPingInterval") == 0 )
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_WebSocketPingInterval].Item, "WebSocketPingInterval");
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_WebSocketPingInterval].Key, "WebSocketPingInterval");
|
|
|
-
|
|
|
- if(ShmOCPP16Data->ConfigurationTable.CoreProfile[WebSocketPingInterval].ItemAccessibility == 1)
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_WebSocketPingInterval].ReadOnly, "0"/*"FALSE"*/);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_WebSocketPingInterval].ReadOnly, "1"/*"TRUE"*/);
|
|
|
- }
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_WebSocketPingInterval].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[WebSocketPingInterval].ItemData );
|
|
|
- isKnowKey = TRUE;
|
|
|
-
|
|
|
- }
|
|
|
-#if 1
|
|
|
- if(isEmpty || strcmp(keyReq, "LocalAuthListEnabled") == 0 )
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_LocalAuthListEnabled].Item, "LocalAuthListEnabled");
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_LocalAuthListEnabled].Key, "LocalAuthListEnabled");
|
|
|
-
|
|
|
- if(ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemAccessibility == 1)
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_LocalAuthListEnabled].ReadOnly, "0"/*"FALSE"*/);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_LocalAuthListEnabled].ReadOnly, "1"/*"TRUE"*/);
|
|
|
- }
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_LocalAuthListEnabled].Value, (const char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemData );
|
|
|
- isKnowKey = TRUE;
|
|
|
- }
|
|
|
-#endif
|
|
|
-
|
|
|
- if(isEmpty || strcmp(keyReq, "LocalAuthListMaxLength") == 0 )
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_LocalAuthListMaxLength].Item, "LocalAuthListMaxLength");
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_LocalAuthListMaxLength].Key, "LocalAuthListMaxLength");
|
|
|
-
|
|
|
- if(ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListMaxLength].ItemAccessibility == 1)
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_LocalAuthListMaxLength].ReadOnly, "0"/*"FALSE"*/);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_LocalAuthListMaxLength].ReadOnly, "1"/*"TRUE"*/);
|
|
|
- }
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_LocalAuthListMaxLength].Value, (const char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListMaxLength].ItemData );
|
|
|
- isKnowKey = TRUE;
|
|
|
- }
|
|
|
-
|
|
|
- if(isEmpty || strcmp(keyReq, "SendLocalListMaxLength") == 0 )
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_SendLocalListMaxLength].Item, "SendLocalListMaxLength");
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_SendLocalListMaxLength].Key, "SendLocalListMaxLength");
|
|
|
-
|
|
|
- if(ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[SendLocalListMaxLength].ItemAccessibility == 1)
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_SendLocalListMaxLength].ReadOnly, "0"/*"FALSE"*/);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_SendLocalListMaxLength].ReadOnly, "1"/*"TRUE"*/);
|
|
|
- }
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_SendLocalListMaxLength].Value, (const char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[SendLocalListMaxLength].ItemData );
|
|
|
- isKnowKey = TRUE;
|
|
|
- }
|
|
|
-
|
|
|
- if(isEmpty || strcmp(keyReq, "ReserveConnectorZeroSupported") == 0 )
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_ReserveConnectorZeroSupported].Item, "ReserveConnectorZeroSupported");
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ReserveConnectorZeroSupported].Key, "ReserveConnectorZeroSupported");
|
|
|
-
|
|
|
- if(ShmOCPP16Data->ConfigurationTable.ReservationProfile[ReserveConnectorZeroSupported].ItemAccessibility == 1)
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ReserveConnectorZeroSupported].ReadOnly, "0"/*"FALSE"*/);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ReserveConnectorZeroSupported].ReadOnly, "1"/*"TRUE"*/);
|
|
|
- }
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ReserveConnectorZeroSupported].Value,(const char *)ShmOCPP16Data->ConfigurationTable.ReservationProfile[ReserveConnectorZeroSupported].ItemData);
|
|
|
- isKnowKey = TRUE;
|
|
|
- }
|
|
|
-
|
|
|
- if(isEmpty || strcmp(keyReq, "ChargeProfileMaxStackLevel") == 0 )
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_ChargeProfileMaxStackLevel].Item, "ChargeProfileMaxStackLevel");
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ChargeProfileMaxStackLevel].Key, "ChargeProfileMaxStackLevel");
|
|
|
-
|
|
|
- if(ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargeProfileMaxStackLevel].ItemAccessibility == 1)
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ChargeProfileMaxStackLevel].ReadOnly, "0"/*"FALSE"*/);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ChargeProfileMaxStackLevel].ReadOnly, "1"/*"TRUE"*/);
|
|
|
- }
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ChargeProfileMaxStackLevel].Value, (const char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargeProfileMaxStackLevel].ItemData);
|
|
|
- isKnowKey = TRUE;
|
|
|
- }
|
|
|
-
|
|
|
- if(isEmpty || strcmp(keyReq, "ChargingScheduleAllowedChargingRateUnit") == 0 )
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_ChargingScheduleAllowedChargingRateUnit].Item, "ChargingScheduleAllowedChargingRateUnit");
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ChargingScheduleAllowedChargingRateUnit].Key, "ChargingScheduleAllowedChargingRateUnit");
|
|
|
-
|
|
|
- if(ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleAllowedChargingRateUnit].ItemAccessibility == 1)
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ChargingScheduleAllowedChargingRateUnit].ReadOnly, "0"/*"FALSE"*/);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ChargingScheduleAllowedChargingRateUnit].ReadOnly, "1"/*"TRUE"*/);
|
|
|
- }
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ChargingScheduleAllowedChargingRateUnit].Value, (const char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleAllowedChargingRateUnit].ItemData);
|
|
|
- isKnowKey = TRUE;
|
|
|
- }
|
|
|
-
|
|
|
- if(isEmpty || strcmp(keyReq, "ChargingScheduleMaxPeriods") == 0 )
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_ChargingScheduleMaxPeriods].Item, "ChargingScheduleMaxPeriods");
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ChargingScheduleMaxPeriods].Key, "ChargingScheduleMaxPeriods");
|
|
|
-
|
|
|
- if(ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleMaxPeriods].ItemAccessibility == 1)
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ChargingScheduleMaxPeriods].ReadOnly, "0"/*"FALSE"*/);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ChargingScheduleMaxPeriods].ReadOnly, "1"/*"TRUE"*/);
|
|
|
- }
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ChargingScheduleMaxPeriods].Value, (const char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleMaxPeriods].ItemData);
|
|
|
- isKnowKey = TRUE;
|
|
|
- }
|
|
|
-
|
|
|
- if(isEmpty || strcmp(keyReq, "ConnectorSwitch3to1PhaseSupported") == 0 )
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_ConnectorSwitch3to1PhaseSupported].Item, "ConnectorSwitch3to1PhaseSupported");
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ConnectorSwitch3to1PhaseSupported].Key, "ConnectorSwitch3to1PhaseSupported");
|
|
|
-
|
|
|
- if(ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ConnectorSwitch3to1PhaseSupported].ItemAccessibility == 1)
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ConnectorSwitch3to1PhaseSupported].ReadOnly, "0"/*"FALSE"*/);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ConnectorSwitch3to1PhaseSupported].ReadOnly, "1"/*"TRUE"*/);
|
|
|
- }
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ConnectorSwitch3to1PhaseSupported].Value, (const char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ConnectorSwitch3to1PhaseSupported].ItemData);
|
|
|
- isKnowKey = TRUE;
|
|
|
- }
|
|
|
-
|
|
|
- if(isEmpty || strcmp(keyReq, "MaxChargingProfilesInstalled") == 0 )
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_MaxChargingProfilesInstalled].Item, "MaxChargingProfilesInstalled");
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MaxChargingProfilesInstalled].Key, "MaxChargingProfilesInstalled");
|
|
|
-
|
|
|
- if(ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[MaxChargingProfilesInstalled].ItemAccessibility == 1)
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MaxChargingProfilesInstalled].ReadOnly, "0"/*"FLASE"*/);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MaxChargingProfilesInstalled].ReadOnly, "1"/*"TRUE"*/);
|
|
|
- }
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MaxChargingProfilesInstalled].Value, (const char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[MaxChargingProfilesInstalled].ItemData);
|
|
|
- isKnowKey = TRUE;
|
|
|
- }
|
|
|
-
|
|
|
- //=========================================================
|
|
|
-
|
|
|
- if(!isEmpty && !isKnowKey)
|
|
|
- {
|
|
|
- DEBUG_INFO("unKnowIndex =%d\n", UnknownKeynum);
|
|
|
- strcpy(unknownkey[UnknownKeynum], keyReq);
|
|
|
- UnknownKeynum = UnknownKeynum + 1;
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
-}
|
|
|
-
|
|
|
-void processUnkownKey(void)
|
|
|
-{
|
|
|
- DEBUG_INFO("processUnkownKey...\n");
|
|
|
- memset(ShmOCPP16Data->GetConfiguration.ResponseUnknownKey, 0 , sizeof(struct StructConfigurationKeyItems)* 10);
|
|
|
-
|
|
|
- for(int index=0; index < UnknownKeynum; index++)
|
|
|
- {
|
|
|
- if(ShmOCPP16Data->GetConfiguration.ResponseUnknownKey[index].Item[0] == 0)
|
|
|
- {
|
|
|
- strcpy((char *)(ShmOCPP16Data->GetConfiguration.ResponseUnknownKey[index].Item), unknownkey[index]);
|
|
|
- }
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-int setKeyValue(char *key, char *value)
|
|
|
-{
|
|
|
- int isSuccess = NotSupported;
|
|
|
- int check_ascii=0;
|
|
|
- char str[10]={0};
|
|
|
-
|
|
|
- DEBUG_INFO(" setKeyValue %s = %s\n", key, value);
|
|
|
-
|
|
|
- if(strcmp(key, "AllowOfflineTxForUnknownId") == 0)
|
|
|
- {
|
|
|
- //Charger.AllowOfflineTxForUnknownId = (value.toLowerCase().equals("true")?true:false);
|
|
|
- if(ShmOCPP16Data->ConfigurationTable.CoreProfile[AllowOfflineTxForUnknownId].ItemAccessibility == 1)
|
|
|
- {
|
|
|
- strcpy(str, (const char*)value);
|
|
|
- for(int i = 0; str[i]; i++){
|
|
|
- str[i] = tolower(str[i]);
|
|
|
- }
|
|
|
-
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AllowOfflineTxForUnknownId].ItemData, "%s", (strcmp(str, "true")==0) ?"TRUE":"FALSE" );
|
|
|
- isSuccess = ConfigurationStatus_Accepted;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- isSuccess = ConfigurationStatus_Rejected;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- if(strcmp(key, "AuthorizationCacheEnabled") == 0)
|
|
|
- {
|
|
|
- //Charger.AuthorizationCacheEnabled = (value.toLowerCase().equals("true")?true:false);
|
|
|
- if(ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizationCacheEnabled].ItemAccessibility == 1)
|
|
|
- {
|
|
|
- strcpy(str, (const char*)value);
|
|
|
- for(int i = 0; str[i]; i++){
|
|
|
- str[i] = tolower(str[i]);
|
|
|
- }
|
|
|
-
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizationCacheEnabled].ItemData, "%s", (strcmp(str, "true")==0) ?"TRUE":"FALSE" );
|
|
|
- isSuccess = ConfigurationStatus_Accepted;
|
|
|
- //updateSetting("AuthorizationCacheEnabled",(char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[1].ItemData);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- isSuccess = ConfigurationStatus_Rejected;
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- if(strcmp(key, "AuthorizeRemoteTxRequests") == 0)
|
|
|
- {
|
|
|
- if(ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizeRemoteTxRequests].ItemAccessibility == 1)
|
|
|
- {
|
|
|
- strcpy(str, (const char*)value);
|
|
|
- for(int i = 0; str[i]; i++)
|
|
|
- {
|
|
|
- str[i] = tolower(str[i]);
|
|
|
- }
|
|
|
- //Charger.AuthorizeRemoteTxRequests = (value.toLowerCase().equals("true")?true:false);
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizeRemoteTxRequests].ItemData, "%s", (strcmp(str, "true")==0) ?"TRUE":"FALSE" );
|
|
|
- isSuccess = ConfigurationStatus_Accepted;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- isSuccess = ConfigurationStatus_Rejected;
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- if(strcmp(key, "BlinkRepeat") == 0)
|
|
|
- {
|
|
|
- //Charger.BlinkRepeat = Integer.parseInt(value);
|
|
|
- if(ShmOCPP16Data->ConfigurationTable.CoreProfile[BlinkRepeat].ItemAccessibility == 1)
|
|
|
- {
|
|
|
- check_ascii = value[0];
|
|
|
- if( (check_ascii < 48) || (check_ascii > 57) )
|
|
|
- {
|
|
|
- isSuccess = ConfigurationStatus_Rejected;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[BlinkRepeat].ItemData, "%d", atoi(value) );
|
|
|
- isSuccess = ConfigurationStatus_Accepted;
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- isSuccess = ConfigurationStatus_Rejected;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- if(strcmp(key, "ClockAlignedDataInterval") == 0)
|
|
|
- {
|
|
|
- if(ShmOCPP16Data->ConfigurationTable.CoreProfile[ClockAlignedDataInterval].ItemAccessibility == 1)
|
|
|
- {
|
|
|
- check_ascii = value[0];
|
|
|
- if( (check_ascii < 48) || (check_ascii > 57) )
|
|
|
- {
|
|
|
- isSuccess = ConfigurationStatus_Rejected;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- //Charger.ClockAlignedDataInterval = Integer.parseInt(value)*1000;
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ClockAlignedDataInterval].ItemData, "%d", atoi(value) );
|
|
|
- isSuccess = ConfigurationStatus_Accepted;
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- isSuccess = ConfigurationStatus_Rejected;
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- if(strcmp(key, "ConnectionTimeOut") == 0 )
|
|
|
- {
|
|
|
- if(ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectionTimeOut].ItemAccessibility == 1)
|
|
|
- {
|
|
|
- check_ascii = value[0];
|
|
|
- if( (check_ascii < 48) || (check_ascii > 57) )
|
|
|
- {
|
|
|
- isSuccess = ConfigurationStatus_Rejected;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- //Charger.ConnectionTimeOut = Integer.parseInt(value)*1000;
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectionTimeOut].ItemData, "%d", atoi(value));
|
|
|
- isSuccess = ConfigurationStatus_Accepted;
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- isSuccess = ConfigurationStatus_Rejected;
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- if(strcmp(key, "GetConfigurationMaxKeys") == 0)
|
|
|
- {
|
|
|
- if(ShmOCPP16Data->ConfigurationTable.CoreProfile[GetConfigurationMaxKeys].ItemAccessibility == 1)
|
|
|
- {
|
|
|
- check_ascii = value[0];
|
|
|
- if( (check_ascii < 48) || (check_ascii > 57) )
|
|
|
- {
|
|
|
- isSuccess = ConfigurationStatus_Rejected;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- //Charger.HeartbeatInterval = Integer.parseInt(value)*1000;
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[GetConfigurationMaxKeys].ItemData, "%d", atoi(value) );
|
|
|
- isSuccess = ConfigurationStatus_Accepted;
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- isSuccess = ConfigurationStatus_Rejected;
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- if(strcmp(key, "HeartbeatInterval") == 0)
|
|
|
- {
|
|
|
- if(ShmOCPP16Data->ConfigurationTable.CoreProfile[HeartbeatInterval].ItemAccessibility == 1)
|
|
|
- {
|
|
|
- check_ascii = value[0];
|
|
|
- if( (check_ascii < 48) || (check_ascii > 57) )
|
|
|
- {
|
|
|
- isSuccess = ConfigurationStatus_Rejected;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- //Charger.HeartbeatInterval = Integer.parseInt(value)*1000;
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[HeartbeatInterval].ItemData, "%d", atoi(value));
|
|
|
- HeartBeatWaitTime = atoi(value);
|
|
|
- isSuccess = ConfigurationStatus_Accepted;
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- isSuccess = ConfigurationStatus_Rejected;
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- if(strcmp(key, "LightIntensity") == 0)
|
|
|
- {
|
|
|
- if(ShmOCPP16Data->ConfigurationTable.CoreProfile[LightIntensity].ItemAccessibility == 1)
|
|
|
- {
|
|
|
- check_ascii = value[0];
|
|
|
- if( (check_ascii < 48) || (check_ascii > 57) )
|
|
|
- {
|
|
|
- isSuccess = ConfigurationStatus_Rejected;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LightIntensity].ItemData, "%d", atoi(value) );
|
|
|
- isSuccess = ConfigurationStatus_Accepted;
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- isSuccess = ConfigurationStatus_Rejected;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- if(strcmp(key, "LocalAuthorizeOffline") == 0)
|
|
|
- {
|
|
|
- if(ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalAuthorizeOffline].ItemAccessibility == 1)
|
|
|
- {
|
|
|
- strcpy(str, (const char*)value);
|
|
|
- for(int i = 0; str[i]; i++)
|
|
|
- {
|
|
|
- str[i] = tolower(str[i]);
|
|
|
- }
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalAuthorizeOffline].ItemData, "%s", (strcmp(str, "true")==0) ?"TRUE":"FALSE" );
|
|
|
- isSuccess = ConfigurationStatus_Accepted;
|
|
|
- //updateSetting("LocalAuthorizeOffline", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalAuthorizeOffline].ItemData);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- isSuccess = ConfigurationStatus_Rejected;
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- if(strcmp(key, "LocalPreAuthorize") == 0)
|
|
|
- {
|
|
|
- if(ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalPreAuthorize].ItemAccessibility == 1)
|
|
|
- {
|
|
|
- strcpy(str, (const char*)value);
|
|
|
- for(int i = 0; str[i]; i++)
|
|
|
- {
|
|
|
- str[i] = tolower(str[i]);
|
|
|
- }
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalPreAuthorize].ItemData, "%s", (strcmp(str, "true")==0) ?"TRUE":"FALSE" );
|
|
|
- isSuccess = ConfigurationStatus_Accepted;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- isSuccess = ConfigurationStatus_Rejected;
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- if(strcmp(key, "MaxEnergyOnInvalidId") == 0)
|
|
|
- {
|
|
|
- if(ShmOCPP16Data->ConfigurationTable.CoreProfile[MaxEnergyOnInvalidId].ItemAccessibility == 1)
|
|
|
- {
|
|
|
- check_ascii = value[0];
|
|
|
- if( (check_ascii < 48) || (check_ascii > 57) )
|
|
|
- {
|
|
|
- isSuccess = ConfigurationStatus_Rejected;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MaxEnergyOnInvalidId].ItemData, "%d", atoi(value) );
|
|
|
- ShmSysConfigAndInfo->SysConfig.OfflineMaxChargeEnergy = atoi(value)/1000;
|
|
|
- isSuccess = ConfigurationStatus_Accepted;
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- isSuccess = ConfigurationStatus_Rejected;
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- if(strcmp(key, "MeterValuesAlignedData") == 0)
|
|
|
- {
|
|
|
- if(ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedData].ItemAccessibility == 1)
|
|
|
- {
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedData].ItemData, "%s", value );
|
|
|
- isSuccess = ConfigurationStatus_Accepted;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- isSuccess = ConfigurationStatus_Rejected;
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- if(strcmp(key, "MeterValuesAlignedDataMaxLength") == 0)
|
|
|
- {
|
|
|
- if(ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedDataMaxLength].ItemAccessibility == 1)
|
|
|
- {
|
|
|
- check_ascii = value[0];
|
|
|
- if( (check_ascii < 48) || (check_ascii > 57) )
|
|
|
- {
|
|
|
- isSuccess = ConfigurationStatus_Rejected;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- //Charger.MeterValueSampleInterval = Integer.parseInt(value)*1000;
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedDataMaxLength].ItemData, "%d", atoi(value));
|
|
|
- isSuccess = ConfigurationStatus_Accepted;
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- isSuccess = ConfigurationStatus_Rejected;
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- if(strcmp(key, "MeterValuesSampledData") == 0 )
|
|
|
- {
|
|
|
- if(ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledData].ItemAccessibility == 1)
|
|
|
- {
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledData].ItemData, "%s", value );
|
|
|
- isSuccess = ConfigurationStatus_Accepted;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- isSuccess = ConfigurationStatus_Rejected;
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- if(strcmp(key, "MeterValuesSampledDataMaxLength") == 0)
|
|
|
- {
|
|
|
- if(ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledDataMaxLength].ItemAccessibility == 1)
|
|
|
- {
|
|
|
- check_ascii = value[0];
|
|
|
- if( (check_ascii < 48) || (check_ascii > 57) )
|
|
|
- {
|
|
|
- isSuccess = ConfigurationStatus_Rejected;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- //Charger.MeterValueSampleInterval = Integer.parseInt(value)*1000;
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledDataMaxLength].ItemData, "%d", atoi(value));
|
|
|
- isSuccess = ConfigurationStatus_Accepted;
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- isSuccess = ConfigurationStatus_Rejected;
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- if(strcmp(key, "MeterValueSampleInterval") == 0)
|
|
|
- {
|
|
|
- if(ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValueSampleInterval].ItemAccessibility == 1)
|
|
|
- {
|
|
|
- check_ascii = value[0];
|
|
|
- if( (check_ascii < 48) || (check_ascii > 57) )
|
|
|
- {
|
|
|
- isSuccess = ConfigurationStatus_Rejected;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- //Charger.MeterValueSampleInterval = Integer.parseInt(value)*1000;
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValueSampleInterval].ItemData, "%d", atoi(value));
|
|
|
- isSuccess = ConfigurationStatus_Accepted;
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- isSuccess = ConfigurationStatus_Rejected;
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- if(strcmp(key, "MinimumStatusDuration") == 0)
|
|
|
- {
|
|
|
- if(ShmOCPP16Data->ConfigurationTable.CoreProfile[MinimumStatusDuration].ItemAccessibility == 1)
|
|
|
- {
|
|
|
- check_ascii = value[0];
|
|
|
- if( (check_ascii < 48) || (check_ascii > 57) )
|
|
|
- {
|
|
|
- isSuccess = ConfigurationStatus_Rejected;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- if(atoi(value) == 0) // MinimumStatusDuration's value can not be 0
|
|
|
- {
|
|
|
- isSuccess = ConfigurationStatus_Rejected;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- //Charger.MinimumStatusDuration = Integer.parseInt(value);
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MinimumStatusDuration].ItemData, "%d", atoi(value) );
|
|
|
- server_cycle_Status = atoi(value); //StatusNotification Cycle
|
|
|
- isSuccess = ConfigurationStatus_Accepted;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- isSuccess = ConfigurationStatus_Rejected;
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- if(strcmp(key, "NumberOfConnectors") == 0)
|
|
|
- {
|
|
|
- if(ShmOCPP16Data->ConfigurationTable.CoreProfile[NumberOfConnectors].ItemAccessibility == 1)
|
|
|
- {
|
|
|
- check_ascii = value[0];
|
|
|
- if( (check_ascii < 48) || (check_ascii > 57) )
|
|
|
- {
|
|
|
- isSuccess = ConfigurationStatus_Rejected;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- //Charger.ResetRetries = Integer.parseInt(value);
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[NumberOfConnectors].ItemData, "%d", atoi(value) );
|
|
|
- isSuccess = ConfigurationStatus_Accepted;
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- isSuccess = ConfigurationStatus_Rejected;
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- if(strcmp(key, "ResetRetries") == 0)
|
|
|
- {
|
|
|
- if(ShmOCPP16Data->ConfigurationTable.CoreProfile[ResetRetries].ItemAccessibility == 1)
|
|
|
- {
|
|
|
- check_ascii = value[0];
|
|
|
- if( (check_ascii < 48) || (check_ascii > 57) )
|
|
|
- {
|
|
|
- isSuccess = ConfigurationStatus_Rejected;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- //Charger.ResetRetries = Integer.parseInt(value);
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ResetRetries].ItemData, "%d", atoi(value) );
|
|
|
- isSuccess = ConfigurationStatus_Accepted;
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- isSuccess = ConfigurationStatus_Rejected;
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- if(strcmp(key, "ConnectorPhaseRotation") == 0)
|
|
|
- {
|
|
|
- if(ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotation].ItemAccessibility == 1)
|
|
|
- {
|
|
|
- strcpy(str, (const char*)value);
|
|
|
- for(int i = 0; str[i]; i++)
|
|
|
- {
|
|
|
- str[i] = tolower(str[i]);
|
|
|
- }
|
|
|
-
|
|
|
- if(strcmp(str, "notapplicable")== 0)
|
|
|
- {
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotation].ItemData, "%s", "NotApplicable" );
|
|
|
- isSuccess = ConfigurationStatus_Accepted;
|
|
|
- }
|
|
|
- else if(strcmp(str, "unknown")== 0)
|
|
|
- {
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotation].ItemData, "%s", "Unknown" );
|
|
|
- isSuccess = ConfigurationStatus_Accepted;
|
|
|
- }
|
|
|
- else if(strcmp(str, "rst")== 0)
|
|
|
- {
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotation].ItemData, "%s", "RST" );
|
|
|
- isSuccess = ConfigurationStatus_Accepted;
|
|
|
- }
|
|
|
- else if(strcmp(str, "rts")== 0)
|
|
|
- {
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotation].ItemData, "%s", "RTS" );
|
|
|
- isSuccess = ConfigurationStatus_Accepted;
|
|
|
- }
|
|
|
- else if(strcmp(str, "srt")== 0)
|
|
|
- {
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotation].ItemData, "%s", "SRT" );
|
|
|
- isSuccess = ConfigurationStatus_Accepted;
|
|
|
- }
|
|
|
- else if(strcmp(str, "str")== 0)
|
|
|
- {
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotation].ItemData, "%s", "STR" );
|
|
|
- isSuccess = ConfigurationStatus_Accepted;
|
|
|
- }
|
|
|
- else if(strcmp(str, "trs")== 0)
|
|
|
- {
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotation].ItemData, "%s", "TRS" );
|
|
|
- isSuccess = ConfigurationStatus_Accepted;
|
|
|
- }
|
|
|
- else if(strcmp(str, "tsr")== 0)
|
|
|
- {
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotation].ItemData, "%s", "TSR" );
|
|
|
- isSuccess = ConfigurationStatus_Accepted;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- isSuccess = ConfigurationStatus_Rejected;
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- isSuccess = ConfigurationStatus_Rejected;
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- if(strcmp(key, "ConnectorPhaseRotationMaxLength") == 0)
|
|
|
- {
|
|
|
- if(ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotationMaxLength].ItemAccessibility == 1)
|
|
|
- {
|
|
|
- check_ascii = value[0];
|
|
|
- if( (check_ascii < 48) || (check_ascii > 57) )
|
|
|
- {
|
|
|
- isSuccess = ConfigurationStatus_Rejected;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotationMaxLength].ItemData, "%d", atoi(value) );
|
|
|
- isSuccess = ConfigurationStatus_Accepted;
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- isSuccess = ConfigurationStatus_Rejected;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- if(strcmp(key, "StopTransactionOnEVSideDisconnect") == 0)
|
|
|
- {
|
|
|
- if(ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnEVSideDisconnect].ItemAccessibility == 1)
|
|
|
- {
|
|
|
- strcpy(str, (const char*)value);
|
|
|
- for(int i = 0; str[i]; i++)
|
|
|
- {
|
|
|
- str[i] = tolower(str[i]);
|
|
|
- }
|
|
|
- //Charger.StopTransactionOnEVSideDisconnect = (value.toLowerCase().equals("true")?true:false);
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnEVSideDisconnect].ItemData, "%s", (strcmp(str, "true")==0) ?"TRUE":"FALSE" );
|
|
|
- isSuccess = ConfigurationStatus_Accepted;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- isSuccess = ConfigurationStatus_Rejected;
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- if(strcmp(key, "StopTransactionOnInvalidId") == 0)
|
|
|
- {
|
|
|
- if(ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnInvalidId].ItemAccessibility == 1)
|
|
|
- {
|
|
|
- strcpy(str, (const char*)value);
|
|
|
- for(int i = 0; str[i]; i++)
|
|
|
- {
|
|
|
- str[i] = tolower(str[i]);
|
|
|
- }
|
|
|
- //Charger.StopTransactionOnInvalidId = (value.toLowerCase().equals("true")?true:false);
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnInvalidId].ItemData, "%s", (strcmp(str, "true")==0) ?"TRUE":"FALSE" );
|
|
|
- isSuccess = ConfigurationStatus_Accepted;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- isSuccess = ConfigurationStatus_Rejected;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- if(strcmp(key, "StopTxnAlignedData") == 0)
|
|
|
- {
|
|
|
- if(ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedData].ItemAccessibility == 1)
|
|
|
- {
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedData].ItemData, "%s", value );
|
|
|
- isSuccess = ConfigurationStatus_Accepted;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- isSuccess = ConfigurationStatus_Rejected;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- if(strcmp(key, "StopTxnAlignedDataMaxLength") == 0)
|
|
|
- {
|
|
|
- if(ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedDataMaxLength].ItemAccessibility == 1)
|
|
|
- {
|
|
|
- check_ascii = value[0];
|
|
|
- if( (check_ascii < 48) || (check_ascii > 57) )
|
|
|
- {
|
|
|
- isSuccess = ConfigurationStatus_Rejected;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedDataMaxLength].ItemData, "%d", atoi(value) );
|
|
|
- isSuccess = ConfigurationStatus_Accepted;
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- isSuccess = ConfigurationStatus_Rejected;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- if(strcmp(key, "StopTxnSampledData") == 0)
|
|
|
- {
|
|
|
- if(ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledData].ItemAccessibility == 1)
|
|
|
- {
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledData].ItemData, "%s", value );
|
|
|
- isSuccess = ConfigurationStatus_Accepted;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- isSuccess = ConfigurationStatus_Rejected;
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- if(strcmp(key, "StopTxnSampledDataMaxLength") == 0)
|
|
|
- {
|
|
|
- if(ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledDataMaxLength].ItemAccessibility == 1)
|
|
|
- {
|
|
|
- check_ascii = value[0];
|
|
|
- if( (check_ascii < 48) || (check_ascii > 57) )
|
|
|
- {
|
|
|
- isSuccess = ConfigurationStatus_Rejected;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledDataMaxLength].ItemData, "%d", atoi(value) );
|
|
|
- isSuccess = ConfigurationStatus_Accepted;
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- isSuccess = ConfigurationStatus_Rejected;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- if(strcmp(key, "SupportedFeatureProfiles") == 0)
|
|
|
- {
|
|
|
- if(ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfiles].ItemAccessibility == 1)
|
|
|
- {
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfiles].ItemData, "%s", value );
|
|
|
- isSuccess = ConfigurationStatus_Accepted;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- isSuccess = ConfigurationStatus_Rejected;
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- if(strcmp(key, "SupportedFeatureProfilesMaxLength") == 0)
|
|
|
- {
|
|
|
- if(ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfilesMaxLength].ItemAccessibility == 1)
|
|
|
- {
|
|
|
- check_ascii = value[0];
|
|
|
- if( (check_ascii < 48) || (check_ascii > 57) )
|
|
|
- {
|
|
|
- isSuccess = ConfigurationStatus_Rejected;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfilesMaxLength].ItemData, "%d", atoi(value) );
|
|
|
- isSuccess = ConfigurationStatus_Accepted;
|
|
|
-
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- isSuccess = ConfigurationStatus_Rejected;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- if(strcmp(key, "TransactionMessageAttempts") == 0)
|
|
|
- {
|
|
|
- if(ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageAttempts].ItemAccessibility == 1)
|
|
|
- {
|
|
|
- check_ascii = value[0];
|
|
|
- if( (check_ascii < 48) || (check_ascii > 57) )
|
|
|
- {
|
|
|
- isSuccess = ConfigurationStatus_Rejected;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- //Charger.TransactionMessageAttempts = Integer.parseInt(value);
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageAttempts].ItemData, "%d", atoi(value) );
|
|
|
- TransactionMessageAttemptsValue = atoi(value);
|
|
|
- isSuccess = ConfigurationStatus_Accepted;
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- isSuccess = ConfigurationStatus_Rejected;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- if(strcmp(key, "TransactionMessageRetryInterval") == 0)
|
|
|
- {
|
|
|
- if(ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageRetryInterval].ItemAccessibility == 1)
|
|
|
- {
|
|
|
- check_ascii = value[0];
|
|
|
- if( (check_ascii < 48) || (check_ascii > 57) )
|
|
|
- {
|
|
|
- isSuccess = ConfigurationStatus_Rejected;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- //Charger.TransactionMessageRetryInterval = Integer.parseInt(value)*1000;
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageRetryInterval].ItemData, "%d", atoi(value) );
|
|
|
- TransactionMessageRetryIntervalValue = atoi(value);
|
|
|
- isSuccess = ConfigurationStatus_Accepted;
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- isSuccess = ConfigurationStatus_Rejected;
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- if(strcmp(key, "UnlockConnectorOnEVSideDisconnect") == 0)
|
|
|
- {
|
|
|
- if(ShmOCPP16Data->ConfigurationTable.CoreProfile[UnlockConnectorOnEVSideDisconnect].ItemAccessibility == 1)
|
|
|
- {
|
|
|
- strcpy(str, (const char*)value);
|
|
|
- for(int i = 0; str[i]; i++)
|
|
|
- {
|
|
|
- str[i] = tolower(str[i]);
|
|
|
- }
|
|
|
- //Charger.UnlockConnectorOnEVSideDisconnect = (value.toLowerCase().equals("true")?true:false);
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[UnlockConnectorOnEVSideDisconnect].ItemData, "%s", (strcmp(str, "true")==0) ?"TRUE":"FALSE" );
|
|
|
- isSuccess = ConfigurationStatus_Accepted;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- isSuccess = ConfigurationStatus_Rejected;
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- if(strcmp(key, "WebSocketPingInterval") == 0)
|
|
|
- {
|
|
|
- if(ShmOCPP16Data->ConfigurationTable.CoreProfile[WebSocketPingInterval].ItemAccessibility == 1)
|
|
|
- {
|
|
|
- check_ascii = value[0];
|
|
|
- if( (check_ascii < 48) || (check_ascii > 57) )
|
|
|
- {
|
|
|
- isSuccess = ConfigurationStatus_Rejected;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
-
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[WebSocketPingInterval].ItemData, "%d", atoi(value) );
|
|
|
- isSuccess = ConfigurationStatus_Accepted;
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- isSuccess = ConfigurationStatus_Rejected;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
-#if 0
|
|
|
- //For OCPP Test Case
|
|
|
- if(strcmp(key, "LocalAuthorizationListEnabled") == 0)
|
|
|
- {
|
|
|
- if(ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemAccessibility == 1)
|
|
|
- {
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemData, "%s", (strcmp(value, "true")==0) ?"TRUE":"FALSE" );
|
|
|
- isSuccess = ConfigurationStatus_Accepted;
|
|
|
- //updateSetting("LocalAuthorizationListEnabled", (char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemData);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- isSuccess = ConfigurationStatus_Rejected;
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
-#endif
|
|
|
-
|
|
|
-#if 1
|
|
|
- if(strcmp(key, "LocalAuthListEnabled") == 0)
|
|
|
- {
|
|
|
- if(ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemAccessibility == 1)
|
|
|
- {
|
|
|
- strcpy(str, (const char*)value);
|
|
|
- for(int i = 0; str[i]; i++)
|
|
|
- {
|
|
|
- str[i] = tolower(str[i]);
|
|
|
- }
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemData, "%s", (strcmp(str, "true")==0) ?"TRUE":"FALSE" );
|
|
|
- isSuccess = ConfigurationStatus_Accepted;
|
|
|
- //updateSetting("LocalAuthListEnabled", (char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemData);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- isSuccess = ConfigurationStatus_Rejected;
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
-#endif
|
|
|
-
|
|
|
- if(strcmp(key, "LocalAuthListMaxLength") == 0)
|
|
|
- {
|
|
|
- if(ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListMaxLength].ItemAccessibility == 1)
|
|
|
- {
|
|
|
- check_ascii = value[0];
|
|
|
- if( (check_ascii < 48) || (check_ascii > 57) )
|
|
|
- {
|
|
|
- isSuccess = ConfigurationStatus_Rejected;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
-
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListMaxLength].ItemData, "%d", atoi(value) );
|
|
|
- isSuccess = ConfigurationStatus_Accepted;
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- isSuccess = ConfigurationStatus_Rejected;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- if(strcmp(key, "SendLocalListMaxLength") == 0)
|
|
|
- {
|
|
|
- if(ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[SendLocalListMaxLength].ItemAccessibility == 1)
|
|
|
- {
|
|
|
- check_ascii = value[0];
|
|
|
- if( (check_ascii < 48) || (check_ascii > 57) )
|
|
|
- {
|
|
|
- isSuccess = ConfigurationStatus_Rejected;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
-
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[SendLocalListMaxLength].ItemData, "%d", atoi(value) );
|
|
|
- isSuccess = ConfigurationStatus_Accepted;
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- isSuccess = ConfigurationStatus_Rejected;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- if(strcmp(key, "ReserveConnectorZeroSupported") == 0)
|
|
|
- {
|
|
|
- if(ShmOCPP16Data->ConfigurationTable.ReservationProfile[ReserveConnectorZeroSupported].ItemAccessibility == 1)
|
|
|
- {
|
|
|
- strcpy(str, (const char*)value);
|
|
|
- for(int i = 0; str[i]; i++)
|
|
|
- {
|
|
|
- str[i] = tolower(str[i]);
|
|
|
- }
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.ReservationProfile[ReserveConnectorZeroSupported].ItemData, "%s", (strcmp(str, "true")==0) ?"TRUE":"FALSE" );
|
|
|
- isSuccess = ConfigurationStatus_Accepted;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- isSuccess = ConfigurationStatus_Rejected;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- if(strcmp(key, "ChargeProfileMaxStackLevel") == 0)
|
|
|
- {
|
|
|
- if(ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargeProfileMaxStackLevel].ItemAccessibility == 1)
|
|
|
- {
|
|
|
- check_ascii = value[0];
|
|
|
- if( (check_ascii < 48) || (check_ascii > 57) )
|
|
|
- {
|
|
|
- isSuccess = ConfigurationStatus_Rejected;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
-
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargeProfileMaxStackLevel].ItemData, "%d", atoi(value) );
|
|
|
- isSuccess = ConfigurationStatus_Accepted;
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- isSuccess = ConfigurationStatus_Rejected;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- if(strcmp(key, "ChargingScheduleAllowedChargingRateUnit") == 0)
|
|
|
- {
|
|
|
- if(ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleAllowedChargingRateUnit].ItemAccessibility == 1)
|
|
|
- {
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleAllowedChargingRateUnit].ItemData, "%s", value );
|
|
|
- isSuccess = ConfigurationStatus_Accepted;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- isSuccess = ConfigurationStatus_Rejected;
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- if(strcmp(key, "ChargingScheduleMaxPeriods") == 0)
|
|
|
- {
|
|
|
- if(ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleMaxPeriods].ItemAccessibility == 1)
|
|
|
- {
|
|
|
- check_ascii = value[0];
|
|
|
- if( (check_ascii < 48) || (check_ascii > 57) )
|
|
|
- {
|
|
|
- isSuccess = ConfigurationStatus_Rejected;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
-
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleMaxPeriods].ItemData, "%d", atoi(value) );
|
|
|
- isSuccess = ConfigurationStatus_Accepted;
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- isSuccess = ConfigurationStatus_Rejected;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- if(strcmp(key, "ConnectorSwitch3to1PhaseSupported") == 0)
|
|
|
- {
|
|
|
- if(ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ConnectorSwitch3to1PhaseSupported].ItemAccessibility == 1)
|
|
|
- {
|
|
|
- strcpy(str, (const char*)value);
|
|
|
- for(int i = 0; str[i]; i++)
|
|
|
- {
|
|
|
- str[i] = tolower(str[i]);
|
|
|
- }
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ConnectorSwitch3to1PhaseSupported].ItemData, "%s", (strcmp(str, "true")==0) ?"TRUE":"FALSE" );
|
|
|
- isSuccess = ConfigurationStatus_Accepted;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- isSuccess = ConfigurationStatus_Rejected;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- if(strcmp(key, "MaxChargingProfilesInstalled") == 0)
|
|
|
- {
|
|
|
- if(ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[MaxChargingProfilesInstalled].ItemAccessibility == 1)
|
|
|
- {
|
|
|
- check_ascii = value[0];
|
|
|
- if( (check_ascii < 48) || (check_ascii > 57) )
|
|
|
- {
|
|
|
- isSuccess = ConfigurationStatus_Rejected;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
-
|
|
|
- sprintf((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[MaxChargingProfilesInstalled].ItemData, "%d", atoi(value) );
|
|
|
- isSuccess = ConfigurationStatus_Accepted;
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- isSuccess = ConfigurationStatus_Rejected;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- return isSuccess;
|
|
|
-}
|
|
|
-
|
|
|
-int TransactionMessageAttemptsGet(void)
|
|
|
-{
|
|
|
- return TransactionMessageAttemptsValue;
|
|
|
-}
|
|
|
-
|
|
|
-int FirstHeartBeatResponse(void)
|
|
|
-{
|
|
|
- return FirstHeartBeat;
|
|
|
-}
|
|
|
-
|
|
|
-
|
|
|
-int TransactionMessageRetryIntervalGet(void)
|
|
|
-{
|
|
|
- return TransactionMessageRetryIntervalValue;//atoi((const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageRetryInterval].ItemData);
|
|
|
-}
|
|
|
-
|
|
|
-int ReadHttpStatus(int sock)
|
|
|
-{
|
|
|
- //char c;
|
|
|
- char buff[1024]="",*ptr=buff+1;
|
|
|
- int bytes_received, status;
|
|
|
- DEBUG_INFO("Begin Response ..\n");
|
|
|
- while((bytes_received = recv(sock, ptr, 1, 0))){
|
|
|
- if(bytes_received==-1){
|
|
|
- perror("ReadHttpStatus");
|
|
|
- exit(1);
|
|
|
- }
|
|
|
-
|
|
|
- if((ptr[-1]=='\r') && (*ptr=='\n' )) break;
|
|
|
- ptr++;
|
|
|
- }
|
|
|
- *ptr=0;
|
|
|
- ptr=buff+1;
|
|
|
-
|
|
|
- sscanf(ptr,"%*s %d ", &status);
|
|
|
-
|
|
|
- DEBUG_INFO("%s\n",ptr);
|
|
|
- DEBUG_INFO("status=%d\n",status);
|
|
|
- DEBUG_INFO("End Response ..\n");
|
|
|
- return (bytes_received>0)?status:0;
|
|
|
-
|
|
|
-}
|
|
|
-
|
|
|
-//the only filed that it parsed is 'Content-Length'
|
|
|
-int ParseHeader(int sock)
|
|
|
-{
|
|
|
- //char c;
|
|
|
- char buff[1024]="",*ptr=buff+4;
|
|
|
- int bytes_received;
|
|
|
- DEBUG_INFO("Begin HEADER ..\n");
|
|
|
- while((bytes_received = recv(sock, ptr, 1, 0))){
|
|
|
- if(bytes_received==-1){
|
|
|
- perror("Parse Header");
|
|
|
- exit(1);
|
|
|
- }
|
|
|
-
|
|
|
- if(
|
|
|
- (ptr[-3]=='\r') && (ptr[-2]=='\n' ) &&
|
|
|
- (ptr[-1]=='\r') && (*ptr=='\n' )
|
|
|
- ) break;
|
|
|
- ptr++;
|
|
|
- }
|
|
|
-
|
|
|
- *ptr=0;
|
|
|
- ptr=buff+4;
|
|
|
- //printf("%s",ptr);
|
|
|
-
|
|
|
- if(bytes_received){
|
|
|
- ptr=strstr(ptr,"Content-Length:");
|
|
|
- if(ptr){
|
|
|
- sscanf(ptr,"%*s %d",&bytes_received);
|
|
|
-
|
|
|
- }else
|
|
|
- bytes_received=-1; //unknown size
|
|
|
-
|
|
|
- DEBUG_INFO("Content-Length: %d\n",bytes_received);
|
|
|
- }
|
|
|
- DEBUG_INFO("End HEADER ..\n");
|
|
|
- return bytes_received ;
|
|
|
-
|
|
|
-}
|
|
|
-
|
|
|
-int httpDownLoadFile(char *location, char *path, char *filename,char *url)
|
|
|
-{
|
|
|
- char rmFileCmd[100]={0};
|
|
|
- char FilePath[100]={0};
|
|
|
- char ftpbuf[200];
|
|
|
- int systemresult;
|
|
|
-
|
|
|
- //DEBUG_INFO("filename=%s\n",filename);
|
|
|
- //DEBUG_INFO("url=%s\n",url);
|
|
|
- sprintf(FilePath,"/mnt/%s",filename);
|
|
|
-
|
|
|
- if((access(FilePath,F_OK))!=-1)
|
|
|
- {
|
|
|
- DEBUG_INFO("filename=%s exist.\n",FilePath);
|
|
|
- sprintf(rmFileCmd,"rm -f %s",FilePath);
|
|
|
- system(rmFileCmd);
|
|
|
- }
|
|
|
- memset(ftpbuf, 0, sizeof(ftpbuf));
|
|
|
- sprintf(ftpbuf, "wget --tries=3 -O /mnt/%s -c %s",filename, url);
|
|
|
- //sprintf(ftpbuf, "ftpput -u %s -p %s %s -P %d %s%s %s",user,password,IPbuffer,21,filename,filename,path);
|
|
|
- systemresult = system(ftpbuf);
|
|
|
-
|
|
|
- //DEBUG_INFO("systemresult=%d\n",systemresult);
|
|
|
- if(systemresult != 0)
|
|
|
- {
|
|
|
- DEBUG_INFO("http DownLoad error!\n");
|
|
|
- return FALSE;
|
|
|
- }
|
|
|
-
|
|
|
- return TRUE;
|
|
|
-}
|
|
|
-
|
|
|
-int ftpDownLoadFile(char *location, char *user, char *password, int port, char *path, char *filename,char *url)
|
|
|
-{
|
|
|
- char rmFileCmd[100]={0};
|
|
|
- char FilePath[100]={0};
|
|
|
- char ftpbuf[200];
|
|
|
- int systemresult;
|
|
|
- //char temp[100];
|
|
|
- sprintf(FilePath,"/mnt/%s",filename);
|
|
|
-
|
|
|
- if((access(FilePath,F_OK))!=-1)
|
|
|
- {
|
|
|
- DEBUG_INFO("filename=%s exist.\n",FilePath);
|
|
|
- sprintf(rmFileCmd,"rm -f %s",FilePath);
|
|
|
- system(rmFileCmd);
|
|
|
- }
|
|
|
-
|
|
|
- memset(ftpbuf, 0, sizeof(ftpbuf));
|
|
|
-
|
|
|
- sprintf(ftpbuf, "wget --tries=3 -O /mnt/%s -c %s",filename, url);
|
|
|
- //sprintf(ftpbuf, "ftpget -u %s -p %s %s -P %d %s %s%s",user,password,IPbuffer,port/*21*/,filename,path,filename); --- remove temporally
|
|
|
- //DEBUG_INFO("ftpbuf=%s\n",ftpbuf);
|
|
|
- //sprintf(ftpbuf, "ftpput -u %s -p %s %s -P %d %s%s %s",user,password,IPbuffer,21,filename,filename,path);
|
|
|
- systemresult = system(ftpbuf);
|
|
|
-
|
|
|
- //DEBUG_INFO("systemresult=%d\n",systemresult);
|
|
|
- if(systemresult != 0)
|
|
|
- {
|
|
|
- printf("wget error!\n");
|
|
|
- return FALSE;
|
|
|
- }
|
|
|
-
|
|
|
- return TRUE;
|
|
|
-
|
|
|
-}
|
|
|
-
|
|
|
-int httpUploadFile(char *location, char *path, char *filename,char *url)
|
|
|
-{
|
|
|
- char rmFileCmd[100]={0};
|
|
|
- char FilePath[100]={0};
|
|
|
- char ftpbuf[200];
|
|
|
- int systemresult;
|
|
|
-
|
|
|
- //DEBUG_INFO("filename=%s\n",filename);
|
|
|
- //DEBUG_INFO("url=%s\n",url);
|
|
|
- sprintf(FilePath,"%s","/mnt/upload_file.txt");
|
|
|
-
|
|
|
- if((access(FilePath,F_OK))!=-1)
|
|
|
- {
|
|
|
- DEBUG_INFO("filename=%s exist.\n",FilePath);
|
|
|
- sprintf(rmFileCmd,"rm -f %s",FilePath);
|
|
|
- system(rmFileCmd);
|
|
|
- }
|
|
|
-
|
|
|
- FILE *fp = fopen("/mnt/upload_file.txt", "w+");
|
|
|
-
|
|
|
- if(fp == NULL)
|
|
|
- {
|
|
|
- DEBUG_INFO("log is NULL\n");
|
|
|
- return FALSE;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- fprintf(fp, "%s\n", url);
|
|
|
- fprintf(fp, "%s\n", filename);
|
|
|
- fclose(fp);
|
|
|
- }
|
|
|
-
|
|
|
- memset(ftpbuf, 0, sizeof(ftpbuf));
|
|
|
- sprintf(ftpbuf, "%s","/bin/php-cgi /var/www/ocpp_upload.php");
|
|
|
- systemresult = system(ftpbuf);
|
|
|
-
|
|
|
- DEBUG_INFO("systemresult = %d\n",systemresult);
|
|
|
- if(systemresult != 0)
|
|
|
- {
|
|
|
- DEBUG_INFO("http upload error!\n");
|
|
|
- return FALSE;
|
|
|
- }
|
|
|
-
|
|
|
- return TRUE;
|
|
|
-}
|
|
|
-
|
|
|
-int ftpFile(char *location, char *user, char *password, int port, char *path, char *fnamePlusPath,char *filename)
|
|
|
-{
|
|
|
- struct hostent* server;
|
|
|
- char *IPbuffer;
|
|
|
- char ftpbuf[200];
|
|
|
- int systemresult;
|
|
|
-
|
|
|
- // To retrieve host information
|
|
|
- server = gethostbyname(location);
|
|
|
- // To convert an Internet network
|
|
|
- // address into ASCII string
|
|
|
- IPbuffer = inet_ntoa(*((struct in_addr*)
|
|
|
- server->h_addr_list[0]));
|
|
|
-
|
|
|
- memset(ftpbuf, 0, sizeof(ftpbuf));
|
|
|
-
|
|
|
- /* format : ftpput -u phihong -p y42j%2f4cj84 112.91.88.35 -P 21 /2020-02.zip ../mnt/2020-02.zip*/
|
|
|
- /* format : ftpput -u username -p passwd IP target source*/
|
|
|
- sprintf(ftpbuf, "ftpput -u %s -p %s %s -P %d %s%s %s",user,password,IPbuffer,port/*21*/,path,filename,fnamePlusPath);
|
|
|
- DEBUG_INFO("ftpbuf=%s\n",ftpbuf);
|
|
|
- //sprintf(ftpbuf, "ftpput -u %s -p %s %s -P %d %s%s %s",user,password,IPbuffer,21,filename,filename,path);
|
|
|
- systemresult = system(ftpbuf);
|
|
|
-
|
|
|
- DEBUG_INFO("systemresult=%d\n",systemresult);
|
|
|
- if(systemresult != 0)
|
|
|
- {
|
|
|
- DEBUG_INFO("ftpput error!\n");
|
|
|
- return FALSE;
|
|
|
- }
|
|
|
-
|
|
|
- return TRUE;
|
|
|
-
|
|
|
-}
|
|
|
-
|
|
|
-/**
|
|
|
- * Place the contents of the specified file into a memory buffer
|
|
|
- *
|
|
|
- * @param[in] filename The path and name of the file to read
|
|
|
- * @param[out] filebuffer A pointer to the contents in memory
|
|
|
- * @return status 0 success, 1 on failure
|
|
|
- */
|
|
|
-int get_file_contents(const char* filename, char** outbuffer) {
|
|
|
- FILE* file = NULL;
|
|
|
- long filesize;
|
|
|
- const int blocksize = 1;
|
|
|
- size_t readsize;
|
|
|
- char* filebuffer;
|
|
|
-
|
|
|
- // Open the file
|
|
|
- file = fopen(filename, "r");
|
|
|
- if (NULL == file)
|
|
|
- {
|
|
|
- printf("'%s' not opened\n", filename);
|
|
|
- exit(EXIT_FAILURE);
|
|
|
- }
|
|
|
-
|
|
|
- // Determine the file size
|
|
|
- fseek(file, 0, SEEK_END);
|
|
|
- filesize = ftell(file);
|
|
|
- rewind (file);
|
|
|
-
|
|
|
- // Allocate memory for the file contents
|
|
|
- filebuffer = (char*) malloc(sizeof(char) * filesize);
|
|
|
- *outbuffer = filebuffer;
|
|
|
- if (filebuffer == NULL)
|
|
|
- {
|
|
|
- fputs ("malloc out-of-memory", stderr);
|
|
|
- exit(EXIT_FAILURE);
|
|
|
- }
|
|
|
-
|
|
|
- // Read in the file
|
|
|
- readsize = fread(filebuffer, blocksize, filesize, file);
|
|
|
- if (readsize != filesize)
|
|
|
- {
|
|
|
- fputs ("didn't read file completely",stderr);
|
|
|
- exit(EXIT_FAILURE);
|
|
|
- }
|
|
|
-
|
|
|
- // Clean exit
|
|
|
- fclose(file);
|
|
|
- return EXIT_SUCCESS;
|
|
|
-}
|
|
|
-
|
|
|
-static int selectSqlCount = 0;
|
|
|
-static int callback(void *data, int argc, char **argv, char **azColName){
|
|
|
- int i;
|
|
|
- //printf("%s: ", (const char*)data);
|
|
|
- selectSqlCount = argc;
|
|
|
- for(i = 0; i<argc; i++){
|
|
|
- // printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
|
|
|
- }
|
|
|
-
|
|
|
- //printf("\n");
|
|
|
- return 0;
|
|
|
-}
|
|
|
-
|
|
|
-static int versioncallback(void *data, int argc, char **argv, char **azColName){
|
|
|
- //int i;
|
|
|
- //printf("%s:\n", (const char*)data);
|
|
|
- localversion = argv[5] ? atoi(argv[5]) : 0;
|
|
|
- //printf("localversion=%d\n", localversion);
|
|
|
- return 0;
|
|
|
-}
|
|
|
-
|
|
|
-static int IdTagcallback(void *data, int argc, char **argv, char **azColName){
|
|
|
- //int i;
|
|
|
- //printf("%s:\n", (const char*)data);
|
|
|
-
|
|
|
- //idTag
|
|
|
- sprintf(idTagAuthorization,"%s", argv[1] ? argv[1] : "NULL");
|
|
|
- sprintf(idTagQuery.idTagstr,"%s", argv[1] ? argv[1] : "NULL");
|
|
|
-
|
|
|
- //parentIdTag
|
|
|
- sprintf(idTagQuery.parentIdTag,"%s", argv[2] ? argv[2] : "NULL");
|
|
|
-
|
|
|
- //expir_date
|
|
|
- sprintf(idTagQuery.expiryDate,"%s", argv[3] ? argv[3] : "NULL");
|
|
|
-
|
|
|
- //status
|
|
|
- sprintf(idTagQuery.idTagstatus,"%s", argv[4] ? argv[4] : "NULL");
|
|
|
-
|
|
|
- //version
|
|
|
- idTagQuery.listVersionInt = atoi(argv[5]);
|
|
|
-
|
|
|
- //DEBUG_INFO("IdTag=%s\n", idTagAuthorization);
|
|
|
-
|
|
|
- return 0;
|
|
|
-}
|
|
|
-
|
|
|
-static int deleteIdTagcallback(void *data, int argc, char **argv, char **azColName)
|
|
|
-{
|
|
|
-// localversion = argv[5] ? atoi(argv[5]) : 0;
|
|
|
-// printf("localversion=%d\n", localversion);
|
|
|
- return 0;
|
|
|
-}
|
|
|
-
|
|
|
-//=========================================
|
|
|
-// Sqlite3 related function
|
|
|
-//=========================================
|
|
|
-int sqlite3_exec_callback(void *data, int n_columns, char **col_values, char **col_names)
|
|
|
-{
|
|
|
- for (int i = 0; i < n_columns; i++)
|
|
|
- {
|
|
|
- DEBUG_INFO("%s/t", col_values[i]);
|
|
|
- }
|
|
|
- DEBUG_INFO("/n");
|
|
|
-
|
|
|
- return 0;
|
|
|
-}
|
|
|
-
|
|
|
-void OCPP_getListVerion()
|
|
|
-{
|
|
|
- int rc = 0;
|
|
|
- // const char* data = "Callback function called";
|
|
|
- char sql[100];
|
|
|
- char zErrMsg[100];
|
|
|
-
|
|
|
- memset(sql, 0, 100);
|
|
|
- memset(zErrMsg, 0, 100);
|
|
|
-
|
|
|
- strcpy(sql, "select * from ocpp_auth_local order by idx");
|
|
|
-
|
|
|
- /* Execute SQL statement */
|
|
|
- rc = sqlite3_exec(db, sql, versioncallback, 0, (char **)&zErrMsg);
|
|
|
-
|
|
|
- if( rc != SQLITE_OK )
|
|
|
- {
|
|
|
- DEBUG_INFO("SQL error: %s", zErrMsg);
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-void OCPP_getIdTag(char idTag[])
|
|
|
-{
|
|
|
- int rc = 0;
|
|
|
- // const char* data = "Callback function called";
|
|
|
- char sql[100];
|
|
|
- char zErrMsg[100];
|
|
|
-
|
|
|
- memset(sql, 0, 100);
|
|
|
- memset(zErrMsg, 0, 100);
|
|
|
- memset(idTagAuthorization, 0, sizeof(idTagAuthorization));
|
|
|
- memset(&idTagQuery, 0, sizeof(idTagQuery));
|
|
|
-
|
|
|
- //DEBUG_INFO("look up card: %s in ocpp_auth_local table", idTag);
|
|
|
- sprintf(sql,"select * from ocpp_auth_local where idtag='%s'", idTag);
|
|
|
-
|
|
|
- /* Execute SQL statement */
|
|
|
-
|
|
|
- rc = sqlite3_exec(db, sql, IdTagcallback, 0, (char **)&zErrMsg);
|
|
|
-
|
|
|
- if( rc != SQLITE_OK )
|
|
|
- {
|
|
|
- DEBUG_INFO("SQL error: %s", zErrMsg);
|
|
|
- }
|
|
|
-
|
|
|
- //return ver;
|
|
|
-}
|
|
|
-
|
|
|
-void OCPP_get_TableAuthlocalAllData(void)
|
|
|
-{
|
|
|
- int rc = 0;
|
|
|
- char sql[100];
|
|
|
- char zErrMsg[100];
|
|
|
-
|
|
|
- memset(sql, 0, 100);
|
|
|
- memset(zErrMsg, 0, 100);
|
|
|
-
|
|
|
- sprintf(sql,"select * from ocpp_auth_local ");
|
|
|
-
|
|
|
- /* Execute SQL statement */
|
|
|
-
|
|
|
- rc = sqlite3_exec(db, sql, &sqlite3_exec_callback, 0,(char **)&zErrMsg);
|
|
|
-
|
|
|
- if( rc != SQLITE_OK )
|
|
|
- {
|
|
|
- DEBUG_INFO("SQL error: %s", zErrMsg);
|
|
|
- }
|
|
|
-
|
|
|
- //return ver;
|
|
|
-}
|
|
|
-
|
|
|
-int OCPP_cleanLocalList()
|
|
|
-{
|
|
|
- char * sqlcleanLocalList = "delete from ocpp_auth_local";
|
|
|
- char *errMsg = 0;
|
|
|
- int rc =sqlite3_exec(db, sqlcleanLocalList, 0, 0, &errMsg);
|
|
|
-
|
|
|
- if (SQLITE_OK != rc)
|
|
|
- {
|
|
|
- DEBUG_INFO("%s\n",errMsg);
|
|
|
- return FALSE;
|
|
|
- }
|
|
|
-
|
|
|
- return TRUE;
|
|
|
-}
|
|
|
-
|
|
|
-int OCPP_addLocalList_1(int version, char *idTag, char *parentTage, char *expiryDate, char *status)
|
|
|
-{
|
|
|
- int isSuccess = FALSE;
|
|
|
- int ret = 0;
|
|
|
- //const char* data = "Callback function called";
|
|
|
- char sql[300];
|
|
|
- char zErrMsg[200];
|
|
|
-
|
|
|
- memset(sql, 0, 300);
|
|
|
- memset(zErrMsg, 0, 200);
|
|
|
-
|
|
|
- sprintf(sql,"insert or replace into ocpp_auth_local (idtag, parent_idtag, expir_date, status, version) " "VALUES ('%s', '%s', '%s', '%s', %d ); ""SELECT * from ocpp_auth_local", idTag, parentTage, expiryDate, status, version);
|
|
|
-
|
|
|
- //* Execute SQL statement */
|
|
|
- ret = sqlite3_exec(db, sql, callback, 0, (char **)&zErrMsg);
|
|
|
- if( ret != SQLITE_OK )
|
|
|
- {
|
|
|
- DEBUG_INFO("SQL error: %s\n", zErrMsg);
|
|
|
- return isSuccess;
|
|
|
- }
|
|
|
-
|
|
|
- memset(sql, 0, 300);
|
|
|
- sprintf(sql, "UPDATE ocpp_auth_local SET version=%d",version);
|
|
|
- ret = sqlite3_exec(db, sql, NULL, NULL, (char **)&zErrMsg);
|
|
|
- if( ret != SQLITE_OK )
|
|
|
- {
|
|
|
- DEBUG_INFO("SQL error: %s\n", zErrMsg);
|
|
|
- return isSuccess;
|
|
|
- }
|
|
|
-
|
|
|
- isSuccess = TRUE;
|
|
|
- return isSuccess;
|
|
|
-}
|
|
|
-
|
|
|
-void OCPP_deleteIdTag(char idTag[])
|
|
|
-{
|
|
|
- //int ver = 0;
|
|
|
- //int isSuccess = FALSE;
|
|
|
- int rc = 0;
|
|
|
- char sql[100];
|
|
|
- char zErrMsg[100];
|
|
|
-
|
|
|
- memset(sql, 0, 100);
|
|
|
- memset(zErrMsg, 0, 100);
|
|
|
- sprintf(sql,"DELETE from ocpp_auth_local where idtag='%s'; SELECT * from ocpp_auth_local;", idTag);
|
|
|
-
|
|
|
- //* Execute SQL statement */
|
|
|
- rc = sqlite3_exec(db, sql, deleteIdTagcallback, 0,(char **)&zErrMsg);
|
|
|
- if( rc != SQLITE_OK )
|
|
|
- {
|
|
|
- DEBUG_INFO("SQL error: %s", zErrMsg);
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-int GetOcppServerURL()
|
|
|
-{
|
|
|
- int result = FALSE;
|
|
|
- memset(OcppProtocol, 0, sizeof(OcppProtocol));
|
|
|
- memset(OcppHost, 0, sizeof(OcppHost));
|
|
|
- memset(OcppTempPath, 0, sizeof(OcppTempPath));
|
|
|
-
|
|
|
- if((ShmSysConfigAndInfo->SysConfig.OcppServerURL != NULL) && (strcmp((const char *)ShmSysConfigAndInfo->SysConfig.OcppServerURL,"") != 0) )
|
|
|
- {
|
|
|
-#if 1
|
|
|
- sscanf((const char *)ShmSysConfigAndInfo->SysConfig.OcppServerURL,
|
|
|
- "%[^:]:%*2[/]%[^:]:%i/%[a-zA-Z0-9._/-]",
|
|
|
- OcppProtocol, OcppHost, &OcppPort, OcppTempPath);
|
|
|
-#endif
|
|
|
- result = TRUE;
|
|
|
- goto End;
|
|
|
- }
|
|
|
- else if((ShmOCPP16Data->OcppServerURL != NULL) && (strcmp((const char *)ShmOCPP16Data->OcppServerURL,"") != 0))
|
|
|
- {
|
|
|
- sscanf((const char *)ShmOCPP16Data->OcppServerURL,
|
|
|
- "%[^:]:%*2[/]%[^:]:%i/%[a-zA-Z0-9._/-]",
|
|
|
- OcppProtocol, OcppHost, &OcppPort, OcppTempPath);
|
|
|
- result = TRUE;
|
|
|
- goto End;
|
|
|
-
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- strcpy(OcppHost,"");
|
|
|
- }
|
|
|
-
|
|
|
-End:
|
|
|
- return result;
|
|
|
-}
|
|
|
-
|
|
|
-int GetOcppPath()
|
|
|
-{
|
|
|
- int result = FALSE;
|
|
|
- if((ShmSysConfigAndInfo->SysConfig.ChargeBoxId != NULL) && (strcmp((const char *)ShmSysConfigAndInfo->SysConfig.ChargeBoxId,"") != 0) )
|
|
|
- {
|
|
|
- if(OcppTempPath == NULL)
|
|
|
- {
|
|
|
- sprintf(OcppPath,"/%s",ShmSysConfigAndInfo->SysConfig.ChargeBoxId);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- sprintf(OcppPath,"/%s%s",OcppTempPath,ShmSysConfigAndInfo->SysConfig.ChargeBoxId);
|
|
|
- }
|
|
|
- result = TRUE;
|
|
|
- goto End;
|
|
|
- }
|
|
|
- else if((ShmOCPP16Data->ChargeBoxId != NULL) && (strcmp((const char *)ShmOCPP16Data->ChargeBoxId,"") != 0))
|
|
|
- {
|
|
|
- if(OcppTempPath == NULL)
|
|
|
- {
|
|
|
- sprintf(OcppPath,"/%s",ShmOCPP16Data->ChargeBoxId);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- sprintf(OcppPath,"/%s%s",OcppTempPath,ShmOCPP16Data->ChargeBoxId);
|
|
|
- }
|
|
|
- result = TRUE;
|
|
|
- goto End;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- strcpy(OcppPath,"");
|
|
|
- }
|
|
|
-
|
|
|
-End:
|
|
|
- return result;
|
|
|
-}
|
|
|
-
|
|
|
-int GetOcppPort()
|
|
|
-{
|
|
|
- return OcppPort;
|
|
|
-}
|
|
|
-
|
|
|
-int GetOcppConnStatus(void)
|
|
|
-{
|
|
|
- return ShmOCPP16Data->OcppConnStatus;
|
|
|
-}
|
|
|
-
|
|
|
-void SetOcppConnStatus(uint8_t status)
|
|
|
-{
|
|
|
- ShmOCPP16Data->OcppConnStatus = status;
|
|
|
- ShmSysConfigAndInfo->SysInfo.OcppConnStatus = status;
|
|
|
-}
|
|
|
-
|
|
|
-int GetHeartBeatWithNOResponse(void)
|
|
|
-{
|
|
|
- return HeartBeatWithNOResponse;
|
|
|
-}
|
|
|
-
|
|
|
-void SetHeartBeatWithNOResponse(void)
|
|
|
-{
|
|
|
- HeartBeatWithNOResponse = 0;
|
|
|
-}
|
|
|
-
|
|
|
-void GetStartTransactionIdTag(int gun_index)
|
|
|
-{
|
|
|
- memset(StartTransactionIdTagTemp, 0 ,sizeof(StartTransactionIdTagTemp));
|
|
|
- strcpy(StartTransactionIdTagTemp, (const char *)ShmOCPP16Data->StartTransaction[gun_index].IdTag);
|
|
|
-}
|
|
|
-
|
|
|
-int GetTransactionId(int gunindex, char idTag[])
|
|
|
-{
|
|
|
- char ch;
|
|
|
- FILE *fptr1;
|
|
|
- int temptransactionId;
|
|
|
- char str[100]={0};
|
|
|
-
|
|
|
- temptransactionId = 0;
|
|
|
-
|
|
|
- if((strcmp((const char*)idTag, "")==0)||(idTag[0]=='\0'))
|
|
|
- {
|
|
|
- return temptransactionId;
|
|
|
- }
|
|
|
-
|
|
|
- /*------ Read the file ----------------*/
|
|
|
- fptr1=fopen("/Storage/OCPP/QueueTransactionId", "r");
|
|
|
- if (!fptr1)
|
|
|
- {
|
|
|
- return temptransactionId;
|
|
|
- }
|
|
|
-
|
|
|
- ch=fgetc(fptr1);
|
|
|
- rewind(fptr1);
|
|
|
- if(ch!=EOF)
|
|
|
- {
|
|
|
- while (fgets(str, 100, fptr1) != NULL)
|
|
|
- {
|
|
|
- str[strlen(str) - 1] = '\0'; // eat the newline fgets() stores
|
|
|
-
|
|
|
- if(str[0]=='\0')
|
|
|
- {
|
|
|
- break;
|
|
|
- }
|
|
|
- char *revbuf[8] = {0};
|
|
|
- int num = 0;
|
|
|
- splitstring(str,",",revbuf,&num);
|
|
|
- if((revbuf[1][0] != '\0')&&(revbuf[2][0] != '\0'))
|
|
|
- {
|
|
|
- if((atoi(revbuf[0])==gunindex) || (strcmp(revbuf[1],(const char *)idTag)==0))
|
|
|
- {
|
|
|
- temptransactionId = atoi(revbuf[2]);
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- fclose(fptr1);
|
|
|
- /*------- End of reading ---------------*/
|
|
|
- return temptransactionId;
|
|
|
-}
|
|
|
-
|
|
|
-void SetTransactionIdZero(int transactionId)
|
|
|
-{
|
|
|
- char ch;
|
|
|
- FILE *fptr1, *fptr2;
|
|
|
- int temptransactionId = 0;
|
|
|
- char str[100]={0}, strtemp[100]={0}, temp[] = "/Storage/OCPP/QueueTransactionIdtemp.json";
|
|
|
-
|
|
|
- fptr1 = fopen("/Storage/OCPP/QueueTransactionId", "r");
|
|
|
- if (!fptr1)
|
|
|
- {
|
|
|
- //printf(" File not found or unable to open the input file!!\n");
|
|
|
- return ;
|
|
|
- }
|
|
|
-
|
|
|
- fptr2 = fopen(temp, "w"); // open the temporary file in write mode
|
|
|
- if (!fptr2)
|
|
|
- {
|
|
|
- DEBUG_INFO("Unable to open a temporary file to write!!\n");
|
|
|
- fclose(fptr1);
|
|
|
- return ;
|
|
|
- }
|
|
|
-
|
|
|
- ch=fgetc(fptr1);
|
|
|
-
|
|
|
- rewind(fptr1);
|
|
|
- if(ch!=EOF)
|
|
|
- {
|
|
|
- // copy all contents to the temporary file except the specific line
|
|
|
- while (fgets(str, 100, fptr1) != NULL)
|
|
|
- {
|
|
|
- str[strlen(str) - 1] = '\0'; // eat the newline fgets() stores
|
|
|
-
|
|
|
- if(str[0]=='\0')
|
|
|
- {
|
|
|
- break;
|
|
|
- }
|
|
|
-
|
|
|
- char *revbuf[8] = {0};
|
|
|
- int num = 0;
|
|
|
-
|
|
|
- strcpy(strtemp, str);
|
|
|
- splitstring(str,",",revbuf,&num);
|
|
|
-
|
|
|
- if(revbuf[2][0] != '\0')
|
|
|
- {
|
|
|
- temptransactionId = atoi(revbuf[2]);
|
|
|
- if(transactionId != temptransactionId)
|
|
|
- {
|
|
|
- fprintf(fptr2, "%s\n", strtemp);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- fclose(fptr1);
|
|
|
- fclose(fptr2);
|
|
|
- remove("/Storage/OCPP/QueueTransactionId"); // remove the original file
|
|
|
- rename(temp, "/Storage/OCPP/QueueTransactionId"); // rename the temporary file to original name
|
|
|
-/*------ Read the file ----------------*/
|
|
|
-
|
|
|
-}
|
|
|
-
|
|
|
-int InternetDisconnect(void)
|
|
|
-{
|
|
|
- return (ShmStatusCodeData->InfoCode.InfoEvents.bits.InternetDisconnectVia4Gi && ShmStatusCodeData->InfoCode.InfoEvents.bits.InternetDisconnectViaEthernet && ShmStatusCodeData->InfoCode.InfoEvents.bits.InternetDisconnectViaWiFi );
|
|
|
-}
|
|
|
-
|
|
|
-//Note: It is not real StopTransaction. It is temporary StopTransaction.
|
|
|
-void storeTempStopTransaction(int gun_index)
|
|
|
-{
|
|
|
- char guid[37]={0};
|
|
|
- int tempIndex = 0;
|
|
|
- DEBUG_INFO("storeTempStopTransaction...\n");
|
|
|
- memset(queuedata, 0, sizeof(queuedata));
|
|
|
-
|
|
|
- //ENERGY_ACTIVE_IMPORT_REGISTER
|
|
|
- //J: CHAdeMO U: CCS1 combo E: CCS2 combo G: GBT DCcc
|
|
|
- if(gunType[gun_index] == 'J')
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
- {
|
|
|
- tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tempIndex = gun_index;
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < CHAdeMO_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
|
|
|
- {
|
|
|
- ShmOCPP16Data->StopTransaction[gun_index].MeterStop = ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PowerConsumption;
|
|
|
- }
|
|
|
- }// END OF CHAdeMO_QUANTITY
|
|
|
- }
|
|
|
- else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
- {
|
|
|
- tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tempIndex = gun_index;
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < CCS_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
|
|
|
- {
|
|
|
- ShmOCPP16Data->StopTransaction[gun_index].MeterStop = ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PowerConsumption;
|
|
|
- }
|
|
|
- }// END OF CCS_QUANTITY
|
|
|
-
|
|
|
- }
|
|
|
- else if(gunType[gun_index] == 'G')
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
- {
|
|
|
- tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tempIndex = gun_index;
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < GB_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
|
|
|
- {
|
|
|
- ShmOCPP16Data->StopTransaction[gun_index].MeterStop = ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PowerConsumption;
|
|
|
- }
|
|
|
- }// END OF GB_QUANTITY
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
|
|
|
- {
|
|
|
- tempIndex = 2;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tempIndex = gun_index;
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < AC_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
|
|
|
- {
|
|
|
- ShmOCPP16Data->StopTransaction[gun_index].MeterStop = ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PowerConsumption;
|
|
|
- }
|
|
|
- }// END OF AC_QUANTITY
|
|
|
- }
|
|
|
-
|
|
|
- //Stop Transaction Time
|
|
|
- struct timeval tmnow;
|
|
|
- struct tm *tm;
|
|
|
- char buf[28];//, usec_buf[6];
|
|
|
- gettimeofday(&tmnow, NULL);
|
|
|
-
|
|
|
- time_t t;
|
|
|
- t = time(NULL);
|
|
|
- /*UTC time and date*/
|
|
|
- tm = gmtime(&t);
|
|
|
- strftime(buf,28,"%Y-%m-%dT%H:%M:%SZ", tm);
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].Timestamp,buf);
|
|
|
- ShmOCPP16Data->StopTransaction[gun_index].TransactionId = ShmOCPP16Data->StartTransaction[gun_index].ResponseTransactionId;
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].IdTag, (const char*)ShmOCPP16Data->StartTransaction[gun_index].IdTag);
|
|
|
-
|
|
|
- random_uuid(guid);
|
|
|
-
|
|
|
- /***********************************transactionData******************************************************/
|
|
|
- memset(ShmOCPP16Data->StopTransaction[gun_index].TransactionData, 0, sizeof(sizeof(struct StructMeterValue)));
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].TimeStamp, buf);
|
|
|
-
|
|
|
- //=================================
|
|
|
- //1. Transaction_Begin
|
|
|
- //=================================
|
|
|
- // Energy.Active.Export.Interval
|
|
|
- //idx_sample=0;
|
|
|
- sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Value, "%.1f",(float)(ShmOCPP16Data->StartTransaction[gun_index].MeterStart)); // MeterStart is 0~6553.5 kWh
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Context,ReadingContextStr[ReadingContext_Transaction_Begin]);
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Format,ValueFormatStr[Raw]);
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Measurand,MeasurandStr[Energy_Active_Import_Interval]);//MeasurandStr[Energy_Active_Export_Interval/*Energy_Reactive_Export_Register*/]);
|
|
|
-
|
|
|
- //J: CHAdeMO U: CCS1 combo E: CCS2 combo G: GBT DCcc
|
|
|
- if((gunType[gun_index] == 'J')||(gunType[gun_index] == 'U')||(gunType[gun_index] == 'E')||(gunType[gun_index] == 'G'))
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Phase,PhaseStr[L3_N]);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Phase,PhaseStr[L1_N]);
|
|
|
- }
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Location,LocationStr[Location_Outlet]);
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Unit,UnitOfMeasureStr[UnitOfMeasure_kWh]);
|
|
|
-
|
|
|
- //=================================
|
|
|
- //2. Transaction_End
|
|
|
- //=================================
|
|
|
- //2.1 Current.Export
|
|
|
- //idx_sample=1;
|
|
|
- //J: CHAdeMO U: CCS1 combo E: CCS2 combo G : GBT DC
|
|
|
- if(gunType[gun_index] == 'J')
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
- {
|
|
|
- tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tempIndex = gun_index;
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < CHAdeMO_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
|
|
|
- {
|
|
|
- sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargingCurrent );// PresentChargingCurrent is 0~6553.5 amp
|
|
|
- }
|
|
|
- }// End of for CHAdeMO_QUANTITY
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Phase,PhaseStr[L3_N]);
|
|
|
- }
|
|
|
- else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
- {
|
|
|
- tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tempIndex = gun_index;
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < CCS_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
|
|
|
- {
|
|
|
- sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargingCurrent );// PresentChargingCurrent is 0~6553.5 amp
|
|
|
- }
|
|
|
- }// End of for CCS_QUANTITY
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Phase,PhaseStr[L3_N]);
|
|
|
- }
|
|
|
- else if(gunType[gun_index] == 'G')
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
- {
|
|
|
- tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tempIndex = gun_index;
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < GB_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
|
|
|
- {
|
|
|
- sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargingCurrent );// PresentChargingCurrent is 0~6553.5 amp
|
|
|
- }
|
|
|
- }// End of for GB_QUANTITY
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Phase,PhaseStr[L3_N]);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
|
|
|
- {
|
|
|
- tempIndex = 2;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tempIndex = gun_index;
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < AC_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
|
|
|
- {
|
|
|
- sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PresentChargingCurrent );// 0~6553.5 amp for EVSE
|
|
|
- }
|
|
|
- }// End of for AC_QUANTITY
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Phase,PhaseStr[L1_N]);
|
|
|
- }
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Context,ReadingContextStr[ReadingContext_Transaction_End]);
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Format,ValueFormatStr[Raw]);
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Measurand,MeasurandStr[Current_Import]);
|
|
|
- //strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Phase,PhaseStr[L1_N]);
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Location,LocationStr[Location_Outlet]);
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Unit,UnitOfMeasureStr[UnitOfMeasure_A]);
|
|
|
-
|
|
|
- //2.2 Energy.Active.Export.Interval
|
|
|
- //idx_sample=2;
|
|
|
- //J: CHAdeMO U: CCS1 combo E: CCS2 combo G: GBT DC
|
|
|
-
|
|
|
- if(gunType[gun_index] == 'J')
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
- {
|
|
|
- tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tempIndex = gun_index;
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < CHAdeMO_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
|
|
|
- {
|
|
|
- sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargedEnergy );// PresentChargedEnergy is 0~6553.5 kWh
|
|
|
- }
|
|
|
- }// END OF CHAdeMO_QUANTITY
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Phase,PhaseStr[L3_N]);
|
|
|
-
|
|
|
- }
|
|
|
- else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
- {
|
|
|
- tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tempIndex = gun_index;
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < CCS_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
|
|
|
- {
|
|
|
- sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargedEnergy );// PresentChargedEnergy is 0~6553.5 kWh
|
|
|
- }
|
|
|
- }// END OF CCS_QUANTITY
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Phase,PhaseStr[L3_N]);
|
|
|
-
|
|
|
- }
|
|
|
- else if(gunType[gun_index] == 'G')
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
- {
|
|
|
- tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tempIndex = gun_index;
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < GB_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
|
|
|
- {
|
|
|
- sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargedEnergy );// PresentChargedEnergy is 0~6553.5 kWh
|
|
|
- }
|
|
|
- }// END OF GB_QUANTITY
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Phase,PhaseStr[L3_N]);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
|
|
|
- {
|
|
|
- tempIndex = 2;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tempIndex = gun_index;
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- for (int index = 0; index < AC_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
|
|
|
- {
|
|
|
- sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PresentChargedEnergy );// PresentChargedEnergy is 0~6553.5 kWh
|
|
|
- }
|
|
|
- }// END OF AC_QUANTITY
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Phase,PhaseStr[L1_N]);
|
|
|
- }
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Context,ReadingContextStr[ReadingContext_Transaction_End]);
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Format,ValueFormatStr[Raw]);
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Measurand,MeasurandStr[Energy_Active_Import_Interval]);
|
|
|
- //strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Phase,PhaseStr[L1_N]);
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Location,LocationStr[Location_Outlet]);
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Unit,UnitOfMeasureStr[UnitOfMeasure_kWh]);
|
|
|
-
|
|
|
- //2.3 Power.Active.Export
|
|
|
- //idx_sample=3;
|
|
|
- //J: CHAdeMO U: CCS1 combo E: CCS2 combo G: GBT DC
|
|
|
-
|
|
|
- if(gunType[gun_index] == 'J')
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
- {
|
|
|
- tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tempIndex = gun_index;
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < CHAdeMO_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
|
|
|
- {
|
|
|
- sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargingPower );// PresentChargingPower is 0~6553.5 kW
|
|
|
- }
|
|
|
- } // End for CHAdeMO_QUANTITY
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Phase,PhaseStr[L3_N]);
|
|
|
- }
|
|
|
- else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
- {
|
|
|
- tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tempIndex = gun_index;
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < CCS_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
|
|
|
- {
|
|
|
- sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargingPower );// PresentChargingPower is 0~6553.5 kW
|
|
|
- }
|
|
|
- } // END for CCS_QUANTITY
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Phase,PhaseStr[L3_N]);
|
|
|
- }
|
|
|
- else if(gunType[gun_index] == 'G')
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
- {
|
|
|
- tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tempIndex = gun_index;
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < GB_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
|
|
|
- {
|
|
|
- sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargingPower );// PresentChargingPower is 0~6553.5 kW
|
|
|
- }
|
|
|
- }// END for GB_QUANTITY
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Phase,PhaseStr[L3_N]);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
|
|
|
- {
|
|
|
- tempIndex = 2;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tempIndex = gun_index;
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < AC_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
|
|
|
- {
|
|
|
- sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PresentChargingPower );// PresentChargingPower is 0~6553.5 kW
|
|
|
- }
|
|
|
- } // END for AC_QUANTITY
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Phase,PhaseStr[L1_N]);
|
|
|
- }
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Context,ReadingContextStr[ReadingContext_Transaction_End]);
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Format,ValueFormatStr[Raw]);
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Measurand,MeasurandStr[Power_Active_Import]);
|
|
|
- //strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Phase,PhaseStr[L1_N]);
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Location,LocationStr[Location_Outlet]);
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Unit,UnitOfMeasureStr[UnitOfMeasure_kW/*UnitOfMeasure_kWh*/]);
|
|
|
-
|
|
|
- //2.4 Voltage
|
|
|
- //idx_sample=4;
|
|
|
- //J: CHAdeMO U: CCS1 combo E: CCS2 combo G: GBT DC
|
|
|
- if(gunType[gun_index] == 'J')
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
- {
|
|
|
- tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tempIndex = gun_index;
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < CHAdeMO_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
|
|
|
- {
|
|
|
- sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargingVoltage );// PresentChargingVoltage is 0~6553.5 volt
|
|
|
- }
|
|
|
- } // END OF FOR CHAdeMO_QUANTITY
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Phase,PhaseStr[L3_N]);
|
|
|
-
|
|
|
- }
|
|
|
- else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
- {
|
|
|
- tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tempIndex = gun_index;
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < CCS_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
|
|
|
- {
|
|
|
- sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargingVoltage );// PresentChargingVoltage is 0~6553.5 volt
|
|
|
- }
|
|
|
- } // END OF FOR CCS_QUANTITY
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Phase,PhaseStr[L3_N]);
|
|
|
- }
|
|
|
- else if(gunType[gun_index] == 'G')
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
- {
|
|
|
- tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tempIndex = gun_index;
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < GB_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
|
|
|
- {
|
|
|
- sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargingVoltage );// PresentChargingVoltage is 0~6553.5 volt
|
|
|
- }
|
|
|
- } // END OF FOR GB_QUANTITY
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Phase,PhaseStr[L3_N]);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
|
|
|
- {
|
|
|
- tempIndex = 2;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tempIndex = gun_index;
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < AC_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
|
|
|
- {
|
|
|
- sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PresentChargingVoltage );//AcChargingVoltage is 0~6553.5 volt for AC EVSE
|
|
|
- }
|
|
|
- } // END OF FOR AC_QUANTITY
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Phase,PhaseStr[L1_N]);
|
|
|
- }
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Context,ReadingContextStr[ReadingContext_Transaction_End]);
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Format,ValueFormatStr[Raw]);
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Measurand,MeasurandStr[Voltage]);
|
|
|
- //strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Phase,PhaseStr[L1_N]);
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Location,LocationStr[Location_Outlet]);
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Unit,UnitOfMeasureStr[UnitOfMeasure_V]);
|
|
|
-
|
|
|
- //2.5 SoC
|
|
|
- //idx_sample=5;
|
|
|
- //J : CHAdeMO U: CCS1 combo E: CCS2 combo G: GBT DC
|
|
|
- if((gunType[gun_index] == 'J')||(gunType[gun_index] == 'U')||(gunType[gun_index] == 'E')||(gunType[gun_index] == 'G'))
|
|
|
- {
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
- {
|
|
|
- tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- tempIndex = gun_index;
|
|
|
- }
|
|
|
-
|
|
|
- if(gunType[gun_index] == 'J')
|
|
|
- {
|
|
|
- for (int index = 0; index < CHAdeMO_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
|
|
|
- {
|
|
|
- sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Value, "%d" ,ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].EvBatterySoc );// 0~100%
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
|
|
|
- {
|
|
|
- for (int index = 0; index < CCS_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
|
|
|
- {
|
|
|
- sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Value, "%d" ,ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].EvBatterySoc );// 0~100%
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
- else if(gunType[gun_index] == 'G')
|
|
|
- {
|
|
|
- for (int index = 0; index < GB_QUANTITY; index++)
|
|
|
- {
|
|
|
- if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
|
|
|
- {
|
|
|
- sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Value, "%d" ,ShmSysConfigAndInfo->SysInfo.GbChargingData[index].EvBatterySoc );// 0~100%
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Context,ReadingContextStr[ReadingContext_Transaction_End]);
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Format,ValueFormatStr[Raw]);
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Measurand,MeasurandStr[SoC/*Energy_Reactive_Export_Register*/]);
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Phase,PhaseStr[L3_N]);
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Location,LocationStr[Location_Outlet]);
|
|
|
- strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Unit,UnitOfMeasureStr[UnitOfMeasure_Percent/*UnitOfMeasure_kWh*/]);
|
|
|
-
|
|
|
- } // END FOR DC CASE
|
|
|
-
|
|
|
- if((gunType[gun_index] == 'J')||(gunType[gun_index] == 'U')||(gunType[gun_index] == 'E')||(gunType[gun_index] == 'G'))
|
|
|
- {
|
|
|
- sprintf(queuedata,"[%d,\"%s\",\"StopTransaction\",{\"idTag\":\"%s\",\"meterStop\":%d,\"timestamp\":\"%s\",\"transactionId\":%d,\"reason\":\"%s\",\"transactionData\":[{\"timestamp\":\"%s\",\"sampledValue\":[{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"}]}]}]"
|
|
|
-
|
|
|
- ,MESSAGE_TYPE_CALL
|
|
|
- ,guid
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].IdTag
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].MeterStop
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].Timestamp
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionId
|
|
|
- ,"PowerLoss"
|
|
|
- ,(const char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].TimeStamp
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Value
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Context
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Format
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Measurand
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Phase
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Location
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Unit
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Value
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Context
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Format
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Measurand
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Phase
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Location
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Unit
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Value
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Context
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Format
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Measurand
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Phase
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Location
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Unit
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Value
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Context
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Format
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Measurand
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Phase
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Location
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Unit
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Value
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Context
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Format
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Measurand
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Phase
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Location
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Unit
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Value
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Context
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Format
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Measurand
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Phase
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Location
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Unit
|
|
|
- );
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- sprintf(queuedata,"[%d,\"%s\",\"StopTransaction\",{\"idTag\":\"%s\",\"meterStop\":%d,\"timestamp\":\"%s\",\"transactionId\":%d,\"reason\":\"%s\",\"transactionData\":[{\"timestamp\":\"%s\",\"sampledValue\":[{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"}]}]}]"
|
|
|
-
|
|
|
- ,MESSAGE_TYPE_CALL
|
|
|
- ,guid
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].IdTag
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].MeterStop
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].Timestamp
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionId
|
|
|
- ,"PowerLoss"
|
|
|
- ,(const char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].TimeStamp
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Value
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Context
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Format
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Measurand
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Phase
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Location
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Unit
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Value
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Context
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Format
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Measurand
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Phase
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Location
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Unit
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Value
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Context
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Format
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Measurand
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Phase
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Location
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Unit
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Value
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Context
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Format
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Measurand
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Phase
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Location
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Unit
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Value
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Context
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Format
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Measurand
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Phase
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Location
|
|
|
- ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Unit
|
|
|
- );
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- // Check File "TempStopTransaction" Exist
|
|
|
- if((access("/Storage/OCPP/TempStopTransaction",F_OK))!=-1)
|
|
|
- {
|
|
|
- //DEBUG_INFO("TransactionRelatedQueue exist.\n");
|
|
|
- fclose(fopen("/Storage/OCPP/TempStopTransaction", "w"));
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- //DEBUG_INFO("TransactionRelatedQueue not exist\n");
|
|
|
- FILE *log = fopen("/Storage/OCPP/TempStopTransaction", "w+");
|
|
|
-
|
|
|
- if(log == NULL)
|
|
|
- {
|
|
|
- //DEBUG_INFO("Can't Create File TransactionRelatedQueue \n");
|
|
|
- return ;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- fclose(log);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- //Add TempStopTransaction | Update TempStopTransaction
|
|
|
- // open file for writing
|
|
|
- FILE *outfile;
|
|
|
- outfile = fopen ("/Storage/OCPP/TempStopTransaction", "a");
|
|
|
- //DEBUG_INFO("data = %s\n", queuedata);
|
|
|
- fputs(queuedata, outfile);
|
|
|
- fputs("\n", outfile);
|
|
|
- fclose (outfile);
|
|
|
-}
|
|
|
-
|
|
|
-void checkTempStopTransaction(int gun_index)
|
|
|
-{
|
|
|
- FILE *fptr1;
|
|
|
- char ch;
|
|
|
- char str[1200]={0};
|
|
|
- char guid[37]={0};
|
|
|
- char tempdata[65]={0};
|
|
|
-
|
|
|
- fptr1 = fopen("/Storage/OCPP/TempStopTransaction", "r");
|
|
|
- if (!fptr1)
|
|
|
- {
|
|
|
- //printf(" File not found or unable to open the input file!!\n");
|
|
|
- return ;
|
|
|
- }
|
|
|
-
|
|
|
- ch=fgetc(fptr1);
|
|
|
- //printf(" Now the content of the file %s is : \n",fname);
|
|
|
-
|
|
|
- rewind(fptr1);
|
|
|
- if(ch!=EOF)
|
|
|
- {
|
|
|
- // copy all contents to the temporary file except the specific line
|
|
|
- while (fgets(str, 1200, fptr1) != NULL)
|
|
|
- {
|
|
|
- str[strlen(str) - 1] = '\0'; // eat the newline fgets() stores
|
|
|
-
|
|
|
- if(str[0]=='\0')
|
|
|
- {
|
|
|
- break;
|
|
|
- }
|
|
|
-
|
|
|
- //random_uuid(guid);
|
|
|
- strncpy(guid, str+4, 36); //skip 4 bytes( [2," ),copy guid
|
|
|
- sprintf(tempdata, "StopTransaction,%d", (gun_index));
|
|
|
- if(hashmap_operation(HASH_OP_ADD, guid, tempdata) == 1)
|
|
|
- {
|
|
|
- DEBUG_INFO("StopTransaction mapitem pass\n");
|
|
|
- }
|
|
|
- queue_operation(QUEUE_OPERATION_ADD, guid, str );//addq(guid, queuedata); ---> remove temporally
|
|
|
-
|
|
|
- memset(str,0,sizeof str);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- // fptr1=freopen(NULL,"w",fptr1); // reset the fptr1 again
|
|
|
- fclose(fptr1);
|
|
|
- remove("/Storage/OCPP/TempStopTransaction"); // remove the original file
|
|
|
-}
|
|
|
-
|
|
|
-void FillStartTransaction(int ConnectorId, unsigned char IdTag[], int MeterStart,int ReservationId,unsigned char Timestamp[])
|
|
|
-{
|
|
|
- ShmOCPP16Data->StartTransaction[ConnectorId-1].ConnectorId = ConnectorId;
|
|
|
- ShmOCPP16Data->StartTransaction[ConnectorId-1].ReservationId = ReservationId;
|
|
|
- ShmOCPP16Data->StartTransaction[ConnectorId-1].MeterStart = MeterStart;
|
|
|
- strcpy((char *)ShmOCPP16Data->StartTransaction[ConnectorId-1].IdTag, (char *)IdTag);
|
|
|
- strcpy((char *)ShmOCPP16Data->StartTransaction[ConnectorId-1].Timestamp,(char *) Timestamp);
|
|
|
-}
|
|
|
-
|
|
|
-int GetWebSocketPingInterval(void)
|
|
|
-{
|
|
|
- return atoi((const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[WebSocketPingInterval].ItemData);
|
|
|
-}
|
|
|
-
|
|
|
-int GetServerSign(void)
|
|
|
-{
|
|
|
- return server_sign;
|
|
|
-}
|
|
|
-
|
|
|
-void SetServerSign(int value)
|
|
|
-{
|
|
|
- server_sign = value;
|
|
|
-}
|
|
|
-
|
|
|
-int GetBootNotificationInterval(void)
|
|
|
-{
|
|
|
- return BootNotificationInterval;
|
|
|
-}
|
|
|
-
|
|
|
-int GetInternetConn(void)
|
|
|
-{
|
|
|
- return ShmSysConfigAndInfo->SysInfo.InternetConn;
|
|
|
-}
|
|
|
-
|
|
|
-void InitialSystemValue(void)
|
|
|
-{
|
|
|
- int connectorIndex = 0;
|
|
|
- //int valueASCII = 0;
|
|
|
- server_cycle_Status = 120;
|
|
|
- gunTotalNumber=0;
|
|
|
- SystemInitial = 0;
|
|
|
- localversion=0;
|
|
|
- BootNotificationInterval = 0;
|
|
|
- authorizeRetryTimes = 0;
|
|
|
- GunStatusInterval = 10;
|
|
|
- TransactionMessageAttemptsValue = 0;
|
|
|
- TransactionMessageRetryIntervalValue = 0;
|
|
|
-
|
|
|
- //Hear Beat
|
|
|
- HeartBeatWithNOResponse = 0;
|
|
|
- HeartBeatCountPerHour = 0;
|
|
|
- HeartBeatWaitTime = atoi((char*)ShmOCPP16Data->ConfigurationTable.CoreProfile[HeartbeatInterval].ItemData);;
|
|
|
- FirstHeartBeat = 0;
|
|
|
-
|
|
|
- FirmwareStatusNotificationStatus = FIRMWARE_STATUS_IDLE; // Idle
|
|
|
- DiagnosticsStatusNotificationStatus = DIAGNOSTIC_STATUS_IDLE; // Idle
|
|
|
-
|
|
|
- memset(CurrentChargingProfileScheduleStr, 0, sizeof(CurrentChargingProfileScheduleStr));
|
|
|
- memset(statusModeChage, 0, sizeof(statusModeChage));
|
|
|
- memset(ChademoPreviousSystemStatus, 0, sizeof(ChademoPreviousSystemStatus));
|
|
|
- memset(CcsPreviousSystemStatus, 0, sizeof(CcsPreviousSystemStatus));
|
|
|
- memset(GbPreviousSystemStatus, 0, sizeof(GbPreviousSystemStatus));
|
|
|
- memset(AcPreviousSystemStatus, 0, sizeof(AcPreviousSystemStatus));
|
|
|
- memset(ChademoPreviousConnectorPlugIn, 0, sizeof(ChademoPreviousConnectorPlugIn));
|
|
|
- memset(CcsPreviousConnectorPlugIn, 0, sizeof(CcsPreviousConnectorPlugIn));
|
|
|
- memset(GbPreviousConnectorPlugIn, 0, sizeof(GbPreviousConnectorPlugIn));
|
|
|
- memset(AcPreviousConnectorPlugIn, 0, sizeof(AcPreviousConnectorPlugIn));
|
|
|
- memset(gunType, 0, sizeof(gunType));
|
|
|
-
|
|
|
- if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D') // 'D' means DC
|
|
|
- {
|
|
|
- //check connector / socket type (index: 8, 9, 10)
|
|
|
- for(int index=7; index <10 ; index++)
|
|
|
- {
|
|
|
- if(index != 8)
|
|
|
- {
|
|
|
- // DC Connector
|
|
|
- if ((ShmSysConfigAndInfo->SysConfig.ModelName[index] >= 'A') && (ShmSysConfigAndInfo->SysConfig.ModelName[index] <= 'Z'))
|
|
|
- {
|
|
|
- SystemInitial = SystemInitial + 1;
|
|
|
- gunTotalNumber = gunTotalNumber + 1;
|
|
|
- gunType[connectorIndex] = ShmSysConfigAndInfo->SysConfig.ModelName[index];
|
|
|
- connectorIndex = connectorIndex + 1;
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- // AC Connector
|
|
|
- if ((ShmSysConfigAndInfo->SysConfig.ModelName[index] > '0') && (ShmSysConfigAndInfo->SysConfig.ModelName[index] <= '9'))
|
|
|
- {
|
|
|
- SystemInitial = SystemInitial + 1;
|
|
|
- gunTotalNumber = gunTotalNumber + 1;
|
|
|
- gunType[connectorIndex] = ShmSysConfigAndInfo->SysConfig.ModelName[index];
|
|
|
- connectorIndex = connectorIndex + 1;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- //DEBUG_INFO("DC ...\n");
|
|
|
- }
|
|
|
- else if (ShmSysConfigAndInfo->SysConfig.ModelName[0]=='A') //'A' means AC
|
|
|
- {
|
|
|
- //check connector / socket type (index: 8, 9, 10)
|
|
|
- for(int index=7; index <10 ; index++)
|
|
|
- {
|
|
|
- if ((ShmSysConfigAndInfo->SysConfig.ModelName[index] > '0') && (ShmSysConfigAndInfo->SysConfig.ModelName[index] <= '9'))
|
|
|
- {
|
|
|
- SystemInitial = SystemInitial + 1;
|
|
|
- gunTotalNumber = gunTotalNumber + 1;
|
|
|
- gunType[connectorIndex] = ShmSysConfigAndInfo->SysConfig.ModelName[index];
|
|
|
- connectorIndex = connectorIndex + 1;
|
|
|
-
|
|
|
- //DEBUG_INFO("AC: %d, %c\n", index, ShmSysConfigAndInfo->SysConfig.ModelName[index]);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- //Status && ConnectorPlugIn Setting
|
|
|
- for (int index = 0; index < CHAdeMO_QUANTITY; index++)
|
|
|
- {
|
|
|
- ChademoPreviousSystemStatus[index]= ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PreviousSystemStatus;
|
|
|
- ChademoPreviousConnectorPlugIn[index] = ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].ConnectorPlugIn;
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < CCS_QUANTITY; index++)
|
|
|
- {
|
|
|
- CcsPreviousSystemStatus[index] = ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PreviousSystemStatus;
|
|
|
- CcsPreviousConnectorPlugIn[index] = ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].ConnectorPlugIn;
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < GB_QUANTITY; index++)
|
|
|
- {
|
|
|
- GbPreviousSystemStatus[index] = ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PreviousSystemStatus;
|
|
|
- GbPreviousConnectorPlugIn[index] = ShmSysConfigAndInfo->SysInfo.GbChargingData[index].ConnectorPlugIn;
|
|
|
- }
|
|
|
-
|
|
|
- for (int index = 0; index < AC_QUANTITY; index++)
|
|
|
- {
|
|
|
- AcPreviousSystemStatus[index]= ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PreviousSystemStatus;
|
|
|
- AcPreviousConnectorPlugIn[index] = ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PilotState;
|
|
|
- }
|
|
|
-
|
|
|
- for(int gun_index=0; gun_index < gunTotalNumber; gun_index++ )
|
|
|
- {
|
|
|
- cpinitateMsg.bits[gun_index].StatusNotificationReq = 0;
|
|
|
- cpinitateMsg.bits[gun_index].StatusNotificationConf = 0;
|
|
|
- clientTime.MeterValues[gun_index] = time((time_t*)NULL);
|
|
|
- clientTime.StatusNotification[gun_index] = time((time_t*)NULL);
|
|
|
- }
|
|
|
-
|
|
|
- // Charger PRE_SYS_MODE
|
|
|
- memset(PRE_SYS_MODE, 0, sizeof(PRE_SYS_MODE));
|
|
|
-
|
|
|
- memset( (void *)unknownkey, 0, sizeof(unknownkey));
|
|
|
-
|
|
|
- clientTime.Heartbeat=time((time_t*)NULL);
|
|
|
-
|
|
|
- sleep(1);
|
|
|
-}
|
|
|
-
|
|
|
-void LWS_Send(char * str)
|
|
|
-{
|
|
|
- //=====================================================
|
|
|
- // Check InternetConn 0: disconnected, 1: connected
|
|
|
- //====================================================
|
|
|
- if(ShmSysConfigAndInfo->SysInfo.InternetConn == 0)
|
|
|
- {
|
|
|
- DEBUG_INFO("\n offline now !!!\n");
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- pthread_mutex_lock(&lock);
|
|
|
- memset(SendBuffer, 0, SendBufLen);
|
|
|
- sprintf((char *)SendBuffer, "%s", str);
|
|
|
- pthread_mutex_unlock(&lock);
|
|
|
-
|
|
|
- lws_callback_on_writable(wsi_client);
|
|
|
- lws_service(context, 100);//timeout_ms
|
|
|
+#include "Module_OcppBackend.h"
|
|
|
+#include "define.h"
|
|
|
+
|
|
|
+//ChargePointMaxProfile
|
|
|
+#define ChargePointMaxProfile_JSON "/Storage/OCPP/ChargePointMaxProfile.json"
|
|
|
+
|
|
|
+//TxDefaultProfile
|
|
|
+#define TxDefaultProfile_0_JSON "/Storage/OCPP/TxDefaultProfile_0.json"
|
|
|
+#define TxDefaultProfile_1_JSON "/Storage/OCPP/TxDefaultProfile_1.json"
|
|
|
+#define TxDefaultProfile_2_JSON "/Storage/OCPP/TxDefaultProfile_2.json"
|
|
|
+
|
|
|
+//TxProfile
|
|
|
+#define TxProfile_1_JSON "/Storage/OCPP/TxProfile_1.json"
|
|
|
+#define TxProfile_2_JSON "/Storage/OCPP/TxProfile_2.json"
|
|
|
+
|
|
|
+#define ChargingProfile_0_JSON "/Storage/OCPP/chargingprofile_0.json"
|
|
|
+#define ChargingProfile_1_JSON "/Storage/OCPP/chargingprofile_1.json"
|
|
|
+#define ChargingProfile_2_JSON "/Storage/OCPP/chargingprofile_2.json"
|
|
|
+#define AuthorizationCache_JSON "/Storage/OCPP/AuthorizationCache.json"
|
|
|
+#define LocalAuthorizationList_JSON "/Storage/OCPP/LocalAuthorizationList.json"
|
|
|
+
|
|
|
+
|
|
|
+//===================================
|
|
|
+// Define CP State constant
|
|
|
+//===================================
|
|
|
+#define CP_STATE_UNKNOWN 0
|
|
|
+#define CP_STATE_A 1
|
|
|
+#define CP_STATE_B 2
|
|
|
+#define CP_STATE_C 3
|
|
|
+#define CP_STATE_D 4
|
|
|
+#define CP_STATE_E 5
|
|
|
+#define CP_STATE_F 6
|
|
|
+
|
|
|
+struct SysConfigAndInfo *ShmSysConfigAndInfo;
|
|
|
+struct StatusCodeData *ShmStatusCodeData;
|
|
|
+struct PsuData *ShmPsuData ;
|
|
|
+struct OCPP16Data *ShmOCPP16Data;
|
|
|
+
|
|
|
+#define MACROSTR(k) #k
|
|
|
+
|
|
|
+//ConfigurationMaxKeys
|
|
|
+#define GetConfigurationMaxKeysNUM 43
|
|
|
+
|
|
|
+pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
|
|
|
+char queuedata[2600] = {0};
|
|
|
+
|
|
|
+//=================================
|
|
|
+// StatusNotification cycle
|
|
|
+//=================================
|
|
|
+static int server_cycle_Status = 120;
|
|
|
+
|
|
|
+//===============================
|
|
|
+// Configuration: unknownkey
|
|
|
+//===============================
|
|
|
+static char unknownkey[10][20] = {0};
|
|
|
+static int UnknownKeynum = 0;
|
|
|
+
|
|
|
+//===============================
|
|
|
+// Gun Total Numbers
|
|
|
+//===============================
|
|
|
+static int gunTotalNumber = 0;
|
|
|
+static unsigned char gunType[4] = {0};
|
|
|
+
|
|
|
+//===============================
|
|
|
+// Local List Version
|
|
|
+//===============================
|
|
|
+static int localversion=0;
|
|
|
+static char idTagAuthorization[32] = {0};
|
|
|
+
|
|
|
+//===============================
|
|
|
+// OCPP sign variable
|
|
|
+//===============================
|
|
|
+static int server_sign = FALSE;
|
|
|
+int server_pending = FALSE;
|
|
|
+int PRE_SYS_MODE[CHAdeMO_QUANTITY+ CCS_QUANTITY + GB_QUANTITY + AC_QUANTITY];
|
|
|
+static int BootNotificationInterval = 0;
|
|
|
+static int SystemInitial = 0;//= CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY; // System Boot UP
|
|
|
+
|
|
|
+//===============================
|
|
|
+// OCPP auth variable
|
|
|
+//===============================
|
|
|
+static int authorizeRetryTimes = 0; //number of Retry times
|
|
|
+
|
|
|
+//===============================
|
|
|
+// OCPP other variables
|
|
|
+//===============================
|
|
|
+//int isUpdateRequest = FALSE;
|
|
|
+static int HeartBeatWaitTime = 10;
|
|
|
+static int FirstHeartBeat = 0;
|
|
|
+static int FirmwareStatusNotificationStatus = FIRMWARE_STATUS_IDLE; // Idle
|
|
|
+static int DiagnosticsStatusNotificationStatus = DIAGNOSTIC_STATUS_IDLE; // Idle
|
|
|
+static char CurrentChargingProfileScheduleStr[30] = {0};
|
|
|
+
|
|
|
+//========================================
|
|
|
+// OCPP status/previous related variables
|
|
|
+//========================================
|
|
|
+static int GunStatusInterval = 10;
|
|
|
+static int statusModeChage[CHAdeMO_QUANTITY+ CCS_QUANTITY + GB_QUANTITY + AC_QUANTITY] = {FALSE};
|
|
|
+static int ChademoPreviousSystemStatus[CHAdeMO_QUANTITY];
|
|
|
+static int CcsPreviousSystemStatus[CCS_QUANTITY];
|
|
|
+static int GbPreviousSystemStatus[GB_QUANTITY];
|
|
|
+static int AcPreviousSystemStatus[AC_QUANTITY];
|
|
|
+static int ChademoPreviousConnectorPlugIn[CHAdeMO_QUANTITY];
|
|
|
+static int CcsPreviousConnectorPlugIn[CCS_QUANTITY];
|
|
|
+static int GbPreviousConnectorPlugIn[GB_QUANTITY];
|
|
|
+static int AcPreviousConnectorPlugIn[AC_QUANTITY];
|
|
|
+static int TransactionMessageAttemptsValue = 0;
|
|
|
+static int TransactionMessageRetryIntervalValue = 0;
|
|
|
+static int TempMeterValueInterval = 0;
|
|
|
+static struct OCPPAuthLocalElemet
|
|
|
+{
|
|
|
+ int listVersionInt;
|
|
|
+ char idTagstr[20];
|
|
|
+ char parentIdTag[20];
|
|
|
+ char expiryDate[30];
|
|
|
+ char idTagstatus[16];
|
|
|
+}idTagQuery;
|
|
|
+
|
|
|
+//=============================================
|
|
|
+// OCPP HeartBeat Response Not Receive Counts
|
|
|
+//============================================
|
|
|
+static int HeartBeatWithNOResponse = 0;
|
|
|
+static int HeartBeatCountPerHour = 0;
|
|
|
+
|
|
|
+extern void ChageWebSocketPingInterval(int WebSocketPingInterval);
|
|
|
+extern int GetTransactionQueueNum(void);
|
|
|
+extern pthread_mutex_t mutex1;
|
|
|
+extern struct Charger_Info Charger;
|
|
|
+extern sqlite3 *db;
|
|
|
+
|
|
|
+int TransactionMessageAttemptsGet(void);
|
|
|
+int TransactionMessageRetryIntervalGet(void);
|
|
|
+int GetOcppConnStatus(void);
|
|
|
+void SetOcppConnStatus(uint8_t status);
|
|
|
+int setKeyValue(char *key, char *value);
|
|
|
+void OCPP_get_TableAuthlocalAllData(void);
|
|
|
+void processUnkownKey(void);
|
|
|
+
|
|
|
+struct StructOCPPMeterValue
|
|
|
+{
|
|
|
+ unsigned char TimeStamp[28];
|
|
|
+ struct StructSampledValue SampledValue[10];
|
|
|
+};
|
|
|
+
|
|
|
+struct ClientTime
|
|
|
+{
|
|
|
+ unsigned int Heartbeat;
|
|
|
+ unsigned int StatusNotification[CHAdeMO_QUANTITY+ CCS_QUANTITY + GB_QUANTITY + AC_QUANTITY];
|
|
|
+ unsigned int StartTransaction;
|
|
|
+ unsigned int StopTransaction;
|
|
|
+ unsigned int MeterValues[CHAdeMO_QUANTITY+ CCS_QUANTITY + GB_QUANTITY + AC_QUANTITY];
|
|
|
+
|
|
|
+}clientTime;
|
|
|
+
|
|
|
+typedef union
|
|
|
+{
|
|
|
+ //Operations Initiated by Central System
|
|
|
+ unsigned char CsMsgValue[CHAdeMO_QUANTITY+ CCS_QUANTITY + GB_QUANTITY + AC_QUANTITY];
|
|
|
+ struct
|
|
|
+ {
|
|
|
+ //CsMsgValue[0]
|
|
|
+ unsigned char StatusNotificationReq :1; //bit 0,
|
|
|
+ unsigned char StatusNotificationConf :1; //bit 0,
|
|
|
+ unsigned char :6; //bit 2~7
|
|
|
+ }bits[CHAdeMO_QUANTITY+ CCS_QUANTITY + GB_QUANTITY + AC_QUANTITY];
|
|
|
+}CpinitiateMsg;
|
|
|
+
|
|
|
+CpinitiateMsg cpinitateMsg;
|
|
|
+
|
|
|
+//==========================================
|
|
|
+// Init all Enumeration & Mapping String
|
|
|
+//==========================================
|
|
|
+/*ChargePointErrorCode*/
|
|
|
+typedef enum {
|
|
|
+ ConnectorLockFailure,
|
|
|
+ EVCommunicationError,
|
|
|
+ GroundFailure,
|
|
|
+ HighTemperature,
|
|
|
+ InternalError,
|
|
|
+ LocalListConflict,
|
|
|
+ NoError,
|
|
|
+ OtherError,
|
|
|
+ OverCurrentFailure,
|
|
|
+ OverVoltage,
|
|
|
+ PowerMeterFailure,
|
|
|
+ PowerSwitchFailure,
|
|
|
+ ReaderFailure,
|
|
|
+ ResetFailure,
|
|
|
+ UnderVoltage,
|
|
|
+ WeakSignal
|
|
|
+} ChargePointErrorCode;
|
|
|
+
|
|
|
+#if 0
|
|
|
+static char *ChargePointErrorCodeStr[] = {
|
|
|
+ MACROSTR(ConnectorLockFailure),
|
|
|
+ MACROSTR(EVCommunicationError),
|
|
|
+ MACROSTR(GroundFailure),
|
|
|
+ MACROSTR(HighTemperature),
|
|
|
+ MACROSTR(InternalError),
|
|
|
+ MACROSTR(LocalListConflict),
|
|
|
+ MACROSTR(NoError),
|
|
|
+ MACROSTR(OtherError),
|
|
|
+ MACROSTR(OverCurrentFailure),
|
|
|
+ MACROSTR(OverVoltage),
|
|
|
+ MACROSTR(PowerMeterFailure),
|
|
|
+ MACROSTR(PowerSwitchFailure),
|
|
|
+ MACROSTR(ReaderFailure),
|
|
|
+ MACROSTR(ResetFailure),
|
|
|
+ MACROSTR(UnderVoltage),
|
|
|
+ MACROSTR(WeakSignal)
|
|
|
+};
|
|
|
+#endif
|
|
|
+
|
|
|
+/*ChargePointStatus*/
|
|
|
+typedef enum {
|
|
|
+ Available =0,
|
|
|
+ Preparing,
|
|
|
+ Charging,
|
|
|
+ SuspendedEVSE,
|
|
|
+ SuspendedEV,
|
|
|
+ Finishing,
|
|
|
+ Reserved,
|
|
|
+ Unavailable,
|
|
|
+ Faulted
|
|
|
+} ChargePointStatus;
|
|
|
+
|
|
|
+static char * ChargePointStatusStr[] = {
|
|
|
+ MACROSTR(Available),
|
|
|
+ MACROSTR(Preparing),
|
|
|
+ MACROSTR(Charging),
|
|
|
+ MACROSTR(SuspendedEVSE),
|
|
|
+ MACROSTR(SuspendedEV),
|
|
|
+ MACROSTR(Finishing),
|
|
|
+ MACROSTR(Reserved),
|
|
|
+ MACROSTR(Unavailable),
|
|
|
+ MACROSTR(Faulted)
|
|
|
+};
|
|
|
+
|
|
|
+/*AvailabilityType*/
|
|
|
+typedef enum {
|
|
|
+ RegistrationStatus_Accepted,
|
|
|
+ RegistrationStatus_Pending,
|
|
|
+ RegistrationStatus_Rejected
|
|
|
+} RegistrationStatus;
|
|
|
+
|
|
|
+static char *RegistrationStatusStr[] = {
|
|
|
+ MACROSTR(Accepted),
|
|
|
+ MACROSTR(Pending),
|
|
|
+ MACROSTR(Rejected)
|
|
|
+};
|
|
|
+
|
|
|
+/*AvailabilityType*/
|
|
|
+typedef enum {
|
|
|
+ Inoperative,
|
|
|
+ Operative
|
|
|
+} AvailabilityType;
|
|
|
+
|
|
|
+static char *AvailabilityTypeStr[] = {
|
|
|
+ MACROSTR(Inoperative),
|
|
|
+ MACROSTR(Operative)
|
|
|
+};
|
|
|
+
|
|
|
+/*AvailabilityStatus*/
|
|
|
+typedef enum {
|
|
|
+ Accepted,
|
|
|
+ Rejected,
|
|
|
+ Scheduled
|
|
|
+} AvailabilityStatus;
|
|
|
+
|
|
|
+static char *AvailabilityStatusStr[] = {
|
|
|
+ MACROSTR(Accepted),
|
|
|
+ MACROSTR(Rejected),
|
|
|
+ MACROSTR(Scheduled)
|
|
|
+};
|
|
|
+
|
|
|
+/*ConfigurationStatus*/
|
|
|
+typedef enum {
|
|
|
+ ConfigurationStatus_Accepted,
|
|
|
+ ConfigurationStatus_Rejected,
|
|
|
+ RebootRequired,
|
|
|
+ NotSupported
|
|
|
+} ConfigurationStatus;
|
|
|
+
|
|
|
+static char *ConfigurationStatusStr[] = {
|
|
|
+ MACROSTR(Accepted),
|
|
|
+ MACROSTR(Rejected),
|
|
|
+ MACROSTR(RebootRequired),
|
|
|
+ MACROSTR(NotSupported)
|
|
|
+};
|
|
|
+
|
|
|
+/*ClearCacheStatus*/
|
|
|
+typedef enum {
|
|
|
+ ClearCacheStatus_Accepted,
|
|
|
+ ClearCacheStatus_Rejected
|
|
|
+} ClearCacheStatus;
|
|
|
+
|
|
|
+static char *ClearCacheStatusStr[] = {
|
|
|
+ MACROSTR(Accepted),
|
|
|
+ MACROSTR(Rejected)
|
|
|
+};
|
|
|
+
|
|
|
+/*ChargingProfilePurposeType*/
|
|
|
+typedef enum {
|
|
|
+ ChargePointMaxProfile,
|
|
|
+ TxDefaultProfile,
|
|
|
+ TxProfile
|
|
|
+} ChargingProfilePurposeType;
|
|
|
+
|
|
|
+static char *ChargingProfilePurposeTypeStr[] = {
|
|
|
+ MACROSTR(ChargePointMaxProfile),
|
|
|
+ MACROSTR(TxDefaultProfile),
|
|
|
+ MACROSTR(TxProfile)
|
|
|
+};
|
|
|
+
|
|
|
+/*ChargingProfileStatus*/
|
|
|
+typedef enum {
|
|
|
+ ChargingProfileStatus_Accepted,
|
|
|
+ ChargingProfileStatus_Rejected,
|
|
|
+ ChargingProfileStatus_NotSupported
|
|
|
+} ChargingProfileStatus;
|
|
|
+
|
|
|
+static char *ChargingProfileStatusStr[] = {
|
|
|
+ MACROSTR(Accepted),
|
|
|
+ MACROSTR(Rejected),
|
|
|
+ MACROSTR(NotSupported)
|
|
|
+};
|
|
|
+
|
|
|
+/*ClearChargingProfileStatus*/
|
|
|
+typedef enum {
|
|
|
+ ClearChargingProfileStatus_Accepted,
|
|
|
+ ClearChargingProfileStatus_Unknown
|
|
|
+} ClearChargingProfileStatus;
|
|
|
+
|
|
|
+static char *ClearChargingProfileStatusStr[] = {
|
|
|
+ MACROSTR(Accepted),
|
|
|
+ MACROSTR(Unknown)
|
|
|
+};
|
|
|
+
|
|
|
+/*GetCompositeScheduleStatus*/
|
|
|
+typedef enum {
|
|
|
+ GetCompositeScheduleStatus_Accepted,
|
|
|
+ GetCompositeScheduleStatus_Rejected
|
|
|
+} GetCompositeScheduleStatus;
|
|
|
+
|
|
|
+
|
|
|
+static char *GetCompositeScheduleStatusStr[] = {
|
|
|
+ MACROSTR(Accepted),
|
|
|
+ MACROSTR(Rejected)
|
|
|
+};
|
|
|
+
|
|
|
+/*ChargingRateUnitType*/
|
|
|
+typedef enum {
|
|
|
+ ChargingRateUnitType_W,
|
|
|
+ ChargingRateUnitType_A
|
|
|
+} ChargingRateUnitType;
|
|
|
+
|
|
|
+/*AuthorizationStatus*/
|
|
|
+typedef enum {
|
|
|
+ AuthorizationStatus_Accepted ,
|
|
|
+ AuthorizationStatus_Blocked ,
|
|
|
+ AuthorizationStatus_Expired ,
|
|
|
+ AuthorizationStatus_Invalid ,
|
|
|
+ AuthorizationStatus_ConcurrentTx
|
|
|
+} AuthorizationStatus;
|
|
|
+
|
|
|
+/*UpdateType*/
|
|
|
+typedef enum {
|
|
|
+ Differential ,
|
|
|
+ Full
|
|
|
+} UpdateType;
|
|
|
+
|
|
|
+static char *UpdateTypeStr[] = {
|
|
|
+ MACROSTR(Differential),
|
|
|
+ MACROSTR(Full)
|
|
|
+};
|
|
|
+
|
|
|
+/*UpdateStatus*/
|
|
|
+typedef enum {
|
|
|
+ UpdateStatus_Accepted ,
|
|
|
+ UpdateStatus_Failed ,
|
|
|
+ UpdateStatus_NotSupported ,
|
|
|
+ UpdateStatus_VersionMismatch
|
|
|
+} UpdateStatus;
|
|
|
+
|
|
|
+static char *UpdateStatusStr[] = {
|
|
|
+ MACROSTR(Accepted),
|
|
|
+ MACROSTR(Failed),
|
|
|
+ MACROSTR(NotSupported),
|
|
|
+ MACROSTR(VersionMismatch)
|
|
|
+};
|
|
|
+
|
|
|
+/*RemoteStartStopStatus*/
|
|
|
+typedef enum {
|
|
|
+ RemoteStartStopStatus_Accepted,
|
|
|
+ RemoteStartStopStatus_Rejected
|
|
|
+
|
|
|
+} RemoteStartStopStatus;
|
|
|
+
|
|
|
+
|
|
|
+static char *RemoteStartStopStatusStr[] = {
|
|
|
+ MACROSTR(Accepted),
|
|
|
+ MACROSTR(Rejected)
|
|
|
+
|
|
|
+};
|
|
|
+
|
|
|
+/*ReservationStatus*/
|
|
|
+typedef enum {
|
|
|
+ ReservationStatus_Accepted,
|
|
|
+ ReservationStatus_Faulted,
|
|
|
+ ReservationStatus_Occupied,
|
|
|
+ ReservationStatus_Rejected,
|
|
|
+ ReservationStatus_Unavailable
|
|
|
+
|
|
|
+} ReservationStatus;
|
|
|
+
|
|
|
+static char *ReservationStatusStr[] = {
|
|
|
+ MACROSTR(Accepted),
|
|
|
+ MACROSTR(Faulted),
|
|
|
+ MACROSTR(Occupied),
|
|
|
+ MACROSTR(Rejected),
|
|
|
+ MACROSTR(Unavailable)
|
|
|
+};
|
|
|
+
|
|
|
+/*ResetType*/
|
|
|
+typedef enum {
|
|
|
+ Hard,
|
|
|
+ Soft
|
|
|
+} ResetType;
|
|
|
+
|
|
|
+
|
|
|
+static char *ResetTypeStr[] = {
|
|
|
+ MACROSTR(Hard),
|
|
|
+ MACROSTR(Soft)
|
|
|
+};
|
|
|
+
|
|
|
+
|
|
|
+/*ResetStatus*/
|
|
|
+typedef enum {
|
|
|
+ ResetStatus_Accepted,
|
|
|
+ ResetStatus_Rejected
|
|
|
+} ResetStatus;
|
|
|
+
|
|
|
+
|
|
|
+static char *ResetStatusStr[] = {
|
|
|
+ MACROSTR(Accepted),
|
|
|
+ MACROSTR(Rejected)
|
|
|
+};
|
|
|
+
|
|
|
+/*DiagnosticsStatus*/
|
|
|
+typedef enum {
|
|
|
+ DiagnosticsStatus_Idle,
|
|
|
+ DiagnosticsStatus_Uploaded,
|
|
|
+ DiagnosticsStatus_UploadFailed,
|
|
|
+ DiagnosticsStatus_Uploading
|
|
|
+} DiagnosticsStatus;
|
|
|
+
|
|
|
+
|
|
|
+static char * DiagnosticsStatusStr[] = {
|
|
|
+ MACROSTR(Idle),
|
|
|
+ MACROSTR(Uploaded),
|
|
|
+ MACROSTR(UploadFailed),
|
|
|
+ MACROSTR(Uploading)
|
|
|
+};
|
|
|
+
|
|
|
+/*FirmwareStatus*/
|
|
|
+typedef enum {
|
|
|
+ FirmwareStatus_Downloaded,
|
|
|
+ FirmwareStatus_DownloadFailed,
|
|
|
+ FirmwareStatus_Downloading,
|
|
|
+ FirmwareStatus_Idle,
|
|
|
+ FirmwareStatus_InstallationFailed,
|
|
|
+ FirmwareStatus_Installing,
|
|
|
+ FirmwareStatus_Installed
|
|
|
+} FirmwareStatus;
|
|
|
+
|
|
|
+
|
|
|
+static char * FirmwareStatusStr[] = {
|
|
|
+ MACROSTR(Downloaded),
|
|
|
+ MACROSTR(DownloadFailed),
|
|
|
+ MACROSTR(Downloading),
|
|
|
+ MACROSTR(Idle),
|
|
|
+ MACROSTR(InstallationFailed),
|
|
|
+ MACROSTR(Installing),
|
|
|
+ MACROSTR(Installed)
|
|
|
+};
|
|
|
+
|
|
|
+
|
|
|
+/*MessageTrigger*/
|
|
|
+typedef enum {
|
|
|
+ BootNotification,
|
|
|
+ DiagnosticsStatusNotification,
|
|
|
+ FirmwareStatusNotification,
|
|
|
+ Heartbeat,
|
|
|
+ MeterValues,
|
|
|
+ StatusNotification
|
|
|
+} MessageTrigger;
|
|
|
+
|
|
|
+
|
|
|
+static char * MessageTriggerStr[] = {
|
|
|
+ MACROSTR(BootNotification),
|
|
|
+ MACROSTR(DiagnosticsStatusNotification),
|
|
|
+ MACROSTR(FirmwareStatusNotification),
|
|
|
+ MACROSTR(Heartbeat),
|
|
|
+ MACROSTR(MeterValues),
|
|
|
+ MACROSTR(StatusNotification)
|
|
|
+};
|
|
|
+
|
|
|
+
|
|
|
+/*TriggerMessageStatus*/
|
|
|
+typedef enum {
|
|
|
+ TriggerMessageStatus_Accepted ,
|
|
|
+ TriggerMessageStatus_Rejected ,
|
|
|
+ TriggerMessageStatus_NotImplemented
|
|
|
+} TriggerMessageStatus;
|
|
|
+
|
|
|
+
|
|
|
+static char * TriggerMessageStatusStr[] = {
|
|
|
+ MACROSTR(Accepted),
|
|
|
+ MACROSTR(Rejected),
|
|
|
+ MACROSTR(NotImplemented)
|
|
|
+};
|
|
|
+
|
|
|
+
|
|
|
+/*UnlockStatus*/
|
|
|
+typedef enum {
|
|
|
+ Unlocked,
|
|
|
+ UnlockFailed,
|
|
|
+ UnlockStatus_NotSupported
|
|
|
+} UnlockStatus;
|
|
|
+
|
|
|
+
|
|
|
+static char * UnlockStatusStr[] = {
|
|
|
+ MACROSTR(Unlocked),
|
|
|
+ MACROSTR(UnlockFailed),
|
|
|
+ MACROSTR(NotSupported)
|
|
|
+};
|
|
|
+
|
|
|
+/*StopTransactionReason*/
|
|
|
+typedef enum {
|
|
|
+ EmergencyStop,
|
|
|
+ EVDisconnected,
|
|
|
+ HardReset,
|
|
|
+ Local,
|
|
|
+ Other,
|
|
|
+ PowerLoss,
|
|
|
+ Reboot,
|
|
|
+ Remote,
|
|
|
+ SoftReset,
|
|
|
+ UnlockCommand,
|
|
|
+ DeAuthorized
|
|
|
+} StopTransactionReason;
|
|
|
+
|
|
|
+#if 0
|
|
|
+static char * StopTransactionReasonStr[] = {
|
|
|
+ MACROSTR(EmergencyStop),
|
|
|
+ MACROSTR(EVDisconnected),
|
|
|
+ MACROSTR(HardReset),
|
|
|
+ MACROSTR(Local),
|
|
|
+ MACROSTR(Other),
|
|
|
+ MACROSTR(PowerLoss),
|
|
|
+ MACROSTR(Reboot),
|
|
|
+ MACROSTR(Remote),
|
|
|
+ MACROSTR(SoftReset),
|
|
|
+ MACROSTR(UnlockCommand),
|
|
|
+ MACROSTR(DeAuthorized)
|
|
|
+};
|
|
|
+#endif
|
|
|
+
|
|
|
+/*CancelReservationStatus*/
|
|
|
+typedef enum {
|
|
|
+ CancelReservationStatus_Accepted,
|
|
|
+ CancelReservationStatus_Rejected
|
|
|
+} CancelReservationStatus;
|
|
|
+
|
|
|
+static char * CancelReservationStatusStr[] = {
|
|
|
+ MACROSTR(Accepted),
|
|
|
+ MACROSTR(Rejected)
|
|
|
+};
|
|
|
+
|
|
|
+/*ReadingContext*/
|
|
|
+typedef enum {
|
|
|
+ ReadingContext_Interruption_Begin,
|
|
|
+ ReadingContext_Interruption_End,
|
|
|
+ ReadingContext_Other,
|
|
|
+ ReadingContext_Sample_Clock,
|
|
|
+ ReadingContext_Sample_Periodic ,
|
|
|
+ ReadingContext_Transaction_Begin ,
|
|
|
+ ReadingContext_Transaction_End,
|
|
|
+ ReadingContext_Trigger
|
|
|
+} ReadingContext;
|
|
|
+
|
|
|
+
|
|
|
+static char * ReadingContextStr[] = {
|
|
|
+ MACROSTR(Interruption.Begin),
|
|
|
+ MACROSTR(Interruption.End),
|
|
|
+ MACROSTR(Other),
|
|
|
+ MACROSTR(Sample.Clock),
|
|
|
+ MACROSTR(Sample.Periodic),
|
|
|
+ MACROSTR(Transaction.Begin),
|
|
|
+ MACROSTR(Transaction.End),
|
|
|
+ MACROSTR(Trigger)
|
|
|
+};
|
|
|
+
|
|
|
+
|
|
|
+/*ValueFormat*/
|
|
|
+typedef enum {
|
|
|
+ Raw,
|
|
|
+ SignedData
|
|
|
+} ValueFormat;
|
|
|
+
|
|
|
+
|
|
|
+static char * ValueFormatStr[] = {
|
|
|
+ MACROSTR(Raw),
|
|
|
+ MACROSTR(SignedData)
|
|
|
+};
|
|
|
+
|
|
|
+/*Measurand*/
|
|
|
+typedef enum {
|
|
|
+ Current_Export ,
|
|
|
+ Current_Import,
|
|
|
+ Current_Offered,
|
|
|
+ Energy_Active_Export_Register,
|
|
|
+ Energy_Active_Import_Register,
|
|
|
+ Energy_Reactive_Export_Register,
|
|
|
+ Energy_Reactive_Import_Register,
|
|
|
+ Energy_Active_Export_Interval,
|
|
|
+ Energy_Active_Import_Interval,
|
|
|
+ Energy_Reactive_Export_Interval,
|
|
|
+ Energy_Reactive_Import_Interval,
|
|
|
+ Frequency,
|
|
|
+ Power_Active_Export ,
|
|
|
+ Power_Active_Import,
|
|
|
+ Power_Factor,
|
|
|
+ Power_Offered,
|
|
|
+ Power_Reactive_Export,
|
|
|
+ Power_Reactive_Import,
|
|
|
+ RPM,
|
|
|
+ SoC,
|
|
|
+ Temperature ,
|
|
|
+ Voltage
|
|
|
+} Measurand;
|
|
|
+
|
|
|
+
|
|
|
+static char * MeasurandStr[] = {
|
|
|
+ MACROSTR(Current.Export),
|
|
|
+ MACROSTR(Current.Import),
|
|
|
+ MACROSTR(Current.Offered),
|
|
|
+ MACROSTR(Energy.Active.Export.Register),
|
|
|
+ MACROSTR(Energy.Active.Import.Register),
|
|
|
+ MACROSTR(Energy.Reactive.Export.Register),
|
|
|
+ MACROSTR(Energy.Reactive.Import.Register),
|
|
|
+ MACROSTR(Energy.Active.Export.Interval),
|
|
|
+ MACROSTR(Energy.Active.Import.Interval),
|
|
|
+ MACROSTR(Energy.Reactive.Export.Interval),
|
|
|
+ MACROSTR(Energy.Reactive.Import.Interval),
|
|
|
+ MACROSTR(Frequency),
|
|
|
+ MACROSTR(Power.Active.Export),
|
|
|
+ MACROSTR(Power.Active.Import),
|
|
|
+ MACROSTR(Power.Factor),
|
|
|
+ MACROSTR(Power.Offered),
|
|
|
+ MACROSTR(Power.Reactive.ExportMACROSTR),
|
|
|
+ MACROSTR(Power.Reactive.Import),
|
|
|
+ MACROSTR(RPM),
|
|
|
+ MACROSTR(SoC),
|
|
|
+ MACROSTR(Temperature),
|
|
|
+ MACROSTR(Voltage)
|
|
|
+};
|
|
|
+
|
|
|
+
|
|
|
+/*Location*/
|
|
|
+typedef enum {
|
|
|
+ Location_Body,
|
|
|
+ Location_Cable,
|
|
|
+ Location_EV,
|
|
|
+ Location_Inlet ,
|
|
|
+ Location_Outlet
|
|
|
+} Location;
|
|
|
+
|
|
|
+
|
|
|
+static char * LocationStr[] = {
|
|
|
+ MACROSTR(Body),
|
|
|
+ MACROSTR(Cable),
|
|
|
+ MACROSTR(EV),
|
|
|
+ MACROSTR(Inlet),
|
|
|
+ MACROSTR(Outlet)
|
|
|
+};
|
|
|
+
|
|
|
+
|
|
|
+/*Phase*/
|
|
|
+typedef enum {
|
|
|
+ L1,
|
|
|
+ L2,
|
|
|
+ L3,
|
|
|
+ N,
|
|
|
+ L1_N,
|
|
|
+ L2_N,
|
|
|
+ L3_N,
|
|
|
+ L1_L2,
|
|
|
+ L2_L3,
|
|
|
+ L3_L1
|
|
|
+} Phase;
|
|
|
+
|
|
|
+
|
|
|
+static char * PhaseStr[] = {
|
|
|
+ MACROSTR(L1),
|
|
|
+ MACROSTR(L2),
|
|
|
+ MACROSTR(L3),
|
|
|
+ MACROSTR(N),
|
|
|
+ MACROSTR(L1-N),
|
|
|
+ MACROSTR(L2-N),
|
|
|
+ MACROSTR(L3-N),
|
|
|
+ MACROSTR(L1-L2),
|
|
|
+ MACROSTR(L2-L3),
|
|
|
+ MACROSTR(L3-L1)
|
|
|
+};
|
|
|
+
|
|
|
+
|
|
|
+/*UnitOfMeasure*/
|
|
|
+typedef enum {
|
|
|
+ UnitOfMeasure_Wh,
|
|
|
+ UnitOfMeasure_kWh ,
|
|
|
+ UnitOfMeasure_varh ,
|
|
|
+ UnitOfMeasure_kvarh ,
|
|
|
+ UnitOfMeasure_W ,
|
|
|
+ UnitOfMeasure_kW ,
|
|
|
+ UnitOfMeasure_VA ,
|
|
|
+ UnitOfMeasure_kVA ,
|
|
|
+ UnitOfMeasure_var ,
|
|
|
+ UnitOfMeasure_kvar ,
|
|
|
+ UnitOfMeasure_A ,
|
|
|
+ UnitOfMeasure_V ,
|
|
|
+ UnitOfMeasure_Celsius ,
|
|
|
+ UnitOfMeasure_Fahrenheit ,
|
|
|
+ UnitOfMeasure_K ,
|
|
|
+ UnitOfMeasure_Percent
|
|
|
+
|
|
|
+} UnitOfMeasure;
|
|
|
+
|
|
|
+
|
|
|
+static char * UnitOfMeasureStr[] = {
|
|
|
+ MACROSTR(Wh),
|
|
|
+ MACROSTR(kWh),
|
|
|
+ MACROSTR(varh),
|
|
|
+ MACROSTR(kvarh),
|
|
|
+ MACROSTR(W),
|
|
|
+ MACROSTR(kW),
|
|
|
+ MACROSTR(VA),
|
|
|
+ MACROSTR(kVA),
|
|
|
+ MACROSTR(var),
|
|
|
+ MACROSTR(kvar),
|
|
|
+ MACROSTR(A),
|
|
|
+ MACROSTR(V),
|
|
|
+ MACROSTR(Celsius),
|
|
|
+ MACROSTR(Fahrenheit),
|
|
|
+ MACROSTR(K),
|
|
|
+ MACROSTR(Percent)
|
|
|
+};
|
|
|
+
|
|
|
+enum LocalAuthListManagementProfile{
|
|
|
+ LocalAuthListEnabled=0,
|
|
|
+ LocalAuthListMaxLength,
|
|
|
+ SendLocalListMaxLength,
|
|
|
+ _LocalAuthListManagementProfile_CNT
|
|
|
+};
|
|
|
+
|
|
|
+enum ReservationProfile{
|
|
|
+ ReserveConnectorZeroSupported
|
|
|
+};
|
|
|
+
|
|
|
+enum SmartChargingProfile{
|
|
|
+ ChargeProfileMaxStackLevel,
|
|
|
+ ChargingScheduleAllowedChargingRateUnit,
|
|
|
+ ChargingScheduleMaxPeriods,
|
|
|
+ ConnectorSwitch3to1PhaseSupported,
|
|
|
+ MaxChargingProfilesInstalled
|
|
|
+};
|
|
|
+
|
|
|
+enum ChargerSystemStatus{
|
|
|
+ ChargerSystemStatus_Booting,
|
|
|
+ ChargerSystemStatus_Idle,
|
|
|
+ ChargerSystemStatus_Authorizing,
|
|
|
+ ChargerSystemStatus_Preparing,
|
|
|
+ ChargerSystemStatus_Charging,
|
|
|
+ ChargerSystemStatus_Terminating,
|
|
|
+ ChargerSystemStatus_Alarm,
|
|
|
+ ChargerSystemStatus_Fault
|
|
|
+};
|
|
|
+
|
|
|
+enum GetConfigurationKey {
|
|
|
+ GetConfiguration_AllowOfflineTxForUnknownId=0,
|
|
|
+ GetConfiguration_AuthorizationCacheEnabled,
|
|
|
+ GetConfiguration_AuthorizeRemoteTxRequests,
|
|
|
+ GetConfiguration_BlinkRepeat,
|
|
|
+ GetConfiguration_ClockAlignedDataInterval,
|
|
|
+ GetConfiguration_ConnectionTimeOut,
|
|
|
+ GetConfiguration_GetConfigurationMaxKeys,
|
|
|
+ GetConfiguration_HeartbeatInterval,
|
|
|
+ GetConfiguration_LightIntensity,
|
|
|
+ GetConfiguration_LocalAuthorizeOffline,
|
|
|
+ GetConfiguration_LocalPreAuthorize,
|
|
|
+ GetConfiguration_MaxEnergyOnInvalidId,
|
|
|
+ GetConfiguration_MeterValuesAlignedData,
|
|
|
+ GetConfiguration_MeterValuesAlignedDataMaxLength,
|
|
|
+ GetConfiguration_MeterValuesSampledData,
|
|
|
+ GetConfiguration_MeterValuesSampledDataMaxLength,
|
|
|
+ GetConfiguration_MeterValueSampleInterval,
|
|
|
+ GetConfiguration_MinimumStatusDuration,
|
|
|
+ GetConfiguration_NumberOfConnectors,
|
|
|
+ GetConfiguration_ResetRetries,
|
|
|
+ GetConfiguration_ConnectorPhaseRotation,
|
|
|
+ GetConfiguration_ConnectorPhaseRotationMaxLength,
|
|
|
+ GetConfiguration_StopTransactionOnEVSideDisconnect,
|
|
|
+ GetConfiguration_StopTransactionOnInvalidId,
|
|
|
+ GetConfiguration_StopTxnAlignedData,
|
|
|
+ GetConfiguration_StopTxnAlignedDataMaxLength,
|
|
|
+ GetConfiguration_StopTxnSampledData,
|
|
|
+ GetConfiguration_StopTxnSampledDataMaxLength,
|
|
|
+ GetConfiguration_SupportedFeatureProfiles,
|
|
|
+ GetConfiguration_SupportedFeatureProfilesMaxLength,
|
|
|
+ GetConfiguration_TransactionMessageAttempts,
|
|
|
+ GetConfiguration_TransactionMessageRetryInterval,
|
|
|
+ GetConfiguration_UnlockConnectorOnEVSideDisconnect,
|
|
|
+ GetConfiguration_WebSocketPingInterval,
|
|
|
+ GetConfiguration_LocalAuthListEnabled,
|
|
|
+ GetConfiguration_LocalAuthListMaxLength,
|
|
|
+ GetConfiguration_SendLocalListMaxLength,
|
|
|
+ GetConfiguration_ReserveConnectorZeroSupported,
|
|
|
+ GetConfiguration_ChargeProfileMaxStackLevel,
|
|
|
+ GetConfiguration_ChargingScheduleAllowedChargingRateUnit,
|
|
|
+ GetConfiguration_ChargingScheduleMaxPeriods,
|
|
|
+ GetConfiguration_ConnectorSwitch3to1PhaseSupported,
|
|
|
+ GetConfiguration_MaxChargingProfilesInstalled,
|
|
|
+};
|
|
|
+
|
|
|
+//GetConfiguration Array
|
|
|
+struct StructConfigurationKeyItems staticKeyArray[GetConfigurationMaxKeysNUM]={0};
|
|
|
+struct StructConfigurationKey staticResponseConfigurationKeyArray[GetConfigurationMaxKeysNUM]={0};
|
|
|
+struct StructConfigurationKeyItems staticResponseUnknownKey[10]={0};
|
|
|
+struct StructLocalAuthorizationList staticLocalAuthorizationList[500]={0};
|
|
|
+
|
|
|
+
|
|
|
+//==========================================
|
|
|
+// GetCompositeSchedule logic related function
|
|
|
+//==========================================
|
|
|
+int DiffTimebSec(struct timeb ST, struct timeb ET)
|
|
|
+{
|
|
|
+ //return milli-second
|
|
|
+ unsigned int StartTime,StopTime;
|
|
|
+
|
|
|
+ StartTime=(unsigned int)ST.time;
|
|
|
+ StopTime=(unsigned int)ET.time;
|
|
|
+ return (StopTime-StartTime);
|
|
|
+}
|
|
|
+
|
|
|
+int DiffTimebWithNowSec(struct timeb ST)
|
|
|
+{
|
|
|
+ //return milli-second
|
|
|
+ struct timeb ET;
|
|
|
+ unsigned int StartTime,StopTime;
|
|
|
+
|
|
|
+ ftime(&ET);
|
|
|
+ StartTime=(unsigned int)ST.time;
|
|
|
+ StopTime=(unsigned int)ET.time;
|
|
|
+ return (StopTime-StartTime);
|
|
|
+}
|
|
|
+
|
|
|
+int getStartStop(uint8_t *start, uint8_t *stop)
|
|
|
+{
|
|
|
+ int result = -1;
|
|
|
+ struct tm tmStart;
|
|
|
+ struct timeb tbStart;
|
|
|
+ struct tm tmStop;
|
|
|
+ struct timeb tbStop;
|
|
|
+
|
|
|
+
|
|
|
+ if((sscanf((char*)start, "%4d-%2d-%2dT%2d:%2d:%2d", &tmStart.tm_year, &tmStart.tm_mon, &tmStart.tm_mday, &tmStart.tm_hour, &tmStart.tm_min, &tmStart.tm_sec) == 6) &&
|
|
|
+ (sscanf((char*)stop, "%4d-%2d-%2dT%2d:%2d:%2d", &tmStop.tm_year, &tmStop.tm_mon, &tmStop.tm_mday, &tmStop.tm_hour, &tmStop.tm_min, &tmStop.tm_sec) == 6))
|
|
|
+ {
|
|
|
+ tmStart.tm_year -= 1900;
|
|
|
+ tmStart.tm_mon -= 1;
|
|
|
+ tbStart.time = mktime(&tmStart);
|
|
|
+ tbStart.millitm = 0;
|
|
|
+
|
|
|
+ tmStop.tm_year -= 1900;
|
|
|
+ tmStop.tm_mon -= 1;
|
|
|
+ tbStop.time = mktime(&tmStop);
|
|
|
+ tbStop.millitm = 0;
|
|
|
+
|
|
|
+ result = DiffTimebSec(tbStart, tbStop);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ DEBUG_WARN("Start or stop date parsing error.\r\n");
|
|
|
+ }
|
|
|
+
|
|
|
+ return result;
|
|
|
+}
|
|
|
+
|
|
|
+int getStartSinceToday(uint8_t *stop)
|
|
|
+{
|
|
|
+ int result = -1;
|
|
|
+ time_t t;
|
|
|
+ struct tm *tmStartToday;
|
|
|
+ struct timeb tbStartToday;
|
|
|
+ struct tm tmStop;
|
|
|
+ struct timeb tbStop;
|
|
|
+
|
|
|
+ if((sscanf((char*)stop, "%4d-%2d-%2dT%2d:%2d:%2d", &tmStop.tm_year, &tmStop.tm_mon, &tmStop.tm_mday, &tmStop.tm_hour, &tmStop.tm_min, &tmStop.tm_sec) == 6))
|
|
|
+ {
|
|
|
+ t=time(NULL);
|
|
|
+ tmStartToday=localtime(&t);
|
|
|
+ tmStartToday->tm_hour = 0;
|
|
|
+ tmStartToday->tm_min = 0;
|
|
|
+ tmStartToday->tm_sec = 0;
|
|
|
+ tbStartToday.time = mktime(tmStartToday);
|
|
|
+
|
|
|
+ tmStop.tm_year -= 1900;
|
|
|
+ tmStop.tm_mon -= 1;
|
|
|
+ tbStop.time = mktime(&tmStop);
|
|
|
+ tbStop.millitm = 0;
|
|
|
+
|
|
|
+ result = DiffTimebSec(tbStartToday, tbStop);
|
|
|
+ }
|
|
|
+
|
|
|
+ return result;
|
|
|
+}
|
|
|
+
|
|
|
+int getStartSinceWeek(uint8_t *stop)
|
|
|
+{
|
|
|
+ int result = -1;
|
|
|
+ time_t t;
|
|
|
+ struct tm *tmStartWeek;
|
|
|
+ struct timeb tbStartWeek;
|
|
|
+ struct tm tmStop;
|
|
|
+ struct timeb tbStop;
|
|
|
+
|
|
|
+ if((sscanf((char*)stop, "%4d-%2d-%2dT%2d:%2d:%2d", &tmStop.tm_year, &tmStop.tm_mon, &tmStop.tm_mday, &tmStop.tm_hour, &tmStop.tm_min, &tmStop.tm_sec) == 6))
|
|
|
+ {
|
|
|
+ t=time(NULL);
|
|
|
+ tmStartWeek=localtime(&t);
|
|
|
+ t-=86400*tmStartWeek->tm_wday;
|
|
|
+ tmStartWeek=localtime(&t);
|
|
|
+
|
|
|
+ tmStartWeek->tm_hour = 0;
|
|
|
+ tmStartWeek->tm_min = 0;
|
|
|
+ tmStartWeek->tm_sec = 0;
|
|
|
+ tbStartWeek.time = mktime(tmStartWeek);
|
|
|
+
|
|
|
+ tmStop.tm_year -= 1900;
|
|
|
+ tmStop.tm_mon -= 1;
|
|
|
+ tbStop.time = mktime(&tmStop);
|
|
|
+ tbStop.millitm = 0;
|
|
|
+
|
|
|
+ result = DiffTimebSec(tbStartWeek, tbStop);
|
|
|
+ }
|
|
|
+
|
|
|
+ return result;
|
|
|
+}
|
|
|
+
|
|
|
+void checkCompositeSchedule(uint8_t connectorId, uint32_t durationReq, struct StructChargingProfile *compositeProfile)
|
|
|
+{
|
|
|
+ FILE *fp;
|
|
|
+ char profileFileName[128];
|
|
|
+ char *line = NULL;
|
|
|
+ size_t len = 0;
|
|
|
+ time_t CurrentTime;
|
|
|
+ struct tm *tmComposite;
|
|
|
+
|
|
|
+ struct StructChargingProfile maxProfile;
|
|
|
+ struct StructChargingProfile defaultTxProfile;
|
|
|
+ struct StructChargingProfile txProfile;
|
|
|
+
|
|
|
+ struct StructChargingSchedulePeriod tmpPeriod;
|
|
|
+ uint8_t limitMax=0;
|
|
|
+ uint8_t limitDef=0;
|
|
|
+ uint8_t limitTx=0;
|
|
|
+
|
|
|
+ int compositePeriodIdx = 0;
|
|
|
+
|
|
|
+ CurrentTime = time(NULL);
|
|
|
+ tmComposite=localtime(&CurrentTime);
|
|
|
+ sprintf((char*)compositeProfile->ChargingSchedule.StartSchedule, "%04d-%02d-%02dT%02d:%02d:%02dZ", tmComposite->tm_year+1900, tmComposite->tm_mon+1, tmComposite->tm_mday, tmComposite->tm_hour, tmComposite->tm_min, tmComposite->tm_sec);
|
|
|
+ sprintf((char*)compositeProfile->ChargingSchedule.ChargingRateUnit, "A");
|
|
|
+ compositeProfile->ChargingSchedule.Duration = durationReq;
|
|
|
+ for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(compositeProfile->ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
|
|
|
+ {
|
|
|
+ compositeProfile->ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod = -1;
|
|
|
+ compositeProfile->ChargingSchedule.ChargingSchedulePeriod[idxPeriod].Limit = -1;
|
|
|
+ compositeProfile->ChargingSchedule.ChargingSchedulePeriod[idxPeriod].NumberPhases = 3;
|
|
|
+ }
|
|
|
+ compositeProfile->ChargingProfileId = 1;
|
|
|
+ compositeProfile->StackLevel = 99 ;
|
|
|
+ sprintf((char*)compositeProfile->ChargingProfileKind ,"Absolute");
|
|
|
+
|
|
|
+ maxProfile.ChargingProfileId = -1;
|
|
|
+ defaultTxProfile.ChargingProfileId = -1;
|
|
|
+ txProfile.ChargingProfileId = -1;
|
|
|
+
|
|
|
+ system("yes|rm /tmp/*.json");
|
|
|
+ system("cp /Storage/OCPP/*.json /tmp");
|
|
|
+ /*
|
|
|
+ * Search valid charging profile
|
|
|
+ */
|
|
|
+ //DEBUG_INFO("====================================\n");
|
|
|
+ // Search max profile
|
|
|
+ sprintf(profileFileName, "/tmp/ChargePointMaxProfile.json");
|
|
|
+ if((access(profileFileName, F_OK))!=-1)
|
|
|
+ {
|
|
|
+ fp = fopen(profileFileName, "r");
|
|
|
+
|
|
|
+ for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(maxProfile.ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
|
|
|
+ {
|
|
|
+ maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod = -1;
|
|
|
+ maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].Limit = -1;
|
|
|
+ maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].NumberPhases = 3;
|
|
|
+ }
|
|
|
+ maxProfile.ChargingProfileId = -1;
|
|
|
+ maxProfile.StackLevel = -1;
|
|
|
+
|
|
|
+ while(getline(&line, &len, fp) != -1)
|
|
|
+ {
|
|
|
+ json_object *obj = NULL;
|
|
|
+
|
|
|
+ obj = json_tokener_parse(line);
|
|
|
+ if(is_error(obj))
|
|
|
+ {
|
|
|
+ DEBUG_ERROR("Parse MaxProfile from file error.\n");
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if((json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "ChargingProfileId")) != maxProfile.ChargingProfileId) &&
|
|
|
+ (json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "stackLevel")) >= maxProfile.StackLevel)
|
|
|
+ )
|
|
|
+ {
|
|
|
+ if((json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validFrom") != NULL) &&
|
|
|
+ (json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validTo") != NULL)
|
|
|
+ )
|
|
|
+ {
|
|
|
+ struct tm tmFrom, tmTo;
|
|
|
+ struct timeb tbFrom, tbTo;
|
|
|
+
|
|
|
+ if((sscanf((char*)json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validFrom")), "%4d-%2d-%2dT%2d:%2d:%2d", &tmFrom.tm_year, &tmFrom.tm_mon, &tmFrom.tm_mday, &tmFrom.tm_hour, &tmFrom.tm_min, &tmFrom.tm_sec) == 6) &&
|
|
|
+ (sscanf((char*)json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validTo")), "%4d-%2d-%2dT%2d:%2d:%2d", &tmTo.tm_year, &tmTo.tm_mon, &tmTo.tm_mday, &tmTo.tm_hour, &tmTo.tm_min, &tmTo.tm_sec) == 6))
|
|
|
+ {
|
|
|
+ tmFrom.tm_year -= 1900;
|
|
|
+ tmFrom.tm_mon -= 1;
|
|
|
+ tbFrom.time = mktime(&tmFrom);
|
|
|
+
|
|
|
+ tmTo.tm_year -= 1900;
|
|
|
+ tmTo.tm_mon -= 1;
|
|
|
+ tbTo.time = mktime(&tmTo);
|
|
|
+
|
|
|
+ if((DiffTimebWithNowSec(tbFrom)>=0) && (DiffTimebWithNowSec(tbTo)<=0))
|
|
|
+ {
|
|
|
+ if(maxProfile.ChargingProfileId == -1)
|
|
|
+ DEBUG_INFO("MaxProfile found.\n");
|
|
|
+ else
|
|
|
+ DEBUG_INFO("MaxProfile updated.\n");
|
|
|
+
|
|
|
+ // Required item
|
|
|
+ maxProfile.ChargingProfileId = json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingProfileId"));
|
|
|
+ maxProfile.StackLevel = json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "stackLevel"));
|
|
|
+ sprintf((char*)maxProfile.ChargingProfileKind, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingProfileKind")));
|
|
|
+ sprintf((char*)maxProfile.ChargingSchedule.ChargingRateUnit, "A");
|
|
|
+
|
|
|
+ for(int idxPeriod=0;idxPeriod<json_object_array_length(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"));idxPeriod++)
|
|
|
+ {
|
|
|
+ maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod = json_object_get_int(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "startPeriod"));
|
|
|
+ maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].Limit = (strstr(json_object_get_string(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingRateUnit")),"W")!=NULL?json_object_get_double(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "limit"))/220:json_object_get_double(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "limit")));
|
|
|
+ maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].NumberPhases = (json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "numberPhases")==NULL?
|
|
|
+ 3:
|
|
|
+ json_object_get_int(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "numberPhases")));
|
|
|
+ }
|
|
|
+
|
|
|
+ // Optional item
|
|
|
+ if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validFrom") != NULL)
|
|
|
+ {
|
|
|
+ sprintf((char*)maxProfile.ValidFrom, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validFrom")));
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ sprintf((char*)maxProfile.ValidFrom, " ");
|
|
|
+ }
|
|
|
+
|
|
|
+ if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validTo") != NULL)
|
|
|
+ {
|
|
|
+ sprintf((char*)maxProfile.ValidTo, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validTo")));
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ sprintf((char*)maxProfile.ValidTo, " ");
|
|
|
+ }
|
|
|
+
|
|
|
+ if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "RecurrencyKind") != NULL)
|
|
|
+ {
|
|
|
+ sprintf((char*)maxProfile.RecurrencyKind, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "RecurrencyKind")));
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ sprintf((char*)maxProfile.RecurrencyKind, " ");
|
|
|
+ }
|
|
|
+
|
|
|
+ if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "transactionId") != NULL)
|
|
|
+ {
|
|
|
+ maxProfile.TransactionId = json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "transactionId"));
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ maxProfile.TransactionId = -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "duration") != NULL)
|
|
|
+ {
|
|
|
+ maxProfile.ChargingSchedule.Duration = json_object_get_int(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "duration"));
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ maxProfile.ChargingSchedule.Duration = -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "startSchedule") != NULL)
|
|
|
+ {
|
|
|
+ sprintf((char*)maxProfile.ChargingSchedule.StartSchedule, "%s", json_object_get_string(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "startSchedule")));
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ sprintf((char*)maxProfile.ChargingSchedule.StartSchedule, " ");
|
|
|
+ }
|
|
|
+
|
|
|
+ if(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "minChargingRate") != NULL)
|
|
|
+ {
|
|
|
+ maxProfile.ChargingSchedule.MinChargingRate = json_object_get_double(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "minChargingRate"));
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ maxProfile.ChargingSchedule.MinChargingRate = -1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if(maxProfile.ChargingProfileId == -1)
|
|
|
+ DEBUG_INFO("MaxProfile found.\n");
|
|
|
+ else
|
|
|
+ DEBUG_INFO("MaxProfile updated.\n");
|
|
|
+
|
|
|
+ // Required item
|
|
|
+ maxProfile.ChargingProfileId = json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingProfileId"));
|
|
|
+ maxProfile.StackLevel = json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "stackLevel"));
|
|
|
+ sprintf((char*)maxProfile.ChargingProfileKind, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingProfileKind")));
|
|
|
+ sprintf((char*)maxProfile.ChargingSchedule.ChargingRateUnit, "A");
|
|
|
+
|
|
|
+ for(int idxPeriod=0;idxPeriod<json_object_array_length(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"));idxPeriod++)
|
|
|
+ {
|
|
|
+ maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod = json_object_get_int(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "startPeriod"));
|
|
|
+ maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].Limit = (strstr((char*)json_object_get_string(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingRateUnit")),"W")!=NULL?json_object_get_double(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "limit"))/220:json_object_get_double(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "limit")));
|
|
|
+ maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].NumberPhases = (json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "numberPhases")==NULL?
|
|
|
+ 3:
|
|
|
+ json_object_get_int(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "numberPhases")));
|
|
|
+ }
|
|
|
+
|
|
|
+ // Optional item
|
|
|
+ if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validFrom") != NULL)
|
|
|
+ {
|
|
|
+ sprintf((char*)maxProfile.ValidFrom, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validFrom")));
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ sprintf((char*)maxProfile.ValidFrom, " ");
|
|
|
+ }
|
|
|
+
|
|
|
+ if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validTo") != NULL)
|
|
|
+ {
|
|
|
+ sprintf((char*)maxProfile.ValidTo, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validTo")));
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ sprintf((char*)maxProfile.ValidTo, " ");
|
|
|
+ }
|
|
|
+
|
|
|
+ if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "RecurrencyKind") != NULL)
|
|
|
+ {
|
|
|
+ sprintf((char*)maxProfile.RecurrencyKind, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "RecurrencyKind")));
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ sprintf((char*)maxProfile.RecurrencyKind, " ");
|
|
|
+ }
|
|
|
+
|
|
|
+ if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "transactionId") != NULL)
|
|
|
+ {
|
|
|
+ maxProfile.TransactionId = json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "transactionId"));
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ maxProfile.TransactionId = -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "duration") != NULL)
|
|
|
+ {
|
|
|
+ maxProfile.ChargingSchedule.Duration = json_object_get_int(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "duration"));
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ maxProfile.ChargingSchedule.Duration = -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "startSchedule") != NULL)
|
|
|
+ {
|
|
|
+ sprintf((char*)maxProfile.ChargingSchedule.StartSchedule, "%s", json_object_get_string(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "startSchedule")));
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ sprintf((char*)maxProfile.ChargingSchedule.StartSchedule, " ");
|
|
|
+ }
|
|
|
+
|
|
|
+ if(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "minChargingRate") != NULL)
|
|
|
+ {
|
|
|
+ maxProfile.ChargingSchedule.MinChargingRate = json_object_get_double(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "minChargingRate"));
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ maxProfile.ChargingSchedule.MinChargingRate = -1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ json_object_put(obj);
|
|
|
+ }
|
|
|
+ fclose(fp);
|
|
|
+/*
|
|
|
+ if(maxProfile.ChargingProfileId !=-1)
|
|
|
+ {
|
|
|
+ DEBUG_INFO("Profile ID: %d\n", maxProfile.ChargingProfileId);
|
|
|
+ DEBUG_INFO("Profile stackLevel: %d\n", maxProfile.StackLevel);
|
|
|
+ DEBUG_INFO("Profile TransactionId: %d\n", maxProfile.TransactionId);
|
|
|
+ DEBUG_INFO("Profile valid from: %s\n", maxProfile.ValidFrom);
|
|
|
+ DEBUG_INFO("Profile valid to: %s\n", maxProfile.ValidTo);
|
|
|
+ DEBUG_INFO("Profile ChargingProfileKind: %s\n", maxProfile.ChargingProfileKind);
|
|
|
+ DEBUG_INFO("Profile RecurrencyKind: %s\n", maxProfile.RecurrencyKind);
|
|
|
+
|
|
|
+ DEBUG_INFO("Profile start schedule: %s\n", maxProfile.ChargingSchedule.StartSchedule);
|
|
|
+ DEBUG_INFO("Profile schedule duration: %d\n", maxProfile.ChargingSchedule.Duration);
|
|
|
+ DEBUG_INFO("Profile charging rate unit: %s\n", maxProfile.ChargingSchedule.ChargingRateUnit);
|
|
|
+ DEBUG_INFO("Profile charging min rate: %f\n", maxProfile.ChargingSchedule.MinChargingRate);
|
|
|
+
|
|
|
+ for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(maxProfile.ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
|
|
|
+ {
|
|
|
+ if(maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod >= 0)
|
|
|
+ {
|
|
|
+ DEBUG_INFO("Period-%02d startPeriod: %d\n", idxPeriod, maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod);
|
|
|
+ DEBUG_INFO("Period-%02d limit: %f\n", idxPeriod, maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].Limit);
|
|
|
+ DEBUG_INFO("Period-%02d NumberPhases: %d\n", idxPeriod, maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].NumberPhases);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ DEBUG_INFO("MaxProfile not found.\n");
|
|
|
+ DEBUG_INFO("------------------------------------\n");*/
|
|
|
+ }
|
|
|
+
|
|
|
+ // Search default tx profile
|
|
|
+ sprintf(profileFileName, "/tmp/TxDefaultProfile_%d.json", connectorId);
|
|
|
+ if((access(profileFileName, F_OK))==-1)
|
|
|
+ sprintf(profileFileName, "/tmp/TxDefaultProfile_0.json");
|
|
|
+
|
|
|
+ if((access(profileFileName, F_OK))!=-1)
|
|
|
+ {
|
|
|
+ fp = fopen(profileFileName, "r");
|
|
|
+
|
|
|
+ for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
|
|
|
+ {
|
|
|
+ defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod = -1;
|
|
|
+ defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].Limit = -1;
|
|
|
+ defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].NumberPhases = 3;
|
|
|
+ }
|
|
|
+ defaultTxProfile.ChargingProfileId = -1;
|
|
|
+ defaultTxProfile.StackLevel = -1;
|
|
|
+
|
|
|
+ while(getline(&line, &len, fp) != -1)
|
|
|
+ {
|
|
|
+ json_object *obj = NULL;
|
|
|
+
|
|
|
+ obj = json_tokener_parse(line);
|
|
|
+ if(is_error(obj))
|
|
|
+ {
|
|
|
+ DEBUG_ERROR("Parse TxDefaultProfile from file error.\n");
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if((json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "ChargingProfileId")) != defaultTxProfile.ChargingProfileId) &&
|
|
|
+ (json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "stackLevel")) >= defaultTxProfile.StackLevel)
|
|
|
+ )
|
|
|
+ {
|
|
|
+ if((json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validFrom") != NULL) &&
|
|
|
+ (json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validTo") != NULL)
|
|
|
+ )
|
|
|
+ {
|
|
|
+ struct tm tmFrom, tmTo;
|
|
|
+ struct timeb tbFrom, tbTo;
|
|
|
+
|
|
|
+ if((sscanf((char*)json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validFrom")), "%4d-%2d-%2dT%2d:%2d:%2d", &tmFrom.tm_year, &tmFrom.tm_mon, &tmFrom.tm_mday, &tmFrom.tm_hour, &tmFrom.tm_min, &tmFrom.tm_sec) == 6) &&
|
|
|
+ (sscanf((char*)json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validTo")), "%4d-%2d-%2dT%2d:%2d:%2d", &tmTo.tm_year, &tmTo.tm_mon, &tmTo.tm_mday, &tmTo.tm_hour, &tmTo.tm_min, &tmTo.tm_sec) == 6))
|
|
|
+ {
|
|
|
+ tmFrom.tm_year -= 1900;
|
|
|
+ tmFrom.tm_mon -= 1;
|
|
|
+ tbFrom.time = mktime(&tmFrom);
|
|
|
+
|
|
|
+ tmTo.tm_year -= 1900;
|
|
|
+ tmTo.tm_mon -= 1;
|
|
|
+ tbTo.time = mktime(&tmTo);
|
|
|
+
|
|
|
+ if((DiffTimebWithNowSec(tbFrom)>=0) && (DiffTimebWithNowSec(tbTo)<=0))
|
|
|
+ {
|
|
|
+ if(defaultTxProfile.ChargingProfileId == -1)
|
|
|
+ DEBUG_INFO("TxDefaultProfile found.\n");
|
|
|
+ else
|
|
|
+ DEBUG_INFO("TxDefaultProfile updated.\n");
|
|
|
+
|
|
|
+ // Required item
|
|
|
+ defaultTxProfile.ChargingProfileId = json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingProfileId"));
|
|
|
+ defaultTxProfile.StackLevel = json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "stackLevel"));
|
|
|
+ sprintf((char*)defaultTxProfile.ChargingProfileKind, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingProfileKind")));
|
|
|
+ sprintf((char*)defaultTxProfile.ChargingSchedule.ChargingRateUnit, "A");
|
|
|
+
|
|
|
+ for(int idxPeriod=0;idxPeriod<json_object_array_length(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"));idxPeriod++)
|
|
|
+ {
|
|
|
+ defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod = json_object_get_int(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "startPeriod"));
|
|
|
+ defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].Limit = (strstr(json_object_get_string(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingRateUnit")),"W")!=NULL?json_object_get_double(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "limit"))/220:json_object_get_double(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "limit")));
|
|
|
+ defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].NumberPhases = (json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "numberPhases")==NULL?
|
|
|
+ 3:
|
|
|
+ json_object_get_int(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "numberPhases")));
|
|
|
+ }
|
|
|
+
|
|
|
+ // Optional item
|
|
|
+ if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validFrom") != NULL)
|
|
|
+ {
|
|
|
+ sprintf((char*)defaultTxProfile.ValidFrom, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validFrom")));
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ sprintf((char*)defaultTxProfile.ValidFrom, " ");
|
|
|
+ }
|
|
|
+
|
|
|
+ if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validTo") != NULL)
|
|
|
+ {
|
|
|
+ sprintf((char*)defaultTxProfile.ValidTo, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validTo")));
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ sprintf((char*)defaultTxProfile.ValidTo, " ");
|
|
|
+ }
|
|
|
+
|
|
|
+ if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "RecurrencyKind") != NULL)
|
|
|
+ {
|
|
|
+ sprintf((char*)defaultTxProfile.RecurrencyKind, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "RecurrencyKind")));
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ sprintf((char*)defaultTxProfile.RecurrencyKind, " ");
|
|
|
+ }
|
|
|
+
|
|
|
+ if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "transactionId") != NULL)
|
|
|
+ {
|
|
|
+ defaultTxProfile.TransactionId = json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "transactionId"));
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ defaultTxProfile.TransactionId = -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "duration") != NULL)
|
|
|
+ {
|
|
|
+ defaultTxProfile.ChargingSchedule.Duration = json_object_get_int(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "duration"));
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ defaultTxProfile.ChargingSchedule.Duration = -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "startSchedule") != NULL)
|
|
|
+ {
|
|
|
+ sprintf((char*)defaultTxProfile.ChargingSchedule.StartSchedule, "%s", json_object_get_string(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "startSchedule")));
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ sprintf((char*)defaultTxProfile.ChargingSchedule.StartSchedule, " ");
|
|
|
+ }
|
|
|
+
|
|
|
+ if(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "minChargingRate") != NULL)
|
|
|
+ {
|
|
|
+ defaultTxProfile.ChargingSchedule.MinChargingRate = json_object_get_double(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "minChargingRate"));
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ defaultTxProfile.ChargingSchedule.MinChargingRate = -1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if(defaultTxProfile.ChargingProfileId == -1)
|
|
|
+ DEBUG_INFO("TxDefaultProfile found.\n");
|
|
|
+ else
|
|
|
+ DEBUG_INFO("TxDefaultProfile updated.\n");
|
|
|
+
|
|
|
+ // Required item
|
|
|
+ defaultTxProfile.ChargingProfileId = json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingProfileId"));
|
|
|
+ defaultTxProfile.StackLevel = json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "stackLevel"));
|
|
|
+ sprintf((char*)defaultTxProfile.ChargingProfileKind, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingProfileKind")));
|
|
|
+ sprintf((char*)defaultTxProfile.ChargingSchedule.ChargingRateUnit, "A");
|
|
|
+
|
|
|
+ for(int idxPeriod=0;idxPeriod<json_object_array_length(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"));idxPeriod++)
|
|
|
+ {
|
|
|
+ defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod = json_object_get_int(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "startPeriod"));
|
|
|
+ defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].Limit = (strstr(json_object_get_string(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingRateUnit")),"W")!=NULL?json_object_get_double(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "limit"))/220:json_object_get_double(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "limit")));
|
|
|
+ defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].NumberPhases = (json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "numberPhases")==NULL?
|
|
|
+ 3:
|
|
|
+ json_object_get_int(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "numberPhases")));
|
|
|
+ }
|
|
|
+
|
|
|
+ // Optional item
|
|
|
+ if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validFrom") != NULL)
|
|
|
+ {
|
|
|
+ sprintf((char*)defaultTxProfile.ValidFrom, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validFrom")));
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ sprintf((char*)defaultTxProfile.ValidFrom, " ");
|
|
|
+ }
|
|
|
+
|
|
|
+ if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validTo") != NULL)
|
|
|
+ {
|
|
|
+ sprintf((char*)defaultTxProfile.ValidTo, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validTo")));
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ sprintf((char*)defaultTxProfile.ValidTo, " ");
|
|
|
+ }
|
|
|
+
|
|
|
+ if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "RecurrencyKind") != NULL)
|
|
|
+ {
|
|
|
+ sprintf((char*)defaultTxProfile.RecurrencyKind, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "RecurrencyKind")));
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ sprintf((char*)defaultTxProfile.RecurrencyKind, " ");
|
|
|
+ }
|
|
|
+
|
|
|
+ if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "transactionId") != NULL)
|
|
|
+ {
|
|
|
+ defaultTxProfile.TransactionId = json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "transactionId"));
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ defaultTxProfile.TransactionId = -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "duration") != NULL)
|
|
|
+ {
|
|
|
+ defaultTxProfile.ChargingSchedule.Duration = json_object_get_int(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "duration"));
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ defaultTxProfile.ChargingSchedule.Duration = -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "startSchedule") != NULL)
|
|
|
+ {
|
|
|
+ sprintf((char*)defaultTxProfile.ChargingSchedule.StartSchedule, "%s", json_object_get_string(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "startSchedule")));
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ sprintf((char*)defaultTxProfile.ChargingSchedule.StartSchedule, " ");
|
|
|
+ }
|
|
|
+
|
|
|
+ if(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "minChargingRate") != NULL)
|
|
|
+ {
|
|
|
+ maxProfile.ChargingSchedule.MinChargingRate = json_object_get_double(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "minChargingRate"));
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ maxProfile.ChargingSchedule.MinChargingRate = -1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ json_object_put(obj);
|
|
|
+ }
|
|
|
+ fclose(fp);
|
|
|
+/*
|
|
|
+ if(defaultTxProfile.ChargingProfileId != -1)
|
|
|
+ {
|
|
|
+ DEBUG_INFO("Profile ID: %d\n", defaultTxProfile.ChargingProfileId);
|
|
|
+ DEBUG_INFO("Profile stackLevel: %d\n", defaultTxProfile.StackLevel);
|
|
|
+ DEBUG_INFO("Profile TransactionId: %d\n", defaultTxProfile.TransactionId);
|
|
|
+ DEBUG_INFO("Profile valid from: %s\n", defaultTxProfile.ValidFrom);
|
|
|
+ DEBUG_INFO("Profile valid to: %s\n", defaultTxProfile.ValidTo);
|
|
|
+ DEBUG_INFO("Profile ChargingProfileKind: %s\n", defaultTxProfile.ChargingProfileKind);
|
|
|
+ DEBUG_INFO("Profile RecurrencyKind: %s\n", defaultTxProfile.RecurrencyKind);
|
|
|
+
|
|
|
+ DEBUG_INFO("Profile start schedule: %s\n", defaultTxProfile.ChargingSchedule.StartSchedule);
|
|
|
+ DEBUG_INFO("Profile schedule duration: %d\n", defaultTxProfile.ChargingSchedule.Duration);
|
|
|
+ DEBUG_INFO("Profile charging rate unit: %s\n", defaultTxProfile.ChargingSchedule.ChargingRateUnit);
|
|
|
+ DEBUG_INFO("Profile charging min rate: %f\n", defaultTxProfile.ChargingSchedule.MinChargingRate);
|
|
|
+
|
|
|
+ for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
|
|
|
+ {
|
|
|
+ if(defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod >= 0)
|
|
|
+ {
|
|
|
+ DEBUG_INFO("Period-%02d startPeriod: %d\n", idxPeriod, defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod);
|
|
|
+ DEBUG_INFO("Period-%02d limit: %f\n", idxPeriod, defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].Limit);
|
|
|
+ DEBUG_INFO("Period-%02d NumberPhases: %d\n", idxPeriod, defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].NumberPhases);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ DEBUG_INFO("TxDefaultProfile not found.\n");
|
|
|
+
|
|
|
+ DEBUG_INFO("------------------------------------\n");*/
|
|
|
+ }
|
|
|
+
|
|
|
+ // Search tx profile
|
|
|
+ sprintf(profileFileName, "/tmp/TxProfile_%d.json", connectorId);
|
|
|
+ if((access(profileFileName, F_OK))!=-1)
|
|
|
+ {
|
|
|
+ fp = fopen(profileFileName, "r");
|
|
|
+
|
|
|
+ for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(txProfile.ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
|
|
|
+ {
|
|
|
+ txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod = -1;
|
|
|
+ txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].Limit = -1;
|
|
|
+ txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].NumberPhases = 3;
|
|
|
+ }
|
|
|
+ txProfile.ChargingProfileId = -1;
|
|
|
+ txProfile.StackLevel = -1;
|
|
|
+
|
|
|
+ while(getline(&line, &len, fp) != -1)
|
|
|
+ {
|
|
|
+ json_object *obj = NULL;
|
|
|
+
|
|
|
+ obj = json_tokener_parse(line);
|
|
|
+ if(is_error(obj))
|
|
|
+ {
|
|
|
+ DEBUG_ERROR("Parse txProfile from file error.\n");
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if((json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "ChargingProfileId")) != txProfile.ChargingProfileId) &&
|
|
|
+ (json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "stackLevel")) >= txProfile.StackLevel)
|
|
|
+ )
|
|
|
+ {
|
|
|
+ if((json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validFrom") != NULL) &&
|
|
|
+ (json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validTo") != NULL)
|
|
|
+ )
|
|
|
+ {
|
|
|
+ struct tm tmFrom, tmTo;
|
|
|
+ struct timeb tbFrom, tbTo;
|
|
|
+
|
|
|
+ if((sscanf((char*)json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validFrom")), "%4d-%2d-%2dT%2d:%2d:%2d", &tmFrom.tm_year, &tmFrom.tm_mon, &tmFrom.tm_mday, &tmFrom.tm_hour, &tmFrom.tm_min, &tmFrom.tm_sec) == 6) &&
|
|
|
+ (sscanf((char*)json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validTo")), "%4d-%2d-%2dT%2d:%2d:%2d", &tmTo.tm_year, &tmTo.tm_mon, &tmTo.tm_mday, &tmTo.tm_hour, &tmTo.tm_min, &tmTo.tm_sec) == 6))
|
|
|
+ {
|
|
|
+ tmFrom.tm_year -= 1900;
|
|
|
+ tmFrom.tm_mon -= 1;
|
|
|
+ tbFrom.time = mktime(&tmFrom);
|
|
|
+
|
|
|
+ tmTo.tm_year -= 1900;
|
|
|
+ tmTo.tm_mon -= 1;
|
|
|
+ tbTo.time = mktime(&tmTo);
|
|
|
+
|
|
|
+ if((DiffTimebWithNowSec(tbFrom)>=0) && (DiffTimebWithNowSec(tbTo)<=0))
|
|
|
+ {
|
|
|
+ if(txProfile.ChargingProfileId == -1)
|
|
|
+ DEBUG_INFO("TxProfile found.\n");
|
|
|
+ else
|
|
|
+ DEBUG_INFO("TxProfile updated.\n");
|
|
|
+
|
|
|
+ // Required item
|
|
|
+ txProfile.ChargingProfileId = json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingProfileId"));
|
|
|
+ txProfile.StackLevel = json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "stackLevel"));
|
|
|
+ sprintf((char*)txProfile.ChargingProfileKind, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingProfileKind")));
|
|
|
+ sprintf((char*)txProfile.ChargingSchedule.ChargingRateUnit, "A");
|
|
|
+
|
|
|
+ for(int idxPeriod=0;idxPeriod<json_object_array_length(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"));idxPeriod++)
|
|
|
+ {
|
|
|
+ txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod = json_object_get_int(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "startPeriod"));
|
|
|
+ txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].Limit = (strstr(json_object_get_string(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingRateUnit")),"W")!=NULL?json_object_get_double(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "limit"))/220:json_object_get_double(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "limit")));
|
|
|
+ txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].NumberPhases = (json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "numberPhases")==NULL?
|
|
|
+ 3:
|
|
|
+ json_object_get_int(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "numberPhases")));
|
|
|
+ }
|
|
|
+
|
|
|
+ // Optional item
|
|
|
+ if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validFrom") != NULL)
|
|
|
+ {
|
|
|
+ sprintf((char*)txProfile.ValidFrom, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validFrom")));
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ sprintf((char*)txProfile.ValidFrom, " ");
|
|
|
+ }
|
|
|
+
|
|
|
+ if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validTo") != NULL)
|
|
|
+ {
|
|
|
+ sprintf((char*)txProfile.ValidTo, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validTo")));
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ sprintf((char*)txProfile.ValidTo, " ");
|
|
|
+ }
|
|
|
+
|
|
|
+ if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "RecurrencyKind") != NULL)
|
|
|
+ {
|
|
|
+ sprintf((char*)txProfile.RecurrencyKind, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "RecurrencyKind")));
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ sprintf((char*)txProfile.RecurrencyKind, " ");
|
|
|
+ }
|
|
|
+
|
|
|
+ if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "transactionId") != NULL)
|
|
|
+ {
|
|
|
+ txProfile.TransactionId = json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "transactionId"));
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ txProfile.TransactionId = -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "duration") != NULL)
|
|
|
+ {
|
|
|
+ txProfile.ChargingSchedule.Duration = json_object_get_int(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "duration"));
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ txProfile.ChargingSchedule.Duration = -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "startSchedule") != NULL)
|
|
|
+ {
|
|
|
+ sprintf((char*)txProfile.ChargingSchedule.StartSchedule, "%s", json_object_get_string(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "startSchedule")));
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ sprintf((char*)txProfile.ChargingSchedule.StartSchedule, " ");
|
|
|
+ }
|
|
|
+
|
|
|
+ if(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "minChargingRate") != NULL)
|
|
|
+ {
|
|
|
+ txProfile.ChargingSchedule.MinChargingRate = json_object_get_double(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "minChargingRate"));
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ txProfile.ChargingSchedule.MinChargingRate = -1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if(txProfile.ChargingProfileId == -1)
|
|
|
+ DEBUG_INFO("TxProfile found.\n");
|
|
|
+ else
|
|
|
+ DEBUG_INFO("TxProfile updated.\n");
|
|
|
+
|
|
|
+ // Required item
|
|
|
+ txProfile.ChargingProfileId = json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingProfileId"));
|
|
|
+ txProfile.StackLevel = json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "stackLevel"));
|
|
|
+ sprintf((char*)txProfile.ChargingProfileKind, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingProfileKind")));
|
|
|
+ sprintf((char*)txProfile.ChargingSchedule.ChargingRateUnit, "A");
|
|
|
+
|
|
|
+ for(int idxPeriod=0;idxPeriod<json_object_array_length(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"));idxPeriod++)
|
|
|
+ {
|
|
|
+ txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod = json_object_get_int(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "startPeriod"));
|
|
|
+ txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].Limit = (strstr(json_object_get_string(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingRateUnit")),"W")!=NULL?json_object_get_double(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "limit"))/220:json_object_get_double(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "limit")));
|
|
|
+ txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].NumberPhases = (json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "numberPhases")==NULL?
|
|
|
+ 3:
|
|
|
+ json_object_get_int(json_object_object_get(json_object_array_get_idx(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "chargingSchedulePeriod"), idxPeriod), "numberPhases")));
|
|
|
+ }
|
|
|
+
|
|
|
+ // Optional item
|
|
|
+ if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validFrom") != NULL)
|
|
|
+ {
|
|
|
+ sprintf((char*)txProfile.ValidFrom, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validFrom")));
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ sprintf((char*)txProfile.ValidFrom, " ");
|
|
|
+ }
|
|
|
+
|
|
|
+ if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validTo") != NULL)
|
|
|
+ {
|
|
|
+ sprintf((char*)txProfile.ValidTo, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "validTo")));
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ sprintf((char*)txProfile.ValidTo, " ");
|
|
|
+ }
|
|
|
+
|
|
|
+ if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "RecurrencyKind") != NULL)
|
|
|
+ {
|
|
|
+ sprintf((char*)txProfile.RecurrencyKind, "%s", json_object_get_string(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "RecurrencyKind")));
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ sprintf((char*)txProfile.RecurrencyKind, " ");
|
|
|
+ }
|
|
|
+
|
|
|
+ if(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "transactionId") != NULL)
|
|
|
+ {
|
|
|
+ txProfile.TransactionId = json_object_get_int(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "transactionId"));
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ txProfile.TransactionId = -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "duration") != NULL)
|
|
|
+ {
|
|
|
+ txProfile.ChargingSchedule.Duration = json_object_get_int(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "duration"));
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ txProfile.ChargingSchedule.Duration = -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "startSchedule") != NULL)
|
|
|
+ {
|
|
|
+ sprintf((char*)txProfile.ChargingSchedule.StartSchedule, "%s", json_object_get_string(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "startSchedule")));
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ sprintf((char*)txProfile.ChargingSchedule.StartSchedule, " ");
|
|
|
+ }
|
|
|
+
|
|
|
+ if(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "minChargingRate") != NULL)
|
|
|
+ {
|
|
|
+ maxProfile.ChargingSchedule.MinChargingRate = json_object_get_double(json_object_object_get(json_object_object_get(json_object_object_get(obj, "csChargingProfiles"), "chargingSchedule"), "minChargingRate"));
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ maxProfile.ChargingSchedule.MinChargingRate = -1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ json_object_put(obj);
|
|
|
+ }
|
|
|
+ fclose(fp);
|
|
|
+/*
|
|
|
+ if(defaultTxProfile.ChargingProfileId != -1)
|
|
|
+ {
|
|
|
+ DEBUG_INFO("Profile ID: %d\n", txProfile.ChargingProfileId);
|
|
|
+ DEBUG_INFO("Profile stackLevel: %d\n", txProfile.StackLevel);
|
|
|
+ DEBUG_INFO("Profile TransactionId: %d\n", txProfile.TransactionId);
|
|
|
+ DEBUG_INFO("Profile valid from: %s\n", txProfile.ValidFrom);
|
|
|
+ DEBUG_INFO("Profile valid to: %s\n", txProfile.ValidTo);
|
|
|
+ DEBUG_INFO("Profile ChargingProfileKind: %s\n", txProfile.ChargingProfileKind);
|
|
|
+ DEBUG_INFO("Profile RecurrencyKind: %s\n", txProfile.RecurrencyKind);
|
|
|
+
|
|
|
+ DEBUG_INFO("Profile start schedule: %s\n", txProfile.ChargingSchedule.StartSchedule);
|
|
|
+ DEBUG_INFO("Profile schedule duration: %d\n", txProfile.ChargingSchedule.Duration);
|
|
|
+ DEBUG_INFO("Profile charging rate unit: %s\n", txProfile.ChargingSchedule.ChargingRateUnit);
|
|
|
+ DEBUG_INFO("Profile charging min rate: %f\n", txProfile.ChargingSchedule.MinChargingRate);
|
|
|
+
|
|
|
+ for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(txProfile.ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
|
|
|
+ {
|
|
|
+ if(txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod >= 0)
|
|
|
+ {
|
|
|
+ DEBUG_INFO("Period-%02d startPeriod: %d\n", idxPeriod, txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod);
|
|
|
+ DEBUG_INFO("Period-%02d limit: %f\n", idxPeriod, txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].Limit);
|
|
|
+ DEBUG_INFO("Period-%02d NumberPhases: %d\n", idxPeriod, txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].NumberPhases);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ DEBUG_INFO("TxProfile not found.\n");*/
|
|
|
+ }
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Align found profile start schedule & periods
|
|
|
+ */
|
|
|
+ //DEBUG_INFO("====================================\n");
|
|
|
+ /*
|
|
|
+ // For local test usage, force modify found profile start schedule info
|
|
|
+ sprintf((char*)maxProfile.ChargingSchedule.StartSchedule, "%04d-%02d-%02dT%02d:%02d:%02dZ", tmComposite->tm_year+1900, tmComposite->tm_mon+1, tmComposite->tm_mday, tmComposite->tm_hour, tmComposite->tm_min, tmComposite->tm_sec-10);
|
|
|
+ sprintf((char*)defaultTxProfile.ChargingSchedule.StartSchedule, "%04d-%02d-%02dT%02d:%02d:%02dZ", tmComposite->tm_year+1900, tmComposite->tm_mon+1, tmComposite->tm_mday, tmComposite->tm_hour, tmComposite->tm_min, tmComposite->tm_sec-5);
|
|
|
+ sprintf((char*)txProfile.ChargingSchedule.StartSchedule, "%04d-%02d-%02dT%02d:%02d:%02dZ", tmComposite->tm_year+1900, tmComposite->tm_mon+1, tmComposite->tm_mday, tmComposite->tm_hour, tmComposite->tm_min, tmComposite->tm_sec-3);
|
|
|
+*/
|
|
|
+
|
|
|
+ if(maxProfile.ChargingProfileId != -1)
|
|
|
+ {
|
|
|
+ if(strstr((char*)maxProfile.ChargingProfileKind, "Absolute") != NULL)
|
|
|
+ {
|
|
|
+ if(maxProfile.ChargingSchedule.Duration != -1)
|
|
|
+ {
|
|
|
+ maxProfile.ChargingSchedule.Duration = ((maxProfile.ChargingSchedule.Duration-getStartStop(maxProfile.ChargingSchedule.StartSchedule, compositeProfile->ChargingSchedule.StartSchedule))<0?
|
|
|
+ 0:
|
|
|
+ (maxProfile.ChargingSchedule.Duration-getStartStop(maxProfile.ChargingSchedule.StartSchedule, compositeProfile->ChargingSchedule.StartSchedule)));
|
|
|
+ }
|
|
|
+
|
|
|
+ for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(maxProfile.ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
|
|
|
+ {
|
|
|
+ if(maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod != -1)
|
|
|
+ {
|
|
|
+ maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod = ((maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartStop(maxProfile.ChargingSchedule.StartSchedule, compositeProfile->ChargingSchedule.StartSchedule))<0?
|
|
|
+ 0:
|
|
|
+ (maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartStop(maxProfile.ChargingSchedule.StartSchedule, compositeProfile->ChargingSchedule.StartSchedule)));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if(strstr((char*)maxProfile.ChargingProfileKind, "Relative") != NULL)
|
|
|
+ {
|
|
|
+ if(maxProfile.ChargingSchedule.Duration != -1)
|
|
|
+ {
|
|
|
+ maxProfile.ChargingSchedule.Duration = (strstr((char*)ShmOCPP16Data->StatusNotification[(connectorId==0?0:connectorId-1)].Status, "Charging")==NULL)?maxProfile.ChargingSchedule.Duration:((maxProfile.ChargingSchedule.Duration-getStartStop(ShmOCPP16Data->StartTransaction[(connectorId==0?0:connectorId-1)].Timestamp, compositeProfile->ChargingSchedule.StartSchedule))<0?
|
|
|
+ 0:
|
|
|
+ (maxProfile.ChargingSchedule.Duration-getStartStop(ShmOCPP16Data->StartTransaction[(connectorId==0?0:connectorId-1)].Timestamp, compositeProfile->ChargingSchedule.StartSchedule)));
|
|
|
+ }
|
|
|
+
|
|
|
+ for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(maxProfile.ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
|
|
|
+ {
|
|
|
+ if(maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod != -1)
|
|
|
+ {
|
|
|
+ maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod = (strstr((char*)ShmOCPP16Data->StatusNotification[(connectorId==0?0:connectorId-1)].Status, "Charging")==NULL)?maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod:((maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartStop(ShmOCPP16Data->StartTransaction[(connectorId==0?0:connectorId-1)].Timestamp, compositeProfile->ChargingSchedule.StartSchedule))<0?
|
|
|
+ 0:
|
|
|
+ (maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartStop(ShmOCPP16Data->StartTransaction[(connectorId==0?0:connectorId-1)].Timestamp, compositeProfile->ChargingSchedule.StartSchedule)));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if(strstr((char*)maxProfile.RecurrencyKind, "Weekly") != NULL)
|
|
|
+ {
|
|
|
+ if(maxProfile.ChargingSchedule.Duration != -1)
|
|
|
+ {
|
|
|
+ maxProfile.ChargingSchedule.Duration = ((maxProfile.ChargingSchedule.Duration-getStartSinceWeek(compositeProfile->ChargingSchedule.StartSchedule))<0?
|
|
|
+ 0:
|
|
|
+ (maxProfile.ChargingSchedule.Duration-getStartSinceWeek(compositeProfile->ChargingSchedule.StartSchedule)));
|
|
|
+ }
|
|
|
+
|
|
|
+ for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(maxProfile.ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
|
|
|
+ {
|
|
|
+ if(maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod != -1)
|
|
|
+ {
|
|
|
+ maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod = ((maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartSinceWeek(compositeProfile->ChargingSchedule.StartSchedule))<0?
|
|
|
+ 0:
|
|
|
+ (maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartSinceWeek(compositeProfile->ChargingSchedule.StartSchedule)));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if(maxProfile.ChargingSchedule.Duration != -1)
|
|
|
+ {
|
|
|
+ maxProfile.ChargingSchedule.Duration = ((maxProfile.ChargingSchedule.Duration-getStartSinceToday(compositeProfile->ChargingSchedule.StartSchedule))<0?
|
|
|
+ 0:
|
|
|
+ (maxProfile.ChargingSchedule.Duration-getStartSinceToday(compositeProfile->ChargingSchedule.StartSchedule)));
|
|
|
+ }
|
|
|
+
|
|
|
+ for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(maxProfile.ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
|
|
|
+ {
|
|
|
+ if(maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod != -1)
|
|
|
+ {
|
|
|
+ maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod = ((maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartSinceToday(compositeProfile->ChargingSchedule.StartSchedule))<0?
|
|
|
+ 0:
|
|
|
+ (maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartSinceToday(compositeProfile->ChargingSchedule.StartSchedule)));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+/*
|
|
|
+ DEBUG_INFO("MaxProfile after align.\n");
|
|
|
+ DEBUG_INFO("Profile ID: %d\n", maxProfile.ChargingProfileId);
|
|
|
+ DEBUG_INFO("Profile stackLevel: %d\n", maxProfile.StackLevel);
|
|
|
+ DEBUG_INFO("Profile TransactionId: %d\n", maxProfile.TransactionId);
|
|
|
+ DEBUG_INFO("Profile valid from: %s\n", maxProfile.ValidFrom);
|
|
|
+ DEBUG_INFO("Profile valid to: %s\n", maxProfile.ValidTo);
|
|
|
+ DEBUG_INFO("Profile ChargingProfileKind: %s\n", maxProfile.ChargingProfileKind);
|
|
|
+ DEBUG_INFO("Profile RecurrencyKind: %s\n", maxProfile.RecurrencyKind);
|
|
|
+
|
|
|
+ DEBUG_INFO("Profile start schedule: %s\n", compositeProfile->ChargingSchedule.StartSchedule);
|
|
|
+ DEBUG_INFO("Profile schedule duration: %d\n", maxProfile.ChargingSchedule.Duration);
|
|
|
+ DEBUG_INFO("Profile charging rate unit: %s\n", maxProfile.ChargingSchedule.ChargingRateUnit);
|
|
|
+ DEBUG_INFO("Profile charging min rate: %f\n", maxProfile.ChargingSchedule.MinChargingRate);
|
|
|
+
|
|
|
+ for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(maxProfile.ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
|
|
|
+ {
|
|
|
+ if(maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod >= 0)
|
|
|
+ {
|
|
|
+ DEBUG_INFO("Period-%02d startPeriod: %d\n", idxPeriod, maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod);
|
|
|
+ DEBUG_INFO("Period-%02d limit: %f\n", idxPeriod, maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].Limit);
|
|
|
+ DEBUG_INFO("Period-%02d NumberPhases: %d\n", idxPeriod, maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].NumberPhases);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ DEBUG_INFO("------------------------------------\n");*/
|
|
|
+ }
|
|
|
+
|
|
|
+ if(defaultTxProfile.ChargingProfileId != -1)
|
|
|
+ {
|
|
|
+ if(strstr((char*)defaultTxProfile.ChargingProfileKind, "Absolute") != NULL)
|
|
|
+ {
|
|
|
+ if(defaultTxProfile.ChargingSchedule.Duration != -1)
|
|
|
+ {
|
|
|
+ defaultTxProfile.ChargingSchedule.Duration = ((defaultTxProfile.ChargingSchedule.Duration-getStartStop(defaultTxProfile.ChargingSchedule.StartSchedule, compositeProfile->ChargingSchedule.StartSchedule))<0?
|
|
|
+ 0:
|
|
|
+ (defaultTxProfile.ChargingSchedule.Duration-getStartStop(defaultTxProfile.ChargingSchedule.StartSchedule, compositeProfile->ChargingSchedule.StartSchedule)));
|
|
|
+ }
|
|
|
+
|
|
|
+ for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
|
|
|
+ {
|
|
|
+ if(defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod != -1)
|
|
|
+ {
|
|
|
+ defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod = ((defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartStop(defaultTxProfile.ChargingSchedule.StartSchedule, compositeProfile->ChargingSchedule.StartSchedule))<0?
|
|
|
+ 0:
|
|
|
+ (defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartStop(defaultTxProfile.ChargingSchedule.StartSchedule, compositeProfile->ChargingSchedule.StartSchedule)));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if(strstr((char*)defaultTxProfile.ChargingProfileKind, "Relative") != NULL)
|
|
|
+ {
|
|
|
+ if(defaultTxProfile.ChargingSchedule.Duration != -1)
|
|
|
+ {
|
|
|
+ defaultTxProfile.ChargingSchedule.Duration = (strstr((char*)ShmOCPP16Data->StatusNotification[(connectorId==0?0:connectorId-1)].Status, "Charging")==NULL)?defaultTxProfile.ChargingSchedule.Duration:((defaultTxProfile.ChargingSchedule.Duration-getStartStop(ShmOCPP16Data->StartTransaction[(connectorId==0?0:connectorId-1)].Timestamp, compositeProfile->ChargingSchedule.StartSchedule))<0?
|
|
|
+ 0:
|
|
|
+ (defaultTxProfile.ChargingSchedule.Duration-getStartStop(ShmOCPP16Data->StartTransaction[(connectorId==0?0:connectorId-1)].Timestamp, compositeProfile->ChargingSchedule.StartSchedule)));
|
|
|
+ }
|
|
|
+
|
|
|
+ for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
|
|
|
+ {
|
|
|
+ if(defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod != -1)
|
|
|
+ {
|
|
|
+ defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod = (strstr((char*)ShmOCPP16Data->StatusNotification[(connectorId==0?0:connectorId-1)].Status, "Charging")==NULL)?defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod:((defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartStop(ShmOCPP16Data->StartTransaction[(connectorId==0?0:connectorId-1)].Timestamp, compositeProfile->ChargingSchedule.StartSchedule))<0?
|
|
|
+ 0:
|
|
|
+ (defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartStop(ShmOCPP16Data->StartTransaction[(connectorId==0?0:connectorId-1)].Timestamp, compositeProfile->ChargingSchedule.StartSchedule)));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if(strstr((char*)defaultTxProfile.RecurrencyKind, "Weekly") != NULL)
|
|
|
+ {
|
|
|
+ if(defaultTxProfile.ChargingSchedule.Duration != -1)
|
|
|
+ {
|
|
|
+ defaultTxProfile.ChargingSchedule.Duration = ((defaultTxProfile.ChargingSchedule.Duration-getStartSinceWeek(compositeProfile->ChargingSchedule.StartSchedule))<0?
|
|
|
+ 0:
|
|
|
+ (defaultTxProfile.ChargingSchedule.Duration-getStartSinceWeek(compositeProfile->ChargingSchedule.StartSchedule)));
|
|
|
+ }
|
|
|
+
|
|
|
+ for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
|
|
|
+ {
|
|
|
+ if(defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod != -1)
|
|
|
+ {
|
|
|
+ defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod = ((defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartSinceWeek(compositeProfile->ChargingSchedule.StartSchedule))<0?
|
|
|
+ 0:
|
|
|
+ (defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartSinceWeek(compositeProfile->ChargingSchedule.StartSchedule)));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if(defaultTxProfile.ChargingSchedule.Duration != -1)
|
|
|
+ {
|
|
|
+ defaultTxProfile.ChargingSchedule.Duration = ((defaultTxProfile.ChargingSchedule.Duration-getStartSinceToday(compositeProfile->ChargingSchedule.StartSchedule))<0?
|
|
|
+ 0:
|
|
|
+ (defaultTxProfile.ChargingSchedule.Duration-getStartSinceToday(compositeProfile->ChargingSchedule.StartSchedule)));
|
|
|
+ }
|
|
|
+
|
|
|
+ for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
|
|
|
+ {
|
|
|
+ if(defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod != -1)
|
|
|
+ {
|
|
|
+ defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod = ((defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartSinceToday(compositeProfile->ChargingSchedule.StartSchedule))<0?
|
|
|
+ 0:
|
|
|
+ (defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartSinceToday(compositeProfile->ChargingSchedule.StartSchedule)));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+/*
|
|
|
+ DEBUG_INFO("defaultTxProfile after align.\n");
|
|
|
+ DEBUG_INFO("Profile ID: %d\n", defaultTxProfile.ChargingProfileId);
|
|
|
+ DEBUG_INFO("Profile stackLevel: %d\n", defaultTxProfile.StackLevel);
|
|
|
+ DEBUG_INFO("Profile TransactionId: %d\n", defaultTxProfile.TransactionId);
|
|
|
+ DEBUG_INFO("Profile valid from: %s\n", defaultTxProfile.ValidFrom);
|
|
|
+ DEBUG_INFO("Profile valid to: %s\n", defaultTxProfile.ValidTo);
|
|
|
+ DEBUG_INFO("Profile ChargingProfileKind: %s\n", defaultTxProfile.ChargingProfileKind);
|
|
|
+ DEBUG_INFO("Profile RecurrencyKind: %s\n", defaultTxProfile.RecurrencyKind);
|
|
|
+
|
|
|
+ DEBUG_INFO("Profile start schedule: %s\n", compositeProfile->ChargingSchedule.StartSchedule);
|
|
|
+ DEBUG_INFO("Profile schedule duration: %d\n", defaultTxProfile.ChargingSchedule.Duration);
|
|
|
+ DEBUG_INFO("Profile charging rate unit: %s\n", defaultTxProfile.ChargingSchedule.ChargingRateUnit);
|
|
|
+ DEBUG_INFO("Profile charging min rate: %f\n", defaultTxProfile.ChargingSchedule.MinChargingRate);
|
|
|
+
|
|
|
+ for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
|
|
|
+ {
|
|
|
+ if(defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod >= 0)
|
|
|
+ {
|
|
|
+ DEBUG_INFO("Period-%02d startPeriod: %d\n", idxPeriod, defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod);
|
|
|
+ DEBUG_INFO("Period-%02d limit: %f\n", idxPeriod, defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].Limit);
|
|
|
+ DEBUG_INFO("Period-%02d NumberPhases: %d\n", idxPeriod, defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].NumberPhases);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ DEBUG_INFO("------------------------------------\n");*/
|
|
|
+ }
|
|
|
+
|
|
|
+ if(txProfile.ChargingProfileId != -1)
|
|
|
+ {
|
|
|
+ if(strstr((char*)txProfile.ChargingProfileKind, "Absolute") != NULL)
|
|
|
+ {
|
|
|
+ if(txProfile.ChargingSchedule.Duration != -1)
|
|
|
+ {
|
|
|
+ txProfile.ChargingSchedule.Duration = ((txProfile.ChargingSchedule.Duration-getStartStop(txProfile.ChargingSchedule.StartSchedule, compositeProfile->ChargingSchedule.StartSchedule))<0?
|
|
|
+ 0:
|
|
|
+ (txProfile.ChargingSchedule.Duration-getStartStop(txProfile.ChargingSchedule.StartSchedule, compositeProfile->ChargingSchedule.StartSchedule)));
|
|
|
+ }
|
|
|
+
|
|
|
+ for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(txProfile.ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
|
|
|
+ {
|
|
|
+ if(txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod != -1)
|
|
|
+ {
|
|
|
+ txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod = ((txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartStop(txProfile.ChargingSchedule.StartSchedule, compositeProfile->ChargingSchedule.StartSchedule))<0?
|
|
|
+ 0:
|
|
|
+ (txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartStop(txProfile.ChargingSchedule.StartSchedule, compositeProfile->ChargingSchedule.StartSchedule)));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if(strstr((char*)txProfile.ChargingProfileKind, "Relative") != NULL)
|
|
|
+ {
|
|
|
+ if(txProfile.ChargingSchedule.Duration != -1)
|
|
|
+ {
|
|
|
+ txProfile.ChargingSchedule.Duration = (strstr((char*)ShmOCPP16Data->StatusNotification[(connectorId==0?0:connectorId-1)].Status, "Charging")==NULL)?txProfile.ChargingSchedule.Duration:((txProfile.ChargingSchedule.Duration-getStartStop(ShmOCPP16Data->StartTransaction[(connectorId==0?0:connectorId-1)].Timestamp, compositeProfile->ChargingSchedule.StartSchedule))<0?
|
|
|
+ 0:
|
|
|
+ (txProfile.ChargingSchedule.Duration-getStartStop(ShmOCPP16Data->StartTransaction[(connectorId==0?0:connectorId-1)].Timestamp, compositeProfile->ChargingSchedule.StartSchedule)));
|
|
|
+ }
|
|
|
+
|
|
|
+ for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(txProfile.ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
|
|
|
+ {
|
|
|
+ if(txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod != -1)
|
|
|
+ {
|
|
|
+ txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod = (strstr((char*)ShmOCPP16Data->StatusNotification[(connectorId==0?0:connectorId-1)].Status, "Charging")==NULL)?txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod:((txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartStop(ShmOCPP16Data->StartTransaction[(connectorId==0?0:connectorId-1)].Timestamp, compositeProfile->ChargingSchedule.StartSchedule))<0?
|
|
|
+ 0:
|
|
|
+ (txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartStop(ShmOCPP16Data->StartTransaction[(connectorId==0?0:connectorId-1)].Timestamp, compositeProfile->ChargingSchedule.StartSchedule)));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if(strstr((char*)txProfile.RecurrencyKind, "Weekly") != NULL)
|
|
|
+ {
|
|
|
+ if(txProfile.ChargingSchedule.Duration != -1)
|
|
|
+ {
|
|
|
+ txProfile.ChargingSchedule.Duration = ((txProfile.ChargingSchedule.Duration-getStartSinceWeek(compositeProfile->ChargingSchedule.StartSchedule))<0?
|
|
|
+ 0:
|
|
|
+ (txProfile.ChargingSchedule.Duration-getStartSinceWeek(compositeProfile->ChargingSchedule.StartSchedule)));
|
|
|
+ }
|
|
|
+
|
|
|
+ for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(txProfile.ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
|
|
|
+ {
|
|
|
+ if(txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod != -1)
|
|
|
+ {
|
|
|
+ txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod = ((txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartSinceWeek(compositeProfile->ChargingSchedule.StartSchedule))<0?
|
|
|
+ 0:
|
|
|
+ (txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartSinceWeek(compositeProfile->ChargingSchedule.StartSchedule)));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if(txProfile.ChargingSchedule.Duration != -1)
|
|
|
+ {
|
|
|
+ txProfile.ChargingSchedule.Duration = ((txProfile.ChargingSchedule.Duration-getStartSinceToday(compositeProfile->ChargingSchedule.StartSchedule))<0?
|
|
|
+ 0:
|
|
|
+ (txProfile.ChargingSchedule.Duration-getStartSinceToday(compositeProfile->ChargingSchedule.StartSchedule)));
|
|
|
+ }
|
|
|
+
|
|
|
+ for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(txProfile.ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
|
|
|
+ {
|
|
|
+ if(txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod != -1)
|
|
|
+ {
|
|
|
+ txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod = ((txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartSinceToday(compositeProfile->ChargingSchedule.StartSchedule))<0?
|
|
|
+ 0:
|
|
|
+ (txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod-getStartSinceToday(compositeProfile->ChargingSchedule.StartSchedule)));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ /*
|
|
|
+ DEBUG_INFO("txProfile after align.\n");
|
|
|
+ DEBUG_INFO("Profile ID: %d\n", txProfile.ChargingProfileId);
|
|
|
+ DEBUG_INFO("Profile stackLevel: %d\n", txProfile.StackLevel);
|
|
|
+ DEBUG_INFO("Profile TransactionId: %d\n", txProfile.TransactionId);
|
|
|
+ DEBUG_INFO("Profile valid from: %s\n", txProfile.ValidFrom);
|
|
|
+ DEBUG_INFO("Profile valid to: %s\n", txProfile.ValidTo);
|
|
|
+ DEBUG_INFO("Profile ChargingProfileKind: %s\n", txProfile.ChargingProfileKind);
|
|
|
+ DEBUG_INFO("Profile RecurrencyKind: %s\n", txProfile.RecurrencyKind);
|
|
|
+
|
|
|
+ DEBUG_INFO("Profile start schedule: %s\n", compositeProfile->ChargingSchedule.StartSchedule);
|
|
|
+ DEBUG_INFO("Profile schedule duration: %d\n", txProfile.ChargingSchedule.Duration);
|
|
|
+ DEBUG_INFO("Profile charging rate unit: %s\n", txProfile.ChargingSchedule.ChargingRateUnit);
|
|
|
+ DEBUG_INFO("Profile charging min rate: %f\n", txProfile.ChargingSchedule.MinChargingRate);
|
|
|
+
|
|
|
+ for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(txProfile.ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
|
|
|
+ {
|
|
|
+ if(txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod >= 0)
|
|
|
+ {
|
|
|
+ DEBUG_INFO("Period-%02d startPeriod: %d\n", idxPeriod, txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod);
|
|
|
+ DEBUG_INFO("Period-%02d limit: %f\n", idxPeriod, txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].Limit);
|
|
|
+ DEBUG_INFO("Period-%02d NumberPhases: %d\n", idxPeriod, txProfile.ChargingSchedule.ChargingSchedulePeriod[idxPeriod].NumberPhases);
|
|
|
+ }
|
|
|
+ }*/
|
|
|
+ }
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Merge to conposite schedule
|
|
|
+ */
|
|
|
+ //DEBUG_INFO("====================================\n");
|
|
|
+ // Find each profile period quantity
|
|
|
+ for(int idx=0;idx<ARRAY_SIZE(maxProfile.ChargingSchedule.ChargingSchedulePeriod);idx++)
|
|
|
+ {
|
|
|
+ if(maxProfile.ChargingSchedule.ChargingSchedulePeriod[idx].Limit != -1)
|
|
|
+ limitMax = idx+1;
|
|
|
+ }
|
|
|
+
|
|
|
+ for(int idx=0;idx<ARRAY_SIZE(defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod);idx++)
|
|
|
+ {
|
|
|
+ if(defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idx].Limit != -1)
|
|
|
+ limitDef = idx+1;
|
|
|
+ }
|
|
|
+
|
|
|
+ for(int idx=0;idx<ARRAY_SIZE(txProfile.ChargingSchedule.ChargingSchedulePeriod);idx++)
|
|
|
+ {
|
|
|
+ if(txProfile.ChargingSchedule.ChargingSchedulePeriod[idx].Limit != -1)
|
|
|
+ limitTx = idx+1;
|
|
|
+ }
|
|
|
+
|
|
|
+ // TxProfile found, composite schedule based on it
|
|
|
+ if(txProfile.ChargingProfileId != -1)
|
|
|
+ {
|
|
|
+ for(int idxTxPeriod=0;idxTxPeriod<limitTx;idxTxPeriod++)
|
|
|
+ {
|
|
|
+ if((txProfile.ChargingSchedule.ChargingSchedulePeriod[idxTxPeriod].Limit != -1) &&
|
|
|
+ (txProfile.ChargingSchedule.ChargingSchedulePeriod[idxTxPeriod].StartPeriod < durationReq))
|
|
|
+ {
|
|
|
+ if(maxProfile.ChargingProfileId != -1)
|
|
|
+ {
|
|
|
+ for(int idxMaxPeriod=0;idxMaxPeriod<limitMax;idxMaxPeriod++)
|
|
|
+ {
|
|
|
+ if((txProfile.ChargingSchedule.ChargingSchedulePeriod[idxTxPeriod].StartPeriod >= maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxMaxPeriod].StartPeriod) &&
|
|
|
+ (maxProfile.ChargingSchedule.Duration > txProfile.ChargingSchedule.ChargingSchedulePeriod[idxTxPeriod].StartPeriod))
|
|
|
+ {
|
|
|
+ tmpPeriod.StartPeriod = txProfile.ChargingSchedule.ChargingSchedulePeriod[idxTxPeriod].StartPeriod;
|
|
|
+ tmpPeriod.NumberPhases = txProfile.ChargingSchedule.ChargingSchedulePeriod[idxTxPeriod].NumberPhases;
|
|
|
+ tmpPeriod.Limit = (txProfile.ChargingSchedule.ChargingSchedulePeriod[idxTxPeriod].Limit>maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxMaxPeriod].Limit?maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxMaxPeriod].Limit:txProfile.ChargingSchedule.ChargingSchedulePeriod[idxTxPeriod].Limit);
|
|
|
+ }
|
|
|
+
|
|
|
+ if(idxMaxPeriod == (limitMax-1))
|
|
|
+ {
|
|
|
+ if(tmpPeriod.Limit != compositeProfile->ChargingSchedule.ChargingSchedulePeriod[(compositePeriodIdx==0?compositePeriodIdx:compositePeriodIdx-1)].Limit)
|
|
|
+ {
|
|
|
+ if(tmpPeriod.StartPeriod != compositeProfile->ChargingSchedule.ChargingSchedulePeriod[(compositePeriodIdx==0?compositePeriodIdx:compositePeriodIdx-1)].StartPeriod)
|
|
|
+ {
|
|
|
+ memcpy(&compositeProfile->ChargingSchedule.ChargingSchedulePeriod[compositePeriodIdx], &tmpPeriod , sizeof(struct StructChargingSchedulePeriod));
|
|
|
+ compositePeriodIdx++;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ memcpy(&compositeProfile->ChargingSchedule.ChargingSchedulePeriod[(compositePeriodIdx==0?compositePeriodIdx:compositePeriodIdx-1)], &tmpPeriod , sizeof(struct StructChargingSchedulePeriod));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if(txProfile.ChargingSchedule.ChargingSchedulePeriod[idxTxPeriod].StartPeriod != compositeProfile->ChargingSchedule.ChargingSchedulePeriod[(compositePeriodIdx==0?compositePeriodIdx:compositePeriodIdx-1)].StartPeriod)
|
|
|
+ {
|
|
|
+ memcpy(&compositeProfile->ChargingSchedule.ChargingSchedulePeriod[compositePeriodIdx], &txProfile.ChargingSchedule.ChargingSchedulePeriod[idxTxPeriod],sizeof(struct StructChargingSchedulePeriod));
|
|
|
+ compositePeriodIdx++;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ memcpy(&compositeProfile->ChargingSchedule.ChargingSchedulePeriod[(compositePeriodIdx==0?compositePeriodIdx:compositePeriodIdx-1)], &txProfile.ChargingSchedule.ChargingSchedulePeriod[idxTxPeriod],sizeof(struct StructChargingSchedulePeriod));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if(idxTxPeriod == (limitTx-1))
|
|
|
+ {
|
|
|
+ if(defaultTxProfile.ChargingProfileId != -1)
|
|
|
+ {
|
|
|
+ for(int idxDefPeriod=0;idxDefPeriod<limitDef;idxDefPeriod++)
|
|
|
+ {
|
|
|
+ if((defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxDefPeriod].StartPeriod > txProfile.ChargingSchedule.ChargingSchedulePeriod[idxTxPeriod].StartPeriod) &&
|
|
|
+ (defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxDefPeriod].StartPeriod < durationReq))
|
|
|
+ {
|
|
|
+ if(maxProfile.ChargingProfileId != -1)
|
|
|
+ {
|
|
|
+ for(int idxMaxPeriod=0;idxMaxPeriod<limitMax;idxMaxPeriod++)
|
|
|
+ {
|
|
|
+ if(defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxDefPeriod].StartPeriod >= maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxMaxPeriod].StartPeriod)
|
|
|
+ {
|
|
|
+ tmpPeriod.StartPeriod = defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxDefPeriod].StartPeriod;
|
|
|
+ tmpPeriod.NumberPhases = defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxDefPeriod].NumberPhases;
|
|
|
+ tmpPeriod.Limit = (defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxDefPeriod].Limit>maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxMaxPeriod].Limit?maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxMaxPeriod].Limit:defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxTxPeriod].Limit);
|
|
|
+
|
|
|
+ if(tmpPeriod.Limit != compositeProfile->ChargingSchedule.ChargingSchedulePeriod[(compositePeriodIdx==0?compositePeriodIdx:compositePeriodIdx-1)].Limit)
|
|
|
+ {
|
|
|
+ if(tmpPeriod.StartPeriod != compositeProfile->ChargingSchedule.ChargingSchedulePeriod[(compositePeriodIdx==0?compositePeriodIdx:compositePeriodIdx-1)].StartPeriod)
|
|
|
+ {
|
|
|
+ memcpy(&compositeProfile->ChargingSchedule.ChargingSchedulePeriod[compositePeriodIdx], &tmpPeriod , sizeof(struct StructChargingSchedulePeriod));
|
|
|
+ compositePeriodIdx++;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ memcpy(&compositeProfile->ChargingSchedule.ChargingSchedulePeriod[(compositePeriodIdx==0?compositePeriodIdx:compositePeriodIdx-1)], &tmpPeriod , sizeof(struct StructChargingSchedulePeriod));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if(defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxDefPeriod].StartPeriod != compositeProfile->ChargingSchedule.ChargingSchedulePeriod[(compositePeriodIdx==0?compositePeriodIdx:compositePeriodIdx-1)].StartPeriod)
|
|
|
+ {
|
|
|
+ memcpy(&compositeProfile->ChargingSchedule.ChargingSchedulePeriod[compositePeriodIdx], &defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxDefPeriod],sizeof(struct StructChargingSchedulePeriod));
|
|
|
+ compositePeriodIdx++;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ memcpy(&compositeProfile->ChargingSchedule.ChargingSchedulePeriod[(compositePeriodIdx==0?compositePeriodIdx:compositePeriodIdx-1)], &defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxDefPeriod],sizeof(struct StructChargingSchedulePeriod));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // TxProfile not found but defaultTxProfile found, composite schedule based on it
|
|
|
+ else if(defaultTxProfile.ChargingProfileId != -1)
|
|
|
+ {
|
|
|
+ for(int idxDefPeriod=0;idxDefPeriod<limitDef;idxDefPeriod++)
|
|
|
+ {
|
|
|
+ if((defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxDefPeriod].Limit != -1) &&
|
|
|
+ (defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxDefPeriod].StartPeriod < durationReq))
|
|
|
+ {
|
|
|
+ if(maxProfile.ChargingProfileId != -1)
|
|
|
+ {
|
|
|
+ for(int idxMaxPeriod=0;idxMaxPeriod<limitMax;idxMaxPeriod++)
|
|
|
+ {
|
|
|
+ if(defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxDefPeriod].StartPeriod >= maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxMaxPeriod].StartPeriod)
|
|
|
+ {
|
|
|
+ tmpPeriod.StartPeriod = defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxDefPeriod].StartPeriod;
|
|
|
+ tmpPeriod.NumberPhases = defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxDefPeriod].NumberPhases;
|
|
|
+ tmpPeriod.Limit = (defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxDefPeriod].Limit>maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxMaxPeriod].Limit?maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxMaxPeriod].Limit:defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxDefPeriod].Limit);
|
|
|
+
|
|
|
+ if(tmpPeriod.Limit != compositeProfile->ChargingSchedule.ChargingSchedulePeriod[(compositePeriodIdx==0?compositePeriodIdx:compositePeriodIdx-1)].Limit)
|
|
|
+ {
|
|
|
+ if(tmpPeriod.StartPeriod != compositeProfile->ChargingSchedule.ChargingSchedulePeriod[(compositePeriodIdx==0?compositePeriodIdx:compositePeriodIdx-1)].StartPeriod)
|
|
|
+ {
|
|
|
+ memcpy(&compositeProfile->ChargingSchedule.ChargingSchedulePeriod[compositePeriodIdx], &tmpPeriod , sizeof(struct StructChargingSchedulePeriod));
|
|
|
+ compositePeriodIdx++;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ memcpy(&compositeProfile->ChargingSchedule.ChargingSchedulePeriod[(compositePeriodIdx==0?compositePeriodIdx:compositePeriodIdx-1)], &tmpPeriod , sizeof(struct StructChargingSchedulePeriod));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if(defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxDefPeriod].StartPeriod != compositeProfile->ChargingSchedule.ChargingSchedulePeriod[(compositePeriodIdx==0?compositePeriodIdx:compositePeriodIdx-1)].StartPeriod)
|
|
|
+ {
|
|
|
+ memcpy(&compositeProfile->ChargingSchedule.ChargingSchedulePeriod[compositePeriodIdx], &defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxDefPeriod],sizeof(struct StructChargingSchedulePeriod));
|
|
|
+ compositePeriodIdx++;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ memcpy(&compositeProfile->ChargingSchedule.ChargingSchedulePeriod[(compositePeriodIdx==0?compositePeriodIdx:compositePeriodIdx-1)], &defaultTxProfile.ChargingSchedule.ChargingSchedulePeriod[idxDefPeriod],sizeof(struct StructChargingSchedulePeriod));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // Fill other period by MaxProfile
|
|
|
+ if(maxProfile.ChargingProfileId != -1)
|
|
|
+ {
|
|
|
+ for(int idxMaxPeriod=0;idxMaxPeriod<limitMax;idxMaxPeriod++)
|
|
|
+ {
|
|
|
+ if((maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxMaxPeriod].Limit != -1) &&
|
|
|
+ (maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxMaxPeriod].StartPeriod < durationReq))
|
|
|
+ {
|
|
|
+ if((maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxMaxPeriod].StartPeriod >= compositeProfile->ChargingSchedule.ChargingSchedulePeriod[compositePeriodIdx==0?0:compositePeriodIdx-1].StartPeriod) &&
|
|
|
+ (maxProfile.ChargingSchedule.Duration > compositeProfile->ChargingSchedule.ChargingSchedulePeriod[compositePeriodIdx==0?0:compositePeriodIdx-1].StartPeriod))
|
|
|
+ {
|
|
|
+ tmpPeriod.StartPeriod = compositeProfile->ChargingSchedule.ChargingSchedulePeriod[compositePeriodIdx==0?0:compositePeriodIdx-1].StartPeriod;
|
|
|
+ tmpPeriod.NumberPhases = compositeProfile->ChargingSchedule.ChargingSchedulePeriod[compositePeriodIdx==0?0:compositePeriodIdx-1].NumberPhases;
|
|
|
+ tmpPeriod.Limit = maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxMaxPeriod].Limit;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(idxMaxPeriod == (limitMax-1))
|
|
|
+ {
|
|
|
+ if(maxProfile.ChargingSchedule.Duration > compositeProfile->ChargingSchedule.ChargingSchedulePeriod[compositePeriodIdx==0?0:compositePeriodIdx-1].StartPeriod)
|
|
|
+ {
|
|
|
+ tmpPeriod.StartPeriod = compositeProfile->ChargingSchedule.Duration;
|
|
|
+ tmpPeriod.NumberPhases = maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxMaxPeriod].NumberPhases;
|
|
|
+ tmpPeriod.Limit = maxProfile.ChargingSchedule.ChargingSchedulePeriod[idxMaxPeriod].Limit;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(tmpPeriod.Limit != -1)
|
|
|
+ {
|
|
|
+ if(tmpPeriod.Limit != compositeProfile->ChargingSchedule.ChargingSchedulePeriod[(compositePeriodIdx==0?compositePeriodIdx:compositePeriodIdx-1)].Limit)
|
|
|
+ {
|
|
|
+ if(tmpPeriod.StartPeriod != compositeProfile->ChargingSchedule.ChargingSchedulePeriod[(compositePeriodIdx==0?compositePeriodIdx:compositePeriodIdx-1)].StartPeriod)
|
|
|
+ {
|
|
|
+ memcpy(&compositeProfile->ChargingSchedule.ChargingSchedulePeriod[compositePeriodIdx], &tmpPeriod , sizeof(struct StructChargingSchedulePeriod));
|
|
|
+ compositePeriodIdx++;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ memcpy(&compositeProfile->ChargingSchedule.ChargingSchedulePeriod[(compositePeriodIdx==0?compositePeriodIdx:compositePeriodIdx-1)], &tmpPeriod , sizeof(struct StructChargingSchedulePeriod));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ DEBUG_INFO("Composite schedule start: %s\n", compositeProfile->ChargingSchedule.StartSchedule);
|
|
|
+ DEBUG_INFO("Composite schedule duration: %d\n", compositeProfile->ChargingSchedule.Duration);
|
|
|
+ DEBUG_INFO("Composite rate unit: %s\n", compositeProfile->ChargingSchedule.ChargingRateUnit);
|
|
|
+ for(int idxPeriod=0;idxPeriod<ARRAY_SIZE(compositeProfile->ChargingSchedule.ChargingSchedulePeriod);idxPeriod++)
|
|
|
+ {
|
|
|
+ if(compositeProfile->ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod >= 0)
|
|
|
+ {
|
|
|
+ DEBUG_INFO("Period-%02d startPeriod: %d\n", idxPeriod, compositeProfile->ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod);
|
|
|
+ DEBUG_INFO("Period-%02d limit: %f\n", idxPeriod, compositeProfile->ChargingSchedule.ChargingSchedulePeriod[idxPeriod].Limit);
|
|
|
+ DEBUG_INFO("Period-%02d NumberPhases: %d\n", idxPeriod, compositeProfile->ChargingSchedule.ChargingSchedulePeriod[idxPeriod].NumberPhases);
|
|
|
+ }
|
|
|
+
|
|
|
+ if(compositeProfile->ChargingSchedule.ChargingSchedulePeriod[idxPeriod].Limit == -1)
|
|
|
+ compositeProfile->ChargingSchedule.ChargingSchedulePeriod[idxPeriod].Limit =0;
|
|
|
+
|
|
|
+ if(compositeProfile->ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod == -1)
|
|
|
+ compositeProfile->ChargingSchedule.ChargingSchedulePeriod[idxPeriod].StartPeriod =0;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(line)
|
|
|
+ free(line);
|
|
|
+}
|
|
|
+
|
|
|
+//==========================================
|
|
|
+// Init all share memory
|
|
|
+//==========================================
|
|
|
+int InitShareMemory()
|
|
|
+{
|
|
|
+ int result = PASS;
|
|
|
+ int MeterSMId;
|
|
|
+
|
|
|
+ //creat ShmSysConfigAndInfo
|
|
|
+ if ((MeterSMId = shmget(ShmSysConfigAndInfoKey, sizeof(struct SysConfigAndInfo), 0777)) < 0)
|
|
|
+ {
|
|
|
+ DEBUG_ERROR("shmget ShmSysConfigAndInfo NG\n");
|
|
|
+ result = FAIL;
|
|
|
+ }
|
|
|
+ else if ((ShmSysConfigAndInfo = shmat(MeterSMId, NULL, 0)) == (void *) -1)
|
|
|
+ {
|
|
|
+ DEBUG_ERROR("shmat ShmSysConfigAndInfo NG\n");
|
|
|
+ result = FAIL;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {}
|
|
|
+
|
|
|
+ if ((MeterSMId = shmget(ShmStatusCodeKey, sizeof(struct StatusCodeData), 0777)) < 0)
|
|
|
+ {
|
|
|
+ DEBUG_ERROR("shmget ShmStatusCodeData NG\n");
|
|
|
+ result = FAIL;
|
|
|
+ }
|
|
|
+ else if ((ShmStatusCodeData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
|
|
|
+ {
|
|
|
+ DEBUG_ERROR("shmat ShmStatusCodeData NG\n");
|
|
|
+ result = FAIL;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {}
|
|
|
+
|
|
|
+ //creat ShmPsuData
|
|
|
+ if ((MeterSMId = shmget(ShmPsuKey, sizeof(struct PsuData), 0777)) < 0)
|
|
|
+ {
|
|
|
+ DEBUG_ERROR("shmget ShmPsuData NG\n");
|
|
|
+ result = FAIL;
|
|
|
+ }
|
|
|
+ else if ((ShmPsuData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
|
|
|
+ {
|
|
|
+ DEBUG_ERROR("shmat ShmPsuData NG\n");
|
|
|
+ result = FAIL;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {}
|
|
|
+
|
|
|
+ //creat ShmOCPP16Data
|
|
|
+ if ((MeterSMId = shmget(ShmOcppModuleKey, sizeof(struct OCPP16Data), 0777)) < 0)
|
|
|
+ {
|
|
|
+ DEBUG_ERROR("shmget ShmOCPP16Data NG");
|
|
|
+ result = FAIL;
|
|
|
+ }
|
|
|
+ else if ((ShmOCPP16Data = shmat(MeterSMId, NULL, 0)) == (void *) -1)
|
|
|
+ {
|
|
|
+ DEBUG_ERROR("shmat ShmOCPP16Data NG");
|
|
|
+ result = FAIL;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {}
|
|
|
+
|
|
|
+
|
|
|
+ /****************************** For Initial Settings************************************************/
|
|
|
+ ShmOCPP16Data->GetConfiguration.ResponseUnknownKey = NULL;
|
|
|
+ ShmOCPP16Data->SendLocalList.LocalAuthorizationList = NULL;
|
|
|
+
|
|
|
+ // allocate Configuration memory address
|
|
|
+ ShmOCPP16Data->GetConfiguration.Key = staticKeyArray;
|
|
|
+ ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey = staticResponseConfigurationKeyArray;
|
|
|
+ ShmOCPP16Data->GetConfiguration.ResponseUnknownKey = staticResponseUnknownKey;
|
|
|
+ ShmOCPP16Data->SendLocalList.LocalAuthorizationList = staticLocalAuthorizationList;
|
|
|
+
|
|
|
+ //offline MeterValue Interval
|
|
|
+ TempMeterValueInterval = 0;
|
|
|
+
|
|
|
+ return result;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+int ProcessShareMemory()
|
|
|
+{
|
|
|
+ if(InitShareMemory() == FAIL)
|
|
|
+ {
|
|
|
+ DEBUG_ERROR("InitShareMemory NG\n");
|
|
|
+
|
|
|
+ if(ShmStatusCodeData!=NULL)
|
|
|
+ {
|
|
|
+ ShmStatusCodeData->AlarmCode.AlarmEvents.bits.FailToCreateShareMemory=1;
|
|
|
+ }
|
|
|
+ sleep(5);
|
|
|
+ return FAIL;
|
|
|
+ }
|
|
|
+ return PASS;
|
|
|
+}
|
|
|
+
|
|
|
+//---------------------common routine---------------------------//
|
|
|
+int isOFFline(void)
|
|
|
+{
|
|
|
+ if(ShmSysConfigAndInfo->SysInfo.InternetConn == 0)
|
|
|
+ {
|
|
|
+ if(TempMeterValueInterval >= 2 )
|
|
|
+ {
|
|
|
+ TempMeterValueInterval = 0;
|
|
|
+ return TRUE;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ TempMeterValueInterval = TempMeterValueInterval+ 1;
|
|
|
+ return FALSE;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ return FALSE;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+//---------------------------------------------
|
|
|
+// new:
|
|
|
+// enum SYSTEM_STATUS
|
|
|
+// {
|
|
|
+// SYS_MODE_BOOTING = 0,
|
|
|
+// SYS_MODE_IDLE = 1,
|
|
|
+// SYS_MODE_AUTHORIZING = 2,
|
|
|
+// SYS_MODE_MODE_REASSIGN_CHECK = 3,
|
|
|
+// SYS_MODE_REASSIGN = 4,
|
|
|
+// SYS_MODE_PREPARING = 5,
|
|
|
+// SYS_MODE_PREPARE_FOR_EV = 6,
|
|
|
+// SYS_MODE_PREPARE_FOR_EVSE = 7,
|
|
|
+// SYS_MODE_CHARGING = 8,
|
|
|
+// SYS_MODE_TERMINATING = 9,
|
|
|
+// SYS_MODE_COMPLETE = 10,
|
|
|
+// SYS_MODE_ALARM = 11,
|
|
|
+// SYS_MODE_FAULT = 12,
|
|
|
+// SYS_MODE_RESERVATION = 13,
|
|
|
+// SYS_MODE_BOOKING = 14,
|
|
|
+// SYS_MODE_MAINTAIN = 15,
|
|
|
+// SYS_MODE_DEBUG = 16,
|
|
|
+// SYS_MODE_CCS_PRECHARGE_STEP0 = 17,
|
|
|
+// SYS_MODE_CCS_PRECHARGE_STEP1 = 18,
|
|
|
+// SYS_MODE_UPDATE = 19
|
|
|
+// };
|
|
|
+//
|
|
|
+//
|
|
|
+//-----------------------------------------
|
|
|
+
|
|
|
+void CheckSystemValue(void)
|
|
|
+{
|
|
|
+ int meterValueSend[CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY + AC_QUANTITY]={0};
|
|
|
+ //int IdleModeCnt = 0;
|
|
|
+ char filenmae[100]={0};
|
|
|
+ char str[100]={0};
|
|
|
+
|
|
|
+ //===============================
|
|
|
+ // send Heartbeat
|
|
|
+ //===============================
|
|
|
+ //HeartBeatWaitTime = ShmOCPP16Data->BootNotification.ResponseHeartbeatInterval;
|
|
|
+ if((difftime(time((time_t*)NULL), clientTime.Heartbeat) < 0) || (HeartBeatWaitTime <= 0))
|
|
|
+ {
|
|
|
+ clientTime.Heartbeat=time((time_t*)NULL);
|
|
|
+
|
|
|
+ if(server_sign == TRUE)
|
|
|
+ {
|
|
|
+ HeartBeatWaitTime = ShmOCPP16Data->BootNotification.ResponseHeartbeatInterval;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ HeartBeatWaitTime = atoi((char*)ShmOCPP16Data->ConfigurationTable.CoreProfile[HeartbeatInterval].ItemData);
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if((server_sign == TRUE) && (difftime(time((time_t*)NULL), clientTime.Heartbeat) >= HeartBeatWaitTime))
|
|
|
+ {
|
|
|
+ //parameter for test
|
|
|
+ sendHeartbeatRequest(0);
|
|
|
+ //==============================================
|
|
|
+ // Reset Waiting Time
|
|
|
+ //==============================================
|
|
|
+ clientTime.Heartbeat=time((time_t*)NULL);
|
|
|
+ HeartBeatWithNOResponse = HeartBeatWithNOResponse + 1;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ for(int gun_index=0;gun_index < gunTotalNumber ;gun_index++)
|
|
|
+ {
|
|
|
+ //===============================
|
|
|
+ // CSU Trigger Reset Conf
|
|
|
+ //===============================
|
|
|
+ if((server_sign == TRUE) && (ShmOCPP16Data->MsMsg.bits.ResetConf == 1))
|
|
|
+ {
|
|
|
+ sendResetConfirmation((char *)ShmOCPP16Data->Reset.guid, (char *)ShmOCPP16Data->Reset.ResponseStatus);
|
|
|
+ }
|
|
|
+
|
|
|
+ //===============================
|
|
|
+ // CSU Trigger Authorize Request
|
|
|
+ //===============================
|
|
|
+ if((server_sign == TRUE) && (ShmOCPP16Data->SpMsg.bits.AuthorizeReq == 1)&&(authorizeRetryTimes < 3))
|
|
|
+ {
|
|
|
+ sendAuthorizeRequest(0);
|
|
|
+ authorizeRetryTimes = authorizeRetryTimes + 1;
|
|
|
+
|
|
|
+ if(authorizeRetryTimes < 3)
|
|
|
+ ShmOCPP16Data->SpMsg.bits.AuthorizeReq = 0;
|
|
|
+
|
|
|
+ }
|
|
|
+ else if((server_sign == TRUE) && (ShmOCPP16Data->SpMsg.bits.AuthorizeReq == 1)&&(authorizeRetryTimes >= 3))
|
|
|
+ {
|
|
|
+ authorizeRetryTimes = 0;
|
|
|
+ ShmOCPP16Data->OcppConnStatus = 0; // ocpp offline
|
|
|
+ server_sign = FALSE;
|
|
|
+ }
|
|
|
+ else if((server_sign == FALSE) &&(strcmp((const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalAuthorizeOffline].ItemData, "TRUE") == 0)&&(strcmp((const char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemData, "TRUE") == 0)&&(ShmOCPP16Data->OcppConnStatus == 0)&& (ShmOCPP16Data->SpMsg.bits.AuthorizeReq == 1))
|
|
|
+ {
|
|
|
+ sendAuthorizeRequest(0);
|
|
|
+ }
|
|
|
+
|
|
|
+ //===============================
|
|
|
+ // CSU Trigger Smart Charging Profilw
|
|
|
+ //===============================
|
|
|
+ if(ShmOCPP16Data->CSUMsg.bits[gun_index].ChargingProfileReq == 1)
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->CSUMsg.bits[gun_index].ChargingProfileReq = 0;
|
|
|
+ checkCompositeSchedule(gun_index+1, 86400, &ShmOCPP16Data->SmartChargingProfile[gun_index]);
|
|
|
+ ShmOCPP16Data->CSUMsg.bits[gun_index].ChargingProfileConf = 1;
|
|
|
+ }
|
|
|
+
|
|
|
+ //==============================================
|
|
|
+ // Charger start transaction
|
|
|
+ //==============================================
|
|
|
+ if(/*(server_sign == TRUE) &&*/ (ShmOCPP16Data->CpMsg.bits[gun_index].StartTransactionReq == 1))
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->CpMsg.bits[gun_index].StartTransactionReq =0;
|
|
|
+ sendStartTransactionRequest(gun_index);
|
|
|
+ clientTime.StartTransaction = time((time_t*)NULL);
|
|
|
+ clientTime.MeterValues[gun_index] = time((time_t*)NULL);
|
|
|
+ }
|
|
|
+
|
|
|
+ //==============================================
|
|
|
+ // Charger stop transaction
|
|
|
+ //==============================================
|
|
|
+ if(/*(server_sign == TRUE) &&*/ ((ShmOCPP16Data->CpMsg.bits[gun_index].StopTransactionReq == 1)))
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->CpMsg.bits[gun_index].StopTransactionReq =0;
|
|
|
+ sendStopTransactionRequest(gun_index);
|
|
|
+ clientTime.StopTransaction = time((time_t*)NULL);
|
|
|
+ }
|
|
|
+
|
|
|
+ //==============================================
|
|
|
+ // Charger status report
|
|
|
+ //==============================================
|
|
|
+ //--- Check Mode Change ---//
|
|
|
+ // J: CHAdeMO U: CCS1 combo E: CCS2 combo G: GBT DCcc
|
|
|
+
|
|
|
+ if(gunType[gun_index] == 'J')
|
|
|
+ {
|
|
|
+ for (int index = 0; index < CHAdeMO_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == gun_index)
|
|
|
+ {
|
|
|
+ if((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus != ChademoPreviousSystemStatus[index]) || (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].ConnectorPlugIn != ChademoPreviousConnectorPlugIn[index]) )//if(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus != ChademoPreviousSystemStatus[index]/*PRE_SYS_MODE[gun_index]*/ )
|
|
|
+ {
|
|
|
+ //PRE_SYS_MODE[gun_index] = ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus;
|
|
|
+ ChademoPreviousSystemStatus[index] = ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus;
|
|
|
+ ChademoPreviousConnectorPlugIn[index] = ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].ConnectorPlugIn;
|
|
|
+ cpinitateMsg.bits[gun_index].StatusNotificationReq = 1;
|
|
|
+ statusModeChage[gun_index] = TRUE;
|
|
|
+ }
|
|
|
+
|
|
|
+ #if 1 // for TempStopTransaction
|
|
|
+ if((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_IDLE) && (ShmOCPP16Data->CpMsg.bits[gun_index].StopTransactionReq == 0))
|
|
|
+ {
|
|
|
+ checkTempStopTransaction(gun_index);
|
|
|
+ }
|
|
|
+ #endif
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
|
|
|
+ {
|
|
|
+ for (int index = 0; index < CCS_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == gun_index)
|
|
|
+ {
|
|
|
+ if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus != CcsPreviousSystemStatus[index]) || (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].ConnectorPlugIn != CcsPreviousConnectorPlugIn[index]) )//if(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus != CcsPreviousSystemStatus[index]/*PRE_SYS_MODE[gun_index]*/ )
|
|
|
+ {
|
|
|
+ //PRE_SYS_MODE[gun_index] = ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus;
|
|
|
+ CcsPreviousSystemStatus[index] = ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus;
|
|
|
+ CcsPreviousConnectorPlugIn[index] = ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].ConnectorPlugIn;
|
|
|
+ cpinitateMsg.bits[gun_index].StatusNotificationReq = 1;
|
|
|
+ statusModeChage[gun_index] = TRUE;
|
|
|
+ }
|
|
|
+
|
|
|
+ #if 1 // for TempStopTransaction
|
|
|
+ if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_IDLE) && (ShmOCPP16Data->CpMsg.bits[gun_index].StopTransactionReq == 0))
|
|
|
+ {
|
|
|
+ checkTempStopTransaction(gun_index);
|
|
|
+ }
|
|
|
+ #endif
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if(gunType[gun_index] == 'G')
|
|
|
+ {
|
|
|
+ for (int index = 0; index < GB_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == gun_index)
|
|
|
+ {
|
|
|
+ if((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus != GbPreviousSystemStatus[index]) || (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].ConnectorPlugIn != GbPreviousConnectorPlugIn[index]) )//if(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus != GbPreviousSystemStatus[index]/*PRE_SYS_MODE[gun_index]*/ )
|
|
|
+ {
|
|
|
+ //PRE_SYS_MODE[gun_index] = ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus;
|
|
|
+ GbPreviousSystemStatus[index] = ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus;
|
|
|
+ GbPreviousConnectorPlugIn[index] = ShmSysConfigAndInfo->SysInfo.GbChargingData[index].ConnectorPlugIn;
|
|
|
+ cpinitateMsg.bits[gun_index].StatusNotificationReq = 1;
|
|
|
+ statusModeChage[gun_index] = TRUE;
|
|
|
+ }
|
|
|
+
|
|
|
+ #if 1 // for TempStopTransaction
|
|
|
+ if((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_IDLE) && (ShmOCPP16Data->CpMsg.bits[gun_index].StopTransactionReq == 0))
|
|
|
+ {
|
|
|
+ checkTempStopTransaction(gun_index);
|
|
|
+ }
|
|
|
+ #endif
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ for (int index = 0; index < AC_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == gun_index)
|
|
|
+ {
|
|
|
+ if((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus != AcPreviousSystemStatus[index]) || (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PilotState != AcPreviousConnectorPlugIn[index]) )//if(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus != AcPreviousSystemStatus[index]/*PRE_SYS_MODE[gun_index]*/ )
|
|
|
+ {
|
|
|
+ //PRE_SYS_MODE[gun_index] = ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus;
|
|
|
+ AcPreviousSystemStatus[index] = ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus;
|
|
|
+ AcPreviousConnectorPlugIn[index] = ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PilotState;
|
|
|
+ cpinitateMsg.bits[gun_index].StatusNotificationReq = 1;
|
|
|
+ statusModeChage[gun_index] = TRUE;
|
|
|
+ }
|
|
|
+
|
|
|
+ #if 1 // for TempStopTransaction
|
|
|
+ if((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == gun_index)&&(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_IDLE) && (ShmOCPP16Data->CpMsg.bits[gun_index].StopTransactionReq == 0))
|
|
|
+ {
|
|
|
+ checkTempStopTransaction(gun_index);
|
|
|
+ }
|
|
|
+ #endif
|
|
|
+ }
|
|
|
+ }// END
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ if(((server_sign == TRUE) && (SystemInitial > 0)) ||
|
|
|
+ ((server_sign == TRUE) && ((statusModeChage[gun_index] == TRUE) || ((time((time_t*)NULL)-clientTime.StatusNotification[gun_index]) > (server_cycle_Status + (GunStatusInterval*gun_index))) || ((cpinitateMsg.bits[gun_index].StatusNotificationReq == 1) && ((time((time_t*)NULL)-clientTime.StatusNotification[gun_index]) > 30)))) )
|
|
|
+ {
|
|
|
+ if(SystemInitial > 0)
|
|
|
+ SystemInitial = SystemInitial -1;
|
|
|
+
|
|
|
+ sendStatusNotificationRequest(gun_index);
|
|
|
+ clientTime.StatusNotification[gun_index] = time((time_t*)NULL);
|
|
|
+ statusModeChage[gun_index] = FALSE;
|
|
|
+ }
|
|
|
+
|
|
|
+ //==============================================
|
|
|
+ // Meter report
|
|
|
+ //==============================================
|
|
|
+ if(/*(server_sign == TRUE) &&*/(isOFFline() == TRUE) || ((time((time_t*)NULL) - clientTime.MeterValues[gun_index])> (atoi((const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValueSampleInterval].ItemData)- 1 ) ) )
|
|
|
+ {
|
|
|
+ //check Transaction active
|
|
|
+ if(gunType[gun_index] == 'J')
|
|
|
+ {
|
|
|
+ for (int index = 0; index < CHAdeMO_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ // 0: Booting, 1: idle, 2: authorizing, 3: preparing, 4: charging, 5: terminating, 6: alarm, 7: fault
|
|
|
+ if ((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == gun_index)&&(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_CHARGING))
|
|
|
+ {
|
|
|
+ meterValueSend[gun_index] =1;
|
|
|
+ }
|
|
|
+
|
|
|
+ if((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == gun_index)&&(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_COMPLETE)) // complete
|
|
|
+ {
|
|
|
+ sprintf(filenmae,"/Storage/OCPP/TxProfile_%d.json",(gun_index+1));
|
|
|
+ if((access(filenmae,F_OK))!=-1)
|
|
|
+ {
|
|
|
+ DEBUG_INFO("TxProfile exist. OCPP will delete TX Charging Profile\n");
|
|
|
+
|
|
|
+ sprintf(str,"rm -f %s",filenmae);
|
|
|
+ system(str);
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ }// End for CHAdeMO
|
|
|
+ }
|
|
|
+ else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
|
|
|
+ {
|
|
|
+ for (int index = 0; index < CCS_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ // 0: Booting, 1: idle, 2: authorizing, 3: preparing, 4: charging, 5: terminating, 6: alarm, 7: fault
|
|
|
+ if ((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == gun_index)&&(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_CHARGING))
|
|
|
+ {
|
|
|
+ meterValueSend[gun_index] =1;
|
|
|
+ }
|
|
|
+
|
|
|
+ if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == gun_index)&&(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_COMPLETE)) // complete
|
|
|
+ {
|
|
|
+ sprintf(filenmae,"/Storage/OCPP/TxProfile_%d.json",(gun_index+1));
|
|
|
+ if((access(filenmae,F_OK))!=-1)
|
|
|
+ {
|
|
|
+ DEBUG_INFO("TxProfile exist. OCPP will delete TX Charging Profile\n");
|
|
|
+ sprintf(str,"rm -f %s",filenmae);
|
|
|
+ system(str);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } // End for CCS
|
|
|
+ }
|
|
|
+ else if(gunType[gun_index] == 'G')
|
|
|
+ {
|
|
|
+ for (int index = 0; index < GB_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ // 0: Booting, 1: idle, 2: authorizing, 3: preparing, 4: charging, 5: terminating, 6: alarm, 7: fault
|
|
|
+ if ((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == gun_index)&&(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_CHARGING))
|
|
|
+ {
|
|
|
+ meterValueSend[gun_index] =1;
|
|
|
+ }
|
|
|
+
|
|
|
+ if((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == gun_index)&&(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_COMPLETE)) // complete
|
|
|
+ {
|
|
|
+ sprintf(filenmae,"/Storage/OCPP/TxProfile_%d.json",(gun_index+1));
|
|
|
+ if((access(filenmae,F_OK))!=-1)
|
|
|
+ {
|
|
|
+ DEBUG_INFO("TxProfile exist. OCPP will delete TX Charging Profile\n");
|
|
|
+ sprintf(str,"rm -f %s",filenmae);
|
|
|
+ system(str);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }// End for GB
|
|
|
+
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ for (int index = 0; index < AC_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ // 0: Booting, 1: idle, 2: authorizing, 3: preparing, 4: charging, 5: terminating, 6: alarm, 7: fault
|
|
|
+ if ((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == gun_index)&&(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_CHARGING))
|
|
|
+ {
|
|
|
+ meterValueSend[gun_index] =1;
|
|
|
+ }
|
|
|
+
|
|
|
+ if((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == gun_index)&&(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_COMPLETE)) // complete
|
|
|
+ {
|
|
|
+ sprintf(filenmae,"/Storage/OCPP/TxProfile_%d.json",(gun_index+1));
|
|
|
+ if((access(filenmae,F_OK))!=-1)
|
|
|
+ {
|
|
|
+ DEBUG_INFO("TxProfile exist. OCPP will delete TX Charging Profile\n");
|
|
|
+
|
|
|
+ sprintf(str,"rm -f %s",filenmae);
|
|
|
+ system(str);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }//End for AC
|
|
|
+ }
|
|
|
+
|
|
|
+ clientTime.MeterValues[gun_index] = time((time_t*)NULL);
|
|
|
+
|
|
|
+ if(meterValueSend[gun_index] == 1)
|
|
|
+ {
|
|
|
+ sendMeterValuesRequest(gun_index);
|
|
|
+#if 1 // for TempStopTransaction
|
|
|
+ storeTempStopTransaction(gun_index);
|
|
|
+#endif
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ //==============================================
|
|
|
+ // Check Connector reserved
|
|
|
+ //==============================================
|
|
|
+
|
|
|
+ //===============================
|
|
|
+ // Check if Reserve is expired
|
|
|
+ //===============================
|
|
|
+ if((server_sign == TRUE) && (ShmOCPP16Data->ReserveNow[gun_index].ExpiryDate[0] != 0) )
|
|
|
+ {
|
|
|
+ double diff_t;
|
|
|
+ struct tm tp;
|
|
|
+ // current time
|
|
|
+ time_t t = time(NULL);
|
|
|
+ strptime((char *)ShmOCPP16Data->ReserveNow[gun_index].ExpiryDate, "%Y-%m-%dT%H:%M:%S", &tp);
|
|
|
+ tp.tm_isdst = -1;
|
|
|
+ time_t utc = mktime(&tp);
|
|
|
+ diff_t = difftime(utc, t);
|
|
|
+
|
|
|
+ if(diff_t <= 0)
|
|
|
+ {
|
|
|
+ DEBUG_INFO("reserve expired.\n");
|
|
|
+ memset(ShmOCPP16Data->ReserveNow[gun_index].ExpiryDate,0,sizeof(ShmOCPP16Data->ReserveNow[gun_index].ExpiryDate));
|
|
|
+ }
|
|
|
+
|
|
|
+ }//END OF Check if Reserve is expired
|
|
|
+
|
|
|
+ //==========================================
|
|
|
+ // csu trigger FirmwareStatusNotificationReq
|
|
|
+ //==========================================
|
|
|
+ if((server_sign == TRUE) && (ShmOCPP16Data->SpMsg.bits.FirmwareStatusNotificationReq == 1))
|
|
|
+ {
|
|
|
+ sendFirmwareStatusNotificationRequest((char *)ShmOCPP16Data->FirmwareStatusNotification.Status);
|
|
|
+ }
|
|
|
+
|
|
|
+ //==========================================
|
|
|
+ // csu trigger CancelReservationConf
|
|
|
+ //==========================================
|
|
|
+ if((server_sign == TRUE) && (ShmOCPP16Data->CsMsg.bits[gun_index].CancelReservationConf == 1))
|
|
|
+ {
|
|
|
+ sendCancelReservationConfirmation((char *)ShmOCPP16Data->CancelReservation[gun_index].guid,(char *)ShmOCPP16Data->CancelReservation[gun_index].ResponseStatus);
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ //==========================================
|
|
|
+ // csu trigger ChangeAvailabilityConf
|
|
|
+ //==========================================
|
|
|
+ if((server_sign == TRUE) && (ShmOCPP16Data->CsMsg.bits[gun_index].ChangeAvailabilityConf == 1))
|
|
|
+ {
|
|
|
+ //sendChangeAvailabilityConfirmation(,(char *)ShmOCPP16Data->ChangeAvailability[gun_index].ResponseStatus);
|
|
|
+ }
|
|
|
+
|
|
|
+ //==========================================
|
|
|
+ // csu trigger UnlockConnectorConf
|
|
|
+ //==========================================
|
|
|
+ if((server_sign == TRUE) && (ShmOCPP16Data->CsMsg.bits[gun_index].UnlockConnectorConf == 1))
|
|
|
+ {
|
|
|
+ sendUnlockConnectorConfirmation((char *)ShmOCPP16Data->UnlockConnector[gun_index].guid, (char *)ShmOCPP16Data->UnlockConnector[gun_index].ResponseStatus);
|
|
|
+ ShmOCPP16Data->CsMsg.bits[gun_index].UnlockConnectorConf = 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ //==========================================
|
|
|
+ // csu trigger ReserveNowConf
|
|
|
+ //==========================================
|
|
|
+ if((server_sign == TRUE) &&(ShmOCPP16Data->CsMsg.bits[gun_index].ReserveNowConf == 1))
|
|
|
+ {
|
|
|
+ sendReserveNowTransactionConfirmation((char *)ShmOCPP16Data->ReserveNow[gun_index].guid, (char *)ShmOCPP16Data->ReserveNow[gun_index].ResponseStatus);
|
|
|
+ ShmOCPP16Data->CsMsg.bits[gun_index].ReserveNowConf = 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ //==========================================
|
|
|
+ // csu trigger DataTransferReq
|
|
|
+ //==========================================
|
|
|
+ if((server_sign == TRUE) &&(ShmOCPP16Data->CsMsg.bits[gun_index].DataTransferReq == 1))
|
|
|
+ {
|
|
|
+ sendDataTransferRequest(gun_index);
|
|
|
+ ShmOCPP16Data->CsMsg.bits[gun_index].DataTransferReq = 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+//==========================================
|
|
|
+// send request routine
|
|
|
+//==========================================
|
|
|
+int sendAuthorizeRequest(int gun_index)
|
|
|
+{
|
|
|
+
|
|
|
+ mtrace();
|
|
|
+ int result = FAIL;
|
|
|
+ char message[100]={0};
|
|
|
+ char guid[37];
|
|
|
+ char tempdata[65]={0};
|
|
|
+
|
|
|
+ DEBUG_INFO("sendAuthorizeRequest...\n");
|
|
|
+ memset(&(ShmOCPP16Data->Authorize.ResponseIdTagInfo),0,sizeof(struct StructIdTagInfo));
|
|
|
+
|
|
|
+ //Local Authorize
|
|
|
+ if ((strcmp((const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AllowOfflineTxForUnknownId].ItemData , "TRUE")==0) &&(ShmOCPP16Data->OcppConnStatus == 0))
|
|
|
+ {
|
|
|
+ DEBUG_INFO("Allow OfflineTx UnknownId Pass !!!!\n");
|
|
|
+ strcpy((char *)ShmOCPP16Data->Authorize.ResponseIdTagInfo.ExpiryDate, "");
|
|
|
+ strcpy((char *)ShmOCPP16Data->Authorize.ResponseIdTagInfo.ParentIdTag, "");
|
|
|
+ strcpy((char *)ShmOCPP16Data->Authorize.ResponseIdTagInfo.Status, "Accepted");
|
|
|
+ result = PASS;
|
|
|
+ ShmOCPP16Data->SpMsg.bits.AuthorizeReq = 0;
|
|
|
+ ShmOCPP16Data->SpMsg.bits.AuthorizeConf = 1; // inform csu
|
|
|
+ authorizeRetryTimes = 0;
|
|
|
+ return result;
|
|
|
+
|
|
|
+ }
|
|
|
+ else if(((strcmp((const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalAuthorizeOffline].ItemData, "TRUE") == 0)&&(strcmp((const char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemData, "TRUE") == 0)&&(ShmOCPP16Data->OcppConnStatus == 0))||
|
|
|
+ ((strcmp((const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalPreAuthorize].ItemData, "TRUE") == 0)&&(strcmp((const char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemData, "TRUE") == 0)))
|
|
|
+ {
|
|
|
+ OCPP_getIdTag((char *)ShmSysConfigAndInfo->SysConfig.UserId);
|
|
|
+ if((strcmp(idTagQuery.idTagstr,"") == 0) || (strcmp(idTagQuery.idTagstatus,"Accepted") != 0) )
|
|
|
+ {
|
|
|
+ if(strcmp(idTagQuery.idTagstr,"") == 0)
|
|
|
+ {
|
|
|
+ DEBUG_INFO("offline Local Authorization Fail !!!!, Card %s is blank!!!!\n", idTagQuery.idTagstr);
|
|
|
+ }
|
|
|
+
|
|
|
+ if(strcmp(idTagQuery.idTagstatus,"Accepted") != 0)
|
|
|
+ {
|
|
|
+ DEBUG_INFO("offline Local Authorization Fail !!!!, Card %s is not Accepted!!!!\n", idTagQuery.idTagstr);
|
|
|
+ }
|
|
|
+
|
|
|
+ DEBUG_INFO("offline Local Authorization Fail !!!!\n");
|
|
|
+ strcpy((char *)ShmOCPP16Data->Authorize.ResponseIdTagInfo.ExpiryDate, "");
|
|
|
+ strcpy((char *)ShmOCPP16Data->Authorize.ResponseIdTagInfo.ParentIdTag, (const char *)ShmSysConfigAndInfo->SysConfig.UserId);
|
|
|
+ strcpy((char *)ShmOCPP16Data->Authorize.ResponseIdTagInfo.Status, "Invalid");
|
|
|
+ ShmOCPP16Data->SpMsg.bits.AuthorizeReq = 0;
|
|
|
+ ShmOCPP16Data->SpMsg.bits.AuthorizeConf = 1; // inform csu
|
|
|
+ authorizeRetryTimes = 0;
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ DEBUG_INFO("offline Local Authorization Pass !!!!\n");
|
|
|
+ strcpy((char *)ShmOCPP16Data->Authorize.ResponseIdTagInfo.ExpiryDate, idTagQuery.expiryDate);
|
|
|
+ strcpy((char *)ShmOCPP16Data->Authorize.ResponseIdTagInfo.ParentIdTag, (const char *)ShmSysConfigAndInfo->SysConfig.UserId);
|
|
|
+ strcpy((char *)ShmOCPP16Data->Authorize.ResponseIdTagInfo.Status, idTagQuery.idTagstatus);
|
|
|
+ result = PASS;
|
|
|
+ ShmOCPP16Data->SpMsg.bits.AuthorizeReq = 0;
|
|
|
+ ShmOCPP16Data->SpMsg.bits.AuthorizeConf = 1; // inform csu
|
|
|
+ authorizeRetryTimes = 0;
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //initailize struct Authorize
|
|
|
+ memset(&(ShmOCPP16Data->Authorize), 0 , sizeof(struct StructAuthorize));
|
|
|
+
|
|
|
+ //get data from shared memory
|
|
|
+ strcpy((char *)ShmOCPP16Data->Authorize.IdTag, (const char *)ShmSysConfigAndInfo->SysConfig.UserId);
|
|
|
+
|
|
|
+ random_uuid(guid);
|
|
|
+ sprintf(message,"[%d,\"%s\",\"Authorize\",{\"idTag\":\"%s\"}]",MESSAGE_TYPE_CALL, guid, ShmOCPP16Data->Authorize.IdTag);
|
|
|
+ LWS_Send(message);
|
|
|
+
|
|
|
+ sprintf(tempdata, "Authorize,%d", gun_index);
|
|
|
+ if(hashmap_operation(HASH_OP_ADD, guid, tempdata) == 1)
|
|
|
+ {
|
|
|
+ result = PASS;
|
|
|
+ DEBUG_INFO("Authorize mapItem pass\n");
|
|
|
+ }
|
|
|
+
|
|
|
+ ShmOCPP16Data->SpMsg.bits.AuthorizeReq = 0;
|
|
|
+ return result;
|
|
|
+}
|
|
|
+
|
|
|
+int sendBootNotificationRequest(void)
|
|
|
+{
|
|
|
+ mtrace();
|
|
|
+ int result = FAIL;
|
|
|
+ char message[500]={0}, payload[700]={0};
|
|
|
+ char guid[37]={0};
|
|
|
+ char tempdata[65]={0};
|
|
|
+ int IsGunCharging = FALSE;
|
|
|
+
|
|
|
+ //check Transaction active
|
|
|
+ for (int index = 0; index < CHAdeMO_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_CHARGING) //S_CHARGING
|
|
|
+ {
|
|
|
+ IsGunCharging = TRUE;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < CCS_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_CHARGING) //S_CHARGING
|
|
|
+ {
|
|
|
+ IsGunCharging = TRUE;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < GB_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_CHARGING) //S_CHARGING
|
|
|
+ {
|
|
|
+ IsGunCharging = TRUE;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < AC_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_CHARGING) //S_CHARGING
|
|
|
+ {
|
|
|
+ IsGunCharging = TRUE;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if(IsGunCharging == TRUE)
|
|
|
+ {
|
|
|
+ server_sign = TRUE;
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ // Fill BootNotification fields
|
|
|
+ strcpy((char *)ShmOCPP16Data->BootNotification.CbSN,(const char *)ShmOCPP16Data->ChargeBoxId);
|
|
|
+ strcpy((char *)ShmOCPP16Data->BootNotification.CpModel,(const char *)ShmSysConfigAndInfo->SysConfig.ModelName);
|
|
|
+ strcpy((char *)ShmOCPP16Data->BootNotification.CpSN,(const char *)ShmSysConfigAndInfo->SysConfig.SerialNumber);
|
|
|
+ strcpy((char *)ShmOCPP16Data->BootNotification.CpVendor,(const char *)ShmSysConfigAndInfo->SysConfig.chargePointVendor);
|
|
|
+ strcpy((char *)ShmOCPP16Data->BootNotification.CpFwVersion,(const char *)ShmSysConfigAndInfo->SysInfo.CsuRootFsFwRev);
|
|
|
+ strcpy((char *)ShmOCPP16Data->BootNotification.CpIccid,(const char *)ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomSimIccid);
|
|
|
+ strcpy((char *)ShmOCPP16Data->BootNotification.CpImsi,(const char *)ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomSimImsi);
|
|
|
+
|
|
|
+ sprintf(payload, "{\"chargeBoxSerialNumber\":\"%s\",\"chargePointModel\":\"%s\",\"chargePointSerialNumber\":\"%s\",\"chargePointVendor\":\"%s\",\"firmwareVersion\":\"%s\",\"iccid\":\"%s\",\"imsi\":\"%s\"} ",
|
|
|
+ ShmOCPP16Data->ChargeBoxId
|
|
|
+ ,ShmSysConfigAndInfo->SysConfig.ModelName
|
|
|
+ ,ShmSysConfigAndInfo->SysConfig.SerialNumber
|
|
|
+ ,ShmSysConfigAndInfo->SysConfig.chargePointVendor
|
|
|
+ ,ShmOCPP16Data->BootNotification.CpFwVersion
|
|
|
+ ,ShmOCPP16Data->BootNotification.CpIccid
|
|
|
+ ,ShmOCPP16Data->BootNotification.CpImsi);
|
|
|
+
|
|
|
+ random_uuid(guid);
|
|
|
+
|
|
|
+ sprintf(message,"[%d,\"%s\",\"%s\",%s]",MESSAGE_TYPE_CALL, guid, "BootNotification", payload);
|
|
|
+ LWS_Send(message);
|
|
|
+ sprintf(tempdata, "BootNotification,0");
|
|
|
+ if(hashmap_operation(HASH_OP_ADD, guid, tempdata) == 1)//if(hashmap_operation(0,NULL/*hashMap*/, guid,mapItem, tempdata/*(void**)(&mapItem)*//*(void**)(&mapItem)*/) == MAP_OK/*hashmap_put(hashMap, mapItem->key_string, mapItem) == MAP_OK*/)
|
|
|
+ {
|
|
|
+ result = PASS;
|
|
|
+ }
|
|
|
+
|
|
|
+ memset(queuedata, 0, sizeof(queuedata));
|
|
|
+ strcpy(queuedata,message);
|
|
|
+
|
|
|
+ return result;
|
|
|
+}
|
|
|
+
|
|
|
+int sendDataTransferRequest(int gun_index)
|
|
|
+{
|
|
|
+ mtrace();
|
|
|
+ char message[1000]={0};
|
|
|
+ char guid[37]={0};
|
|
|
+ char tempdata[65]={0};
|
|
|
+ int result = FAIL;
|
|
|
+
|
|
|
+//[2,"696e8a35-f394-45e3-a0c7-7098b86f38a6","DataTransfer",{"vendorId":"Phihong","messageId":"FeePerKWH","data":"1"}]
|
|
|
+
|
|
|
+ random_uuid(guid);
|
|
|
+
|
|
|
+ sprintf(message,"[%d,\"%s\",\"DataTransfer\",{\"vendorId\":\"%s\",\"messageId\":\"%s\",\"data\":\"%s\"}]",
|
|
|
+ MESSAGE_TYPE_CALL,
|
|
|
+ guid,
|
|
|
+ ShmOCPP16Data->DataTransfer[gun_index].VendorId,
|
|
|
+ ShmOCPP16Data->DataTransfer[gun_index].MessageId,
|
|
|
+ ShmOCPP16Data->DataTransfer[gun_index].Data);
|
|
|
+
|
|
|
+ LWS_Send(message);
|
|
|
+
|
|
|
+ sprintf(tempdata, "DataTransfer,%d", (gun_index + 1));
|
|
|
+ if(hashmap_operation(HASH_OP_ADD, guid, tempdata) == 1)
|
|
|
+ {
|
|
|
+ result = PASS;
|
|
|
+ DEBUG_INFO("DataTransfer mapItem pass\n");
|
|
|
+ }
|
|
|
+
|
|
|
+ return result;
|
|
|
+}
|
|
|
+
|
|
|
+int sendFirmwareVersionByDataTransfer(void)
|
|
|
+{
|
|
|
+ int8_t result = FAIL;
|
|
|
+ json_object *FirmwareDataTransfer = json_object_new_object();
|
|
|
+
|
|
|
+ // AC & DC model
|
|
|
+ json_object_object_add(FirmwareDataTransfer, "CsuBootLoadFwRev", json_object_new_string((char*)ShmSysConfigAndInfo->SysInfo.CsuBootLoadFwRev));
|
|
|
+ json_object_object_add(FirmwareDataTransfer, "CsuKernelFwRev", json_object_new_string((char*)ShmSysConfigAndInfo->SysInfo.CsuKernelFwRev));
|
|
|
+ json_object_object_add(FirmwareDataTransfer, "CsuRootFsFwRev", json_object_new_string((char*)ShmSysConfigAndInfo->SysInfo.CsuRootFsFwRev));
|
|
|
+ json_object_object_add(FirmwareDataTransfer, "CsuPrimFwRev", json_object_new_string((char*)ShmSysConfigAndInfo->SysInfo.CsuPrimFwRev));
|
|
|
+
|
|
|
+ // DC model
|
|
|
+ if((ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D'))
|
|
|
+ {
|
|
|
+ json_object_object_add(FirmwareDataTransfer, "FanModuleFwRev", json_object_new_string((char*)ShmSysConfigAndInfo->SysInfo.FanModuleFwRev));
|
|
|
+ json_object_object_add(FirmwareDataTransfer, "RelayModuleFwRev", json_object_new_string((char*)ShmSysConfigAndInfo->SysInfo.RelayModuleFwRev));
|
|
|
+ json_object_object_add(FirmwareDataTransfer, "LedModuleFwRev", json_object_new_string((char*)ShmSysConfigAndInfo->SysInfo.LedModuleFwRev));
|
|
|
+ json_object_object_add(FirmwareDataTransfer, "Connector1FwRev", json_object_new_string((char*)ShmSysConfigAndInfo->SysInfo.Connector1FwRev));
|
|
|
+ }
|
|
|
+
|
|
|
+ if((ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D') &&
|
|
|
+ ((gunType[1] != '0') || (gunType[2] != '0') || (gunType[3] != '0')))
|
|
|
+ {
|
|
|
+ json_object_object_add(FirmwareDataTransfer, "Connector2FwRev", json_object_new_string((char*)ShmSysConfigAndInfo->SysInfo.Connector2FwRev));
|
|
|
+ }
|
|
|
+
|
|
|
+ // 4G model
|
|
|
+ if((ShmSysConfigAndInfo->SysConfig.ModelName[10]=='T'))
|
|
|
+ {
|
|
|
+ json_object_object_add(FirmwareDataTransfer, "TelcomModemFwRev", json_object_new_string((char*)ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomSoftwareVer));
|
|
|
+ }
|
|
|
+
|
|
|
+ sprintf((char*)ShmOCPP16Data->DataTransfer[0].VendorId, "Phihong Technology");
|
|
|
+ sprintf((char*)ShmOCPP16Data->DataTransfer[0].MessageId, "ID_FirmwareVersion");
|
|
|
+ sprintf((char*)ShmOCPP16Data->DataTransfer[0].Data, json_object_to_json_string(FirmwareDataTransfer));
|
|
|
+
|
|
|
+ if(sendDataTransferRequest(0))
|
|
|
+ {
|
|
|
+ result = PASS;
|
|
|
+ }
|
|
|
+
|
|
|
+ return result;
|
|
|
+}
|
|
|
+
|
|
|
+int sendDiagnosticsStatusNotificationRequest(char *status)
|
|
|
+{
|
|
|
+ mtrace();
|
|
|
+ int result = FAIL;
|
|
|
+ char message[110]={0};
|
|
|
+ char guid[37]={0};
|
|
|
+ char tempdata[65]={0};
|
|
|
+
|
|
|
+ //[ 2, "9f7bced1-b8b1-40ec-b3bb-2e15630e3cdc", "DiagnosticsStatusNotification", { "status": "Idle" } ]
|
|
|
+
|
|
|
+ DEBUG_INFO("sendDiagnosticsStatusNotificationRequest \n");
|
|
|
+ sprintf((char *)ShmOCPP16Data->DiagnosticsStatusNotification.Status,"%s",(const char *)status);
|
|
|
+ random_uuid(guid);
|
|
|
+
|
|
|
+ sprintf(message,"[%d,\"%s\",\"DiagnosticsStatusNotification\",{\"status\":\"%s\"}]",MESSAGE_TYPE_CALL, guid,status);
|
|
|
+ LWS_Send(message);
|
|
|
+
|
|
|
+ sprintf(tempdata, "DiagnosticsStatusNotification,%d", 0);
|
|
|
+
|
|
|
+ if(hashmap_operation(HASH_OP_ADD, guid, tempdata) == 1)
|
|
|
+ {
|
|
|
+ result = PASS;
|
|
|
+ //DEBUG_INFO("DiagnosticsStatusNotification mapItem pass\n");
|
|
|
+ }
|
|
|
+
|
|
|
+ //#ifdef SystemLogMessage
|
|
|
+ //DEBUG_INFO(">>>>>DiagnosticsStatusNotification request\n");
|
|
|
+ //DEBUG_INFO("Message: %s\n", SendBuffer);
|
|
|
+ //DEBUG_INFO("After push hash length: %d\n", hashmapForMessageLength()/*hashmap_length(hashMap)*/);
|
|
|
+ //#endif
|
|
|
+
|
|
|
+ ShmOCPP16Data->SpMsg.bits.DiagnosticsStatusNotificationReq = 0;
|
|
|
+ ShmOCPP16Data->SpMsg.bits.DiagnosticsStatusNotificationConf = 0;
|
|
|
+
|
|
|
+ //record status
|
|
|
+ if(strcmp(status,"Idle")==0)
|
|
|
+ {
|
|
|
+ DiagnosticsStatusNotificationStatus = DIAGNOSTIC_STATUS_IDLE;
|
|
|
+ }
|
|
|
+ else if(strcmp(status,"Uploaded")==0)
|
|
|
+ {
|
|
|
+ DiagnosticsStatusNotificationStatus = DIAGNOSTIC_STATUS_UPLOADED;
|
|
|
+ }
|
|
|
+ else if(strcmp(status,"UploadFailed")==0)
|
|
|
+ {
|
|
|
+ DiagnosticsStatusNotificationStatus = DIAGNOSTIC_STATUS_UPLOAD_FAIL;
|
|
|
+ }
|
|
|
+ else if(strcmp(status,"Uploading")==0)
|
|
|
+ {
|
|
|
+ DiagnosticsStatusNotificationStatus = DIAGNOSTIC_STATUS_UPLOADING;
|
|
|
+ }
|
|
|
+
|
|
|
+ return result;
|
|
|
+}
|
|
|
+
|
|
|
+int sendFirmwareStatusNotificationRequest(char *status)
|
|
|
+{
|
|
|
+ mtrace();
|
|
|
+ int result = FAIL;
|
|
|
+ char message[110]={0};
|
|
|
+ char guid[37]={0};
|
|
|
+ char tempdata[65]={0};
|
|
|
+
|
|
|
+// [ 2, "eb841424-ae56-42b0-8c84-d5296018c33c", "FirmwareStatusNotification", { "status": "Downloaded" } ]
|
|
|
+
|
|
|
+ DEBUG_INFO("sendFirmwareStatusNotificationRequest \n");
|
|
|
+ sprintf((char *)ShmOCPP16Data->FirmwareStatusNotification.Status, "%s", (const char *)status);
|
|
|
+ random_uuid(guid);
|
|
|
+
|
|
|
+ sprintf(message,"[%d,\"%s\",\"FirmwareStatusNotification\",{\"status\":\"%s\"}]",MESSAGE_TYPE_CALL, guid, status);
|
|
|
+ LWS_Send(message);
|
|
|
+
|
|
|
+ sprintf(tempdata, "FirmwareStatusNotification,%d", 0);
|
|
|
+
|
|
|
+ if(hashmap_operation(HASH_OP_ADD, guid, tempdata) == 1)//if(hashmap_operation(0,NULL/*hashMap*/, mapItem[0].key_string, mapItem[0].key_value/*mapItem*/, (void**)(&mapItem)/*(void**)(&mapItem)*/) == MAP_OK/*hashmap_put(hashMap, mapItem->key_string, mapItem) == MAP_OK*/)
|
|
|
+ {
|
|
|
+ result = PASS;
|
|
|
+ DEBUG_INFO("FirmwareStatusNotification mapItem pass\n");
|
|
|
+ }
|
|
|
+
|
|
|
+ //#ifdef SystemLogMessage
|
|
|
+ //DEBUG_INFO(">>>>>FirmwareStatusNotification request\n");
|
|
|
+ //DEBUG_INFO("Message: %s\n", SendBuffer);
|
|
|
+ //#endif
|
|
|
+
|
|
|
+ ShmOCPP16Data->SpMsg.bits.FirmwareStatusNotificationReq = 0;
|
|
|
+ ShmOCPP16Data->SpMsg.bits.FirmwareStatusNotificationConf = 0;
|
|
|
+
|
|
|
+ //record status
|
|
|
+ if(strcmp(status,"Downloaded")==0)
|
|
|
+ {
|
|
|
+ FirmwareStatusNotificationStatus = FIRMWARE_STATUS_DOWNLOADED;
|
|
|
+ }
|
|
|
+ else if(strcmp(status,"DownloadFailed")==0)
|
|
|
+ {
|
|
|
+ FirmwareStatusNotificationStatus = FIRMWARE_STATUS_DOWNLOAD_DAILED;
|
|
|
+ }
|
|
|
+ else if(strcmp(status,"Downloading")==0)
|
|
|
+ {
|
|
|
+ FirmwareStatusNotificationStatus = FIRMWARE_STATUS_DOWNLOADING;
|
|
|
+ }
|
|
|
+ else if(strcmp(status,"Idle")==0)
|
|
|
+ {
|
|
|
+ FirmwareStatusNotificationStatus = FIRMWARE_STATUS_IDLE;
|
|
|
+ }
|
|
|
+ else if(strcmp(status,"InstallationFailed")==0)
|
|
|
+ {
|
|
|
+ FirmwareStatusNotificationStatus = FIRMWARE_STATUS_INSTALLATION_FAILED;
|
|
|
+ }
|
|
|
+ else if(strcmp(status,"Installing")==0)
|
|
|
+ {
|
|
|
+ FirmwareStatusNotificationStatus = FIRMWARE_STATUS_INSTALLING;
|
|
|
+ }
|
|
|
+ else if(strcmp(status,"Installed")==0)
|
|
|
+ {
|
|
|
+ FirmwareStatusNotificationStatus = FIRMWARE_STATUS_INSTALLED;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ return result;
|
|
|
+}
|
|
|
+
|
|
|
+int sendHeartbeatRequest(int gun_index)
|
|
|
+{
|
|
|
+ mtrace();
|
|
|
+ int result = FAIL;
|
|
|
+
|
|
|
+ char message[80]={0};
|
|
|
+ char guid[37]={0};
|
|
|
+ char tempdata[65]={0};
|
|
|
+
|
|
|
+ random_uuid(guid);
|
|
|
+
|
|
|
+ sprintf(message, "[%d,\"%s\",\"Heartbeat\",{ }]"
|
|
|
+ , MESSAGE_TYPE_CALL
|
|
|
+ , guid );
|
|
|
+
|
|
|
+ LWS_Send(message);
|
|
|
+
|
|
|
+ sprintf(tempdata, "Heartbeat,%d", 0);
|
|
|
+
|
|
|
+ if(hashmap_operation(HASH_OP_ADD, guid, tempdata) == 1)//if(hashmap_operation(0,NULL/*hashMap*/, guid, mapItem, tempdata/*(void**)(&mapItem)*/) == MAP_OK/*hashmap_put(hashMap, mapItem->key_string, mapItem) == MAP_OK*/)
|
|
|
+ {
|
|
|
+ result = PASS;
|
|
|
+ }
|
|
|
+
|
|
|
+ return result;
|
|
|
+}
|
|
|
+
|
|
|
+int sendStartTransactionRequest(int gun_index)
|
|
|
+{
|
|
|
+ mtrace();
|
|
|
+ int result = FAIL;
|
|
|
+ char message[250]={0};
|
|
|
+ char guid[37]={0};
|
|
|
+ struct timeval tmnow;
|
|
|
+ struct tm *tm;
|
|
|
+ char buf[28];//, usec_buf[6];
|
|
|
+ char tempdata[65]={0};
|
|
|
+ int tempIndex = 0;
|
|
|
+
|
|
|
+ DEBUG_INFO("sendStartTransactionRequest...");
|
|
|
+ gettimeofday(&tmnow, NULL);
|
|
|
+
|
|
|
+ time_t t;
|
|
|
+ t = time(NULL);
|
|
|
+ /*UTC time and date*/
|
|
|
+ tm = gmtime(&t);
|
|
|
+ strftime(buf,28,"%Y-%m-%dT%H:%M:%SZ", tm);
|
|
|
+#if 0 // remove temporally
|
|
|
+ strftime(buf,30,"%Y-%m-%dT%H:%M:%S", tm);
|
|
|
+ strcat(buf,".");
|
|
|
+ sprintf(usec_buf,"%dZ",(int)tmnow.tv_usec);
|
|
|
+ strcat(buf,usec_buf);
|
|
|
+#endif
|
|
|
+
|
|
|
+ ShmOCPP16Data->StartTransaction[gun_index].ConnectorId = gun_index +1 ; // gun start from 1~
|
|
|
+ strcpy((char *)ShmOCPP16Data->StartTransaction[gun_index].Timestamp, buf);
|
|
|
+ //strcpy((char *)ShmOCPP16Data->StartTransaction[gun_index].IdTag, (const char *)ShmSysConfigAndInfo->SysConfig.UserId);
|
|
|
+
|
|
|
+ // clear StartTransaction Response
|
|
|
+ strcpy((char *)ShmOCPP16Data->StartTransaction[gun_index].ResponseIdTagInfo.ExpiryDate, "");
|
|
|
+ strcpy((char *)ShmOCPP16Data->StartTransaction[gun_index].ResponseIdTagInfo.ParentIdTag, "");
|
|
|
+ strcpy((char *)ShmOCPP16Data->StartTransaction[gun_index].ResponseIdTagInfo.Status, "");
|
|
|
+ ShmOCPP16Data->StartTransaction[gun_index].ResponseTransactionId = 0;
|
|
|
+
|
|
|
+ //J: CHAdeMO U: CCS1 combo E: CCS2 combo G: GBT DCcc
|
|
|
+
|
|
|
+ if(gunType[gun_index] == 'J')
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
+ {
|
|
|
+ tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tempIndex = gun_index;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < CHAdeMO_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->StartTransaction[gun_index].MeterStart = ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargedEnergy;
|
|
|
+ ShmOCPP16Data->StartTransaction[gun_index].ReservationId = ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].ReservationId;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
+ {
|
|
|
+ tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tempIndex = gun_index;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < CCS_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->StartTransaction[gun_index].MeterStart = ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargedEnergy;
|
|
|
+ ShmOCPP16Data->StartTransaction[gun_index].ReservationId = ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].ReservationId;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if(gunType[gun_index] == 'G')
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
+ {
|
|
|
+ tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tempIndex = gun_index;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < GB_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->StartTransaction[gun_index].MeterStart = ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargedEnergy;
|
|
|
+ ShmOCPP16Data->StartTransaction[gun_index].ReservationId = ShmSysConfigAndInfo->SysInfo.GbChargingData[index].ReservationId;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
|
|
|
+ {
|
|
|
+ tempIndex = 2;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tempIndex = gun_index;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < AC_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->StartTransaction[gun_index].MeterStart = ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PowerConsumption;
|
|
|
+ ShmOCPP16Data->StartTransaction[gun_index].ReservationId = ShmSysConfigAndInfo->SysInfo.AcChargingData[index].ReservationId;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ random_uuid(guid);
|
|
|
+
|
|
|
+ if(ShmOCPP16Data->StartTransaction[gun_index].ReservationId == -1) // No Reservation
|
|
|
+ {
|
|
|
+ sprintf(message, "%d,[%d,\"%s\",\"StartTransaction\",{\"connectorId\":%d,\"idTag\":\"%s\",\"meterStart\":%d,\"timestamp\":\"%s\"}]"
|
|
|
+ , gun_index +1
|
|
|
+ , MESSAGE_TYPE_CALL
|
|
|
+ , guid
|
|
|
+ , ShmOCPP16Data->StartTransaction[gun_index].ConnectorId
|
|
|
+ , ShmOCPP16Data->StartTransaction[gun_index].IdTag
|
|
|
+ , ShmOCPP16Data->StartTransaction[gun_index].MeterStart
|
|
|
+ , ShmOCPP16Data->StartTransaction[gun_index].Timestamp );
|
|
|
+
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ sprintf(message, "%d,[%d,\"%s\",\"StartTransaction\",{\"connectorId\":%d,\"idTag\":\"%s\",\"meterStart\":%d,\"reservationId\":%d,\"timestamp\":\"%s\"}]"
|
|
|
+ , gun_index +1
|
|
|
+ , MESSAGE_TYPE_CALL
|
|
|
+ , guid
|
|
|
+ , ShmOCPP16Data->StartTransaction[gun_index].ConnectorId
|
|
|
+ , ShmOCPP16Data->StartTransaction[gun_index].IdTag
|
|
|
+ , ShmOCPP16Data->StartTransaction[gun_index].MeterStart
|
|
|
+ , ShmOCPP16Data->StartTransaction[gun_index].ReservationId
|
|
|
+ , ShmOCPP16Data->StartTransaction[gun_index].Timestamp );
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+#if 1
|
|
|
+ sprintf(tempdata, "StartTransaction,%d", (gun_index));
|
|
|
+ if(hashmap_operation(0, guid, tempdata) == 1)//if(hashmap_operation(0,NULL/*hashMap*/, mapItem[0].key_string, mapItem[0].key_value/*mapItem*/, (void**)(&mapItem)/*(void**)(&mapItem)*/) == MAP_OK/*hashmap_put(hashMap, mapItem->key_string, mapItem) == MAP_OK*/)
|
|
|
+ {
|
|
|
+ result = PASS;
|
|
|
+ }
|
|
|
+#endif
|
|
|
+
|
|
|
+ strcpy(queuedata, message);
|
|
|
+ queue_operation(4, guid, queuedata );//addq(guid, queuedata); ---> remove temporally
|
|
|
+
|
|
|
+ if(GetTransactionQueueNum() == 1)
|
|
|
+ {
|
|
|
+ LWS_Send(message + 2);
|
|
|
+ }
|
|
|
+
|
|
|
+ return result;
|
|
|
+}
|
|
|
+
|
|
|
+int sendStatusNotificationRequest(int gun_index)
|
|
|
+{
|
|
|
+ mtrace();
|
|
|
+ int result = FAIL;
|
|
|
+
|
|
|
+ char message[600]={0};
|
|
|
+ char guid[37];
|
|
|
+ int currentStatus = 0;
|
|
|
+ struct timeval tmnow;
|
|
|
+ struct tm *tm;
|
|
|
+ char buf[28];//, usec_buf[6];
|
|
|
+ char tempdata[65]={0};
|
|
|
+ int tempIndex = 0;
|
|
|
+
|
|
|
+ gettimeofday(&tmnow, NULL);
|
|
|
+
|
|
|
+ time_t t;
|
|
|
+ t = time(NULL);
|
|
|
+ /*UTC time and date*/
|
|
|
+ tm = gmtime(&t);
|
|
|
+ strftime(buf,28,"%Y-%m-%dT%H:%M:%SZ", tm);
|
|
|
+#if 0 // remove temporally
|
|
|
+ strftime(buf,30,"%Y-%m-%dT%H:%M:%S", tm);
|
|
|
+ strcat(buf,".");
|
|
|
+ sprintf(usec_buf,"%dZ",(int)tmnow.tv_usec);
|
|
|
+ strcat(buf,usec_buf);
|
|
|
+#endif
|
|
|
+ printf("%s",buf);
|
|
|
+
|
|
|
+ ShmOCPP16Data->StatusNotification[gun_index].ConnectorId = (gun_index + 1);
|
|
|
+
|
|
|
+ //strcpy(ShmOCPP16Data->StatusNotification[gun_index].ErrorCode, "NoError"); --- CSU Setting
|
|
|
+
|
|
|
+ // it's option
|
|
|
+ strcpy((char *)ShmOCPP16Data->StatusNotification[gun_index].Info, "");
|
|
|
+
|
|
|
+/*
|
|
|
+ enum _SYSTEM_STATUS
|
|
|
+{
|
|
|
+S_BOOTING = 0,
|
|
|
+S_IDLE, = 1
|
|
|
+S_AUTHORIZING, =2
|
|
|
+S_REASSIGN_CHECK, =3
|
|
|
+S_REASSIGN, =4
|
|
|
+S_PRECHARGE, =5
|
|
|
+S_PREPARING_FOR_EV, =6
|
|
|
+S_PREPARING_FOR_EVSE, =7
|
|
|
+S_CHARGING, =8
|
|
|
+S_TERMINATING, =9
|
|
|
+S_COMPLETE, =10
|
|
|
+S_ALARM, =11
|
|
|
+S_FAULT =12
|
|
|
+}
|
|
|
+
|
|
|
+*/
|
|
|
+
|
|
|
+ //check Transaction active
|
|
|
+ //J: CHAdeMO U: CCS1 combo E: CCS2 combo G: GBT DCcc
|
|
|
+ if(gunType[gun_index] == 'J')
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
+ {
|
|
|
+ tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tempIndex = gun_index;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < CHAdeMO_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if ((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex))
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_IDLE)//S_IDLE
|
|
|
+ {
|
|
|
+
|
|
|
+ if(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].ConnectorPlugIn == 1) // //0: unplug, 1: Plug-in
|
|
|
+ {
|
|
|
+ currentStatus = 1; //OCPP Status: Preparing
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ currentStatus = 0; //OCPP Status: Available
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+ else if ( ((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus >= SYS_MODE_PREPARING)&&( ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus <= SYS_MODE_PREPARE_FOR_EVSE)) ||
|
|
|
+ ( ( ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus >= SYS_MODE_CCS_PRECHARGE_STEP0) && ( ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus <= SYS_MODE_CCS_PRECHARGE_STEP1) )
|
|
|
+ ) //S_PRECHARGE
|
|
|
+
|
|
|
+ {
|
|
|
+ currentStatus = 1; //OCPP Status: Preparing
|
|
|
+ }
|
|
|
+ else if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_CHARGING) //S_CHARGING
|
|
|
+ {
|
|
|
+ currentStatus = 2; //OCPP Status: Charging
|
|
|
+ }
|
|
|
+ else if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_COMPLETE) //S_COMPLETE
|
|
|
+ {
|
|
|
+ currentStatus = 5; //OCPP Status: Finishing
|
|
|
+ }
|
|
|
+ else if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_TERMINATING) // S_TERMINATING ---> SuspendedEV
|
|
|
+ {
|
|
|
+ currentStatus = 4; //OCPP Status: SuspendedEV
|
|
|
+ }
|
|
|
+ else if ((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_MAINTAIN)|| (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_DEBUG) || (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_UPDATE)) // ---> Unavailable
|
|
|
+ {
|
|
|
+ currentStatus = 7; //OCPP Status: Unavailable
|
|
|
+ }
|
|
|
+ else if ((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_FAULT)|| (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_ALARM)) //S_ALARM,S_FAULT ---> Faulted
|
|
|
+ {
|
|
|
+ currentStatus = 8; //OCPP Status: Faulted
|
|
|
+ }
|
|
|
+ else if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_RESERVATION) // ---> Reserved
|
|
|
+ {
|
|
|
+ currentStatus = 6; //OCPP Status: Reserved
|
|
|
+ }
|
|
|
+
|
|
|
+ } //end of the same index
|
|
|
+
|
|
|
+ }//end of for CHAdeMO_QUANTITY
|
|
|
+
|
|
|
+ }
|
|
|
+ else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
+ {
|
|
|
+ tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tempIndex = gun_index;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < CCS_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_IDLE) //S_IDLE
|
|
|
+ {
|
|
|
+
|
|
|
+ if(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].ConnectorPlugIn == 1) //0: unplug, 1: Plug-in
|
|
|
+ {
|
|
|
+ currentStatus = 1; //OCPP Status: Preparing
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ currentStatus = 0; //OCPP Status: Available
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+ else if ( ((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus >= SYS_MODE_PREPARING)&&( ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus <= SYS_MODE_PREPARE_FOR_EVSE)) ||
|
|
|
+ ( ( ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus >= SYS_MODE_CCS_PRECHARGE_STEP0) && ( ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus <= SYS_MODE_CCS_PRECHARGE_STEP1) )
|
|
|
+ ) //S_PRECHARGE
|
|
|
+
|
|
|
+ {
|
|
|
+ currentStatus = 1; //OCPP Status: Preparing
|
|
|
+ }
|
|
|
+ else if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_CHARGING) //S_CHARGING
|
|
|
+ {
|
|
|
+ currentStatus = 2; //OCPP Status: Charging
|
|
|
+ }
|
|
|
+ else if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_COMPLETE) //S_COMPLETE
|
|
|
+ {
|
|
|
+ currentStatus = 5; //OCPP Status: Finishing
|
|
|
+ }
|
|
|
+ else if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_TERMINATING) //S_TERMINATING ---> SuspendedEV
|
|
|
+ {
|
|
|
+ currentStatus = 4; //OCPP Status: SuspendedEV
|
|
|
+ }
|
|
|
+ else if ((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_MAINTAIN) || (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_DEBUG) || (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_UPDATE)) // ---> Unavailable
|
|
|
+ {
|
|
|
+ currentStatus = 7; //OCPP Status : Unavailable
|
|
|
+ }
|
|
|
+ else if ((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_FAULT) || (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_ALARM)) //S_ALARM ,S_FAULT ---> Faulted
|
|
|
+ {
|
|
|
+ currentStatus = 8; //OCPP Status: Faulted
|
|
|
+ }
|
|
|
+ else if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_RESERVATION) // ---> Reserved
|
|
|
+ {
|
|
|
+ currentStatus = 6; //OCPP Status: Reserved
|
|
|
+ }
|
|
|
+
|
|
|
+ } //end of the same index
|
|
|
+
|
|
|
+ } // end of for CCS_QUANTITY
|
|
|
+ }
|
|
|
+ else if(gunType[gun_index] == 'G')
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
+ {
|
|
|
+ tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tempIndex = gun_index;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < GB_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_IDLE) //S_IDLE
|
|
|
+ {
|
|
|
+
|
|
|
+ if(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].ConnectorPlugIn == 1) // //0: unplug, 1: Plug-in
|
|
|
+ {
|
|
|
+ currentStatus = 1; //OCPP Status: Preparing
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ currentStatus = 0; //OCPP Status: Available
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ else if ( ((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus >= SYS_MODE_PREPARING)&&( ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus <= SYS_MODE_PREPARE_FOR_EVSE)) ||
|
|
|
+ ( ( ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus >= SYS_MODE_CCS_PRECHARGE_STEP0) && ( ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus <= SYS_MODE_CCS_PRECHARGE_STEP1) )
|
|
|
+ ) //S_PRECHARGE
|
|
|
+
|
|
|
+ {
|
|
|
+ currentStatus = 1; //OCPP Status: Preparing
|
|
|
+ }
|
|
|
+ else if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_CHARGING) //S_CHARGING
|
|
|
+ {
|
|
|
+ currentStatus = 2; //OCPP Status: Charging
|
|
|
+ }
|
|
|
+ else if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_COMPLETE) //S_COMPLETE
|
|
|
+ {
|
|
|
+ currentStatus = 5; //OCPP Status: Finishing
|
|
|
+ }
|
|
|
+ else if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_TERMINATING) // S_TERMINATING ---> SuspendedEV
|
|
|
+ {
|
|
|
+ currentStatus = 4; //OCPP Status: SuspendedEV
|
|
|
+ }
|
|
|
+ else if ((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_MAINTAIN) || (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_DEBUG) || (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_UPDATE)) // ---> Unavailable
|
|
|
+ {
|
|
|
+ currentStatus = 7; //OCPP Status: Unavailable
|
|
|
+ }
|
|
|
+ else if ((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_FAULT) || (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_ALARM)) //S_ALARM ,S_FAULT ---> Faulted
|
|
|
+ {
|
|
|
+ currentStatus = 8; //OCPP Status: Faulted
|
|
|
+ }
|
|
|
+ else if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_RESERVATION) // ---> Reserved
|
|
|
+ {
|
|
|
+ currentStatus = 6; //OCPP Status: Reserved
|
|
|
+ }
|
|
|
+ } //end of the same index
|
|
|
+
|
|
|
+ } // end of for GB_QUANTITY
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
|
|
|
+ {
|
|
|
+ tempIndex = 2;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tempIndex = gun_index;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < AC_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_IDLE) //SYS_MODE_IDLE
|
|
|
+ {
|
|
|
+ if((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PilotState == CP_STATE_B) ||(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PilotState == CP_STATE_C) || (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PilotState == CP_STATE_D))
|
|
|
+ {
|
|
|
+ currentStatus = 1; //OCPP Status: Preparing
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ currentStatus = 0; //OCPP Status: Available
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ else if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_PREPARING) //SYS_MODE_PREPARING
|
|
|
+ {
|
|
|
+ currentStatus = 1; //OCPP Status: Preparing
|
|
|
+ }
|
|
|
+ else if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_CHARGING) //SYS_MODE_CHARGING
|
|
|
+ {
|
|
|
+ currentStatus = 2; //OCPP Status: Charging
|
|
|
+ }
|
|
|
+ else if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_COMPLETE) //SYS_MODE_COMPLETE
|
|
|
+ {
|
|
|
+ currentStatus = 5; //OCPP Status: Finishing
|
|
|
+ }
|
|
|
+ else if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_TERMINATING) // S_TERMINATING ---> SuspendedEV
|
|
|
+ {
|
|
|
+ currentStatus = 4; //OCPP Status: SuspendedEV
|
|
|
+ }
|
|
|
+ else if ((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_MAINTAIN)|| (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_DEBUG) || (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_UPDATE)) // ---> Unavailable
|
|
|
+ {
|
|
|
+ currentStatus = 7; //OCPP Status: Unavailable
|
|
|
+ }
|
|
|
+ else if ((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_FAULT) || (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_ALARM)) //S_ALARM,S_FAULT ---> Faulted
|
|
|
+ {
|
|
|
+ currentStatus = 8; //OCPP Status: Faulted
|
|
|
+ }
|
|
|
+ else if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_RESERVATION) // ---> Reserved
|
|
|
+ {
|
|
|
+ currentStatus = 6; //OCPP Status: Reserved
|
|
|
+ }
|
|
|
+
|
|
|
+ }//end of the same index
|
|
|
+
|
|
|
+ }//end of for AC_QUANTITY
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ //it's option
|
|
|
+ strcpy((char *)ShmOCPP16Data->StatusNotification[gun_index].Timestamp, buf);
|
|
|
+ strcpy((char *)ShmOCPP16Data->StatusNotification[gun_index].VendorId, "PhihongTechnology");
|
|
|
+ strcpy((char *)ShmOCPP16Data->StatusNotification[gun_index].Status, ChargePointStatusStr[currentStatus]);
|
|
|
+
|
|
|
+ random_uuid(guid);
|
|
|
+
|
|
|
+ sprintf(message, "[%d,\"%s\",\"StatusNotification\",{\"connectorId\":%d,\"errorCode\":\"%s\",\"info\":\"%s\",\"status\":\"%s\",\"timestamp\":\"%s\",\"vendorId\":\"%s\",\"vendorErrorCode\":\"%s\"}]"
|
|
|
+ , MESSAGE_TYPE_CALL
|
|
|
+ , guid
|
|
|
+ , ShmOCPP16Data->StatusNotification[gun_index].ConnectorId
|
|
|
+ , ShmOCPP16Data->StatusNotification[gun_index].ErrorCode
|
|
|
+ , ShmOCPP16Data->StatusNotification[gun_index].Info
|
|
|
+ , ShmOCPP16Data->StatusNotification[gun_index].Status
|
|
|
+ , ShmOCPP16Data->StatusNotification[gun_index].Timestamp
|
|
|
+ , ShmOCPP16Data->StatusNotification[gun_index].VendorId
|
|
|
+ , ShmOCPP16Data->StatusNotification[gun_index].VendorErrorCode);
|
|
|
+
|
|
|
+ LWS_Send(message);
|
|
|
+
|
|
|
+ sprintf(tempdata, "StatusNotification,%d", (gun_index));
|
|
|
+
|
|
|
+ if(hashmap_operation(0, guid, tempdata) == 1)//if(hashmap_operation(0,NULL/*hashMap*/, guid, mapItem, tempdata/*(void**)(&mapItem)*//*(void**)(&mapItem)*/) == MAP_OK/*hashmap_put(hashMap, mapItem->key_string, mapItem) == MAP_OK*/)
|
|
|
+ {
|
|
|
+ //DEBUG_ERROR("statusNotification mapitem pass");
|
|
|
+ result = PASS;
|
|
|
+ }
|
|
|
+
|
|
|
+ return result;
|
|
|
+}
|
|
|
+
|
|
|
+int sendStopTransactionRequest(int gun_index)
|
|
|
+{
|
|
|
+ mtrace();
|
|
|
+ int result = FAIL;
|
|
|
+ //char message[1500]={0};
|
|
|
+ char guid[37]={0};
|
|
|
+ char tempdata[65]={0};
|
|
|
+ int tempIndex = 0;
|
|
|
+ //int idx_sample=0;
|
|
|
+
|
|
|
+ DEBUG_ERROR("sendStopTransactionRequest \n");
|
|
|
+ memset(queuedata, 0, sizeof(queuedata));
|
|
|
+
|
|
|
+ //ENERGY_ACTIVE_IMPORT_REGISTER
|
|
|
+ //J: CHAdeMO U: CCS1 combo E: CCS2 combo G: GBT DCcc
|
|
|
+ if(gunType[gun_index] == 'J')
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
+ {
|
|
|
+ tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tempIndex = gun_index;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < CHAdeMO_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->StopTransaction[gun_index].MeterStop = ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PowerConsumption;
|
|
|
+ }
|
|
|
+ }// END OF CHAdeMO_QUANTITY
|
|
|
+ }
|
|
|
+ else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
+ {
|
|
|
+ tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tempIndex = gun_index;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < CCS_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->StopTransaction[gun_index].MeterStop = ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PowerConsumption;
|
|
|
+ }
|
|
|
+ }// END OF CCS_QUANTITY
|
|
|
+
|
|
|
+ }
|
|
|
+ else if(gunType[gun_index] == 'G')
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
+ {
|
|
|
+ tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tempIndex = gun_index;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < GB_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->StopTransaction[gun_index].MeterStop = ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PowerConsumption;
|
|
|
+ }
|
|
|
+ }// END OF GB_QUANTITY
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
|
|
|
+ {
|
|
|
+ tempIndex = 2;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tempIndex = gun_index;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < AC_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->StopTransaction[gun_index].MeterStop = ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PowerConsumption;
|
|
|
+ }
|
|
|
+ }// END OF AC_QUANTITY
|
|
|
+ }
|
|
|
+
|
|
|
+ //Stop Transaction Time
|
|
|
+ struct timeval tmnow;
|
|
|
+ struct tm *tm;
|
|
|
+ char buf[28];//, usec_buf[6];
|
|
|
+ gettimeofday(&tmnow, NULL);
|
|
|
+
|
|
|
+ time_t t;
|
|
|
+ t = time(NULL);
|
|
|
+ /*UTC time and date*/
|
|
|
+ tm = gmtime(&t);
|
|
|
+ strftime(buf,28,"%Y-%m-%dT%H:%M:%SZ", tm);
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].Timestamp,buf);
|
|
|
+ ShmOCPP16Data->StopTransaction[gun_index].TransactionId = ShmOCPP16Data->StartTransaction[gun_index].ResponseTransactionId;
|
|
|
+
|
|
|
+ random_uuid(guid);
|
|
|
+
|
|
|
+ /***********************************transactionData******************************************************/
|
|
|
+ memset(ShmOCPP16Data->StopTransaction[gun_index].TransactionData, 0, sizeof(sizeof(struct StructMeterValue)));
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].TimeStamp, buf);
|
|
|
+
|
|
|
+ //=================================
|
|
|
+ // Transaction_Begin
|
|
|
+ //=================================
|
|
|
+ // Energy.Active.Export.Interval
|
|
|
+ //idx_sample=0;
|
|
|
+ sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Value, "%.1f",(float)(ShmOCPP16Data->StartTransaction[gun_index].MeterStart)); // MeterStart is 0~6553.5 kWh
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Context,ReadingContextStr[ReadingContext_Transaction_Begin]);
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Format,ValueFormatStr[Raw]);
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Measurand,MeasurandStr[Energy_Active_Import_Interval]);//MeasurandStr[Energy_Active_Export_Interval/*Energy_Reactive_Export_Register*/]);
|
|
|
+
|
|
|
+ //J: CHAdeMO U: CCS1 combo E: CCS2 combo G: GBT DCcc
|
|
|
+ if((gunType[gun_index] == 'J')||(gunType[gun_index] == 'U')||(gunType[gun_index] == 'E')||(gunType[gun_index] == 'G'))
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Phase,PhaseStr[L3_N]);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Phase,PhaseStr[L1_N]);
|
|
|
+ }
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Location,LocationStr[Location_Outlet]);
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Unit,UnitOfMeasureStr[UnitOfMeasure_kWh]);
|
|
|
+
|
|
|
+ //=================================
|
|
|
+ // Transaction_End
|
|
|
+ //=================================
|
|
|
+ //Current.Export
|
|
|
+ //idx_sample=1;
|
|
|
+ //J: CHAdeMO U: CCS1 combo E: CCS2 combo G : GBT DC
|
|
|
+ if(gunType[gun_index] == 'J')
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
+ {
|
|
|
+ tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tempIndex = gun_index;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < CHAdeMO_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
|
|
|
+ {
|
|
|
+ sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargingCurrent );// PresentChargingCurrent is 0~6553.5 amp
|
|
|
+ }
|
|
|
+ }// End of for CHAdeMO_QUANTITY
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Phase,PhaseStr[L3_N]);
|
|
|
+ }
|
|
|
+ else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
+ {
|
|
|
+ tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tempIndex = gun_index;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < CCS_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
|
|
|
+ {
|
|
|
+ sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargingCurrent );// PresentChargingCurrent is 0~6553.5 amp
|
|
|
+ }
|
|
|
+ }// End of for CCS_QUANTITY
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Phase,PhaseStr[L3_N]);
|
|
|
+ }
|
|
|
+ else if(gunType[gun_index] == 'G')
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
+ {
|
|
|
+ tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tempIndex = gun_index;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < GB_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
|
|
|
+ {
|
|
|
+ sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargingCurrent );// PresentChargingCurrent is 0~6553.5 amp
|
|
|
+ }
|
|
|
+ }// End of for GB_QUANTITY
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Phase,PhaseStr[L3_N]);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
|
|
|
+ {
|
|
|
+ tempIndex = 2;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tempIndex = gun_index;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < AC_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
|
|
|
+ {
|
|
|
+ sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PresentChargingCurrent );// 0~6553.5 amp for EVSE
|
|
|
+ }
|
|
|
+ }// End of for AC_QUANTITY
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Phase,PhaseStr[L1_N]);
|
|
|
+ }
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Context,ReadingContextStr[ReadingContext_Transaction_End]);
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Format,ValueFormatStr[Raw]);
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Measurand,MeasurandStr[Current_Import]);
|
|
|
+ //strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Phase,PhaseStr[L1_N]);
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Location,LocationStr[Location_Outlet]);
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Unit,UnitOfMeasureStr[UnitOfMeasure_A]);
|
|
|
+
|
|
|
+ //Energy.Active.Export.Interval
|
|
|
+ //idx_sample=2;
|
|
|
+ //J: CHAdeMO U: CCS1 combo E: CCS2 combo G: GBT DC
|
|
|
+
|
|
|
+ if(gunType[gun_index] == 'J')
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
+ {
|
|
|
+ tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tempIndex = gun_index;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < CHAdeMO_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
|
|
|
+ {
|
|
|
+ sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargedEnergy );// PresentChargedEnergy is 0~6553.5 kWh
|
|
|
+ }
|
|
|
+ }// END OF CHAdeMO_QUANTITY
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Phase,PhaseStr[L3_N]);
|
|
|
+
|
|
|
+ }
|
|
|
+ else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
+ {
|
|
|
+ tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tempIndex = gun_index;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < CCS_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
|
|
|
+ {
|
|
|
+ sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargedEnergy );// PresentChargedEnergy is 0~6553.5 kWh
|
|
|
+ }
|
|
|
+ }// END OF CCS_QUANTITY
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Phase,PhaseStr[L3_N]);
|
|
|
+
|
|
|
+ }
|
|
|
+ else if(gunType[gun_index] == 'G')
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
+ {
|
|
|
+ tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tempIndex = gun_index;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < GB_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
|
|
|
+ {
|
|
|
+ sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargedEnergy );// PresentChargedEnergy is 0~6553.5 kWh
|
|
|
+ }
|
|
|
+ }// END OF GB_QUANTITY
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Phase,PhaseStr[L3_N]);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
|
|
|
+ {
|
|
|
+ tempIndex = 2;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tempIndex = gun_index;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ for (int index = 0; index < AC_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
|
|
|
+ {
|
|
|
+ sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PresentChargedEnergy );// PresentChargedEnergy is 0~6553.5 kWh
|
|
|
+ }
|
|
|
+ }// END OF AC_QUANTITY
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Phase,PhaseStr[L1_N]);
|
|
|
+ }
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Context,ReadingContextStr[ReadingContext_Transaction_End]);
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Format,ValueFormatStr[Raw]);
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Measurand,MeasurandStr[Energy_Active_Import_Interval]);
|
|
|
+ //strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Phase,PhaseStr[L1_N]);
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Location,LocationStr[Location_Outlet]);
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Unit,UnitOfMeasureStr[UnitOfMeasure_kWh]);
|
|
|
+
|
|
|
+ //Power.Active.Export
|
|
|
+ //idx_sample=3;
|
|
|
+ //J: CHAdeMO U: CCS1 combo E: CCS2 combo G: GBT DC
|
|
|
+
|
|
|
+ if(gunType[gun_index] == 'J')
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
+ {
|
|
|
+ tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tempIndex = gun_index;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < CHAdeMO_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
|
|
|
+ {
|
|
|
+ sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargingPower );// PresentChargingPower is 0~6553.5 kW
|
|
|
+ }
|
|
|
+ } // End for CHAdeMO_QUANTITY
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Phase,PhaseStr[L3_N]);
|
|
|
+ }
|
|
|
+ else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
+ {
|
|
|
+ tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tempIndex = gun_index;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < CCS_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
|
|
|
+ {
|
|
|
+ sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargingPower );// PresentChargingPower is 0~6553.5 kW
|
|
|
+ }
|
|
|
+ } // END for CCS_QUANTITY
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Phase,PhaseStr[L3_N]);
|
|
|
+ }
|
|
|
+ else if(gunType[gun_index] == 'G')
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
+ {
|
|
|
+ tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tempIndex = gun_index;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < GB_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
|
|
|
+ {
|
|
|
+ sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargingPower );// PresentChargingPower is 0~6553.5 kW
|
|
|
+ }
|
|
|
+ }// END for GB_QUANTITY
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Phase,PhaseStr[L3_N]);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
|
|
|
+ {
|
|
|
+ tempIndex = 2;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tempIndex = gun_index;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < AC_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
|
|
|
+ {
|
|
|
+ sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PresentChargingPower );// PresentChargingPower is 0~6553.5 kW
|
|
|
+ }
|
|
|
+ } // END for AC_QUANTITY
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Phase,PhaseStr[L1_N]);
|
|
|
+ }
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Context,ReadingContextStr[ReadingContext_Transaction_End]);
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Format,ValueFormatStr[Raw]);
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Measurand,MeasurandStr[Power_Active_Import]);
|
|
|
+ //strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Phase,PhaseStr[L1_N]);
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Location,LocationStr[Location_Outlet]);
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Unit,UnitOfMeasureStr[UnitOfMeasure_kW/*UnitOfMeasure_kWh*/]);
|
|
|
+
|
|
|
+ //Voltage
|
|
|
+ //idx_sample=4;
|
|
|
+ //J: CHAdeMO U: CCS1 combo E: CCS2 combo G: GBT DC
|
|
|
+ if(gunType[gun_index] == 'J')
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
+ {
|
|
|
+ tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tempIndex = gun_index;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < CHAdeMO_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
|
|
|
+ {
|
|
|
+ sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargingVoltage );// PresentChargingVoltage is 0~6553.5 volt
|
|
|
+ }
|
|
|
+ } // END OF FOR CHAdeMO_QUANTITY
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Phase,PhaseStr[L3_N]);
|
|
|
+
|
|
|
+ }
|
|
|
+ else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
+ {
|
|
|
+ tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tempIndex = gun_index;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < CCS_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
|
|
|
+ {
|
|
|
+ sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargingVoltage );// PresentChargingVoltage is 0~6553.5 volt
|
|
|
+ }
|
|
|
+ } // END OF FOR CCS_QUANTITY
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Phase,PhaseStr[L3_N]);
|
|
|
+ }
|
|
|
+ else if(gunType[gun_index] == 'G')
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
+ {
|
|
|
+ tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tempIndex = gun_index;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < GB_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
|
|
|
+ {
|
|
|
+ sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargingVoltage );// PresentChargingVoltage is 0~6553.5 volt
|
|
|
+ }
|
|
|
+ } // END OF FOR GB_QUANTITY
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Phase,PhaseStr[L3_N]);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
|
|
|
+ {
|
|
|
+ tempIndex = 2;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tempIndex = gun_index;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < AC_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
|
|
|
+ {
|
|
|
+ sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PresentChargingVoltage );//AcChargingVoltage is 0~6553.5 volt for AC EVSE
|
|
|
+ }
|
|
|
+ } // END OF FOR AC_QUANTITY
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Phase,PhaseStr[L1_N]);
|
|
|
+ }
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Context,ReadingContextStr[ReadingContext_Transaction_End]);
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Format,ValueFormatStr[Raw]);
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Measurand,MeasurandStr[Voltage]);
|
|
|
+ //strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Phase,PhaseStr[L1_N]);
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Location,LocationStr[Location_Outlet]);
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Unit,UnitOfMeasureStr[UnitOfMeasure_V]);
|
|
|
+
|
|
|
+ //SoC
|
|
|
+ //idx_sample=5;
|
|
|
+ //J : CHAdeMO U: CCS1 combo E: CCS2 combo G: GBT DC
|
|
|
+ if((gunType[gun_index] == 'J')||(gunType[gun_index] == 'U')||(gunType[gun_index] == 'E')||(gunType[gun_index] == 'G'))
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
+ {
|
|
|
+ tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tempIndex = gun_index;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(gunType[gun_index] == 'J')
|
|
|
+ {
|
|
|
+ for (int index = 0; index < CHAdeMO_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
|
|
|
+ {
|
|
|
+ sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Value, "%d" ,ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].EvBatterySoc );// 0~100%
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
|
|
|
+ {
|
|
|
+ for (int index = 0; index < CCS_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
|
|
|
+ {
|
|
|
+ sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Value, "%d" ,ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].EvBatterySoc );// 0~100%
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ else if(gunType[gun_index] == 'G')
|
|
|
+ {
|
|
|
+ for (int index = 0; index < GB_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
|
|
|
+ {
|
|
|
+ sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Value, "%d" ,ShmSysConfigAndInfo->SysInfo.GbChargingData[index].EvBatterySoc );// 0~100%
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Context,ReadingContextStr[ReadingContext_Transaction_End]);
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Format,ValueFormatStr[Raw]);
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Measurand,MeasurandStr[SoC/*Energy_Reactive_Export_Register*/]);
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Phase,PhaseStr[L3_N]);
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Location,LocationStr[Location_Outlet]);
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Unit,UnitOfMeasureStr[UnitOfMeasure_Percent/*UnitOfMeasure_kWh*/]);
|
|
|
+
|
|
|
+ } // END FOR DC CASE
|
|
|
+
|
|
|
+ if((gunType[gun_index] == 'J')||(gunType[gun_index] == 'U')||(gunType[gun_index] == 'E')||(gunType[gun_index] == 'G'))
|
|
|
+ {
|
|
|
+ sprintf(queuedata,"%d,[%d,\"%s\",\"StopTransaction\",{\"idTag\":\"%s\",\"meterStop\":%d,\"timestamp\":\"%s\",\"transactionId\":%d,\"reason\":\"%s\",\"transactionData\":[{\"timestamp\":\"%s\",\"sampledValue\":[{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"}]}]}]"
|
|
|
+
|
|
|
+ ,gun_index+1
|
|
|
+ ,MESSAGE_TYPE_CALL
|
|
|
+ ,guid
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].IdTag
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].MeterStop
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].Timestamp
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionId
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].StopReason
|
|
|
+ ,(const char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].TimeStamp
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Value
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Context
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Format
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Measurand
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Phase
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Location
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Unit
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Value
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Context
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Format
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Measurand
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Phase
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Location
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Unit
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Value
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Context
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Format
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Measurand
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Phase
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Location
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Unit
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Value
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Context
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Format
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Measurand
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Phase
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Location
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Unit
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Value
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Context
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Format
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Measurand
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Phase
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Location
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Unit
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Value
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Context
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Format
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Measurand
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Phase
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Location
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Unit
|
|
|
+ );
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ sprintf(queuedata,"%d,[%d,\"%s\",\"StopTransaction\",{\"idTag\":\"%s\",\"meterStop\":%d,\"timestamp\":\"%s\",\"transactionId\":%d,\"reason\":\"%s\",\"transactionData\":[{\"timestamp\":\"%s\",\"sampledValue\":[{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"}]}]}]"
|
|
|
+
|
|
|
+ ,gun_index+1
|
|
|
+ ,MESSAGE_TYPE_CALL
|
|
|
+ ,guid
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].IdTag
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].MeterStop
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].Timestamp
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionId
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].StopReason
|
|
|
+ ,(const char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].TimeStamp
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Value
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Context
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Format
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Measurand
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Phase
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Location
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Unit
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Value
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Context
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Format
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Measurand
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Phase
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Location
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Unit
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Value
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Context
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Format
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Measurand
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Phase
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Location
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Unit
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Value
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Context
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Format
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Measurand
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Phase
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Location
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Unit
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Value
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Context
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Format
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Measurand
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Phase
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Location
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Unit
|
|
|
+ );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+#if 1 // for TempStopTransaction
|
|
|
+ //Delete TempStopTransaction
|
|
|
+ if((access("/Storage/OCPP/TempStopTransaction",F_OK))!=-1)
|
|
|
+ {
|
|
|
+ remove("/Storage/OCPP/TempStopTransaction"); // remove file "TempStopTransaction"
|
|
|
+ }
|
|
|
+#endif
|
|
|
+
|
|
|
+#if 1
|
|
|
+ sprintf(tempdata, "StopTransaction,%d", (gun_index));
|
|
|
+ if(hashmap_operation(0, guid, tempdata) == 1)
|
|
|
+ {
|
|
|
+ result = PASS;
|
|
|
+ DEBUG_INFO("StopTransaction mapitem pass\n");
|
|
|
+ }
|
|
|
+#endif
|
|
|
+ queue_operation(4, guid, queuedata );//addq(guid, queuedata); ---> remove temporally
|
|
|
+
|
|
|
+ if(GetTransactionQueueNum() == 1)
|
|
|
+ {
|
|
|
+ LWS_Send(queuedata+2);
|
|
|
+ }
|
|
|
+
|
|
|
+ //----------------------------replace queue StopTransaction TransactionId ---------------------------//
|
|
|
+ //int gettransactionId = GetTransactionId(gun_index+1, ShmOCPP16Data->StopTransaction[gun_index].IdTag);
|
|
|
+ int gettransactionId = GetTransactionId(gun_index+1, ShmOCPP16Data->StartTransaction[gun_index].IdTag);
|
|
|
+
|
|
|
+ if((ShmOCPP16Data->StopTransaction[gun_index].TransactionId != 0) && (gettransactionId != 0))
|
|
|
+ {
|
|
|
+ SetTransactionIdZero(ShmOCPP16Data->StopTransaction[gun_index].TransactionId);
|
|
|
+ }
|
|
|
+
|
|
|
+ //for test
|
|
|
+ //ShmOCPP16Data->CpMsg.bits[gun_index].StopTransactionReq = 0;
|
|
|
+
|
|
|
+ return result;
|
|
|
+}
|
|
|
+
|
|
|
+int sendMeterValuesRequest(int gun_index)
|
|
|
+{
|
|
|
+ mtrace();
|
|
|
+ int result = FAIL;
|
|
|
+// char message[1500]={0};
|
|
|
+ char guid[37]={0};
|
|
|
+ //int idx_sample=0;
|
|
|
+ //int length = 0;
|
|
|
+ char tempdata[65]={0};
|
|
|
+ int tempIndex = 0;
|
|
|
+
|
|
|
+ DEBUG_INFO("sendMeterValuesRequest ...\n");
|
|
|
+ //DEBUG_ERROR("gun_index =%d\n",gun_index);
|
|
|
+
|
|
|
+ if((ShmOCPP16Data->StartTransaction[gun_index].ResponseTransactionId == 0)&&(ShmOCPP16Data->CsMsg.bits[gun_index].TriggerMessageReq == 0)) // no TransactionId
|
|
|
+ {
|
|
|
+ DEBUG_INFO("NOT SENT METER Vlaue\n");
|
|
|
+ //DEBUG_ERROR("ShmOCPP16Data->StartTransaction[gun_index].ResponseTransactionId =%d\n",ShmOCPP16Data->StartTransaction[gun_index].ResponseTransactionId);
|
|
|
+ //DEBUG_ERROR("ShmOCPP16Data->CsMsg.bits[gun_index].TriggerMessageReq =%d\n",ShmOCPP16Data->CsMsg.bits[gun_index].TriggerMessageReq);
|
|
|
+
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(ShmOCPP16Data->CsMsg.bits[gun_index].TriggerMessageReq == 1)
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->CsMsg.bits[gun_index].TriggerMessageReq = 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ memset(queuedata, 0, sizeof(queuedata));
|
|
|
+ //set value
|
|
|
+ ShmOCPP16Data->MeterValues[gun_index].ConnectorId = gun_index + 1; // gun start from 1~
|
|
|
+ ShmOCPP16Data->MeterValues[gun_index].TransactionId = ShmOCPP16Data->StartTransaction[gun_index].ResponseTransactionId;
|
|
|
+
|
|
|
+ random_uuid(guid);
|
|
|
+
|
|
|
+ //UTC Date time
|
|
|
+ struct timeval tmnow;
|
|
|
+ struct tm *tm;
|
|
|
+ char buf[28];//, usec_buf[6];
|
|
|
+ gettimeofday(&tmnow, NULL);
|
|
|
+
|
|
|
+ time_t t;
|
|
|
+ t = time(NULL);
|
|
|
+ /*UTC time and date*/
|
|
|
+ tm = gmtime(&t);
|
|
|
+ strftime(buf,28,"%Y-%m-%dT%H:%M:%SZ", tm);
|
|
|
+ strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].TimeStamp, buf);
|
|
|
+
|
|
|
+ DEBUG_INFO( "ShmSysConfigAndInfo->SysConfig.ModelName[0]=%c\n", ShmSysConfigAndInfo->SysConfig.ModelName[0]);
|
|
|
+
|
|
|
+ //idx_sample=0;
|
|
|
+ //********************************(1)Current.Export************************************************/
|
|
|
+ //J: CHAdeMO U: CCS1 combo E: CCS2 combo G: GBT DC
|
|
|
+
|
|
|
+ if(gunType[gun_index] == 'J')
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
+ {
|
|
|
+ tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tempIndex = gun_index;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < CHAdeMO_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
|
|
|
+ {
|
|
|
+ sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargingCurrent );
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Phase, PhaseStr[L3_N]);
|
|
|
+ }
|
|
|
+ else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
+ {
|
|
|
+ tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tempIndex = gun_index;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < CCS_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
|
|
|
+ {
|
|
|
+ sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargingCurrent );
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Phase, PhaseStr[L3_N]);
|
|
|
+ }
|
|
|
+ else if(gunType[gun_index] == 'G')
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
+ {
|
|
|
+ tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tempIndex = gun_index;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < GB_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
|
|
|
+ {
|
|
|
+ sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargingCurrent );
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Phase, PhaseStr[L3_N]);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
|
|
|
+ {
|
|
|
+ tempIndex = 2;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tempIndex = gun_index;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < AC_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
|
|
|
+ {
|
|
|
+ sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PresentChargingCurrent );
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Phase, PhaseStr[L1_N]);
|
|
|
+ }
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Context, ReadingContextStr[ReadingContext_Sample_Periodic]);
|
|
|
+ strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Format, ValueFormatStr[Raw]);
|
|
|
+ strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Measurand, MeasurandStr[Current_Import]);
|
|
|
+ //strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Phase, PhaseStr[L1_N]);
|
|
|
+ strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Location, LocationStr[Location_Outlet]);
|
|
|
+ strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Unit,UnitOfMeasureStr[UnitOfMeasure_A]);
|
|
|
+
|
|
|
+
|
|
|
+ //idx_sample=1;
|
|
|
+ //********************************(2)Energy.Active.Import.Register ************************************************/
|
|
|
+ //J: CHAdeMO U: CCS1 combo E: CCS2 combo G: GBT DC
|
|
|
+
|
|
|
+ if(gunType[gun_index] == 'J')
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
+ {
|
|
|
+ tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tempIndex = gun_index;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < CHAdeMO_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
|
|
|
+ {
|
|
|
+ sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PowerConsumption );
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Phase, PhaseStr[L3_N]);
|
|
|
+ }
|
|
|
+ else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
+ {
|
|
|
+ tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tempIndex = gun_index;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < CCS_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
|
|
|
+ {
|
|
|
+ sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PowerConsumption );
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Phase, PhaseStr[L3_N]);
|
|
|
+ }
|
|
|
+ else if(gunType[gun_index] == 'G')
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
+ {
|
|
|
+ tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tempIndex = gun_index;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < GB_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
|
|
|
+ {
|
|
|
+ sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PowerConsumption );
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Phase, PhaseStr[L3_N]);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
|
|
|
+ {
|
|
|
+ tempIndex = 2;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tempIndex = gun_index;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < AC_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
|
|
|
+ {
|
|
|
+ sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PowerConsumption );
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Phase, PhaseStr[L1_N]);
|
|
|
+ }
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Context, ReadingContextStr[ReadingContext_Sample_Periodic]);
|
|
|
+ strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Format, ValueFormatStr[Raw]);
|
|
|
+ strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Measurand, MeasurandStr[Energy_Active_Import_Register]);
|
|
|
+ //strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Phase, PhaseStr[L1_N]);
|
|
|
+ strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Location, LocationStr[Location_Outlet]);
|
|
|
+ strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Unit,UnitOfMeasureStr[UnitOfMeasure_kWh]);
|
|
|
+
|
|
|
+
|
|
|
+ //idx_sample=2;
|
|
|
+ //****************************************************(3)Energy.Active.Export.Interval*********************************************/
|
|
|
+ //J: CHAdeMO U: CCS1 combo E: CCS2 combo G: GBT DC
|
|
|
+
|
|
|
+ if(gunType[gun_index] == 'J')
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
+ {
|
|
|
+ tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tempIndex = gun_index;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < CHAdeMO_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
|
|
|
+ {
|
|
|
+ sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargedEnergy );
|
|
|
+ }
|
|
|
+ } // END OF FOR CHAdeMO_QUANTITY
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Phase, PhaseStr[L3_N]);
|
|
|
+ }
|
|
|
+ else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
+ {
|
|
|
+ tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tempIndex = gun_index;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < CCS_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ // printf("ShmSysConfigAndInfo->SysInfo.CcsChargingData[%d].Index=%d\n",index, ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index );
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
|
|
|
+ {
|
|
|
+ //ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargedEnergy = 100.0;
|
|
|
+ sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargedEnergy );
|
|
|
+ }
|
|
|
+ } // END OF CCS_QUANTITY
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Phase, PhaseStr[L3_N]);
|
|
|
+ }
|
|
|
+ else if(gunType[gun_index] == 'G')
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
+ {
|
|
|
+ tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tempIndex = gun_index;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < GB_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
|
|
|
+ {
|
|
|
+ sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargedEnergy);
|
|
|
+ }
|
|
|
+ } // END OF GB_QUANTITY
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Phase, PhaseStr[L3_N]);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
|
|
|
+ {
|
|
|
+ tempIndex = 2;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tempIndex = gun_index;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < AC_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
|
|
|
+ {
|
|
|
+ sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PresentChargedEnergy );
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Phase, PhaseStr[L1_N]);
|
|
|
+ }
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Context, ReadingContextStr[ReadingContext_Sample_Periodic]);
|
|
|
+ strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Format, ValueFormatStr[Raw]);
|
|
|
+ strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Measurand, MeasurandStr[Energy_Active_Import_Interval]);
|
|
|
+ //strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Phase, PhaseStr[L1_N]);
|
|
|
+ strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Location, LocationStr[Location_Outlet]);
|
|
|
+ strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Unit,UnitOfMeasureStr[UnitOfMeasure_kWh]);
|
|
|
+
|
|
|
+ //idx_sample=3;
|
|
|
+ //********************************(4)Power.Active.Export************************************************/
|
|
|
+ //J : CHAdeMO U: CCS1 combo E: CCS2 combo G: GBT DC
|
|
|
+
|
|
|
+ if(gunType[gun_index] == 'J')
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
+ {
|
|
|
+ tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tempIndex = gun_index;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < CHAdeMO_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
|
|
|
+ {
|
|
|
+ sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Value, "%.1f" , ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargingPower);
|
|
|
+ }
|
|
|
+ } // END OF FOR
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Phase, PhaseStr[L3_N]);
|
|
|
+ }
|
|
|
+ else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
+ {
|
|
|
+ tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tempIndex = gun_index;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < CCS_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
|
|
|
+ {
|
|
|
+ sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Value, "%.1f" , ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargingPower);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Phase, PhaseStr[L3_N]);
|
|
|
+ }
|
|
|
+ else if(gunType[gun_index] == 'G')
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
+ {
|
|
|
+ tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tempIndex = gun_index;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < GB_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
|
|
|
+ {
|
|
|
+ //ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargingPower = 100.0;
|
|
|
+ sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Value, "%.1f" , ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargingPower);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Phase, PhaseStr[L3_N]);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
|
|
|
+ {
|
|
|
+ tempIndex = 2;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tempIndex = gun_index;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < AC_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
|
|
|
+ {
|
|
|
+ sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Value, "%.1f" , ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PresentChargingPower);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Phase, PhaseStr[L1_N]);
|
|
|
+ }
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Context, ReadingContextStr[ReadingContext_Sample_Periodic]);
|
|
|
+ strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Format, ValueFormatStr[Raw]);
|
|
|
+ strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Measurand, MeasurandStr[Power_Active_Import]);
|
|
|
+ //strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Phase, PhaseStr[L1_N]);
|
|
|
+ strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Location, LocationStr[Location_Outlet]);
|
|
|
+ strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Unit,UnitOfMeasureStr[UnitOfMeasure_kW]);
|
|
|
+
|
|
|
+
|
|
|
+ //idx_sample=4;
|
|
|
+ //***********************************************(5)VOLTAGE******************************************************/
|
|
|
+ //J : CHAdeMO U: CCS1 combo E: CCS2 combo G: GBT DC
|
|
|
+
|
|
|
+ if(gunType[gun_index] == 'J')
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
+ {
|
|
|
+ tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tempIndex = gun_index;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < CHAdeMO_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
|
|
|
+ {
|
|
|
+ sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargingVoltage );
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Phase, PhaseStr[L3_N]);
|
|
|
+ }
|
|
|
+ else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
+ {
|
|
|
+ tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tempIndex = gun_index;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < CCS_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
|
|
|
+ {
|
|
|
+ sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargingVoltage );
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Phase, PhaseStr[L3_N]);
|
|
|
+ }
|
|
|
+ else if(gunType[gun_index] == 'G')
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
+ {
|
|
|
+ tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tempIndex = gun_index;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < GB_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
|
|
|
+ {
|
|
|
+ sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargingVoltage );
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Phase, PhaseStr[L3_N]);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
|
|
|
+ {
|
|
|
+ tempIndex = 2;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tempIndex = gun_index;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < AC_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
|
|
|
+ {
|
|
|
+ sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PresentChargingVoltage );
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Phase, PhaseStr[L1_N]);
|
|
|
+ }
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Context, ReadingContextStr[ReadingContext_Sample_Periodic]);
|
|
|
+ strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Format, ValueFormatStr[Raw]);
|
|
|
+ strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Measurand, MeasurandStr[Voltage]);
|
|
|
+ // strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Phase, PhaseStr[L1_N]);
|
|
|
+ strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Location, LocationStr[Location_Outlet]);
|
|
|
+ strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Unit,UnitOfMeasureStr[UnitOfMeasure_V]);
|
|
|
+
|
|
|
+
|
|
|
+ if((gunType[gun_index] == 'J')||(gunType[gun_index] == 'U')||(gunType[gun_index] == 'E')||(gunType[gun_index] == 'G'))
|
|
|
+ {
|
|
|
+ //idx_sample=5;
|
|
|
+ //sampledValue = NULL;
|
|
|
+ //***********************************************(6)SOC******************************************************/
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
+ {
|
|
|
+ tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tempIndex = gun_index;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(gunType[gun_index] == 'J')
|
|
|
+ {
|
|
|
+ //tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
+
|
|
|
+ for (int index = 0; index < CHAdeMO_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
|
|
|
+ {
|
|
|
+ sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[5].Value, "%d" ,ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].EvBatterySoc );
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
|
|
|
+ {
|
|
|
+ //tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
+
|
|
|
+ for (int index = 0; index < CCS_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
|
|
|
+ {
|
|
|
+ sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[5].Value, "%d" ,ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].EvBatterySoc );
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ else if(gunType[gun_index] == 'G')
|
|
|
+ {
|
|
|
+ //tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
+
|
|
|
+ for (int index = 0; index < GB_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
|
|
|
+ {
|
|
|
+ sprintf((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[5].Value, "%d" ,ShmSysConfigAndInfo->SysInfo.GbChargingData[index].EvBatterySoc );
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[5].Context, ReadingContextStr[ReadingContext_Sample_Periodic]);
|
|
|
+ strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[5].Format, ValueFormatStr[Raw]);
|
|
|
+ strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[5].Measurand, MeasurandStr[SoC]);
|
|
|
+ strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[5].Phase, PhaseStr[L3_N]);
|
|
|
+ strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[5].Location, LocationStr[Location_Outlet]);
|
|
|
+ strcpy((char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[5].Unit,UnitOfMeasureStr[UnitOfMeasure_Percent]);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ if((gunType[gun_index] == 'J')||(gunType[gun_index] == 'U')||(gunType[gun_index] == 'E')||(gunType[gun_index] == 'G'))
|
|
|
+ {
|
|
|
+ sprintf(queuedata,"%d,[%d,\"%s\",\"MeterValues\",{\"connectorId\":%d,\"transactionId\":%d,\"meterValue\":[{\"timestamp\":\"%s\",\"sampledValue\":[{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"}]}]}]"
|
|
|
+ ,gun_index + 1
|
|
|
+ ,MESSAGE_TYPE_CALL
|
|
|
+ ,guid
|
|
|
+ ,ShmOCPP16Data->MeterValues[gun_index].ConnectorId
|
|
|
+ ,ShmOCPP16Data->MeterValues[gun_index].TransactionId
|
|
|
+ ,(const char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].TimeStamp
|
|
|
+ ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Value
|
|
|
+ ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Context
|
|
|
+ ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Format
|
|
|
+ ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Measurand
|
|
|
+ ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Phase
|
|
|
+ ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Location
|
|
|
+ ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Unit
|
|
|
+ ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Value
|
|
|
+ ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Context
|
|
|
+ ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Format
|
|
|
+ ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Measurand
|
|
|
+ ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Phase
|
|
|
+ ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Location
|
|
|
+ ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Unit
|
|
|
+ ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Value
|
|
|
+ ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Context
|
|
|
+ ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Format
|
|
|
+ ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Measurand
|
|
|
+ ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Phase
|
|
|
+ ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Location
|
|
|
+ ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Unit
|
|
|
+ ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Value
|
|
|
+ ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Context
|
|
|
+ ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Format
|
|
|
+ ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Measurand
|
|
|
+ ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Phase
|
|
|
+ ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Location
|
|
|
+ ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Unit
|
|
|
+ ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Value
|
|
|
+ ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Context
|
|
|
+ ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Format
|
|
|
+ ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Measurand
|
|
|
+ ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Phase
|
|
|
+ ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Location
|
|
|
+ ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Unit
|
|
|
+ ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[5].Value
|
|
|
+ ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[5].Context
|
|
|
+ ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[5].Format
|
|
|
+ ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[5].Measurand
|
|
|
+ ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[5].Phase
|
|
|
+ ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[5].Location
|
|
|
+ ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[5].Unit
|
|
|
+
|
|
|
+ );
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ sprintf(queuedata,"%d,[%d,\"%s\",\"MeterValues\",{\"connectorId\":%d,\"transactionId\":%d,\"meterValue\":[{\"timestamp\":\"%s\",\"sampledValue\":[{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"}]}]}]"
|
|
|
+ ,gun_index + 1
|
|
|
+ ,MESSAGE_TYPE_CALL
|
|
|
+ ,guid
|
|
|
+ ,ShmOCPP16Data->MeterValues[gun_index].ConnectorId
|
|
|
+ ,ShmOCPP16Data->MeterValues[gun_index].TransactionId
|
|
|
+ ,(const char *)ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].TimeStamp
|
|
|
+ ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Value
|
|
|
+ ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Context
|
|
|
+ ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Format
|
|
|
+ ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Measurand
|
|
|
+ ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Phase
|
|
|
+ ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Location
|
|
|
+ ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[0].Unit
|
|
|
+ ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Value
|
|
|
+ ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Context
|
|
|
+ ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Format
|
|
|
+ ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Measurand
|
|
|
+ ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Phase
|
|
|
+ ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Location
|
|
|
+ ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[1].Unit
|
|
|
+ ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Value
|
|
|
+ ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Context
|
|
|
+ ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Format
|
|
|
+ ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Measurand
|
|
|
+ ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Phase
|
|
|
+ ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Location
|
|
|
+ ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[2].Unit
|
|
|
+ ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Value
|
|
|
+ ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Context
|
|
|
+ ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Format
|
|
|
+ ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Measurand
|
|
|
+ ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Phase
|
|
|
+ ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Location
|
|
|
+ ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[3].Unit
|
|
|
+ ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Value
|
|
|
+ ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Context
|
|
|
+ ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Format
|
|
|
+ ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Measurand
|
|
|
+ ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Phase
|
|
|
+ ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Location
|
|
|
+ ,ShmOCPP16Data->MeterValues[gun_index].MeterValue[0].SampledValue[4].Unit
|
|
|
+
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
+ // Put request guid to hash map
|
|
|
+ sprintf(tempdata, "MeterValues,%d", (gun_index));
|
|
|
+ if(hashmap_operation(0, guid, tempdata) == 1)//if(hashmap_operation(0,NULL/*hashMap*/, mapItem[0].key_string, mapItem[0].key_value/*mapItem*/, (void**)(&mapItem)/*(void**)(&mapItem)*/) == MAP_OK/*hashmap_put(hashMap, mapItem->key_string, mapItem) == MAP_OK*/)
|
|
|
+ {
|
|
|
+ result = PASS;
|
|
|
+ DEBUG_INFO("MeterValues mapitem pass\n");
|
|
|
+ }
|
|
|
+ queue_operation(4, guid, queuedata );//addq(guid, queuedata); ---> remove temporally
|
|
|
+
|
|
|
+ if(GetTransactionQueueNum() == 1)
|
|
|
+ {
|
|
|
+ LWS_Send(queuedata +2);
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ return result;
|
|
|
+}
|
|
|
+
|
|
|
+//==========================================
|
|
|
+// send confirm routine
|
|
|
+//==========================================
|
|
|
+int sendCancelReservationConfirmation(char *uuid,char *payload)
|
|
|
+{
|
|
|
+ mtrace();
|
|
|
+ int result = FAIL;
|
|
|
+ char message[100]={0};
|
|
|
+
|
|
|
+ DEBUG_INFO("sendCancelReservationConfirmation...\n");
|
|
|
+ sprintf(message,"[%d,\"%s\",{\"status\":\"%s\"}]",MESSAGE_TYPE_CALLRESULT,uuid, payload);
|
|
|
+ LWS_Send(message);
|
|
|
+ result = TRUE;
|
|
|
+ ShmOCPP16Data->CsMsg.bits[0].CancelReservationConf = 0;
|
|
|
+ return result;
|
|
|
+}
|
|
|
+
|
|
|
+int sendChangeAvailabilityConfirmation(char *uuid,char *payload)
|
|
|
+{
|
|
|
+ mtrace();
|
|
|
+ int result = FAIL;
|
|
|
+ char message[100]={0};
|
|
|
+ DEBUG_INFO("sendChangeAvailabilityConfirmation...\n");
|
|
|
+ sprintf(message,"[%d,\"%s\",{\"status\":\"%s\"}]",MESSAGE_TYPE_CALLRESULT,uuid, payload);
|
|
|
+ LWS_Send(message);
|
|
|
+ result = TRUE;
|
|
|
+
|
|
|
+ return result;
|
|
|
+}
|
|
|
+
|
|
|
+int sendChangeConfigurationConfirmation(char *uuid,char *payload)
|
|
|
+{
|
|
|
+ mtrace();
|
|
|
+ int result = FAIL;
|
|
|
+ char message[100]={0};
|
|
|
+
|
|
|
+ DEBUG_INFO("sendChangeConfigurationConfirmation...\n");
|
|
|
+ sprintf(message,"[%d,\"%s\",{\"status\":\"%s\"}]",MESSAGE_TYPE_CALLRESULT,uuid, payload);
|
|
|
+ LWS_Send(message);
|
|
|
+ result = TRUE;
|
|
|
+
|
|
|
+ return result;
|
|
|
+}
|
|
|
+
|
|
|
+int sendClearCacheConfirmation(char *uuid,char *payload)
|
|
|
+{
|
|
|
+ mtrace();
|
|
|
+ int result = FAIL;
|
|
|
+ char message[500]={0};
|
|
|
+
|
|
|
+ DEBUG_INFO("sendClearCacheConfirmation...\n");
|
|
|
+ sprintf(message,"[%d,\"%s\",{\"%s\":\"%s\"}]",MESSAGE_TYPE_CALLRESULT, uuid, "status", payload);
|
|
|
+ LWS_Send(message);
|
|
|
+
|
|
|
+ return result;
|
|
|
+}
|
|
|
+
|
|
|
+int sendClearChargingProfileConfirmation(char *uuid,char *payload)
|
|
|
+{
|
|
|
+ mtrace();
|
|
|
+ int result = FAIL;
|
|
|
+
|
|
|
+ char message[500]={0};
|
|
|
+
|
|
|
+ DEBUG_INFO("sendClearChargingProfileConfirmation...\n");
|
|
|
+ sprintf(message,"[%d,\"%s\",{\"%s\":\"%s\"}]",MESSAGE_TYPE_CALLRESULT, uuid, "status", payload);
|
|
|
+ LWS_Send(message);
|
|
|
+
|
|
|
+ return result;
|
|
|
+}
|
|
|
+
|
|
|
+int sendDataTransferConfirmation(char *uuid,char *payload)
|
|
|
+{
|
|
|
+ mtrace();
|
|
|
+ char statusStr[20]={0};
|
|
|
+ char dataStr[10]={0};
|
|
|
+ char sstr[20]={0};
|
|
|
+ int c = 0;
|
|
|
+ char *loc;
|
|
|
+ int result = FAIL;
|
|
|
+
|
|
|
+ DEBUG_INFO("sendDataTransferConfirmation...\n");
|
|
|
+ /**********************status**************************/
|
|
|
+ loc = strstr(payload, "status");
|
|
|
+ memset(sstr ,0, sizeof(sstr) );
|
|
|
+ c = 0;
|
|
|
+ while (loc[3+strlen("status")+c] != '\"')
|
|
|
+ {
|
|
|
+ sstr[c] = loc[3+strlen("status")+c];
|
|
|
+ c++;
|
|
|
+ }
|
|
|
+ sstr[c] = '\0';
|
|
|
+ strcpy(statusStr, sstr);
|
|
|
+
|
|
|
+
|
|
|
+ /**********************data**************************/
|
|
|
+ loc = strstr(payload, "data");
|
|
|
+ memset(sstr ,0, sizeof(sstr) );
|
|
|
+ c = 0;
|
|
|
+ while (loc[3+strlen("data")+c] != '\"')
|
|
|
+ {
|
|
|
+ sstr[c] = loc[3+strlen("data")+c];
|
|
|
+ c++;
|
|
|
+ }
|
|
|
+ sstr[c] = '\0';
|
|
|
+ strcpy(dataStr, sstr);
|
|
|
+
|
|
|
+ return result;
|
|
|
+}
|
|
|
+
|
|
|
+int sendGetCompositeScheduleConfirmation(char *uuid, char *payload, int connectorIdInt, int nPeriod)
|
|
|
+{
|
|
|
+ mtrace();
|
|
|
+ int result = FAIL;
|
|
|
+ char message[1000]={0};
|
|
|
+ int CompositeScheduleIndex = 0;
|
|
|
+
|
|
|
+ DEBUG_INFO("sendGetCompositeScheduleConfirmation...\n");
|
|
|
+
|
|
|
+ CompositeScheduleIndex = (connectorIdInt > 0) ?(connectorIdInt -1) : 0;
|
|
|
+ if(nPeriod == 0)
|
|
|
+ {
|
|
|
+ if(strcmp((const char *)ShmOCPP16Data->GetCompositeSchedule[CompositeScheduleIndex].ResponseChargingSchedule.StartSchedule,"")==0)
|
|
|
+ {
|
|
|
+ sprintf(message,"[%d,\"%s\",{\"status\":\"%s\",\"connectorId\":%d}]"
|
|
|
+ ,MESSAGE_TYPE_CALLRESULT
|
|
|
+ ,uuid
|
|
|
+ ,payload
|
|
|
+ ,connectorIdInt);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ sprintf(message,"[%d,\"%s\",{\"status\":\"%s\",\"connectorId\":%d,\"scheduleStart\":\"%s\",\"chargingSchedule\":{\"duration\":%d,\"startSchedule\":\"%s\",\"chargingRateUnit\":\"%s\",\"chargingSchedulePeriod\":[{\"startPeriod\":0,\"limit\":0,\"numberPhases\":3}]}}]"
|
|
|
+ ,MESSAGE_TYPE_CALLRESULT
|
|
|
+ ,uuid
|
|
|
+ ,payload
|
|
|
+ ,connectorIdInt
|
|
|
+ ,ShmOCPP16Data->GetCompositeSchedule[CompositeScheduleIndex].ResponseChargingSchedule.StartSchedule
|
|
|
+ ,ShmOCPP16Data->GetCompositeSchedule[CompositeScheduleIndex].ResponseChargingSchedule.Duration
|
|
|
+ ,ShmOCPP16Data->GetCompositeSchedule[CompositeScheduleIndex].ResponseChargingSchedule.StartSchedule
|
|
|
+ ,ShmOCPP16Data->GetCompositeSchedule[CompositeScheduleIndex].ResponseChargingSchedule.ChargingRateUnit);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ sprintf(message,"[%d,\"%s\",{\"status\":\"%s\",\"connectorId\":%d,\"scheduleStart\":\"%s\",\"chargingSchedule\":{\"duration\":%d,\"startSchedule\":\"%s\",\"chargingRateUnit\":\"%s\",\"chargingSchedulePeriod\":["
|
|
|
+ ,MESSAGE_TYPE_CALLRESULT
|
|
|
+ ,uuid
|
|
|
+ ,payload
|
|
|
+ ,connectorIdInt
|
|
|
+ ,ShmOCPP16Data->GetCompositeSchedule[CompositeScheduleIndex].ResponseChargingSchedule.StartSchedule
|
|
|
+ ,ShmOCPP16Data->GetCompositeSchedule[CompositeScheduleIndex].ResponseChargingSchedule.Duration
|
|
|
+ ,ShmOCPP16Data->GetCompositeSchedule[CompositeScheduleIndex].ResponseChargingSchedule.StartSchedule
|
|
|
+ ,ShmOCPP16Data->GetCompositeSchedule[CompositeScheduleIndex].ResponseChargingSchedule.ChargingRateUnit);
|
|
|
+
|
|
|
+ for(int idx_sample=0;idx_sample< nPeriod;idx_sample++)
|
|
|
+ {
|
|
|
+ if (idx_sample == 0)
|
|
|
+ {
|
|
|
+ sprintf(message + strlen(message), "{\"startPeriod\":%d,\"limit\":%.1f,\"numberPhases\":%d}"
|
|
|
+ , ShmOCPP16Data->GetCompositeSchedule[CompositeScheduleIndex].ResponseChargingSchedule.ChargingSchedulePeriod[idx_sample].StartPeriod
|
|
|
+ , ShmOCPP16Data->GetCompositeSchedule[CompositeScheduleIndex].ResponseChargingSchedule.ChargingSchedulePeriod[idx_sample].Limit
|
|
|
+ , ShmOCPP16Data->GetCompositeSchedule[CompositeScheduleIndex].ResponseChargingSchedule.ChargingSchedulePeriod[idx_sample].NumberPhases );
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ sprintf(message + strlen(message), ",{\"startPeriod\":%d,\"limit\":%.1f,\"numberPhases\":%d}"
|
|
|
+ , ShmOCPP16Data->GetCompositeSchedule[CompositeScheduleIndex].ResponseChargingSchedule.ChargingSchedulePeriod[idx_sample].StartPeriod
|
|
|
+ , ShmOCPP16Data->GetCompositeSchedule[CompositeScheduleIndex].ResponseChargingSchedule.ChargingSchedulePeriod[idx_sample].Limit
|
|
|
+ , ShmOCPP16Data->GetCompositeSchedule[CompositeScheduleIndex].ResponseChargingSchedule.ChargingSchedulePeriod[idx_sample].NumberPhases );
|
|
|
+ }
|
|
|
+ }
|
|
|
+ sprintf(message + strlen(message), "]}}]");
|
|
|
+ }
|
|
|
+
|
|
|
+ LWS_Send(message);
|
|
|
+ result = TRUE;
|
|
|
+ return result;
|
|
|
+}
|
|
|
+
|
|
|
+int sendGetConfigurationConfirmation(char *uuid)
|
|
|
+{
|
|
|
+ mtrace();
|
|
|
+ int result = FAIL;
|
|
|
+ int MaxKeySupported = 0;
|
|
|
+ int sentConfigurationNumber= 0;
|
|
|
+ int sentunConfigurationNumber= 0;
|
|
|
+ char message[4000]={0};
|
|
|
+
|
|
|
+ DEBUG_INFO("sendGetConfigurationConfirmation...\n");
|
|
|
+
|
|
|
+ MaxKeySupported = atoi((const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[GetConfigurationMaxKeys].ItemData);
|
|
|
+
|
|
|
+ //DEBUG_INFO("MaxKeySupported=%d\n",MaxKeySupported);
|
|
|
+
|
|
|
+ sprintf(message,"[%d,\"%s\",{\"configurationKey\":["
|
|
|
+ ,MESSAGE_TYPE_CALLRESULT
|
|
|
+ ,uuid );
|
|
|
+
|
|
|
+ //configuration key
|
|
|
+ for(int idx_sample=0;idx_sample< MaxKeySupported/*43*/;idx_sample++)
|
|
|
+ {
|
|
|
+ if(strcmp((const char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[idx_sample].Key, "")!= 0)
|
|
|
+ {
|
|
|
+ if (sentConfigurationNumber == 0)
|
|
|
+ {
|
|
|
+ sprintf(message + strlen(message), "{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}"
|
|
|
+ , ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[idx_sample].Key
|
|
|
+ , atoi((const char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[idx_sample].ReadOnly) == 1 ? "true":"false"
|
|
|
+ , ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[idx_sample].Value );
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ sprintf(message + strlen(message), ", {\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}"
|
|
|
+ , ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[idx_sample].Key
|
|
|
+ , atoi((const char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[idx_sample].ReadOnly) == 1 ? "true":"false"
|
|
|
+ , ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[idx_sample].Value );
|
|
|
+ }
|
|
|
+
|
|
|
+ sentConfigurationNumber = sentConfigurationNumber + 1;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ sprintf(message + strlen(message), "]");
|
|
|
+
|
|
|
+
|
|
|
+ if(UnknownKeynum != 0)
|
|
|
+ {
|
|
|
+ sprintf(message + strlen(message), ",\"unknownKey\":[");
|
|
|
+ //unkown key
|
|
|
+ for(int idx_sample=0;idx_sample< UnknownKeynum ;idx_sample++)
|
|
|
+ {
|
|
|
+ // json_object *jstring1 = json_object_new_string((const char *)((ShmOCPP16Data->GetConfiguration.ResponseUnknownKey + idx_sample)->Item));
|
|
|
+
|
|
|
+ DEBUG_INFO("unkown key:%s\n", ShmOCPP16Data->GetConfiguration.ResponseUnknownKey[idx_sample].Item);
|
|
|
+
|
|
|
+ if(sentunConfigurationNumber == 0)
|
|
|
+ {
|
|
|
+ sprintf(message + strlen(message), "\"%s\""
|
|
|
+ , ShmOCPP16Data->GetConfiguration.ResponseUnknownKey[idx_sample].Item );
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ sprintf(message + strlen(message), ",\"%s\""
|
|
|
+ , ShmOCPP16Data->GetConfiguration.ResponseUnknownKey[idx_sample].Item );
|
|
|
+ }
|
|
|
+ sentunConfigurationNumber = sentunConfigurationNumber + 1;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ sprintf(message + strlen(message), "]");
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ sprintf(message + strlen(message), "}]");
|
|
|
+
|
|
|
+ LWS_Send(message);
|
|
|
+
|
|
|
+ return result;
|
|
|
+}
|
|
|
+
|
|
|
+int sendGetDiagnosticsConfirmation(char *uuid,char *payload)
|
|
|
+{
|
|
|
+ mtrace();
|
|
|
+ int result = FAIL;
|
|
|
+ char message[400]={0};
|
|
|
+
|
|
|
+ DEBUG_INFO("sendGetDiagnosticsConfirmation...\n");
|
|
|
+
|
|
|
+ if(strcmp(payload,"")==0)
|
|
|
+ {
|
|
|
+ sprintf(message,"[%d,\"%s\",{}]",MESSAGE_TYPE_CALLRESULT, uuid);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ sprintf(message,"[%d,\"%s\",{\"fileName\":\"%s\"}]", MESSAGE_TYPE_CALLRESULT, uuid, payload);
|
|
|
+ }
|
|
|
+ LWS_Send(message);
|
|
|
+ result = TRUE;
|
|
|
+
|
|
|
+ return result;
|
|
|
+}
|
|
|
+
|
|
|
+int sendGetLocalListVersionConfirmation(char *uuid,char *payload)
|
|
|
+{
|
|
|
+ mtrace();
|
|
|
+ int result = FAIL;
|
|
|
+ char message[80]={0};
|
|
|
+
|
|
|
+ DEBUG_INFO("sendGetLocalListVersionConfirmation...\n");
|
|
|
+ sprintf(message,"[%d,\"%s\",{\"listVersion\":%d}]",MESSAGE_TYPE_CALLRESULT, uuid, ShmOCPP16Data->GetLocalListVersion.ResponseListVersion);
|
|
|
+ LWS_Send(message);
|
|
|
+ result = TRUE;
|
|
|
+
|
|
|
+ return result;
|
|
|
+}
|
|
|
+
|
|
|
+int sendRemoteStartConfirmation(char *uuid,char *payload)
|
|
|
+{
|
|
|
+ mtrace();
|
|
|
+ int result = FAIL;
|
|
|
+ char message[80]={0};
|
|
|
+
|
|
|
+ DEBUG_INFO("sendRemoteStartConfirmation...\n");
|
|
|
+ sprintf(message,"[%d,\"%s\",{\"status\":\"%s\"}]",MESSAGE_TYPE_CALLRESULT, uuid, payload);
|
|
|
+ LWS_Send(message);
|
|
|
+ result = TRUE;
|
|
|
+
|
|
|
+ return result;
|
|
|
+}
|
|
|
+
|
|
|
+int sendRemoteStopTransactionConfirmation(char *uuid,char *payload)
|
|
|
+{
|
|
|
+ mtrace();
|
|
|
+ int result = FAIL;
|
|
|
+ char message[80]={0};
|
|
|
+
|
|
|
+ DEBUG_INFO("sendRemoteStopTransactionConfirmation...\n");
|
|
|
+ sprintf(message,"[%d,\"%s\",{\"status\":\"%s\"}]",MESSAGE_TYPE_CALLRESULT, uuid, payload);
|
|
|
+ LWS_Send(message);
|
|
|
+ result = TRUE;
|
|
|
+
|
|
|
+ return result;
|
|
|
+}
|
|
|
+
|
|
|
+int sendReserveNowTransactionConfirmation(char *uuid,char *payload)
|
|
|
+{
|
|
|
+ mtrace();
|
|
|
+ int result = FAIL;
|
|
|
+ char message[80]={0};
|
|
|
+// [3,"287d837d-809e-41ea-8385-fdab7f72a01c",{"status":"Accepted"}]
|
|
|
+
|
|
|
+ DEBUG_INFO("sendReserveNowTransactionConfirmation...\n");
|
|
|
+ sprintf(message,"[%d,\"%s\",{\"status\":\"%s\"}]",MESSAGE_TYPE_CALLRESULT, uuid, payload);
|
|
|
+ LWS_Send(message);
|
|
|
+ result = TRUE;
|
|
|
+
|
|
|
+ return result;
|
|
|
+}
|
|
|
+
|
|
|
+int sendResetConfirmation(char *uuid,char *payload)
|
|
|
+{
|
|
|
+ mtrace();
|
|
|
+ int result = FAIL;
|
|
|
+ //[ 3, "6f88d461-4d17-462c-a69b-1f7a8c5b12df", { "status": 0 } ]
|
|
|
+ char message[80]={0};
|
|
|
+
|
|
|
+ ShmOCPP16Data->MsMsg.bits.ResetConf = 0;
|
|
|
+
|
|
|
+ sprintf(message,"[%d,\"%s\",{\"status\":\"%s\"}]",MESSAGE_TYPE_CALLRESULT, uuid, payload);
|
|
|
+ LWS_Send(message);
|
|
|
+ result = TRUE;
|
|
|
+
|
|
|
+ return result;
|
|
|
+}
|
|
|
+
|
|
|
+int sendSendLocalListConfirmation(char *uuid,char *payload)
|
|
|
+{
|
|
|
+ mtrace();
|
|
|
+ int result = FAIL;
|
|
|
+ char message[500]={0};
|
|
|
+// [ 3, "1571284266109", { "status": "Accepted" } ]
|
|
|
+ sprintf(message,"[%d,\"%s\",{\"%s\":\"%s\"}]",MESSAGE_TYPE_CALLRESULT, uuid, "status", payload);
|
|
|
+ LWS_Send(message);
|
|
|
+ result = TRUE;
|
|
|
+
|
|
|
+ return result;
|
|
|
+}
|
|
|
+
|
|
|
+int sendSetChargingProfileConfirmation(char *uuid,char *payload)
|
|
|
+{
|
|
|
+ mtrace();
|
|
|
+ int result = FAIL;
|
|
|
+//[3,"5748585f-8524-4fa6-9b4f-4a7eca750b90",{"status":"NotSupported"}]
|
|
|
+ char message[80]={0};
|
|
|
+
|
|
|
+ DEBUG_INFO("sendSetChargingProfileConfirmation...\n");
|
|
|
+ sprintf(message,"[%d,\"%s\",{\"status\":\"%s\"}]",MESSAGE_TYPE_CALLRESULT, uuid, payload);
|
|
|
+ LWS_Send(message);
|
|
|
+ result = TRUE;
|
|
|
+
|
|
|
+ return result;
|
|
|
+}
|
|
|
+
|
|
|
+int sendTriggerMessageConfirmation(char *uuid,char *payload)
|
|
|
+{
|
|
|
+ mtrace();
|
|
|
+ int result = FAIL;
|
|
|
+ char message[80]={0};
|
|
|
+
|
|
|
+ DEBUG_INFO("sendTriggerMessageConfirmation...\n");
|
|
|
+ sprintf(message,"[%d,\"%s\",{\"status\":\"%s\"}]",MESSAGE_TYPE_CALLRESULT, uuid, payload);
|
|
|
+ LWS_Send(message);
|
|
|
+ result = TRUE;
|
|
|
+
|
|
|
+ return result;
|
|
|
+}
|
|
|
+
|
|
|
+int sendUnlockConnectorConfirmation(char *uuid,char *payload)
|
|
|
+{
|
|
|
+ mtrace();
|
|
|
+ int result = FAIL;
|
|
|
+ char message[80]={0};
|
|
|
+
|
|
|
+//[ 3, "ba1cbd49-2a76-493a-8f76-fa23e7606532", { "status": "Unlocked" } ]
|
|
|
+ DEBUG_INFO("sendUnlockConnectorConfirmation...\n");
|
|
|
+ sprintf(message,"[%d,\"%s\",{\"status\":\"%s\"}]",MESSAGE_TYPE_CALLRESULT, uuid, payload);
|
|
|
+ LWS_Send(message);
|
|
|
+ result = TRUE;
|
|
|
+
|
|
|
+ return result;
|
|
|
+}
|
|
|
+
|
|
|
+int sendUpdateFirmwareConfirmation(char *uuid)
|
|
|
+{
|
|
|
+ mtrace();
|
|
|
+ int result = FAIL;
|
|
|
+
|
|
|
+ char message[60]={0};
|
|
|
+
|
|
|
+ //[ 3, "ba1cbd49-2a76-493a-8f76-fa23e7606532", { "status": "Unlocked" } ]
|
|
|
+ DEBUG_INFO("sendUpdateFirmwareConfirmation...\n");
|
|
|
+ sprintf(message,"[%d,\"%s\",{}]",MESSAGE_TYPE_CALLRESULT, uuid);
|
|
|
+ LWS_Send(message);
|
|
|
+ result = TRUE;
|
|
|
+
|
|
|
+ return result;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+//==========================================
|
|
|
+// send CallError routine
|
|
|
+//==========================================
|
|
|
+void SendCallError(char *uniqueId, char *action, char *errorCode, char *errorDescription)
|
|
|
+{
|
|
|
+ mtrace();
|
|
|
+ char message[220]={0};
|
|
|
+
|
|
|
+ DEBUG_INFO("An error occurred. Sending this information: uniqueId {}: action: {}, errorCore: {}, errorDescription: {}\n", uniqueId, action, errorCode, errorDescription);
|
|
|
+
|
|
|
+ sprintf(message,"[%d,\"%s\",\"%s\",\"%s\",{}]",MESSAGE_TYPE_CALLERROR, uniqueId, errorCode, errorDescription);
|
|
|
+ LWS_Send(message);
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+//==========================================
|
|
|
+// Handle server request routine Start
|
|
|
+//==========================================
|
|
|
+int handleCancelReservationRequest(char *uuid, char *payload)
|
|
|
+{
|
|
|
+ mtrace();
|
|
|
+ int result = FAIL;
|
|
|
+ int gunNO = 0;
|
|
|
+ int reservationIdInt =0;
|
|
|
+ char comfirmstr[20];
|
|
|
+ DEBUG_INFO("handleCancelReservationRequest...\n");
|
|
|
+
|
|
|
+ json_object *CancelReservation;
|
|
|
+ CancelReservation = json_tokener_parse(payload);
|
|
|
+ if(!is_error(CancelReservation))
|
|
|
+ {
|
|
|
+ // Required data
|
|
|
+ reservationIdInt = json_object_get_int(json_object_object_get(CancelReservation, "reservationId"));
|
|
|
+ }
|
|
|
+ json_object_put(CancelReservation);
|
|
|
+
|
|
|
+
|
|
|
+ memset(comfirmstr, 0, sizeof comfirmstr);
|
|
|
+ sprintf(comfirmstr, "%s", CancelReservationStatusStr[CancelReservationStatus_Rejected]);
|
|
|
+
|
|
|
+ //0: Booting, 1: idle, 2: authorizing, 3: preparing, 4: charging, 5: terminating, 6: alarm, 7: fault, 8: Reserved, 9: maintain
|
|
|
+ //check Transaction active
|
|
|
+ //J: CHAdeMO U: CCS1 combo E: CCS2 combo G: GBT DC
|
|
|
+ for (int index = 0; index < CHAdeMO_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].ReservationId == reservationIdInt)
|
|
|
+ {
|
|
|
+ sprintf(comfirmstr, "%s", CancelReservationStatusStr[CancelReservationStatus_Accepted] );
|
|
|
+ sprintf((char *)ShmOCPP16Data->CancelReservation[ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index].ResponseStatus, "%s", comfirmstr );
|
|
|
+
|
|
|
+ if(gunType[2] == 'J')
|
|
|
+ {
|
|
|
+ gunNO = ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index + 1;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ gunNO = ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index;
|
|
|
+ }
|
|
|
+
|
|
|
+ ShmOCPP16Data->CsMsg.bits[gunNO].CancelReservationReq = 1;
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < CCS_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].ReservationId == reservationIdInt)
|
|
|
+ {
|
|
|
+ sprintf(comfirmstr, "%s", CancelReservationStatusStr[CancelReservationStatus_Accepted] );
|
|
|
+ sprintf((char *)ShmOCPP16Data->CancelReservation[ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index].ResponseStatus, "%s", comfirmstr );
|
|
|
+ if((gunType[2] == 'U') || (gunType[2] == 'E'))
|
|
|
+ {
|
|
|
+ gunNO = ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index + 1;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ gunNO = ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index;
|
|
|
+ }
|
|
|
+
|
|
|
+ ShmOCPP16Data->CsMsg.bits[gunNO].CancelReservationReq = 1;
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ for (int index = 0; index < GB_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].ReservationId == reservationIdInt)
|
|
|
+ {
|
|
|
+ sprintf(comfirmstr, "%s", CancelReservationStatusStr[CancelReservationStatus_Accepted] );
|
|
|
+ sprintf((char *)ShmOCPP16Data->CancelReservation[ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index].ResponseStatus, "%s", comfirmstr );
|
|
|
+ if(gunType[2] == 'G')
|
|
|
+ {
|
|
|
+ gunNO = ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index + 1;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ gunNO = ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index;
|
|
|
+ }
|
|
|
+
|
|
|
+ ShmOCPP16Data->CsMsg.bits[gunNO].CancelReservationReq = 1;
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ for (int index = 0; index < AC_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].ReservationId == reservationIdInt)
|
|
|
+ {
|
|
|
+ sprintf(comfirmstr, "%s", CancelReservationStatusStr[CancelReservationStatus_Accepted] );
|
|
|
+ sprintf((char *)ShmOCPP16Data->CancelReservation[ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index].ResponseStatus, "%s", comfirmstr );
|
|
|
+
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
|
|
|
+ {
|
|
|
+ gunNO = 1; //ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index ;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ gunNO = ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index;
|
|
|
+ }
|
|
|
+
|
|
|
+ ShmOCPP16Data->CsMsg.bits[gunNO].CancelReservationReq = 1;
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //The reservationId does NOT match the reservationId
|
|
|
+ sendCancelReservationConfirmation(uuid, comfirmstr);
|
|
|
+
|
|
|
+end:
|
|
|
+ // Fill in ocpp packet uuid
|
|
|
+ strcpy((char *)ShmOCPP16Data->CancelReservation[gunNO].guid, uuid);
|
|
|
+
|
|
|
+ return result;
|
|
|
+}
|
|
|
+
|
|
|
+int handleChangeAvailabilityRequest(char *uuid, char *payload)
|
|
|
+{
|
|
|
+ mtrace();
|
|
|
+ int result = FAIL;
|
|
|
+ int gunIndex = 0;
|
|
|
+ char typeStr[16]={0};
|
|
|
+ char comfirmstr[20];
|
|
|
+ int specificId = FALSE;
|
|
|
+
|
|
|
+ DEBUG_INFO("handleChangeAvailabilityRequest...\n");
|
|
|
+
|
|
|
+ json_object *ChangeAvailability;
|
|
|
+ ChangeAvailability = json_tokener_parse(payload);
|
|
|
+
|
|
|
+ if(!is_error(ChangeAvailability))
|
|
|
+ {
|
|
|
+ // Required data
|
|
|
+ gunIndex = json_object_get_int(json_object_object_get(ChangeAvailability, "connectorId"));
|
|
|
+ sprintf((char*)typeStr, "%s", json_object_get_string(json_object_object_get(ChangeAvailability, "type")));
|
|
|
+ }
|
|
|
+ json_object_put(ChangeAvailability);
|
|
|
+
|
|
|
+
|
|
|
+ if(gunIndex != 0)
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->ChangeAvailability[gunIndex - 1].ConnectorId= gunIndex;
|
|
|
+ sprintf((char *)ShmOCPP16Data->ChangeAvailability[gunIndex - 1].Type, "%s", typeStr);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ for(int i=0; i < gunTotalNumber; i++)
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->ChangeAvailability[i].ConnectorId= gunIndex;
|
|
|
+ sprintf((char *)ShmOCPP16Data->ChangeAvailability[i].Type, "%s", typeStr);
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ memset(comfirmstr, 0, sizeof comfirmstr);
|
|
|
+ sprintf(comfirmstr, "%s", AvailabilityStatusStr[Rejected] );
|
|
|
+
|
|
|
+ if((gunIndex == 0) || ((gunIndex - 1) < gunTotalNumber/*(CHAdeMO_QUANTITY+ CCS_QUANTITY + GB_QUANTITY)*/))
|
|
|
+ {
|
|
|
+ specificId = TRUE;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(specificId == FALSE)
|
|
|
+ goto end;
|
|
|
+
|
|
|
+ if(strcmp((const char *)typeStr, AvailabilityTypeStr[Inoperative]) == 0)
|
|
|
+ {
|
|
|
+
|
|
|
+ //----------------------gunIndex is 0 ------------------------------------------------//
|
|
|
+ if(gunIndex == 0)
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D') // 'D' means DC
|
|
|
+ {
|
|
|
+ for(int i=0; i < gunTotalNumber; i++)
|
|
|
+ {
|
|
|
+ for (int index = 0; index < CHAdeMO_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if ((gunType[i] == 'J')&&(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == i))
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_RESERVATION) // S_PRECHARGE
|
|
|
+ {
|
|
|
+ sprintf(comfirmstr, "%s", AvailabilityStatusStr[Rejected] );
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+ else if((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_AUTHORIZING) ||
|
|
|
+ (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_PREPARING) ||
|
|
|
+ (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_CHARGING) ||
|
|
|
+ (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_TERMINATING) ||
|
|
|
+ (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_COMPLETE)) // S_CHARGING
|
|
|
+ {
|
|
|
+ sprintf(comfirmstr, "%s", AvailabilityStatusStr[Scheduled] );
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }//END FOR CHAdeMO_QUANTITY
|
|
|
+
|
|
|
+ for (int index = 0; index < CCS_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (((gunType[i] == 'U')||(gunType[i] == 'E'))&&(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == i))
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_RESERVATION)// S_PRECHARGE
|
|
|
+ {
|
|
|
+ sprintf(comfirmstr, "%s", AvailabilityStatusStr[Rejected] );
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+ else if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_AUTHORIZING) ||
|
|
|
+ (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_PREPARING) ||
|
|
|
+ (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_CHARGING) ||
|
|
|
+ (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_TERMINATING) ||
|
|
|
+ (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_COMPLETE)) // S_CHARGING
|
|
|
+ {
|
|
|
+ sprintf(comfirmstr, "%s", AvailabilityStatusStr[Scheduled] );
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }//END FOR CCS_QUANTITY
|
|
|
+
|
|
|
+ for (int index = 0; index < GB_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if ((gunType[i] == 'G')&&(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == i))
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_RESERVATION) // S_PRECHARGE
|
|
|
+ {
|
|
|
+ sprintf(comfirmstr, "%s", AvailabilityStatusStr[Rejected] );
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+ else if((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_AUTHORIZING) ||
|
|
|
+ (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_PREPARING) ||
|
|
|
+ (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_CHARGING) ||
|
|
|
+ (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_TERMINATING) ||
|
|
|
+ (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_COMPLETE)) // S_CHARGING
|
|
|
+ {
|
|
|
+ sprintf(comfirmstr, "%s", AvailabilityStatusStr[Scheduled] );
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }// END FOR GB_QUANTITY
|
|
|
+
|
|
|
+ for (int index = 0; index < AC_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (((gunType[i] > '0')&&(gunType[i] <= '9'))&&(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == i))
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_RESERVATION) // S_PRECHARGE
|
|
|
+ {
|
|
|
+ sprintf(comfirmstr, "%s", AvailabilityStatusStr[Rejected] );
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+ else if((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_AUTHORIZING) ||
|
|
|
+ (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_PREPARING) ||
|
|
|
+ (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_CHARGING) ||
|
|
|
+ (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_TERMINATING) ||
|
|
|
+ (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_COMPLETE)) // S_CHARGING
|
|
|
+ {
|
|
|
+ sprintf(comfirmstr, "%s", AvailabilityStatusStr[Scheduled] );
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }//END FOR AC_QUANTITY
|
|
|
+ }// END FOR gunTotalNumber
|
|
|
+ }
|
|
|
+ else if (ShmSysConfigAndInfo->SysConfig.ModelName[0]=='A') //'A' means AC
|
|
|
+ {
|
|
|
+ for(int i=0; i < gunTotalNumber; i++)
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysInfo.AcChargingData[i].SystemStatus == SYS_MODE_RESERVATION) // S_PRECHARGE
|
|
|
+ {
|
|
|
+ sprintf(comfirmstr, "%s", AvailabilityStatusStr[Rejected] );
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+ else if((ShmSysConfigAndInfo->SysInfo.AcChargingData[i].SystemStatus == SYS_MODE_AUTHORIZING) ||
|
|
|
+ (ShmSysConfigAndInfo->SysInfo.AcChargingData[i].SystemStatus == SYS_MODE_PREPARING) ||
|
|
|
+ (ShmSysConfigAndInfo->SysInfo.AcChargingData[i].SystemStatus == SYS_MODE_CHARGING) ||
|
|
|
+ (ShmSysConfigAndInfo->SysInfo.AcChargingData[i].SystemStatus == SYS_MODE_TERMINATING) ||
|
|
|
+ (ShmSysConfigAndInfo->SysInfo.AcChargingData[i].SystemStatus == SYS_MODE_COMPLETE)) // S_CHARGING
|
|
|
+ {
|
|
|
+ sprintf(comfirmstr, "%s", AvailabilityStatusStr[Scheduled] );
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ sprintf(comfirmstr, "%s", AvailabilityStatusStr[Accepted] );
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ //----------------------gunIndex is not 0 ------------------------------------------------//
|
|
|
+
|
|
|
+ //check Transaction active
|
|
|
+ for (int index = 0; index < CHAdeMO_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if ((gunIndex > 0)&&(gunType[gunIndex-1] == 'J'))
|
|
|
+ {
|
|
|
+ if((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_RESERVATION) ) // S_PRECHARGE
|
|
|
+ {
|
|
|
+ sprintf(comfirmstr, "%s", AvailabilityStatusStr[Rejected] );
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+ else if((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_AUTHORIZING) ||
|
|
|
+ (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_PREPARING) ||
|
|
|
+ (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_CHARGING) ||
|
|
|
+ (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_TERMINATING) ||
|
|
|
+ (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_COMPLETE)) // S_CHARGING
|
|
|
+ {
|
|
|
+ sprintf(comfirmstr, "%s", AvailabilityStatusStr[Scheduled] );
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ DEBUG_INFO("ShmSysConfigAndInfo->SysInfo.ChademoChargingData[%d].SystemStatus = %d\n",index, ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus);
|
|
|
+ sprintf(comfirmstr, "%s", AvailabilityStatusStr[Accepted] );
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }//END FOR CHAdeMO_QUANTITY
|
|
|
+
|
|
|
+ for (int index = 0; index < CCS_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if ((gunIndex > 0)&&((gunType[gunIndex - 1] == 'U')||(gunType[gunIndex - 1] == 'E')))
|
|
|
+ {
|
|
|
+ if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_RESERVATION) )// S_PRECHARGE
|
|
|
+ {
|
|
|
+ sprintf(comfirmstr, "%s", AvailabilityStatusStr[Rejected] );
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+ else if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_AUTHORIZING) ||
|
|
|
+ (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_PREPARING) ||
|
|
|
+ (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_CHARGING) ||
|
|
|
+ (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_TERMINATING) ||
|
|
|
+ (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_COMPLETE)) // S_CHARGING
|
|
|
+ {
|
|
|
+ sprintf(comfirmstr, "%s", AvailabilityStatusStr[Scheduled] );
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ DEBUG_INFO("ShmSysConfigAndInfo->SysInfo.CcsChargingData[%d].SystemStatus=%d\n",index, ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus);
|
|
|
+ sprintf(comfirmstr, "%s", AvailabilityStatusStr[Accepted] );
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }//END FOR CCS_QUANTITY
|
|
|
+
|
|
|
+ for (int index = 0; index < GB_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if ((gunIndex > 0)&&(gunType[gunIndex-1] == 'G'))
|
|
|
+ {
|
|
|
+ if((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_RESERVATION)) // S_PRECHARGE
|
|
|
+ {
|
|
|
+ sprintf(comfirmstr, "%s", AvailabilityStatusStr[Rejected] );
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+ else if((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_AUTHORIZING) ||
|
|
|
+ (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_PREPARING) ||
|
|
|
+ (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_CHARGING) ||
|
|
|
+ (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_TERMINATING) ||
|
|
|
+ (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_COMPLETE)) // S_CHARGING
|
|
|
+ {
|
|
|
+ sprintf(comfirmstr, "%s", AvailabilityStatusStr[Scheduled] );
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ DEBUG_INFO("ShmSysConfigAndInfo->SysInfo.GbChargingData[%d].SystemStatus=%d\n",index,ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus);
|
|
|
+ sprintf(comfirmstr, "%s", AvailabilityStatusStr[Accepted] );
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+ }// END FOR GB_QUANTITY
|
|
|
+
|
|
|
+ for (int index = 0; index < AC_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if ((gunIndex > 0)&&((gunType[gunIndex-1] > '0')&&(gunType[gunIndex-1] <= '9')))
|
|
|
+ {
|
|
|
+ if((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_RESERVATION)) // S_PRECHARGE
|
|
|
+ {
|
|
|
+ sprintf(comfirmstr, "%s", AvailabilityStatusStr[Rejected] );
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+ else if((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_AUTHORIZING) ||
|
|
|
+ (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_PREPARING) ||
|
|
|
+ (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_CHARGING) ||
|
|
|
+ (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_TERMINATING) ||
|
|
|
+ (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_COMPLETE)) // S_CHARGING
|
|
|
+ {
|
|
|
+ sprintf(comfirmstr, "%s", AvailabilityStatusStr[Scheduled] );
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ DEBUG_INFO("ShmSysConfigAndInfo->SysInfo.AcChargingData[%d].SystemStatus=%d\n",index, ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus);
|
|
|
+ sprintf(comfirmstr, "%s", AvailabilityStatusStr[Accepted] );
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }//END FOR AC_QUANTITY
|
|
|
+
|
|
|
+ }//END FOR AvailabilityTypeStr[Inoperative]
|
|
|
+
|
|
|
+
|
|
|
+ if(strcmp((const char *)typeStr, AvailabilityTypeStr[Operative]) == 0)
|
|
|
+ {
|
|
|
+ //----------------------gunIndex is 0 ------------------------------------------------//
|
|
|
+ if(gunIndex == 0)
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D') // 'D' means DC
|
|
|
+ {
|
|
|
+ for(int i=0; i < gunTotalNumber; i++)
|
|
|
+ {
|
|
|
+ for (int index = 0; index < CHAdeMO_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if ((gunType[i] == 'J' )&&(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == i)&&(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_FAULT)) //S_FAULT //(((gunIndex == 0)|| ((gunIndex > 0)&&(gunType[gunIndex-1] == 'J')) ) &&(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus != SYS_MODE_FAULT)) //S_FAULT
|
|
|
+ {
|
|
|
+ sprintf(comfirmstr, "%s", AvailabilityStatusStr[Rejected] );
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+ }//END FOR CHAdeMO_QUANTITY
|
|
|
+
|
|
|
+ for (int index = 0; index < CCS_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (((gunType[i] == 'U')||(gunType[i] == 'E'))&&(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == i)&&(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_FAULT)) //S_FAULT//(((gunIndex == 0)|| ((gunIndex > 0)&&((gunType[gunIndex - 1] == 'U')||(gunType[gunIndex - 1] == 'E'))) )&&(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus != SYS_MODE_FAULT)) //S_FAULT
|
|
|
+ {
|
|
|
+ sprintf(comfirmstr, "%s", AvailabilityStatusStr[Rejected] );
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+ }//END FOR CCS_QUANTITY
|
|
|
+
|
|
|
+ for (int index = 0; index < GB_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if ((gunType[i] == 'G')&&(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == i)&&(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_FAULT)) //S_FAULT //(((gunIndex == 0)|| ((gunIndex > 0)&&(gunType[gunIndex-1] == 'G')))&&(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus != SYS_MODE_FAULT)) //S_FAULT
|
|
|
+ {
|
|
|
+ //ShmOCPP16Data->CsMsg.bits[gunIndex - 1].ChangeAvailabilityReq = 1;
|
|
|
+ sprintf(comfirmstr, "%s", AvailabilityStatusStr[Rejected] );
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+ }// END FOR GB_QUANTITY
|
|
|
+
|
|
|
+ for (int index = 0; index < AC_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (((gunType[i] > '0')&&(gunType[i] <= '9')) &&(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_FAULT)) //S_FAULT // (((gunIndex == 0)|| ((gunIndex > 0)&&((gunType[gunIndex-1] > '0')&&(gunType[gunIndex-1] <= '9')))) &&(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus != SYS_MODE_FAULT)) //S_FAULT
|
|
|
+ {
|
|
|
+ sprintf(comfirmstr, "%s", AvailabilityStatusStr[Rejected] );
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+ }//END FOR CHAdeMO_QUANTITY
|
|
|
+
|
|
|
+ }// END FOR gunTotalNumber
|
|
|
+ }
|
|
|
+ else if (ShmSysConfigAndInfo->SysConfig.ModelName[0]=='A') //'A' means AC
|
|
|
+ {
|
|
|
+ for(int i=0; i < gunTotalNumber; i++)
|
|
|
+ {
|
|
|
+ for (int index = 0; index < AC_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (((gunType[i] > '0')&&(gunType[i] <= '9')) &&(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_FAULT)) //S_FAULT // (((gunIndex == 0)|| ((gunIndex > 0)&&((gunType[gunIndex-1] > '0')&&(gunType[gunIndex-1] <= '9')))) &&(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus != SYS_MODE_FAULT)) //S_FAULT
|
|
|
+ {
|
|
|
+ sprintf(comfirmstr, "%s", AvailabilityStatusStr[Rejected] );
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+ }//END FOR CHAdeMO_QUANTITY
|
|
|
+
|
|
|
+ } // END FOR gunTotalNumber
|
|
|
+ }
|
|
|
+
|
|
|
+ sprintf(comfirmstr, "%s", AvailabilityStatusStr[Accepted] );
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+
|
|
|
+ //----------------------gunIndex is not 0 ------------------------------------------------//
|
|
|
+ //check Transaction active
|
|
|
+ for (int index = 0; index < CHAdeMO_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (((gunIndex > 0)&&(gunType[gunIndex-1] == 'J') ) &&(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus != SYS_MODE_FAULT)) //S_FAULT
|
|
|
+ {
|
|
|
+ sprintf(comfirmstr, "%s", AvailabilityStatusStr[Accepted] );
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+ }//END FOR CHAdeMO_QUANTITY
|
|
|
+
|
|
|
+ for (int index = 0; index < CCS_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if ((((gunIndex > 0)&&((gunType[gunIndex - 1] == 'U')||(gunType[gunIndex - 1] == 'E'))) )&&(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus != SYS_MODE_FAULT)) //S_FAULT
|
|
|
+ {
|
|
|
+ sprintf(comfirmstr, "%s", AvailabilityStatusStr[Accepted] );
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+ }//END FOR CCS_QUANTITY
|
|
|
+
|
|
|
+ for (int index = 0; index < GB_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (((gunIndex > 0)&&(gunType[gunIndex-1] == 'G'))&&(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus != SYS_MODE_FAULT)) //S_FAULT
|
|
|
+ {
|
|
|
+ sprintf(comfirmstr, "%s", AvailabilityStatusStr[Accepted] );
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+ }// END FOR GB_QUANTITY
|
|
|
+
|
|
|
+ for (int index = 0; index < AC_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (((gunIndex > 0)&&((gunType[gunIndex-1] > '0')&&(gunType[gunIndex-1] <= '9'))) &&(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus != SYS_MODE_FAULT)) //S_FAULT
|
|
|
+ {
|
|
|
+ sprintf(comfirmstr, "%s", AvailabilityStatusStr[Accepted] );
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+ }//END FOR AC_QUANTITY
|
|
|
+ }//END FOR AvailabilityTypeStr[Operative]
|
|
|
+
|
|
|
+end:
|
|
|
+ if(gunIndex != 0)
|
|
|
+ {
|
|
|
+ sprintf((char *)ShmOCPP16Data->ChangeAvailability[gunIndex - 1].ResponseStatus, "%s", comfirmstr );
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ sprintf((char *)ShmOCPP16Data->ChangeAvailability[0].ResponseStatus, "%s", comfirmstr );
|
|
|
+ }
|
|
|
+
|
|
|
+ if(gunIndex != 0)
|
|
|
+ {
|
|
|
+ if(strstr(comfirmstr, AvailabilityStatusStr[Rejected]) == NULL)
|
|
|
+ ShmOCPP16Data->CsMsg.bits[gunIndex - 1].ChangeAvailabilityReq = 1;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if(strstr(comfirmstr, AvailabilityStatusStr[Rejected]) == NULL)
|
|
|
+ {
|
|
|
+ for(int i=0; i < gunTotalNumber/*(CHAdeMO_QUANTITY+ CCS_QUANTITY + GB_QUANTITY)*/; i++)
|
|
|
+ ShmOCPP16Data->CsMsg.bits[i].ChangeAvailabilityReq = 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ sendChangeAvailabilityConfirmation(uuid, comfirmstr);
|
|
|
+
|
|
|
+ return result;
|
|
|
+}
|
|
|
+
|
|
|
+int handleChangeConfigurationRequest(char *uuid, char *payload)
|
|
|
+{
|
|
|
+ mtrace();
|
|
|
+ int result = FAIL;
|
|
|
+ char keystr[40]={0};
|
|
|
+ char valuestr[100]={0};
|
|
|
+ char comfirmstr[20]={0};
|
|
|
+
|
|
|
+ DEBUG_INFO("handleChangeConfigurationRequest...\n");
|
|
|
+ json_object *ChangeConfiguration;
|
|
|
+ ChangeConfiguration = json_tokener_parse(payload);
|
|
|
+ if(!is_error(ChangeConfiguration))
|
|
|
+ {
|
|
|
+ // Required data
|
|
|
+ sprintf((char*)keystr, "%s", json_object_get_string(json_object_object_get(ChangeConfiguration, "key")));
|
|
|
+ sprintf((char*)valuestr, "%s", json_object_get_string(json_object_object_get(ChangeConfiguration, "value")));
|
|
|
+ }
|
|
|
+ json_object_put(ChangeConfiguration);
|
|
|
+
|
|
|
+
|
|
|
+ if((uuid==NULL) || (payload ==NULL) )
|
|
|
+ {
|
|
|
+ DEBUG_ERROR("Payload is null\n");
|
|
|
+ sprintf(comfirmstr, "%s", ConfigurationStatusStr[ConfigurationStatus_Rejected] );
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ int status = setKeyValue(keystr, valuestr);
|
|
|
+
|
|
|
+ switch(status)
|
|
|
+ {
|
|
|
+ case ConfigurationStatus_Accepted:
|
|
|
+ sprintf(comfirmstr, "%s", ConfigurationStatusStr[ConfigurationStatus_Accepted]);
|
|
|
+ ShmOCPP16Data->MsMsg.bits.ChangeConfigurationReq = 1;
|
|
|
+ StoreConfigurationTable();
|
|
|
+ break;
|
|
|
+
|
|
|
+ case ConfigurationStatus_Rejected:
|
|
|
+ sprintf(comfirmstr, "%s", ConfigurationStatusStr[ConfigurationStatus_Rejected] );
|
|
|
+ break;
|
|
|
+
|
|
|
+ case RebootRequired:
|
|
|
+ sprintf(comfirmstr, "%s", ConfigurationStatusStr[RebootRequired]);
|
|
|
+ StoreConfigurationTable();
|
|
|
+ break;
|
|
|
+
|
|
|
+ case NotSupported:
|
|
|
+ sprintf(comfirmstr, "%s", ConfigurationStatusStr[NotSupported] );
|
|
|
+ break;
|
|
|
+
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ sendChangeConfigurationConfirmation(uuid, comfirmstr);
|
|
|
+ ShmOCPP16Data->MsMsg.bits.ChangeConfigurationConf = 1;
|
|
|
+ if((strcmp(keystr,"WebSocketPingInterval")==0)&&(strcmp(comfirmstr,"Accepted")==0))
|
|
|
+ {
|
|
|
+ ChageWebSocketPingInterval(atoi(valuestr));
|
|
|
+ }
|
|
|
+
|
|
|
+ return result;
|
|
|
+}
|
|
|
+
|
|
|
+int handleClearCacheRequest(char *uuid, char *payload)
|
|
|
+{
|
|
|
+ mtrace();
|
|
|
+ int result = FAIL;
|
|
|
+ char comfirmstr[20];
|
|
|
+ int fd;
|
|
|
+ char rmFileCmd[100]={0};
|
|
|
+ struct stat stats;
|
|
|
+ DEBUG_INFO("handleClearCacheRequest...\n");
|
|
|
+ stat("/Storage/OCPP", &stats);
|
|
|
+
|
|
|
+ // Check for directory existence
|
|
|
+ if (S_ISDIR(stats.st_mode) == 1)
|
|
|
+ {}
|
|
|
+ else
|
|
|
+ {
|
|
|
+ DEBUG_INFO("\n OCPP directory not exist, create dir \n");
|
|
|
+ sprintf(rmFileCmd,"mkdir -p %s","/Storage/OCPP");
|
|
|
+ system(rmFileCmd);
|
|
|
+ }
|
|
|
+
|
|
|
+ memset(rmFileCmd, 0, sizeof rmFileCmd);
|
|
|
+ if((access(AuthorizationCache_JSON,F_OK))!=-1)
|
|
|
+ {
|
|
|
+ DEBUG_INFO("AuthorizationCache file exist.\n");
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ DEBUG_INFO("AuthorizationCache file not exist\n");
|
|
|
+ FILE *log = fopen(AuthorizationCache_JSON, "w+");
|
|
|
+
|
|
|
+ if(log == NULL)
|
|
|
+ {
|
|
|
+ DEBUG_INFO("AuthorizationCache file is NULL\n");
|
|
|
+ sprintf(comfirmstr, "%s", ClearCacheStatusStr[ClearCacheStatus_Rejected] );
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ fclose(log);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if((fd = open(AuthorizationCache_JSON,O_RDWR)) < 0)
|
|
|
+ {
|
|
|
+ DEBUG_INFO("open AuthorizationCache file failed\n");
|
|
|
+ sprintf(comfirmstr, "%s", ClearCacheStatusStr[ClearCacheStatus_Rejected] );
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ DEBUG_INFO("open AuthorizationCache file successful\n");
|
|
|
+ ftruncate(fd,0);
|
|
|
+ lseek(fd,0,SEEK_SET);
|
|
|
+ close(fd);
|
|
|
+ sprintf(comfirmstr, "%s", ClearCacheStatusStr[ClearCacheStatus_Accepted] );
|
|
|
+ }
|
|
|
+
|
|
|
+end:
|
|
|
+ sendClearCacheConfirmation(uuid, comfirmstr);
|
|
|
+ return result;
|
|
|
+}
|
|
|
+
|
|
|
+int handleClearChargingProfileRequest(char *uuid, char *payload)
|
|
|
+{
|
|
|
+ mtrace();
|
|
|
+ int result = FAIL;
|
|
|
+ int resultRename;
|
|
|
+ int connectorIdInt, chargingProfileIdInt, stackLevelInt;
|
|
|
+ char chargingProfilePurposeStr[26]={0};
|
|
|
+ int tempconnectorIdInt, tempchargingProfileIdInt, tempstackLevelInt;
|
|
|
+ char tempchargingProfilePurposeStr[26]={0};
|
|
|
+ char sstr[160]={0};
|
|
|
+ char str[100]={0};
|
|
|
+ int c = 0;
|
|
|
+ char *loc;
|
|
|
+ char fname[200]={0};
|
|
|
+ char comfirmstr[20]={0};
|
|
|
+ char word[1600]={0};
|
|
|
+ int clearflag = FALSE;
|
|
|
+ int chargingProfileIdIsNULL = FALSE;
|
|
|
+ int connectorIsNULL = FALSE;
|
|
|
+ int chargingProfilePurposeIsNULL = FALSE;
|
|
|
+ int stackLevelIsNULL = FALSE;
|
|
|
+ //int GotoEnd = FALSE;
|
|
|
+ FILE *fptr1, *fptr2;
|
|
|
+ char temp[] = "/Storage/OCPP/ClearChargingProfiletemp.json"; // Create temp file
|
|
|
+ int n_chargingProfile=0;
|
|
|
+ int isEmptyFile = FALSE;
|
|
|
+ char sLineWord[1600]={0};
|
|
|
+ char chargingProfiles[10][100]={0};
|
|
|
+ int ChargeProfileCount = 0;
|
|
|
+ char ch;
|
|
|
+ connectorIdInt = chargingProfileIdInt = stackLevelInt = 0;
|
|
|
+ DEBUG_INFO("handleClearChargingProfileRequest...\n");
|
|
|
+ json_object *ClearChargingProfile;
|
|
|
+ ClearChargingProfile = json_tokener_parse(payload);
|
|
|
+ if(!is_error(ClearChargingProfile))
|
|
|
+ {
|
|
|
+ // Optional data
|
|
|
+ if(json_object_object_get(ClearChargingProfile, "id") != NULL)
|
|
|
+ chargingProfileIdInt = json_object_get_int(json_object_object_get(ClearChargingProfile, "id"));
|
|
|
+ else
|
|
|
+ chargingProfileIdIsNULL = TRUE;
|
|
|
+
|
|
|
+ if(json_object_object_get(ClearChargingProfile, "connectorId") != NULL)
|
|
|
+ connectorIdInt = json_object_get_int(json_object_object_get(ClearChargingProfile, "connectorId"));
|
|
|
+ else
|
|
|
+ connectorIsNULL = TRUE;
|
|
|
+
|
|
|
+ if(json_object_object_get(ClearChargingProfile, "chargingProfilePurpose") != NULL)
|
|
|
+ sprintf((char*)chargingProfilePurposeStr, "%s", json_object_get_string(json_object_object_get(ClearChargingProfile, "chargingProfilePurpose")));
|
|
|
+ else
|
|
|
+ chargingProfilePurposeIsNULL = TRUE;
|
|
|
+
|
|
|
+ if(json_object_object_get(ClearChargingProfile, "stackLevel") != NULL)
|
|
|
+ stackLevelInt = json_object_get_int(json_object_object_get(ClearChargingProfile, "stackLevel"));
|
|
|
+ else
|
|
|
+ stackLevelIsNULL = TRUE;
|
|
|
+ }
|
|
|
+ json_object_put(ClearChargingProfile);
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ if(connectorIsNULL == FALSE)
|
|
|
+ {
|
|
|
+ switch(connectorIdInt)
|
|
|
+ {
|
|
|
+ case 0:
|
|
|
+
|
|
|
+ if(chargingProfilePurposeIsNULL == TRUE)
|
|
|
+ {
|
|
|
+ int l = 0;
|
|
|
+ strcpy(fname, ChargePointMaxProfile_JSON);
|
|
|
+ if((access(fname,F_OK))!=-1)
|
|
|
+ {
|
|
|
+ strcpy(chargingProfiles[l], fname);
|
|
|
+ l = l + 1;
|
|
|
+ }
|
|
|
+
|
|
|
+ strcpy(fname, TxDefaultProfile_0_JSON);
|
|
|
+ if((access(fname,F_OK))!=-1)
|
|
|
+ {
|
|
|
+ strcpy(chargingProfiles[l], fname);
|
|
|
+ l = l + 1;
|
|
|
+ }
|
|
|
+ ChargeProfileCount = l;
|
|
|
+
|
|
|
+ }
|
|
|
+ else if((chargingProfilePurposeIsNULL == FALSE)&&(strcmp(chargingProfilePurposeStr,"ChargePointMaxProfile")==0))
|
|
|
+ {
|
|
|
+ strcpy(fname, ChargePointMaxProfile_JSON);
|
|
|
+ if((access(fname,F_OK))!=-1)
|
|
|
+ {
|
|
|
+ strcpy(chargingProfiles[0], fname);
|
|
|
+ ChargeProfileCount = 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if((chargingProfilePurposeIsNULL == FALSE)&&(strcmp(chargingProfilePurposeStr,"TxDefaultProfile")==0))
|
|
|
+ {
|
|
|
+ strcpy(fname, TxDefaultProfile_0_JSON);
|
|
|
+ if((access(fname,F_OK))!=-1)
|
|
|
+ {
|
|
|
+ strcpy(chargingProfiles[0], fname);
|
|
|
+ ChargeProfileCount = 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ break;
|
|
|
+
|
|
|
+ default:
|
|
|
+ if(chargingProfilePurposeIsNULL == TRUE)
|
|
|
+ {
|
|
|
+ int m = 0;
|
|
|
+ memset(fname, 0, sizeof fname);
|
|
|
+ sprintf(fname, "/Storage/OCPP/TxDefaultProfile_%d.json", connectorIdInt);
|
|
|
+ if((access(fname,F_OK))!=-1)
|
|
|
+ {
|
|
|
+ strcpy(chargingProfiles[m], fname);
|
|
|
+ m = m + 1;
|
|
|
+ }
|
|
|
+
|
|
|
+ memset(fname, 0, sizeof fname);
|
|
|
+ sprintf(fname, "/Storage/OCPP/TxProfile_%d.json", connectorIdInt);
|
|
|
+ if((access(fname,F_OK))!=-1)
|
|
|
+ {
|
|
|
+ strcpy(chargingProfiles[m], fname);
|
|
|
+ m = m + 1;
|
|
|
+ }
|
|
|
+
|
|
|
+ ChargeProfileCount = m;
|
|
|
+ }
|
|
|
+ else if((chargingProfilePurposeIsNULL == FALSE)&&(strcmp(chargingProfilePurposeStr,"TxDefaultProfile")==0))
|
|
|
+ {
|
|
|
+ //strcpy(fname, TxDefaultProfile_1_JSON);
|
|
|
+ sprintf(fname, "/Storage/OCPP/TxDefaultProfile_%d.json", connectorIdInt);
|
|
|
+ if((access(fname,F_OK))!=-1)
|
|
|
+ {
|
|
|
+ strcpy(chargingProfiles[0], fname);
|
|
|
+ ChargeProfileCount = 1;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ else if((chargingProfilePurposeIsNULL == FALSE)&&(strcmp(chargingProfilePurposeStr,"TxProfile")==0))
|
|
|
+ {
|
|
|
+ sprintf(fname, "/Storage/OCPP/TxProfile_%d.json", connectorIdInt);
|
|
|
+ if((access(fname,F_OK))!=-1)
|
|
|
+ {
|
|
|
+ strcpy(chargingProfiles[0], fname);
|
|
|
+ ChargeProfileCount = 1;
|
|
|
+ }
|
|
|
+ //strcpy(fname, TxProfile_1_JSON);
|
|
|
+ }
|
|
|
+ //strcpy(fname, ChargePointMaxProfile_JSON );
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else // Check all Charging Profiles
|
|
|
+ {
|
|
|
+ int i = 0;
|
|
|
+ char fnametemp[200]={0};
|
|
|
+ ChargeProfileCount = 0;
|
|
|
+ //Check ChargePointMaxProfile.json exit
|
|
|
+ if((access("/Storage/OCPP/ChargePointMaxProfile.json",F_OK))!=-1)
|
|
|
+ {
|
|
|
+ strcpy(chargingProfiles[i], "/Storage/OCPP/ChargePointMaxProfile.json");
|
|
|
+ i = i + 1;
|
|
|
+ }
|
|
|
+
|
|
|
+ //Check TxDefaultProfile_0.json exit
|
|
|
+ if((access("/Storage/OCPP/TxDefaultProfile_0.json",F_OK))!=-1)
|
|
|
+ {
|
|
|
+ strcpy(chargingProfiles[i], "/Storage/OCPP/TxDefaultProfile_0.json");
|
|
|
+ i = i + 1;
|
|
|
+ }
|
|
|
+
|
|
|
+ //Check TxDefaultProfile_%d.json
|
|
|
+ for(int j=1; j <= gunTotalNumber; j++)
|
|
|
+ {
|
|
|
+ memset(fnametemp, 0, sizeof fnametemp);
|
|
|
+ sprintf(fnametemp, "/Storage/OCPP/TxDefaultProfile_%d.json", j);
|
|
|
+ if((access(fnametemp,F_OK))!=-1)
|
|
|
+ {
|
|
|
+ strcpy(chargingProfiles[i], fnametemp);
|
|
|
+ i = i + 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //Check TxProfile_%d.json
|
|
|
+ for(int j=1; j <= gunTotalNumber; j++)
|
|
|
+ {
|
|
|
+ memset(fnametemp, 0, sizeof fnametemp);
|
|
|
+ sprintf(fnametemp, "/Storage/OCPP/TxProfile_%d.json", j);
|
|
|
+ if((access(fnametemp,F_OK))!=-1)
|
|
|
+ {
|
|
|
+ strcpy(chargingProfiles[i], fnametemp);
|
|
|
+ i = i + 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ ChargeProfileCount = i;
|
|
|
+ }// End connectorIsNULL is TRUE
|
|
|
+
|
|
|
+ if(ChargeProfileCount == 0)
|
|
|
+ {
|
|
|
+ sprintf(comfirmstr, "%s", ClearChargingProfileStatusStr[ClearChargingProfileStatus_Unknown] );
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(connectorIsNULL == FALSE && (connectorIdInt != 0) && ( (connectorIdInt-1) > gunTotalNumber) )
|
|
|
+ {
|
|
|
+ sprintf(comfirmstr, "%s", ClearChargingProfileStatusStr[ClearChargingProfileStatus_Unknown] );
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+
|
|
|
+ if((connectorIsNULL == FALSE) && (connectorIdInt == 0) )
|
|
|
+ {
|
|
|
+ memset(str, 0, sizeof str);
|
|
|
+ // clear temp file
|
|
|
+ sprintf(str,"rm -f %s",temp);
|
|
|
+ system(str);
|
|
|
+
|
|
|
+ for(int k=0; k < ChargeProfileCount; k++)
|
|
|
+ {
|
|
|
+ memset(str, 0, sizeof str);
|
|
|
+ //clear file in C
|
|
|
+ sprintf(str,"rm -f %s",chargingProfiles[k]);
|
|
|
+ system(str);
|
|
|
+ }
|
|
|
+
|
|
|
+ sprintf(comfirmstr, "%s", ClearChargingProfileStatusStr[ClearChargingProfileStatus_Accepted] );
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+ else if(connectorIsNULL == TRUE)
|
|
|
+ {
|
|
|
+ for(int k=0; k < ChargeProfileCount; k++)
|
|
|
+ {
|
|
|
+ fptr1 = fopen(chargingProfiles[k], "r");
|
|
|
+ fptr2 = fopen("/Storage/OCPP/ClearChargingProfiletemp.json", "w+");
|
|
|
+
|
|
|
+ //Check Charging Profile Count
|
|
|
+ while(fscanf(fptr1, "%s", word) != EOF)
|
|
|
+ {
|
|
|
+ //DEBUG_INFO("word=%s\n",word);
|
|
|
+ if(strstr(word, "chargingProfileId")!= NULL)
|
|
|
+ {
|
|
|
+ //DEBUG_INFO("test chargingProfileId \n");
|
|
|
+ n_chargingProfile = n_chargingProfile + 1;
|
|
|
+ //DEBUG_INFO("chargingProfileId Found\n");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ rewind(fptr1);
|
|
|
+
|
|
|
+ //search Charging Profile Element
|
|
|
+ //int i= 0;
|
|
|
+ while ( fgets( sLineWord, sizeof sLineWord, fptr1 ) != NULL )
|
|
|
+ {
|
|
|
+ //------------------------tempconnectorIdInt------------------------//
|
|
|
+ loc = strstr(sLineWord, "connectorId");
|
|
|
+ c = 0;
|
|
|
+ memset(sstr ,0, sizeof(sstr) );
|
|
|
+ while (loc[strlen("connectorId")+2+c] != ',')
|
|
|
+ {
|
|
|
+ sstr[c] = loc[strlen("connectorId")+2+c];
|
|
|
+ c++;
|
|
|
+ }
|
|
|
+ sstr[c] = '\0';
|
|
|
+ tempconnectorIdInt = atoi(sstr);
|
|
|
+ printf("file's gun number is %d\n", tempconnectorIdInt);
|
|
|
+
|
|
|
+ //--------------------------chargingProfileId--------------------//
|
|
|
+ c = 0;
|
|
|
+ loc = strstr(sLineWord, "chargingProfileId");
|
|
|
+ memset(sstr ,0, sizeof(sstr) );
|
|
|
+ while (loc[strlen("chargingProfileId")+2+c] != ',')
|
|
|
+ {
|
|
|
+ sstr[c] = loc[strlen("chargingProfileId")+2+c];
|
|
|
+ //printf("i=%d sstr=%c\n",c, sstr[c]);
|
|
|
+ c++;
|
|
|
+ }
|
|
|
+ sstr[c] = '\0';
|
|
|
+ tempchargingProfileIdInt = atoi(sstr);
|
|
|
+
|
|
|
+ //stackLevel
|
|
|
+ c = 0;
|
|
|
+ loc = strstr(sLineWord, "stackLevel");
|
|
|
+ memset(sstr ,0, sizeof(sstr) );
|
|
|
+ while (loc[strlen("stackLevel")+2+c] != ',')
|
|
|
+ {
|
|
|
+ sstr[c] = loc[strlen("stackLevel")+2+c];
|
|
|
+ //printf("i=%d sstr=%c\n",c, sstr[c]);
|
|
|
+ c++;
|
|
|
+ }
|
|
|
+ sstr[c] = '\0';
|
|
|
+ tempstackLevelInt = atoi(sstr);
|
|
|
+
|
|
|
+ c = 0;
|
|
|
+ loc = strstr(sLineWord, "chargingProfilePurpose");
|
|
|
+ memset(sstr ,0, sizeof(sstr) );
|
|
|
+ while (loc[3+strlen("chargingProfilePurpose")+c] != '\"')
|
|
|
+ {
|
|
|
+ sstr[c] = loc[3+strlen("chargingProfilePurpose")+c];
|
|
|
+ c++;
|
|
|
+ }
|
|
|
+ sstr[c] = '\0';
|
|
|
+ strcpy(tempchargingProfilePurposeStr, sstr);
|
|
|
+
|
|
|
+ if((chargingProfileIdIsNULL == FALSE)&&(tempchargingProfileIdInt == chargingProfileIdInt))
|
|
|
+ {
|
|
|
+ //------- not write to fptr2-------//
|
|
|
+ sprintf(comfirmstr, "%s", ClearChargingProfileStatusStr[ClearChargingProfileStatus_Accepted] );
|
|
|
+ //clearflag = TRUE;
|
|
|
+ }
|
|
|
+ else if((chargingProfilePurposeIsNULL == FALSE)&&(strcmp(tempchargingProfilePurposeStr, chargingProfilePurposeStr) == 0))
|
|
|
+ {
|
|
|
+ //------- not write to fptr2-------//
|
|
|
+ sprintf(comfirmstr, "%s", ClearChargingProfileStatusStr[ClearChargingProfileStatus_Accepted] );
|
|
|
+ }
|
|
|
+ else if((stackLevelIsNULL == FALSE) &&(tempstackLevelInt == stackLevelInt))
|
|
|
+ {
|
|
|
+ //------- not write to fptr2-------//
|
|
|
+ sprintf(comfirmstr, "%s", ClearChargingProfileStatusStr[ClearChargingProfileStatus_Accepted] );
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ fprintf(fptr2, sLineWord);//writing data into file
|
|
|
+ }
|
|
|
+
|
|
|
+ memset(sLineWord, 0, sizeof sLineWord);
|
|
|
+
|
|
|
+ } //End of while ( fgets( sLineWord, sizeof sLineWord, fptr1 ) != NULL )
|
|
|
+
|
|
|
+ if(clearflag == TRUE)
|
|
|
+ {
|
|
|
+ fclose(fptr1);
|
|
|
+ fclose(fptr2);
|
|
|
+
|
|
|
+ sprintf(str,"rm -f %s",chargingProfiles[k]);
|
|
|
+ system(str);
|
|
|
+
|
|
|
+ // clear temp file
|
|
|
+ sprintf(str,"rm -f %s",temp);
|
|
|
+ system(str);
|
|
|
+
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ fclose(fptr1);
|
|
|
+ fclose(fptr2);
|
|
|
+
|
|
|
+ memset(str, 0, sizeof str);
|
|
|
+ sprintf(str,"rm -f %s",chargingProfiles[k]);
|
|
|
+ system(str);
|
|
|
+
|
|
|
+ resultRename = rename(temp, chargingProfiles[k]);
|
|
|
+
|
|
|
+ if(resultRename == 0)
|
|
|
+ {
|
|
|
+ DEBUG_INFO("File ChargingProfile renamed successfully");
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ DEBUG_INFO("Error: unable to rename the ChargingProfile file");
|
|
|
+ }
|
|
|
+
|
|
|
+ if(comfirmstr[0]== 0)
|
|
|
+ {
|
|
|
+ sprintf(comfirmstr, "%s", ClearChargingProfileStatusStr[ClearChargingProfileStatus_Unknown] );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ //Check chargingProfile is empty file
|
|
|
+ /*------ Read the file ----------------*/
|
|
|
+ fptr1=fopen(chargingProfiles[k],"r");
|
|
|
+ ch=fgetc(fptr1);
|
|
|
+ rewind(fptr1);
|
|
|
+ memset(sLineWord, 0, sizeof sLineWord);
|
|
|
+ if(ch!=EOF)
|
|
|
+ {
|
|
|
+ while (fgets( sLineWord, sizeof sLineWord, fptr1) != NULL)
|
|
|
+ {
|
|
|
+ str[strlen(sLineWord) - 1] = '\0'; // eat the newline fgets() stores
|
|
|
+
|
|
|
+ if(sLineWord[0]=='\0')
|
|
|
+ {
|
|
|
+ isEmptyFile = TRUE;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ isEmptyFile = FALSE;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ fclose(fptr1);
|
|
|
+
|
|
|
+ if(isEmptyFile == TRUE)
|
|
|
+ {
|
|
|
+ memset(str, 0, sizeof str);
|
|
|
+ sprintf(str,"rm -f %s",chargingProfiles[k]);
|
|
|
+ system(str);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }// End of while(int k=0; k < ChargePointCount; k++)
|
|
|
+ }
|
|
|
+ else if((connectorIsNULL == FALSE) && (connectorIdInt != 0) )
|
|
|
+ {
|
|
|
+ DEBUG_INFO("ChargeProfileCount = %d\n", ChargeProfileCount);
|
|
|
+ for(int k=0; k < ChargeProfileCount; k++)
|
|
|
+ {
|
|
|
+ fptr1 = fopen(chargingProfiles[k], "r");
|
|
|
+ fptr2 = fopen(temp, "w+");
|
|
|
+ //Check Charging Profile Count
|
|
|
+ while(fscanf(fptr1, "%s", word) != EOF)
|
|
|
+ {
|
|
|
+ //DEBUG_INFO("word=%s\n",word);
|
|
|
+ if(strstr(word, "chargingProfileId")!= NULL)
|
|
|
+ {
|
|
|
+ n_chargingProfile = n_chargingProfile + 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ rewind(fptr1);
|
|
|
+ //search Charging Profile Element
|
|
|
+ //int i= 0;
|
|
|
+ while ( fgets( sLineWord, sizeof sLineWord, fptr1 ) != NULL )
|
|
|
+ {
|
|
|
+ //*************************tempconnectorIdInt*********************************/
|
|
|
+ loc = strstr(sLineWord, "connectorId");
|
|
|
+ c = 0;
|
|
|
+ memset(sstr ,0, sizeof(sstr) );
|
|
|
+ while (loc[strlen("connectorId")+2+c] != ',')
|
|
|
+ {
|
|
|
+ sstr[c] = loc[strlen("connectorId")+2+c];
|
|
|
+ c++;
|
|
|
+ }
|
|
|
+ sstr[c] = '\0';
|
|
|
+ tempconnectorIdInt = atoi(sstr);
|
|
|
+
|
|
|
+ //chargingProfileId
|
|
|
+ c = 0;
|
|
|
+ loc = strstr(sLineWord, "chargingProfileId");
|
|
|
+ memset(sstr ,0, sizeof(sstr) );
|
|
|
+ while (loc[strlen("chargingProfileId")+2+c] != ',')
|
|
|
+ {
|
|
|
+ sstr[c] = loc[strlen("chargingProfileId")+2+c];
|
|
|
+ //printf("i=%d sstr=%c\n",c, sstr[c]);
|
|
|
+ c++;
|
|
|
+ }
|
|
|
+ sstr[c] = '\0';
|
|
|
+ tempchargingProfileIdInt = atoi(sstr);
|
|
|
+
|
|
|
+ //stackLevel
|
|
|
+ c = 0;
|
|
|
+ loc = strstr(sLineWord, "stackLevel");
|
|
|
+ memset(sstr ,0, sizeof(sstr) );
|
|
|
+ while (loc[strlen("stackLevel")+2+c] != ',')
|
|
|
+ {
|
|
|
+ sstr[c] = loc[strlen("stackLevel")+2+c];
|
|
|
+ //printf("i=%d sstr=%c\n",c, sstr[c]);
|
|
|
+ c++;
|
|
|
+ }
|
|
|
+ sstr[c] = '\0';
|
|
|
+ tempstackLevelInt = atoi(sstr);
|
|
|
+
|
|
|
+ c = 0;
|
|
|
+ loc = strstr(sLineWord, "chargingProfilePurpose");
|
|
|
+ memset(sstr ,0, sizeof(sstr) );
|
|
|
+ while (loc[3+strlen("chargingProfilePurpose")+c] != '\"')
|
|
|
+ {
|
|
|
+ sstr[c] = loc[3+strlen("chargingProfilePurpose")+c];
|
|
|
+ c++;
|
|
|
+ }
|
|
|
+ sstr[c] = '\0';
|
|
|
+ strcpy(tempchargingProfilePurposeStr, sstr);
|
|
|
+
|
|
|
+ if((chargingProfileIdIsNULL == FALSE)&&(tempchargingProfileIdInt == chargingProfileIdInt))
|
|
|
+ {
|
|
|
+ //------- not write to fptr2-------//
|
|
|
+ sprintf(comfirmstr, "%s", ClearChargingProfileStatusStr[ClearChargingProfileStatus_Accepted] );
|
|
|
+ //clearflag = TRUE;
|
|
|
+ }
|
|
|
+ else if((stackLevelIsNULL == FALSE) &&(tempstackLevelInt == stackLevelInt))
|
|
|
+ {
|
|
|
+ //------- not write to fptr2-------//
|
|
|
+ sprintf(comfirmstr, "%s", ClearChargingProfileStatusStr[ClearChargingProfileStatus_Accepted] );
|
|
|
+ }
|
|
|
+ else if(stackLevelIsNULL == TRUE)
|
|
|
+ {
|
|
|
+ //Clear Whole File
|
|
|
+ sprintf(comfirmstr, "%s", ClearChargingProfileStatusStr[ClearChargingProfileStatus_Accepted] );
|
|
|
+ clearflag = TRUE;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ fprintf(fptr2, sLineWord);//writing data into file
|
|
|
+ }
|
|
|
+
|
|
|
+ memset(sLineWord, 0, sizeof sLineWord);
|
|
|
+ }
|
|
|
+
|
|
|
+ if(clearflag == TRUE)
|
|
|
+ {
|
|
|
+ fclose(fptr1);
|
|
|
+ fclose(fptr2);
|
|
|
+
|
|
|
+ sprintf(str,"rm -f %s",chargingProfiles[k]);
|
|
|
+ system(str);
|
|
|
+
|
|
|
+ // clear temp file
|
|
|
+ sprintf(str,"rm -f %s",temp);
|
|
|
+ system(str);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ fclose(fptr1);
|
|
|
+ fclose(fptr2);
|
|
|
+
|
|
|
+ sprintf(str,"rm -f %s",chargingProfiles[k]);
|
|
|
+ system(str);
|
|
|
+
|
|
|
+ resultRename = rename(temp, chargingProfiles[k]);
|
|
|
+
|
|
|
+ if(resultRename == 0)
|
|
|
+ {
|
|
|
+ DEBUG_INFO("File ChargingProfile renamed successfully");
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ DEBUG_INFO("Error: unable to rename the ChargingProfile file");
|
|
|
+ }
|
|
|
+
|
|
|
+ if(comfirmstr[0]== 0)
|
|
|
+ {
|
|
|
+ sprintf(comfirmstr, "%s", ClearChargingProfileStatusStr[ClearChargingProfileStatus_Unknown] );
|
|
|
+ }
|
|
|
+
|
|
|
+ //Check chargingProfile is empty file
|
|
|
+ /*------ Read the file ----------------*/
|
|
|
+ fptr1=fopen(chargingProfiles[k],"r");
|
|
|
+ ch=fgetc(fptr1);
|
|
|
+ rewind(fptr1);
|
|
|
+ memset(sLineWord, 0, sizeof sLineWord);
|
|
|
+ if(ch!=EOF)
|
|
|
+ {
|
|
|
+ while (fgets( sLineWord, sizeof sLineWord, fptr1) != NULL)
|
|
|
+ {
|
|
|
+ str[strlen(sLineWord) - 1] = '\0'; // eat the newline fgets() stores
|
|
|
+
|
|
|
+ if(sLineWord[0]=='\0')
|
|
|
+ {
|
|
|
+ isEmptyFile = TRUE;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ isEmptyFile = FALSE;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ fclose(fptr1);
|
|
|
+
|
|
|
+ if(isEmptyFile == TRUE)
|
|
|
+ {
|
|
|
+ memset(str, 0, sizeof str);
|
|
|
+ sprintf(str,"rm -f %s",chargingProfiles[k]);
|
|
|
+ system(str);
|
|
|
+ }
|
|
|
+ /*------- End of reading ---------------*/
|
|
|
+ }
|
|
|
+
|
|
|
+ } // while(int k=0; k < ChargeProfileCount; k++)
|
|
|
+
|
|
|
+ }// (connectorIsNULL == FALSE) && (connectorIdInt != 0)
|
|
|
+
|
|
|
+end:
|
|
|
+ sendClearChargingProfileConfirmation(uuid, comfirmstr);
|
|
|
+
|
|
|
+ return result;
|
|
|
+}
|
|
|
+
|
|
|
+int handleDataTransferRequest(char *uuid, char *payload)
|
|
|
+{
|
|
|
+ mtrace();
|
|
|
+ int result = FAIL;
|
|
|
+ //Payload={"vendorId":"Phihong","messageId":"MSGID","data":"Data1"}
|
|
|
+ char tempvendorId[255]={0};
|
|
|
+ char tempmessageId[50]={0};
|
|
|
+ char tempdata[50]={0};
|
|
|
+ char message[80]={0};
|
|
|
+
|
|
|
+ DEBUG_INFO("handleDataTransferRequest...\n");
|
|
|
+ if((uuid != NULL) && (payload != NULL))
|
|
|
+ {
|
|
|
+ json_object *DataTransfer;
|
|
|
+ DataTransfer = json_tokener_parse(payload);
|
|
|
+
|
|
|
+ if(!is_error(DataTransfer))
|
|
|
+ {
|
|
|
+ // Required data
|
|
|
+ sprintf((char*)tempvendorId, "%s", json_object_get_string(json_object_object_get(DataTransfer, "vendorId")));
|
|
|
+
|
|
|
+ // Optional data
|
|
|
+ if(json_object_object_get(DataTransfer, "messageId") != NULL)
|
|
|
+ sprintf((char*)tempmessageId, "%s", json_object_get_string(json_object_object_get(DataTransfer, "messageId")));
|
|
|
+
|
|
|
+ if(json_object_object_get(DataTransfer, "data") != NULL)
|
|
|
+ sprintf((char*)tempdata, "%s", json_object_get_string(json_object_object_get(DataTransfer, "data")));
|
|
|
+
|
|
|
+ result = PASS;
|
|
|
+ }
|
|
|
+ json_object_put(DataTransfer);
|
|
|
+
|
|
|
+
|
|
|
+ sprintf(message,"[%d,\"%s\",{\"status\":\"%s\",\"data\":\"vendorId-%s messageId-%s data-%s\"}]",MESSAGE_TYPE_CALLRESULT, uuid, "Rejected", tempvendorId, tempmessageId, tempdata );
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ char guid[37]={0};
|
|
|
+ random_uuid(guid);
|
|
|
+
|
|
|
+ //[2,"1577349264923","DataTransfer",{"vendorId":"Phihong","messageId":"MSGID","data":"Data1"}]
|
|
|
+ sprintf(message,"[%d,\"%s\",\"%s\",{\"vendorId\":\"Phihong\",\"messageId\":\"MSGID\",\"data\":\"Data1\"}]",MESSAGE_TYPE_CALL, guid, "DataTransfer");
|
|
|
+ }
|
|
|
+
|
|
|
+ LWS_Send(message);
|
|
|
+ return result;
|
|
|
+}
|
|
|
+
|
|
|
+int handleGetCompositeScheduleRequest(char *uuid, char *payload)
|
|
|
+{
|
|
|
+ mtrace();
|
|
|
+ int result = FAIL;
|
|
|
+ int connectorIdInt, durationInt;
|
|
|
+ char chargingRateUnitStr[4]={0};
|
|
|
+ char comfirmstr[20];
|
|
|
+ int confirmPeriods = 0;
|
|
|
+
|
|
|
+ DEBUG_INFO("handleGetCompositeScheduleRequest...\n");
|
|
|
+ json_object *GetCompositeSchedule;
|
|
|
+ GetCompositeSchedule = json_tokener_parse(payload);
|
|
|
+ if(!is_error(GetCompositeSchedule))
|
|
|
+ {
|
|
|
+ // Required data
|
|
|
+ connectorIdInt= json_object_get_int(json_object_object_get(GetCompositeSchedule, "connectorId"));
|
|
|
+ durationInt = json_object_get_int(json_object_object_get(GetCompositeSchedule, "duration"));
|
|
|
+
|
|
|
+ // Optional data
|
|
|
+ if(json_object_object_get(GetCompositeSchedule, "chargingRateUnit") != NULL)
|
|
|
+ sprintf((char*)chargingRateUnitStr, "%s", json_object_get_string(json_object_object_get(GetCompositeSchedule, "chargingRateUnit")));
|
|
|
+ }
|
|
|
+ json_object_put(GetCompositeSchedule);
|
|
|
+
|
|
|
+ memset(ShmOCPP16Data->GetCompositeSchedule, 0, sizeof(struct StructChargingSchedulePeriod)*gunTotalNumber);
|
|
|
+ if((connectorIdInt == 0) ||
|
|
|
+ ((connectorIdInt > 0) && ((connectorIdInt -1) < gunTotalNumber)))
|
|
|
+ {
|
|
|
+ int gun_index = (connectorIdInt==0?0:connectorIdInt-1);
|
|
|
+ struct StructChargingProfile tmpProfile[1];
|
|
|
+
|
|
|
+ checkCompositeSchedule(connectorIdInt, durationInt, &tmpProfile[0]);
|
|
|
+ for(int idx=0;idx<ARRAY_SIZE(ShmOCPP16Data->GetCompositeSchedule[gun_index].ResponseChargingSchedule.ChargingSchedulePeriod);idx++)
|
|
|
+ {
|
|
|
+ DEBUG_INFO("Smart Period-%02d start: %d\n", idx, tmpProfile[0].ChargingSchedule.ChargingSchedulePeriod[idx].StartPeriod);
|
|
|
+ DEBUG_INFO("Smart Period-%02d limit: %f\n", idx, tmpProfile[0].ChargingSchedule.ChargingSchedulePeriod[idx].Limit);
|
|
|
+ }
|
|
|
+ ShmOCPP16Data->GetCompositeSchedule[gun_index].ResponseConnectorId = connectorIdInt;
|
|
|
+ memcpy(&ShmOCPP16Data->GetCompositeSchedule[gun_index].ResponseChargingSchedule, &tmpProfile[0].ChargingSchedule, sizeof(struct StructChargingSchedule));
|
|
|
+ memcpy(&ShmOCPP16Data->GetCompositeSchedule[gun_index].ResponseScheduleStart ,&tmpProfile[0].ChargingSchedule.StartSchedule, ARRAY_SIZE(tmpProfile[0].ChargingSchedule.StartSchedule));
|
|
|
+
|
|
|
+ for(int idx=0;idx<ARRAY_SIZE(ShmOCPP16Data->GetCompositeSchedule[gun_index].ResponseChargingSchedule.ChargingSchedulePeriod);idx++)
|
|
|
+ {
|
|
|
+ DEBUG_INFO("Composite Period-%02d start: %d\n", idx, ShmOCPP16Data->GetCompositeSchedule[gun_index].ResponseChargingSchedule.ChargingSchedulePeriod[idx].StartPeriod);
|
|
|
+ DEBUG_INFO("Composite Period-%02d limit: %f\n", idx, ShmOCPP16Data->GetCompositeSchedule[gun_index].ResponseChargingSchedule.ChargingSchedulePeriod[idx].Limit);
|
|
|
+
|
|
|
+ if((ShmOCPP16Data->GetCompositeSchedule[gun_index].ResponseChargingSchedule.ChargingSchedulePeriod[idx].StartPeriod==0) &&
|
|
|
+ (ShmOCPP16Data->GetCompositeSchedule[gun_index].ResponseChargingSchedule.ChargingSchedulePeriod[idx].Limit==0))
|
|
|
+ {
|
|
|
+ confirmPeriods = idx;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ sprintf(comfirmstr, "%s", GetCompositeScheduleStatusStr[GetCompositeScheduleStatus_Accepted] );
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ sprintf(comfirmstr, "%s", GetCompositeScheduleStatusStr[GetCompositeScheduleStatus_Rejected] );
|
|
|
+ }
|
|
|
+
|
|
|
+ sendGetCompositeScheduleConfirmation(uuid, comfirmstr, connectorIdInt, confirmPeriods);
|
|
|
+
|
|
|
+ return result;
|
|
|
+}
|
|
|
+
|
|
|
+int handleGetConfigurationRequest(char *uuid, char *payload)
|
|
|
+{
|
|
|
+ mtrace();
|
|
|
+ int result = FAIL;
|
|
|
+ int MaxKeySupported = 0;
|
|
|
+ int n_keys = 0;
|
|
|
+ char requestKey[43][50]={0};
|
|
|
+
|
|
|
+ DEBUG_INFO("handleGetConfigurationRequest...\n");
|
|
|
+ json_object *GetConfiguration;
|
|
|
+ GetConfiguration = json_tokener_parse(payload);
|
|
|
+
|
|
|
+ if(!is_error(GetConfiguration))
|
|
|
+ {
|
|
|
+ // Optional data
|
|
|
+ if(json_object_object_get(GetConfiguration, "key") != NULL)
|
|
|
+ {
|
|
|
+ for(int idx=0;idx<json_object_array_length(json_object_object_get(GetConfiguration, "key"));idx++)
|
|
|
+ {
|
|
|
+ sprintf((char*)requestKey[idx], "%s", json_object_get_string(json_object_array_get_idx(json_object_object_get(GetConfiguration, "key"), idx)));
|
|
|
+ n_keys = idx + 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ json_object_put(GetConfiguration);
|
|
|
+
|
|
|
+ UnknownKeynum = 0;
|
|
|
+ memset( (void *)unknownkey, 0, sizeof(unknownkey));
|
|
|
+
|
|
|
+ MaxKeySupported = GetConfigurationMaxKeysNUM;
|
|
|
+ memset(ShmOCPP16Data->GetConfiguration.Key, 0 ,sizeof(struct StructConfigurationKeyItems)*MaxKeySupported);
|
|
|
+ memset(ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey, 0, sizeof(struct StructConfigurationKey)*MaxKeySupported);
|
|
|
+
|
|
|
+ if(n_keys != 0)
|
|
|
+ {
|
|
|
+ for(int i=0;i<n_keys;i++)
|
|
|
+ {
|
|
|
+ getKeyValue(requestKey[i]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ DEBUG_INFO("There is no key in Message, get all configuration\n");
|
|
|
+ getKeyValue("");
|
|
|
+ }
|
|
|
+
|
|
|
+ processUnkownKey();
|
|
|
+ sendGetConfigurationConfirmation(uuid);
|
|
|
+
|
|
|
+ return result;
|
|
|
+}
|
|
|
+
|
|
|
+static char fnamePlusPath[100]={0};
|
|
|
+static char fnamePWithNoPath[60]={0};
|
|
|
+void checkUploadLog(void)
|
|
|
+{
|
|
|
+ FILE *fp;
|
|
|
+ /* Open the command for reading. */
|
|
|
+ fp = popen("find /mnt/ -type f -name \"*.zip\" |xargs ls -t", "r");
|
|
|
+ if (fp == NULL) {
|
|
|
+ printf("Failed to run command\n" );
|
|
|
+ exit(1);
|
|
|
+ }
|
|
|
+
|
|
|
+ int ftppathlen = 0;
|
|
|
+ memset(fnamePlusPath, 0, sizeof(fnamePlusPath));
|
|
|
+ int i = 0;
|
|
|
+ /* Read the output a line at a time - output it. */
|
|
|
+ while (fgets(fnamePlusPath, sizeof(fnamePlusPath), fp) != NULL) {
|
|
|
+ if(i==0)
|
|
|
+ {
|
|
|
+ ftppathlen = strlen(fnamePlusPath);
|
|
|
+ printf("%s\n", fnamePlusPath);
|
|
|
+ fnamePlusPath[ftppathlen]='\0';
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ i= i+1;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* close */
|
|
|
+ pclose(fp);
|
|
|
+
|
|
|
+ for(int k=0; k< sizeof(fnamePlusPath); k++)
|
|
|
+ {
|
|
|
+ if((fnamePlusPath[k]=='\n') || (fnamePlusPath[k]=='r'))
|
|
|
+ {
|
|
|
+ fnamePlusPath[k]='\0';
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ i=1;
|
|
|
+ //char fname[60]={0};
|
|
|
+ while(i < ftppathlen)
|
|
|
+ {
|
|
|
+ int len=ftppathlen-i;
|
|
|
+ if(fnamePlusPath[len]== 47) // '/' ascll code: 47
|
|
|
+ {
|
|
|
+ printf("compare '/' all right\n");
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ i=i+1;
|
|
|
+ }
|
|
|
+
|
|
|
+ memset(fnamePWithNoPath, 0, sizeof(fnamePWithNoPath));
|
|
|
+ strncpy(fnamePWithNoPath, fnamePlusPath+(ftppathlen-i+1), i+1);
|
|
|
+ fnamePWithNoPath[i+1] = '\0';
|
|
|
+
|
|
|
+ for(int j=0; j< sizeof(fnamePWithNoPath); j++)
|
|
|
+ {
|
|
|
+ if((fnamePWithNoPath[j]=='\n') || (fnamePWithNoPath[j]=='r'))
|
|
|
+ {
|
|
|
+ fnamePWithNoPath[j]='\0';
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ FILE* fp1 = fopen(fnamePlusPath, "r");
|
|
|
+ if (fp1)
|
|
|
+ {
|
|
|
+ printf("testfuc : fnamePlusPath=%s exist.\n", fnamePlusPath);
|
|
|
+ // file exists
|
|
|
+ fclose(fp1);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ // file doesn't exist
|
|
|
+ printf("testfuc : fnamePlusPath=%s not exist!\n", fnamePlusPath);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+int handleGetDiagnosticsRequest(char *uuid, char *payload)
|
|
|
+{
|
|
|
+ mtrace();
|
|
|
+ int result = FAIL;
|
|
|
+ char cmdBuf[512];
|
|
|
+ char fName[258];
|
|
|
+ time_t CurrentTime;
|
|
|
+ struct tm *tm;
|
|
|
+
|
|
|
+ pthread_t th_Status;
|
|
|
+ CurrentTime = time(NULL);
|
|
|
+ tm = localtime(&CurrentTime);
|
|
|
+ sprintf(fName ,"%s-%s-%04d%02d%02d%02d%02d%02d.zip", ShmSysConfigAndInfo->SysConfig.ModelName, ShmSysConfigAndInfo->SysConfig.SerialNumber, (tm->tm_year+1900), (tm->tm_mon+1),tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec);
|
|
|
+ sendGetDiagnosticsConfirmation(uuid, fName);
|
|
|
+ system("exec /root/logPackTools 'log' 6");
|
|
|
+ sprintf(cmdBuf, "mv /mnt/log.zip /mnt/%s", fName);
|
|
|
+ system(cmdBuf);
|
|
|
+ checkUploadLog();
|
|
|
+
|
|
|
+ pthread_create(&th_Status, NULL, GetDiagnosticsProcess, stringtrimspace(payload));
|
|
|
+
|
|
|
+ return result;
|
|
|
+}
|
|
|
+
|
|
|
+void* GetDiagnosticsProcess(void* data)
|
|
|
+{
|
|
|
+ pthread_detach(pthread_self());
|
|
|
+ mtrace();
|
|
|
+ int retriesInt=0, retryIntervalInt=0;
|
|
|
+ char locationstr[100]={0}, startTimestr[30]={0}, stopTimestr[30]={0} ;
|
|
|
+ int retriesIsNULL,retryIntervalIsNULL, startTimeIsNULL, stopTimeIsNULL;
|
|
|
+ char protocol[10]={0}, user[50]={0},password[50]={0},host[50]={0}, path[50]={0}, ftppath[60]={0},host1[50]={0},path1[50]={0};
|
|
|
+ int port=0;
|
|
|
+ char sstr[260]={ 0 };
|
|
|
+ int c = 0;
|
|
|
+ char *loc;
|
|
|
+ int isSuccess = FALSE;
|
|
|
+ char ftpbuf[200]={0};
|
|
|
+ char * pch;
|
|
|
+
|
|
|
+ char str[300]={ 0 };
|
|
|
+ strcpy(str,(const char*)data);
|
|
|
+
|
|
|
+ retriesIsNULL = retryIntervalIsNULL = startTimeIsNULL = stopTimeIsNULL = FALSE;
|
|
|
+
|
|
|
+ DEBUG_INFO("GetDiagnosticsProcess...%s\n", str);
|
|
|
+ sendDiagnosticsStatusNotificationRequest(DiagnosticsStatusStr[DiagnosticsStatus_Uploading]);
|
|
|
+
|
|
|
+ //****************location*******************/
|
|
|
+ c = 0;
|
|
|
+ memset(sstr ,0, sizeof(sstr) );
|
|
|
+ loc = strstr(str, "location");
|
|
|
+ while (loc[3+strlen("location")+c] != '\"')
|
|
|
+ {
|
|
|
+ sstr[c] = loc[3+strlen("location")+c];
|
|
|
+ c++;
|
|
|
+ }
|
|
|
+ sstr[c] = '\0';
|
|
|
+ strcpy(locationstr,sstr);
|
|
|
+ //strcpy(locationstr,"http://test.evsocket.phihong.com.cn:9001/UploadFiles/Diagnostics/");
|
|
|
+
|
|
|
+ if(strcmp(locationstr,"")==0)
|
|
|
+ {
|
|
|
+ DEBUG_INFO("location is <Empty>!\n");
|
|
|
+ sendDiagnosticsStatusNotificationRequest(DiagnosticsStatusStr[DiagnosticsStatus_UploadFailed]);
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+
|
|
|
+ //****************retries*******************/
|
|
|
+ c = 0;
|
|
|
+ loc = strstr(str, "retries");
|
|
|
+ if(loc == NULL)
|
|
|
+ {
|
|
|
+ retriesIsNULL = TRUE;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ while ((loc[strlen("retries")+2+c] != ',')&&(loc[strlen("retries")+2+c] != '}'))
|
|
|
+ {
|
|
|
+ sstr[c] = loc[strlen("retries")+2+c];
|
|
|
+ c++;
|
|
|
+ }
|
|
|
+ sstr[c] = '\0';
|
|
|
+ retriesInt = atoi(sstr);
|
|
|
+ }
|
|
|
+
|
|
|
+ if(retriesIsNULL == TRUE)
|
|
|
+ {
|
|
|
+ retriesInt = 3; // If this field is not present, it is left to Charge Point to decide how many times it wants to retry.
|
|
|
+ }
|
|
|
+
|
|
|
+ //****************retryInterval*******************/
|
|
|
+ c = 0;
|
|
|
+ loc = strstr(str, "retryInterval");
|
|
|
+ if(loc == NULL)
|
|
|
+ {
|
|
|
+ retryIntervalIsNULL = TRUE;
|
|
|
+ retryIntervalInt = 30; // if this field is not present, it is left to Charge Point to decide how long to wait between attempts.
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ while ((loc[strlen("retryInterval")+2+c] != ',')&&(loc[strlen("retries")+2+c] != '}'))
|
|
|
+ {
|
|
|
+ sstr[c] = loc[strlen("retryInterval")+2+c];
|
|
|
+ c++;
|
|
|
+ }
|
|
|
+ sstr[c] = '\0';
|
|
|
+ retryIntervalInt = atoi(sstr);
|
|
|
+ }
|
|
|
+
|
|
|
+ //****************startTime*******************/
|
|
|
+ c = 0;
|
|
|
+ memset(sstr ,0, sizeof(sstr) );
|
|
|
+ loc = strstr(str, "startTime");
|
|
|
+ if(loc == NULL)
|
|
|
+ {
|
|
|
+ startTimeIsNULL = TRUE;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ while (loc[3+strlen("startTime")+c] != '\"')
|
|
|
+ {
|
|
|
+ sstr[c] = loc[3+strlen("startTime")+c];
|
|
|
+ c++;
|
|
|
+ }
|
|
|
+ sstr[c] = '\0';
|
|
|
+ strcpy(startTimestr,sstr);
|
|
|
+ }
|
|
|
+
|
|
|
+ //****************stopTime*******************/
|
|
|
+ c = 0;
|
|
|
+ memset(sstr ,0, sizeof(sstr) );
|
|
|
+ loc = strstr(str, "stopTime");
|
|
|
+ if(loc == NULL)
|
|
|
+ {
|
|
|
+ stopTimeIsNULL = TRUE;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ while (loc[3+strlen("stopTime")+c] != '\"')
|
|
|
+ {
|
|
|
+ sstr[c] = loc[3+strlen("stopTime")+c];
|
|
|
+ c++;
|
|
|
+ }
|
|
|
+ sstr[c] = '\0';
|
|
|
+ strcpy(stopTimestr,sstr);
|
|
|
+ }
|
|
|
+
|
|
|
+ memset(protocol, 0, sizeof(protocol));
|
|
|
+ memset(user, 0, sizeof(user) );
|
|
|
+ memset(password, 0, sizeof(password));
|
|
|
+ memset(host, 0, sizeof(host));
|
|
|
+
|
|
|
+ memset(path, 0, sizeof(path));
|
|
|
+ memset(ftppath, 0, sizeof(ftppath));
|
|
|
+ memset(host1, 0, sizeof(host1));
|
|
|
+ memset(path1, 0, sizeof(path1));
|
|
|
+ /*location: ftp://user:password@host:port/path*/
|
|
|
+
|
|
|
+ //DEBUG_INFO("fnamePlusPath =%s\n",fnamePlusPath);
|
|
|
+ if((access(fnamePlusPath,F_OK))!=-1)
|
|
|
+ {
|
|
|
+ DEBUG_INFO("fnamePlusPath exist.\n");
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ DEBUG_INFO("fnamePlusPath not exist!\n");
|
|
|
+ sendDiagnosticsStatusNotificationRequest(DiagnosticsStatusStr[DiagnosticsStatus_UploadFailed]);
|
|
|
+ goto end;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ pch=strchr(locationstr,'@');
|
|
|
+
|
|
|
+ if(pch==NULL)
|
|
|
+ {
|
|
|
+ sscanf(locationstr,
|
|
|
+ "%[^:]:%*2[/]%[^:]:%i/%[a-zA-Z0-9._/-]",
|
|
|
+ protocol, host, &port, path);
|
|
|
+ strcpy(user,"anonymous");
|
|
|
+ strcpy(password,"");
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ //DEBUG_INFO("pch=%s\n", pch);
|
|
|
+ sscanf(locationstr,"%[^:]:%*2[/]%[^:]:%[^@]@%[^:]:%i/%199[^\n]",
|
|
|
+ protocol, user, password, host, &port, path);
|
|
|
+ }
|
|
|
+
|
|
|
+ if((strcmp(protocol,"ftp")!=0)&&(strcmp(protocol,"http")!=0))
|
|
|
+ {
|
|
|
+ DEBUG_INFO("protocol is not ftp/http ! \n");
|
|
|
+ sendDiagnosticsStatusNotificationRequest(DiagnosticsStatusStr[DiagnosticsStatus_UploadFailed]);
|
|
|
+ goto end;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if(strncmp(locationstr,"http", 4) == 0)
|
|
|
+ {
|
|
|
+ sscanf(locationstr,"%[^:]:%*2[/]%[^/]/%199[^\n]", protocol, host, path);
|
|
|
+
|
|
|
+ sprintf(ftppath,"/%s", path);
|
|
|
+
|
|
|
+ do{
|
|
|
+ isSuccess = httpUploadFile(host, ftppath, fnamePlusPath, locationstr);
|
|
|
+ sleep(retryIntervalInt);
|
|
|
+ }while((isSuccess == 0)&&(retriesInt > 0 && retriesInt --));
|
|
|
+
|
|
|
+ if(!isSuccess)
|
|
|
+ {
|
|
|
+ DEBUG_INFO("Diagnostics fail.\n");
|
|
|
+ sendDiagnosticsStatusNotificationRequest(DiagnosticsStatusStr[DiagnosticsStatus_UploadFailed]);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ DEBUG_INFO("sendDiagnosticsStatusNotificationRequest Uploaded\n");
|
|
|
+ sendDiagnosticsStatusNotificationRequest(DiagnosticsStatusStr[DiagnosticsStatus_Uploaded]);
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ sscanf(host,"%[^/]%s",host1, path1);
|
|
|
+ sprintf(ftppath,"%s", path1);
|
|
|
+
|
|
|
+ int ftppathlen=strlen(ftppath);
|
|
|
+ int i=1;
|
|
|
+ char filenametemp[50];
|
|
|
+ while(i < ftppathlen)
|
|
|
+ {
|
|
|
+ int len=ftppathlen-i;
|
|
|
+ if(ftppath[len]== 47) // '/' ascll code: 47
|
|
|
+ {
|
|
|
+ DEBUG_INFO("find '/' all right\n");
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ i=i+1;
|
|
|
+ }
|
|
|
+
|
|
|
+ memset(filenametemp, 0, sizeof(filenametemp));
|
|
|
+ strncpy(filenametemp, ftppath+(ftppathlen-i+1), i+1);
|
|
|
+ filenametemp[i+1] = 0;
|
|
|
+ memset(ftpbuf, 0, sizeof(ftpbuf));
|
|
|
+
|
|
|
+ if(port == 0)
|
|
|
+ port = 21;
|
|
|
+
|
|
|
+ do{
|
|
|
+ isSuccess = ftpFile(host1, user, password, port, ftppath, fnamePlusPath, fnamePWithNoPath);
|
|
|
+ sleep(retryIntervalInt);
|
|
|
+ }while((!isSuccess)&&(retriesInt > 0 && retriesInt --));
|
|
|
+
|
|
|
+ if(!isSuccess)
|
|
|
+ {
|
|
|
+ DEBUG_INFO("Diagnostics fail.\n");
|
|
|
+ sendDiagnosticsStatusNotificationRequest(DiagnosticsStatusStr[DiagnosticsStatus_UploadFailed]);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ DEBUG_INFO("sendDiagnosticsStatusNotificationRequest Uploaded\n");
|
|
|
+ sendDiagnosticsStatusNotificationRequest(DiagnosticsStatusStr[DiagnosticsStatus_Uploaded]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+end:
|
|
|
+ DiagnosticsStatusNotificationStatus = DIAGNOSTIC_STATUS_IDLE;
|
|
|
+ pthread_exit(NULL);
|
|
|
+}
|
|
|
+
|
|
|
+int handleGetLocalListVersionRequest(char *uuid, char *payload)
|
|
|
+{
|
|
|
+ mtrace();
|
|
|
+ int result = FAIL;
|
|
|
+ DEBUG_INFO("handle GetLocalListVersionRequest\n");
|
|
|
+
|
|
|
+ if(strcmp((const char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemData, "FALSE") == 0)
|
|
|
+ {
|
|
|
+ DEBUG_INFO("LocalAuthListEnabled is FALSE \n");
|
|
|
+ localversion = -1;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ DEBUG_INFO("handle GetLocalListVersionRequest OCPP_getListVerion \n");
|
|
|
+ OCPP_getListVerion();
|
|
|
+ }
|
|
|
+
|
|
|
+ //from db.OCPP_getListVerion
|
|
|
+ ShmOCPP16Data->GetLocalListVersion.ResponseListVersion = localversion;
|
|
|
+ //ShmOCPP16Data->MsMsg.bits.GetLocalListVersionReq = 1;
|
|
|
+ sendGetLocalListVersionConfirmation(uuid,"");
|
|
|
+ //ShmOCPP16Data->MsMsg.bits.GetLocalListVersionConf = 1;
|
|
|
+
|
|
|
+ return result;
|
|
|
+}
|
|
|
+
|
|
|
+int handleRemoteStartRequest(char *uuid, char *payload)
|
|
|
+{
|
|
|
+ mtrace();
|
|
|
+ int result = FAIL;
|
|
|
+ int connectorIdInt=0, chargingProfileIdInt=0, transactionIdInt=0, stackLevelInt=0,
|
|
|
+ durationInt=0, startPeriodInt[10]={0}, numberPhasesInt[10]={0};
|
|
|
+ int tempIndex = 0;
|
|
|
+ char idTagstr[20]={0}, chargingProfilePurposestr[30]={0}, chargingProfileKindstr[14]={0}, recurrencyKindstr[10]={0},
|
|
|
+ validFromstr[30]={0}, validTostr[30]={0}, startSchedulestr[30]={0}, chargingRateUnitstr[4]={0};
|
|
|
+ int connectorIdIsNULL,chargingProfileIsNULL,transactionIdIsNULL,recurrencyKindIsNULL,validFromIsNULL,validToIsNULL,durationIsNULL,startScheduleIsNULL,minChargingRateIsNULL,numberPhasesIsNULL;
|
|
|
+ float minChargingRateflaot=0.0, limitflaot[10]={0.0};
|
|
|
+ int chargingSchedulePeriodCount = 0;
|
|
|
+ char sstr[30]={ 0 },sstrtemp[1600]={ 0 };//sstr[200]={ 0 };
|
|
|
+ int c = 0;
|
|
|
+ char *loc;
|
|
|
+ char comfirmstr[20]={0};
|
|
|
+
|
|
|
+ DEBUG_INFO("handleRemoteStartRequest ...\n");
|
|
|
+ if(server_pending == TRUE)
|
|
|
+ {
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ connectorIdIsNULL = chargingProfileIsNULL = transactionIdIsNULL = recurrencyKindIsNULL = validFromIsNULL = validToIsNULL = durationIsNULL = startScheduleIsNULL = minChargingRateIsNULL = numberPhasesIsNULL= FALSE;
|
|
|
+
|
|
|
+ strcpy(sstrtemp, stringtrimspace(payload));
|
|
|
+
|
|
|
+ //**********connectorId****************/
|
|
|
+ c = 0;
|
|
|
+ memset(sstr ,0, sizeof(sstr) );
|
|
|
+ loc = strstr(sstrtemp, "connectorId");
|
|
|
+ if(loc == NULL)
|
|
|
+ {
|
|
|
+ connectorIdIsNULL = TRUE;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ while ((loc[strlen("connectorId")+2+c] != '}') && (loc[strlen("connectorId")+2+c] != ','))
|
|
|
+ {
|
|
|
+ sstr[c] = loc[strlen("connectorId")+2+c];
|
|
|
+ //printf("i=%d sstr=%c\n",c, sstr[c]);
|
|
|
+ c++;
|
|
|
+ }
|
|
|
+ sstr[c] = '\0';
|
|
|
+ connectorIdInt = atoi(sstr);
|
|
|
+ }
|
|
|
+
|
|
|
+ if(connectorIdIsNULL == TRUE) // Number of the connector on which to start the transaction. connectorId SHALL be > 0
|
|
|
+ {
|
|
|
+ strcpy(comfirmstr, RemoteStartStopStatusStr[RemoteStartStopStatus_Rejected]);
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+
|
|
|
+ //****************idTag*******************/
|
|
|
+ c = 0;
|
|
|
+ memset(sstr ,0, sizeof(sstr) );
|
|
|
+ loc = strstr(sstrtemp, "idTag");
|
|
|
+ while (loc[3+strlen("idTag")+c] != '\"')
|
|
|
+ {
|
|
|
+ sstr[c] = loc[3+strlen("idTag")+c];
|
|
|
+ c++;
|
|
|
+ }
|
|
|
+ sstr[c] = '\0';
|
|
|
+ strcpy(idTagstr,sstr);
|
|
|
+
|
|
|
+ //****************chargingProfile*******************/
|
|
|
+ c = 0;
|
|
|
+ memset(sstr ,0, sizeof(sstr) );
|
|
|
+ loc = strstr(sstrtemp, "chargingProfile");
|
|
|
+ if(loc == NULL)
|
|
|
+ {
|
|
|
+ chargingProfileIsNULL = TRUE;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ //****************chargingProfileId*******************/
|
|
|
+ c=0;
|
|
|
+ loc = strstr(sstrtemp, "chargingProfileId");
|
|
|
+ memset(sstr ,0, sizeof(sstr) );
|
|
|
+ while ((loc[strlen("chargingProfileId")+2+c] != '}') && (loc[strlen("chargingProfileId")+2+c] != ','))
|
|
|
+ {
|
|
|
+ sstr[c] = loc[strlen("chargingProfileId")+2+c];
|
|
|
+ //printf("i=%d sstr=%c\n",c, sstr[c]);
|
|
|
+ c++;
|
|
|
+ }
|
|
|
+ sstr[c] = '\0';
|
|
|
+ chargingProfileIdInt = atoi(sstr);
|
|
|
+
|
|
|
+ //****************transactionId*******************/
|
|
|
+
|
|
|
+ loc = strstr(sstrtemp, "transactionId");
|
|
|
+ if(loc == NULL)
|
|
|
+ {
|
|
|
+ transactionIdIsNULL = TRUE;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ c=0;
|
|
|
+ memset(sstr ,0, sizeof(sstr) );
|
|
|
+ while ((loc[strlen("transactionId")+2+c] != '}') && (loc[strlen("transactionId")+2+c] != ','))
|
|
|
+ {
|
|
|
+ sstr[c] = loc[strlen("transactionId")+2+c];
|
|
|
+ //printf("i=%d sstr=%c\n",c, sstr[c]);
|
|
|
+ c++;
|
|
|
+ }
|
|
|
+ sstr[c] = '\0';
|
|
|
+ transactionIdInt = atoi(sstr);
|
|
|
+ }
|
|
|
+
|
|
|
+ //****************stackLevel*******************/
|
|
|
+ c=0;
|
|
|
+ loc = strstr(sstrtemp, "stackLevel");
|
|
|
+ memset(sstr ,0, sizeof(sstr) );
|
|
|
+ while ((loc[strlen("stackLevel")+2+c] != '}') && (loc[strlen("stackLevel")+2+c] != ','))
|
|
|
+ {
|
|
|
+ sstr[c] = loc[strlen("stackLevel")+2+c];
|
|
|
+ //printf("i=%d sstr=%c\n",c, sstr[c]);
|
|
|
+ c++;
|
|
|
+ }
|
|
|
+ sstr[c] = '\0';
|
|
|
+ stackLevelInt = atoi(sstr);
|
|
|
+
|
|
|
+ //****************chargingProfilePurpose*******************/
|
|
|
+ c = 0;
|
|
|
+ memset(sstr ,0, sizeof(sstr) );
|
|
|
+ loc = strstr(sstrtemp, "chargingProfilePurpose");
|
|
|
+ while (loc[3+strlen("chargingProfilePurpose")+c] != '\"')
|
|
|
+ {
|
|
|
+ sstr[c] = loc[3+strlen("chargingProfilePurpose")+c];
|
|
|
+ c++;
|
|
|
+ }
|
|
|
+ sstr[c] = '\0';
|
|
|
+ strcpy(chargingProfilePurposestr,sstr);
|
|
|
+
|
|
|
+ //****************chargingProfileKind*******************/
|
|
|
+ c = 0;
|
|
|
+ memset(sstr ,0, sizeof(sstr) );
|
|
|
+ loc = strstr(sstrtemp, "chargingProfileKind");
|
|
|
+ while (loc[3+strlen("chargingProfileKind")+c] != '\"')
|
|
|
+ {
|
|
|
+ sstr[c] = loc[3+strlen("chargingProfileKind")+c];
|
|
|
+ c++;
|
|
|
+ }
|
|
|
+ sstr[c] = '\0';
|
|
|
+ strcpy(chargingProfileKindstr,sstr);
|
|
|
+
|
|
|
+ //****************recurrencyKind*******************/
|
|
|
+ loc = strstr(sstrtemp, "recurrencyKind");
|
|
|
+ if(loc == NULL)
|
|
|
+ {
|
|
|
+ recurrencyKindIsNULL = TRUE;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ c = 0;
|
|
|
+ memset(sstr ,0, sizeof(sstr) );
|
|
|
+ while (loc[3+strlen("recurrencyKind")+c] != '\"')
|
|
|
+ {
|
|
|
+ sstr[c] = loc[3+strlen("recurrencyKind")+c];
|
|
|
+ c++;
|
|
|
+ }
|
|
|
+ sstr[c] = '\0';
|
|
|
+ strcpy(recurrencyKindstr,sstr);
|
|
|
+ }
|
|
|
+
|
|
|
+ //****************validFrom*******************/
|
|
|
+ loc = strstr(sstrtemp, "validFrom");
|
|
|
+ if(loc == NULL)
|
|
|
+ {
|
|
|
+ validFromIsNULL = TRUE;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ c = 0;
|
|
|
+ memset(sstr ,0, sizeof(sstr) );
|
|
|
+ while (loc[3+strlen("validFrom")+c] != '\"')
|
|
|
+ {
|
|
|
+ sstr[c] = loc[3+strlen("validFrom")+c];
|
|
|
+ c++;
|
|
|
+ }
|
|
|
+ sstr[c] = '\0';
|
|
|
+ strcpy(validFromstr,sstr);
|
|
|
+ }
|
|
|
+
|
|
|
+ //****************validTo*******************/
|
|
|
+ loc = strstr(sstrtemp, "validTo");
|
|
|
+ if(loc == NULL)
|
|
|
+ {
|
|
|
+ validToIsNULL = TRUE;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ c = 0;
|
|
|
+ memset(sstr ,0, sizeof(sstr) );
|
|
|
+ while (loc[3+strlen("validTo")+c] != '\"')
|
|
|
+ {
|
|
|
+ sstr[c] = loc[3+strlen("validTo")+c];
|
|
|
+ c++;
|
|
|
+ }
|
|
|
+ sstr[c] = '\0';
|
|
|
+ strcpy(validTostr,sstr);
|
|
|
+ }
|
|
|
+
|
|
|
+ //****************chargingSchedule*******************/
|
|
|
+ loc = strstr(sstrtemp, "chargingSchedule");
|
|
|
+ if(loc != NULL)
|
|
|
+ {
|
|
|
+ //****************duration*******************/
|
|
|
+ loc = strstr(sstrtemp, "duration");
|
|
|
+
|
|
|
+ if(loc == NULL)
|
|
|
+ {
|
|
|
+ durationIsNULL = TRUE;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ c=0;
|
|
|
+ memset(sstr ,0, sizeof(sstr) );
|
|
|
+ while ((loc[strlen("duration")+2+c] != '}') && (loc[strlen("duration")+2+c] != ','))
|
|
|
+ {
|
|
|
+ sstr[c] = loc[strlen("duration")+2+c];
|
|
|
+ //printf("i=%d sstr=%c\n",c, sstr[c]);
|
|
|
+ c++;
|
|
|
+ }
|
|
|
+ sstr[c] = '\0';
|
|
|
+ durationInt = atoi(sstr);
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ //****************startSchedule******************/
|
|
|
+ loc = strstr(sstrtemp, "startSchedule");
|
|
|
+ if(loc == NULL)
|
|
|
+ {
|
|
|
+ startScheduleIsNULL = TRUE;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ c = 0;
|
|
|
+ memset(sstr ,0, sizeof(sstr) );
|
|
|
+ while (loc[3+strlen("startSchedule")+c] != '\"')
|
|
|
+ {
|
|
|
+ sstr[c] = loc[3+strlen("startSchedule")+c];
|
|
|
+ c++;
|
|
|
+ }
|
|
|
+ sstr[c] = '\0';
|
|
|
+ strcpy(startSchedulestr,sstr);
|
|
|
+ }
|
|
|
+
|
|
|
+ //****************chargingRateUnit*******************/
|
|
|
+ c = 0;
|
|
|
+ memset(sstr ,0, sizeof(sstr) );
|
|
|
+ loc = strstr(sstrtemp, "chargingRateUnit");
|
|
|
+ while (loc[3+strlen("chargingRateUnit")+c] != '\"')
|
|
|
+ {
|
|
|
+ sstr[c] = loc[3+strlen("chargingRateUnit")+c];
|
|
|
+ c++;
|
|
|
+ }
|
|
|
+ sstr[c] = '\0';
|
|
|
+ strcpy(chargingRateUnitstr,sstr);
|
|
|
+
|
|
|
+ //****************minChargingRate*******************/
|
|
|
+ loc = strstr(sstrtemp, "minChargingRate");
|
|
|
+ if(loc == NULL)
|
|
|
+ {
|
|
|
+ minChargingRateIsNULL = TRUE;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ c=0;
|
|
|
+ memset(sstr ,0, sizeof(sstr) );
|
|
|
+ while ((loc[strlen("minChargingRate")+2+c] != '}') && (loc[strlen("minChargingRate")+2+c] != ','))
|
|
|
+ {
|
|
|
+ sstr[c] = loc[strlen("minChargingRate")+2+c];
|
|
|
+ //printf("i=%d sstr=%c\n",c, sstr[c]);
|
|
|
+ c++;
|
|
|
+ }
|
|
|
+ sstr[c] = '\0';
|
|
|
+ minChargingRateflaot = atof(sstr);
|
|
|
+ }
|
|
|
+
|
|
|
+ //****************chargingSchedulePeriod count*******************/
|
|
|
+ int what_len = strlen("startPeriod");
|
|
|
+
|
|
|
+ char *where = sstrtemp;
|
|
|
+
|
|
|
+
|
|
|
+ while ((where = strstr(where, "startPeriod"))) {
|
|
|
+ where += what_len;
|
|
|
+ chargingSchedulePeriodCount++;
|
|
|
+ }
|
|
|
+
|
|
|
+ where = sstrtemp;
|
|
|
+
|
|
|
+ for(int periodNums=0; periodNums < chargingSchedulePeriodCount; periodNums++)
|
|
|
+ {
|
|
|
+ //****************startPeriod*******************/
|
|
|
+ c=0;
|
|
|
+ loc = strstr(where, "startPeriod");
|
|
|
+ memset(sstr ,0, sizeof(sstr) );
|
|
|
+ while ((loc[strlen("startPeriod")+2+c] != '}') && (loc[strlen("startPeriod")+2+c] != ','))
|
|
|
+ {
|
|
|
+ sstr[c] = loc[strlen("startPeriod")+2+c];
|
|
|
+ //printf("i=%d sstr=%c\n",c, sstr[c]);
|
|
|
+ c++;
|
|
|
+ }
|
|
|
+ sstr[c] = '\0';
|
|
|
+ startPeriodInt[periodNums] = atoi(sstr);
|
|
|
+
|
|
|
+ //****************limit*******************/
|
|
|
+ c=0;
|
|
|
+ loc = strstr(where, "limit");
|
|
|
+ memset(sstr ,0, sizeof(sstr) );
|
|
|
+ while ((loc[strlen("limit")+2+c] != '}') && (loc[strlen("limit")+2+c] != ','))
|
|
|
+ {
|
|
|
+ sstr[c] = loc[strlen("limit")+2+c];
|
|
|
+ //printf("i=%d sstr=%c\n",c, sstr[c]);
|
|
|
+ c++;
|
|
|
+ }
|
|
|
+ sstr[c] = '\0';
|
|
|
+ limitflaot[periodNums] = atof(sstr);
|
|
|
+
|
|
|
+ //****************numberPhases*******************/
|
|
|
+ loc = strstr(where, "numberPhases");
|
|
|
+ if(loc == NULL)
|
|
|
+ {
|
|
|
+ numberPhasesIsNULL = TRUE;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ c=0;
|
|
|
+ memset(sstr ,0, sizeof(sstr) );
|
|
|
+ while ((loc[strlen("numberPhases")+2+c] != '}') && (loc[strlen("numberPhases")+2+c] != ','))
|
|
|
+ {
|
|
|
+ sstr[c] = loc[strlen("numberPhases")+2+c];
|
|
|
+ //printf("i=%d sstr=%c\n",c, sstr[c]);
|
|
|
+ c++;
|
|
|
+ }
|
|
|
+ sstr[c] = '\0';
|
|
|
+ numberPhasesInt[periodNums] = atoi(sstr);
|
|
|
+ }
|
|
|
+
|
|
|
+ where = loc;
|
|
|
+
|
|
|
+ } // END FOR chargingSchedulePeriodCount
|
|
|
+ }// END IF chargingSchedule
|
|
|
+
|
|
|
+ } // END chargingProfile
|
|
|
+
|
|
|
+ /*
|
|
|
+
|
|
|
+ enum _SYSTEM_STATUS
|
|
|
+ {
|
|
|
+ S_BOOTING = 0,
|
|
|
+ S_IDLE, = 1
|
|
|
+ S_AUTHORIZING, =2
|
|
|
+ S_REASSIGN_CHECK, =3
|
|
|
+ S_REASSIGN, =4
|
|
|
+ S_PRECHARGE, =5
|
|
|
+ S_PREPARING_FOR_EV, =6
|
|
|
+ S_PREPARING_FOR_EVSE, =7
|
|
|
+ S_CHARGING, =8
|
|
|
+ S_TERMINATING, =9
|
|
|
+ S_COMPLETE, =10
|
|
|
+ S_ALARM, =11
|
|
|
+ S_FAULT =12
|
|
|
+ }
|
|
|
+ */
|
|
|
+ if((connectorIdIsNULL == FALSE)&&(connectorIdInt > 0) && ((connectorIdInt -1) <= gunTotalNumber/*(CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY)*/))
|
|
|
+ {
|
|
|
+ sprintf((char *)ShmOCPP16Data->RemoteStartTransaction[connectorIdInt -1].IdTag, "%s" , idTagstr);
|
|
|
+ ShmOCPP16Data->RemoteStartTransaction[connectorIdInt -1].ChargingProfile.TransactionId = transactionIdInt;
|
|
|
+ //0: Booting, 1: idle, 2: authorizing, 3: preparing, 4: charging, 5: terminating, 6: alarm, 7: fault 8: Reserved
|
|
|
+
|
|
|
+ //check Transaction active
|
|
|
+ if(gunType[connectorIdInt -1] == 'J')
|
|
|
+ {
|
|
|
+
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
+ {
|
|
|
+ tempIndex = ((connectorIdInt -1) == 2) ? 1: 0;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tempIndex = connectorIdInt -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < CHAdeMO_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex )
|
|
|
+ {
|
|
|
+
|
|
|
+ if((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].ReservationId != -1)&&(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].ReservationId >= 0)&&(strcmp((const char *)ShmOCPP16Data->ReserveNow[index].IdTag, idTagstr) == 0))
|
|
|
+ {
|
|
|
+ //Reserved
|
|
|
+ DEBUG_INFO("Reserved now !!!The idTag matches the idTag of Reservation!!!\n");
|
|
|
+ }
|
|
|
+ else if((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].ReservationId != -1)&&(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].ReservationId >= 0)&&(strcmp((const char *)ShmOCPP16Data->ReserveNow[index].IdTag, idTagstr) != 0))
|
|
|
+ {
|
|
|
+ //Reserved
|
|
|
+ DEBUG_INFO("Reserved now !!! The idTag does NOT match the idTag of Reservation!!! Reject it!!!\n");
|
|
|
+ strcpy(comfirmstr, RemoteStartStopStatusStr[RemoteStartStopStatus_Rejected]);
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus != SYS_MODE_IDLE) //S_IDLE
|
|
|
+ && (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus != SYS_MODE_PREPARING ) //S_PRECHARGE
|
|
|
+ && (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus != SYS_MODE_PREPARE_FOR_EV ) //S_PREPARING_FOR_EV
|
|
|
+ && (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus != SYS_MODE_PREPARE_FOR_EVSE )) // S_PREPARING_FOR_EVSE
|
|
|
+ {
|
|
|
+ strcpy(comfirmstr, RemoteStartStopStatusStr[RemoteStartStopStatus_Rejected]);
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+ }//END FOR ELSE
|
|
|
+ }
|
|
|
+ }// END FOR CHAdeMO_QUANTITY
|
|
|
+
|
|
|
+ }
|
|
|
+ else if((gunType[connectorIdInt -1] == 'U')||(gunType[connectorIdInt -1] == 'E'))
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
+ {
|
|
|
+ tempIndex = ((connectorIdInt -1) == 2) ? 1: 0;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tempIndex = connectorIdInt -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < CCS_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
|
|
|
+ {
|
|
|
+ if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].ReservationId != -1)&&(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].ReservationId >= 0)&&(strcmp((const char *)ShmOCPP16Data->ReserveNow[index].IdTag, idTagstr) == 0))
|
|
|
+ {
|
|
|
+ //Reserved
|
|
|
+ DEBUG_INFO("Reserved now !!!The idTag matches the idTag of Reservation!!!\n");
|
|
|
+ }
|
|
|
+ else if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].ReservationId != -1)&&(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].ReservationId >= 0)&&(strcmp((const char *)ShmOCPP16Data->ReserveNow[index].IdTag, idTagstr) != 0))
|
|
|
+ {
|
|
|
+ //Reserved
|
|
|
+ DEBUG_INFO("Reserved now !!! The idTag does NOT match the idTag of Reservation!!! Reject it!!!\n");
|
|
|
+ strcpy(comfirmstr, RemoteStartStopStatusStr[RemoteStartStopStatus_Rejected]);
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus != SYS_MODE_IDLE) //S_IDLE
|
|
|
+ && (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus != SYS_MODE_PREPARING) //S_PRECHARGE
|
|
|
+ && (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus != SYS_MODE_PREPARE_FOR_EV) //S_PREPARING_FOR_EV
|
|
|
+ && (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus != SYS_MODE_PREPARE_FOR_EVSE)) // S_PREPARING_FOR_EVSE
|
|
|
+ {
|
|
|
+ strcpy(comfirmstr, RemoteStartStopStatusStr[RemoteStartStopStatus_Rejected]);
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+
|
|
|
+ }// END FOR ELSE
|
|
|
+ }
|
|
|
+ }// END FOR CCS_QUANTITY
|
|
|
+ }
|
|
|
+ else if(gunType[connectorIdInt -1] == 'G')
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
+ {
|
|
|
+ tempIndex = ((connectorIdInt -1) == 2) ? 1: 0;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tempIndex = connectorIdInt -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < GB_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex )
|
|
|
+ {
|
|
|
+ if((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].ReservationId != -1)&&(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].ReservationId >= 0)&&(strcmp((const char *)ShmOCPP16Data->ReserveNow[index].IdTag, idTagstr) == 0))
|
|
|
+ {
|
|
|
+ //Reserved
|
|
|
+ DEBUG_INFO("Reserved now !!!The idTag matches the idTag of Reservation!!!\n");
|
|
|
+ }
|
|
|
+ else if((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].ReservationId != -1)&&(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].ReservationId >= 0)&&(strcmp((const char *)ShmOCPP16Data->ReserveNow[index].IdTag, idTagstr) != 0))
|
|
|
+ {
|
|
|
+ //Reserved
|
|
|
+ DEBUG_INFO("Reserved now !!! The idTag does NOT match the idTag of Reservation!!! Reject it!!!\n");
|
|
|
+ strcpy(comfirmstr, RemoteStartStopStatusStr[RemoteStartStopStatus_Rejected]);
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus != SYS_MODE_IDLE) //S_IDLE
|
|
|
+ && (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus != SYS_MODE_PREPARING) //S_PRECHARGE
|
|
|
+ && (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus != SYS_MODE_PREPARE_FOR_EV) //S_PREPARING_FOR_EV
|
|
|
+ && (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus != SYS_MODE_PREPARE_FOR_EVSE)) // S_PREPARING_FOR_EVSE
|
|
|
+ {
|
|
|
+ strcpy(comfirmstr, RemoteStartStopStatusStr[RemoteStartStopStatus_Rejected]);
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+
|
|
|
+ }// END FOR ELSE
|
|
|
+ }
|
|
|
+ } // END FOR GB_QUANTITY
|
|
|
+
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D') // 'D' means DC
|
|
|
+ {
|
|
|
+ tempIndex = 2;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tempIndex = connectorIdInt -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < AC_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex )
|
|
|
+ {
|
|
|
+
|
|
|
+ if((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].ReservationId != -1)&&(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].ReservationId >= 0)&&(strcmp((const char *)ShmOCPP16Data->ReserveNow[index].IdTag, idTagstr) == 0))
|
|
|
+ {
|
|
|
+ //Reserved
|
|
|
+ DEBUG_INFO("Reserved now !!!The idTag matches the idTag of Reservation!!!\n");
|
|
|
+ }
|
|
|
+ else if((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].ReservationId != -1)&&(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].ReservationId >= 0)&&(strcmp((const char *)ShmOCPP16Data->ReserveNow[index].IdTag, idTagstr) != 0))
|
|
|
+ {
|
|
|
+ //Reserved
|
|
|
+ DEBUG_INFO("Reserved now !!! The idTag does NOT match the idTag of Reservation!!! Reject it!!!\n");
|
|
|
+ strcpy(comfirmstr, RemoteStartStopStatusStr[RemoteStartStopStatus_Rejected]);
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus != SYS_MODE_IDLE) //S_IDLE
|
|
|
+ && (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus != SYS_MODE_PREPARING) //S_PRECHARGE
|
|
|
+ && (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus != SYS_MODE_PREPARE_FOR_EV) //S_PREPARING_FOR_EV
|
|
|
+ && (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus != SYS_MODE_PREPARE_FOR_EVSE)) // S_PREPARING_FOR_EVSE
|
|
|
+ {
|
|
|
+ strcpy(comfirmstr, RemoteStartStopStatusStr[RemoteStartStopStatus_Rejected]);
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+
|
|
|
+ }//END FOR ELSE
|
|
|
+ }
|
|
|
+ }// END FOR AC_QUANTITY
|
|
|
+ }
|
|
|
+
|
|
|
+ if(chargingProfileIsNULL == FALSE)
|
|
|
+ {
|
|
|
+ //ChargingProfile
|
|
|
+ ShmOCPP16Data->RemoteStartTransaction[connectorIdInt -1].ChargingProfile.ChargingProfileId = chargingProfileIdInt;
|
|
|
+ sprintf((char *)ShmOCPP16Data->RemoteStartTransaction[connectorIdInt -1].ChargingProfile.ChargingProfileKind, "%s" ,chargingProfileKindstr);
|
|
|
+ sprintf((char *)ShmOCPP16Data->RemoteStartTransaction[connectorIdInt -1].ChargingProfile.ChargingProfilePurpose, "%s" ,chargingProfilePurposestr);
|
|
|
+
|
|
|
+ if(recurrencyKindIsNULL == FALSE) //OPTION
|
|
|
+ sprintf((char *)ShmOCPP16Data->RemoteStartTransaction[connectorIdInt -1].ChargingProfile.RecurrencyKind, "%s" ,recurrencyKindstr);
|
|
|
+
|
|
|
+ ShmOCPP16Data->RemoteStartTransaction[connectorIdInt -1].ChargingProfile.StackLevel = stackLevelInt;
|
|
|
+
|
|
|
+ if(transactionIdIsNULL == FALSE) // OPTION
|
|
|
+ ShmOCPP16Data->RemoteStartTransaction[connectorIdInt -1].ChargingProfile.TransactionId = transactionIdInt;
|
|
|
+
|
|
|
+ if(validFromIsNULL == FALSE) // OPTION
|
|
|
+ sprintf((char *)ShmOCPP16Data->RemoteStartTransaction[connectorIdInt -1].ChargingProfile.ValidFrom, "%s" ,validFromstr);
|
|
|
+
|
|
|
+ if(validToIsNULL == FALSE) //OPTION
|
|
|
+ sprintf((char *)ShmOCPP16Data->RemoteStartTransaction[connectorIdInt -1].ChargingProfile.ValidTo, "%s" ,validTostr);
|
|
|
+
|
|
|
+ //ChargingSchedule
|
|
|
+ sprintf((char *)ShmOCPP16Data->RemoteStartTransaction[connectorIdInt -1].ChargingProfile.ChargingSchedule.ChargingRateUnit, "%s" ,chargingRateUnitstr);
|
|
|
+
|
|
|
+ if(durationIsNULL == FALSE) //OPTION
|
|
|
+ ShmOCPP16Data->RemoteStartTransaction[connectorIdInt -1].ChargingProfile.ChargingSchedule.Duration = durationInt;
|
|
|
+
|
|
|
+ if(minChargingRateIsNULL == FALSE) //OPTION
|
|
|
+ ShmOCPP16Data->RemoteStartTransaction[connectorIdInt -1].ChargingProfile.ChargingSchedule.MinChargingRate = minChargingRateflaot;
|
|
|
+
|
|
|
+ if(startScheduleIsNULL == FALSE) //OPTION
|
|
|
+ sprintf((char *)ShmOCPP16Data->RemoteStartTransaction[connectorIdInt -1].ChargingProfile.ChargingSchedule.StartSchedule, "%s" ,startSchedulestr);
|
|
|
+
|
|
|
+
|
|
|
+ for(int periodNums=0; periodNums < chargingSchedulePeriodCount; periodNums++)
|
|
|
+ {
|
|
|
+ //ChargingSchedulePeriod
|
|
|
+ ShmOCPP16Data->RemoteStartTransaction[connectorIdInt -1].ChargingProfile.ChargingSchedule.ChargingSchedulePeriod[periodNums].Limit = limitflaot[periodNums] ;
|
|
|
+
|
|
|
+ if(numberPhasesIsNULL == FALSE)
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->RemoteStartTransaction[connectorIdInt -1].ChargingProfile.ChargingSchedule.ChargingSchedulePeriod[periodNums].NumberPhases = numberPhasesInt[periodNums];
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ ShmOCPP16Data->RemoteStartTransaction[connectorIdInt -1].ChargingProfile.ChargingSchedule.ChargingSchedulePeriod[periodNums].StartPeriod = startPeriodInt[periodNums];
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if(strcmp(chargingProfilePurposestr, ChargingProfilePurposeTypeStr[TxProfile]) == 0)
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->CsMsg.bits[connectorIdInt -1].RemoteStartTransactionReq = 1;
|
|
|
+ strcpy(comfirmstr, RemoteStartStopStatusStr[RemoteStartStopStatus_Accepted]);
|
|
|
+
|
|
|
+
|
|
|
+ //memset idTag
|
|
|
+ memset((char *)ShmOCPP16Data->StartTransaction[connectorIdInt -1].IdTag,0, 20);
|
|
|
+ strcpy((char *)ShmOCPP16Data->StartTransaction[connectorIdInt -1].IdTag, idTagstr);
|
|
|
+
|
|
|
+
|
|
|
+ memset((char *)ShmOCPP16Data->StopTransaction[connectorIdInt -1].IdTag,0, 20);
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[connectorIdInt -1].IdTag, idTagstr);
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ strcpy(comfirmstr, RemoteStartStopStatusStr[RemoteStartStopStatus_Rejected]);
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->CsMsg.bits[connectorIdInt -1].RemoteStartTransactionReq = 1;
|
|
|
+ strcpy(comfirmstr, RemoteStartStopStatusStr[RemoteStartStopStatus_Accepted]);
|
|
|
+
|
|
|
+
|
|
|
+ //memset idTag
|
|
|
+ memset((char *)ShmOCPP16Data->StartTransaction[connectorIdInt -1].IdTag,0, 20);
|
|
|
+ strcpy((char *)ShmOCPP16Data->StartTransaction[connectorIdInt -1].IdTag, idTagstr);
|
|
|
+
|
|
|
+ memset((char *)ShmOCPP16Data->StopTransaction[connectorIdInt -1].IdTag,0, 20);
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[connectorIdInt -1].IdTag, idTagstr);
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ strcpy(comfirmstr, RemoteStartStopStatusStr[RemoteStartStopStatus_Rejected]);
|
|
|
+ //sprintf((char *)ShmOCPP16Data->RemoteStartTransaction[connectorIdInt -1].ResponseStatus, "%s" ,comfirmstr);
|
|
|
+ }
|
|
|
+
|
|
|
+end:
|
|
|
+ if(connectorIdIsNULL == FALSE)
|
|
|
+ ShmOCPP16Data->RemoteStartTransaction[connectorIdInt -1].ConnectorId = connectorIdInt;
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->RemoteStartTransaction[connectorIdInt -1].IdTag, idTagstr);
|
|
|
+ sprintf((char *)ShmOCPP16Data->RemoteStartTransaction[connectorIdInt -1].ResponseStatus, "%s" ,comfirmstr);
|
|
|
+
|
|
|
+ //OCPP send RemoteStartConfirmation by first.
|
|
|
+ sendRemoteStartConfirmation(uuid, comfirmstr);
|
|
|
+
|
|
|
+ return result;
|
|
|
+}
|
|
|
+
|
|
|
+int handleRemoteStopTransactionRequest(char *uuid, char *payload)
|
|
|
+{
|
|
|
+ mtrace();
|
|
|
+ int result = FAIL;
|
|
|
+ int match = FALSE;
|
|
|
+ int GunNO = 0;
|
|
|
+ int tempIndex = 0;
|
|
|
+ int transactionIdInt=0;
|
|
|
+ int transactionIdIsNULL= FALSE;
|
|
|
+ char sstr[16]={ 0 },sstrtemp[50]={ 0 };//sstr[200]={ 0 };
|
|
|
+ int c = 0;
|
|
|
+ char *loc;
|
|
|
+ char comfirmstr[20];
|
|
|
+
|
|
|
+//[2,"ff522854-0dea-436e-87ba-23a229269994","RemoteStopTransaction",{"transactionId":1373618380}]
|
|
|
+ DEBUG_INFO("handleRemoteStopTransactionRequest...\n");
|
|
|
+
|
|
|
+ if(server_pending == TRUE)
|
|
|
+ {
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ strcpy(sstrtemp, stringtrimspace(payload));
|
|
|
+
|
|
|
+ c=0;
|
|
|
+ loc = strstr(sstrtemp, "transactionId");
|
|
|
+
|
|
|
+ if(loc == NULL)
|
|
|
+ {
|
|
|
+ transactionIdIsNULL= TRUE;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ memset(sstr ,0, sizeof(sstr) );
|
|
|
+ while ((loc[strlen("transactionId")+2+c] != '}') && (loc[strlen("transactionId")+2+c] != ','))
|
|
|
+ {
|
|
|
+ sstr[c] = loc[strlen("transactionId")+2+c];
|
|
|
+ //printf("i=%d sstr=%c\n",c, sstr[c]);
|
|
|
+ c++;
|
|
|
+ }
|
|
|
+ sstr[c] = '\0';
|
|
|
+ transactionIdInt = atoi(sstr);
|
|
|
+ }
|
|
|
+
|
|
|
+ if(transactionIdIsNULL == FALSE)
|
|
|
+ {
|
|
|
+
|
|
|
+ for(int gun_index=0;gun_index < gunTotalNumber;gun_index++)
|
|
|
+ {
|
|
|
+ if(ShmOCPP16Data->StartTransaction[gun_index].ResponseTransactionId == transactionIdInt)
|
|
|
+ {
|
|
|
+ //check Transaction active
|
|
|
+ if(gunType[gun_index] == 'J')
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
+ {
|
|
|
+ tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tempIndex = gun_index;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < CHAdeMO_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
|
|
|
+ {
|
|
|
+ if((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_CHARGING) || (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_TERMINATING)) // SYS_MODE_CHARGING, SYS_MODE_TERMINATING
|
|
|
+ {
|
|
|
+ match = TRUE;
|
|
|
+ GunNO = gun_index;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }// END FOR CHAdeMO_QUANTITY
|
|
|
+
|
|
|
+ }
|
|
|
+ else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
+ {
|
|
|
+ tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tempIndex = gun_index;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < CCS_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
|
|
|
+ {
|
|
|
+ if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_CHARGING) || (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_TERMINATING) ) // SYS_MODE_CHARGING, SYS_MODE_TERMINATING
|
|
|
+ {
|
|
|
+ match = TRUE;
|
|
|
+ GunNO = gun_index;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }// END FOR CCS_QUANTITY
|
|
|
+ }
|
|
|
+ else if(gunType[gun_index] == 'G')
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
+ {
|
|
|
+ tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tempIndex = gun_index;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < GB_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
|
|
|
+ {
|
|
|
+ if((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_CHARGING) || (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_TERMINATING)) // SYS_MODE_CHARGING, SYS_MODE_TERMINATING
|
|
|
+ {
|
|
|
+ match = TRUE;
|
|
|
+ GunNO = gun_index;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }// END FOR GB_QUANTITY
|
|
|
+
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D') // 'D' means DC
|
|
|
+ {
|
|
|
+ tempIndex = 2;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tempIndex = gun_index;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < AC_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
|
|
|
+ {
|
|
|
+ if((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_CHARGING) || (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_TERMINATING)) // SYS_MODE_CHARGING, SYS_MODE_TERMINATING
|
|
|
+ {
|
|
|
+ match = TRUE;
|
|
|
+ GunNO = gun_index;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }// END FOR CHAdeMO_QUANTITY
|
|
|
+
|
|
|
+ } // END FOR AC ELSE
|
|
|
+
|
|
|
+ }// CHECK IF ResponseTransactionId == transactionIdInt
|
|
|
+
|
|
|
+ }//END FOR
|
|
|
+
|
|
|
+ if( match == TRUE)
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->CsMsg.bits[GunNO].RemoteStopTransactionReq = 1; // inform csu of StopTransaction
|
|
|
+ strcpy(comfirmstr, RemoteStartStopStatusStr[RemoteStartStopStatus_Accepted]);
|
|
|
+ sprintf((char *)ShmOCPP16Data->RemoteStopTransaction[GunNO].ResponseStatus, "%s" ,comfirmstr);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ strcpy(comfirmstr, RemoteStartStopStatusStr[RemoteStartStopStatus_Rejected]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ sendRemoteStopTransactionConfirmation(uuid, comfirmstr);
|
|
|
+ return result;
|
|
|
+}
|
|
|
+
|
|
|
+int handleReserveNowTransactionRequest(char *uuid, char *payload)
|
|
|
+{
|
|
|
+ mtrace();
|
|
|
+ int result = FAIL;
|
|
|
+ int connectorIdInt=0, reservationIdInt=0;
|
|
|
+ int tempIndex = 0;
|
|
|
+ char expiryDatestr[30]={0}, idTagstr[20]={0},parentIdTagstr[20]={0};
|
|
|
+ char comfirmstr[20]={0};
|
|
|
+ char sstr[180]={ 0 },sstrtemp[200]={ 0 };
|
|
|
+ int c = 0;
|
|
|
+ char *loc;
|
|
|
+ //char *ptr;
|
|
|
+
|
|
|
+ DEBUG_INFO("handleReserveNowTransactionRequest ...\n");
|
|
|
+
|
|
|
+ strcpy(sstrtemp, stringtrimspace(payload));
|
|
|
+ //***(1)connectorId ****/
|
|
|
+ c=0;
|
|
|
+ loc = strstr(sstrtemp, "connectorId");
|
|
|
+ memset(sstr ,0, sizeof(sstr) );
|
|
|
+ while ((loc != NULL) &&(loc[strlen("connectorId")+2+c] != ',') && (loc[strlen("connectorId")+2+c] != '}'))
|
|
|
+ {
|
|
|
+ sstr[c] = loc[strlen("connectorId")+2+c];
|
|
|
+ //printf("i=%d sstr=%c\n",c, sstr[c]);
|
|
|
+ c++;
|
|
|
+ }
|
|
|
+ sstr[c] = '\0';
|
|
|
+ connectorIdInt = atoi(sstr);
|
|
|
+
|
|
|
+ //***(2)expiryDate ****/
|
|
|
+ loc = strstr(sstrtemp, "expiryDate");
|
|
|
+ memset(sstr ,0, sizeof(sstr) );
|
|
|
+ c = 0;
|
|
|
+ while ((loc != NULL) &&(loc[3+strlen("expiryDate")+c] != '\"'))
|
|
|
+ {
|
|
|
+ sstr[c] = loc[3+strlen("expiryDate")+c];
|
|
|
+ c++;
|
|
|
+ }
|
|
|
+ sstr[c] = '\0';
|
|
|
+ strcpy(expiryDatestr, sstr);
|
|
|
+
|
|
|
+ //***(3)idTag ****/
|
|
|
+ loc = strstr(sstrtemp, "idTag");
|
|
|
+ memset(sstr ,0, sizeof(sstr) );
|
|
|
+ c = 0;
|
|
|
+ while ((loc != NULL) &&(loc[3+strlen("idTag")+c] != '\"'))
|
|
|
+ {
|
|
|
+ sstr[c] = loc[3+strlen("idTag")+c];
|
|
|
+ c++;
|
|
|
+ }
|
|
|
+ sstr[c] = '\0';
|
|
|
+ strcpy(idTagstr, sstr);
|
|
|
+
|
|
|
+ //***(4)parentIdTag ****/
|
|
|
+ loc = strstr(sstrtemp, "parentIdTag");
|
|
|
+ memset(sstr ,0, sizeof(sstr) );
|
|
|
+ c = 0;
|
|
|
+
|
|
|
+ if(loc == NULL)
|
|
|
+ {
|
|
|
+ strcpy(parentIdTagstr, "");
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ while ((loc != NULL) &&(loc[3+strlen("parentIdTag")+c] != '\"'))
|
|
|
+ {
|
|
|
+ sstr[c] = loc[3+strlen("parentIdTag")+c];
|
|
|
+ c++;
|
|
|
+ }
|
|
|
+ sstr[c] = '\0';
|
|
|
+ strcpy(parentIdTagstr, sstr);
|
|
|
+ }
|
|
|
+
|
|
|
+ //***(5)reservationId ****/
|
|
|
+ c=0;
|
|
|
+ loc = strstr(sstrtemp, "reservationId");
|
|
|
+ memset(sstr ,0, sizeof(sstr) );
|
|
|
+ while ((loc != NULL) &&((loc[strlen("reservationId")+2+c] != '}') && (loc[strlen("reservationId")+2+c] != ',')))
|
|
|
+ {
|
|
|
+ sstr[c] = loc[strlen("reservationId")+2+c];
|
|
|
+ //printf("i=%d sstr=%c\n",c, sstr[c]);
|
|
|
+ c++;
|
|
|
+ }
|
|
|
+ sstr[c] = '\0';
|
|
|
+ reservationIdInt = atoi(sstr);
|
|
|
+
|
|
|
+ strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Rejected]);
|
|
|
+
|
|
|
+ /*
|
|
|
+ enum SYSTEM_STATUS
|
|
|
+ {
|
|
|
+ SYS_MODE_BOOTING = 0,
|
|
|
+ SYS_MODE_IDLE = 1,
|
|
|
+ SYS_MODE_AUTHORIZING = 2,
|
|
|
+ SYS_MODE_MODE_REASSIGN_CHECK = 3,
|
|
|
+ SYS_MODE_REASSIGN = 4,
|
|
|
+ SYS_MODE_PREPARING = 5,
|
|
|
+ SYS_MODE_PREPARE_FOR_EV = 6,
|
|
|
+ SYS_MODE_PREPARE_FOR_EVSE = 7,
|
|
|
+ SYS_MODE_CHARGING = 8,
|
|
|
+ SYS_MODE_TERMINATING = 9,
|
|
|
+ SYS_MODE_COMPLETE = 10,
|
|
|
+ SYS_MODE_ALARM = 11,
|
|
|
+ SYS_MODE_FAULT = 12,
|
|
|
+ SYS_MODE_RESERVATION = 13,
|
|
|
+ SYS_MODE_BOOKING = 14,
|
|
|
+ SYS_MODE_MAINTAIN = 15,
|
|
|
+ SYS_MODE_DEBUG = 16,
|
|
|
+ SYS_MODE_CCS_PRECHARGE_STEP0 = 17,
|
|
|
+ SYS_MODE_CCS_PRECHARGE_STEP1 = 18,
|
|
|
+ SYS_MODE_UPDATE = 19
|
|
|
+ };
|
|
|
+ */
|
|
|
+ if((connectorIdInt == 0) &&(strcmp((const char *)ShmOCPP16Data->ConfigurationTable.ReservationProfile[ReserveConnectorZeroSupported].ItemData, "FALSE") == 0)) //For OCTT Test case
|
|
|
+ {
|
|
|
+ strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Rejected]);
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+
|
|
|
+ if((connectorIdInt > 0) && ((connectorIdInt -1) <= gunTotalNumber))
|
|
|
+ {
|
|
|
+ //check Transaction active
|
|
|
+ if(gunType[connectorIdInt -1] == 'J')
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
+ {
|
|
|
+ tempIndex = (((connectorIdInt -1)==2) ? 1: 0);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tempIndex = connectorIdInt -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < CHAdeMO_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
|
|
|
+ {
|
|
|
+ if(reservationIdInt != ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].ReservationId)
|
|
|
+ {
|
|
|
+ if((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus != SYS_MODE_FAULT)&&(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus != SYS_MODE_ALARM)) //S_FAULT
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_IDLE) //S_IDLE
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->CsMsg.bits[connectorIdInt-1].ReserveNowReq = 1;
|
|
|
+ strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Accepted]);
|
|
|
+ }
|
|
|
+ else if((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_MAINTAIN)||(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_DEBUG) || (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_UPDATE)) //S_TERMINATING //else if((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == 11) || (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == '9'))
|
|
|
+ {
|
|
|
+ strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Unavailable]);
|
|
|
+
|
|
|
+ }
|
|
|
+ else if((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_PREPARING) || (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_RESERVATION) ) //S_PRECHARGE
|
|
|
+ {
|
|
|
+ strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Occupied]);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Rejected]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_FAULT) || (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_ALARM) || (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_TERMINATING)) // SYS_MODE_FAULT, SYS_MODE_ALARM, SYS_MODE_TERMINATING ---> SuspendedEV
|
|
|
+ {
|
|
|
+ strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Faulted]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ //replace reservation
|
|
|
+ ShmOCPP16Data->CsMsg.bits[connectorIdInt-1].ReserveNowReq = 1;
|
|
|
+ strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Accepted]);
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ } // END FOR CHAdeMO_QUANTITY
|
|
|
+
|
|
|
+ }
|
|
|
+ else if((gunType[connectorIdInt -1] == 'U')||(gunType[connectorIdInt -1] == 'E'))
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
+ {
|
|
|
+ tempIndex = (((connectorIdInt -1)==2) ? 1: 0);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tempIndex = connectorIdInt -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < CCS_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
|
|
|
+ {
|
|
|
+
|
|
|
+ if(reservationIdInt != ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].ReservationId)
|
|
|
+ {
|
|
|
+ //SystemStatus: 0: Booting, 1: idle, 2: authorizing, 3: preparing, 4: charging, 5: terminating, 6: alarm, 7: fault, 8: Reserved, 9: maintain
|
|
|
+ if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus != SYS_MODE_FAULT)&&(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus != SYS_MODE_ALARM)) //S_FAULT
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_IDLE) //S_IDLE
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->CsMsg.bits[connectorIdInt-1].ReserveNowReq = 1;
|
|
|
+ strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Accepted]);
|
|
|
+ }
|
|
|
+ else if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_MAINTAIN) ||(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_DEBUG) || (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_UPDATE)) //S_TERMINATING //else if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == '6') || (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == '9'))
|
|
|
+ {
|
|
|
+ strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Unavailable]);
|
|
|
+ }
|
|
|
+ else if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_PREPARING) || (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_RESERVATION)) //S_PRECHARGE
|
|
|
+ {
|
|
|
+ strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Occupied]);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Rejected]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus ==SYS_MODE_FAULT) || (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus ==SYS_MODE_ALARM) ||(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_TERMINATING)) //SYS_MODE_FAUL, SYS_MODE_TERMINATING ---> SuspendedEV
|
|
|
+ {
|
|
|
+ strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Faulted]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ //replace reservation
|
|
|
+ ShmOCPP16Data->CsMsg.bits[connectorIdInt-1].ReserveNowReq = 1;
|
|
|
+ strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Accepted]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } // END FOR CCS_QUANTITY
|
|
|
+
|
|
|
+ }
|
|
|
+ else if(gunType[connectorIdInt -1] == 'G')
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
+ {
|
|
|
+ tempIndex = (((connectorIdInt -1)==2) ? 1: 0);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tempIndex = connectorIdInt -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < GB_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
|
|
|
+ {
|
|
|
+
|
|
|
+ if(reservationIdInt != ShmSysConfigAndInfo->SysInfo.GbChargingData[index].ReservationId)
|
|
|
+ {
|
|
|
+ //SystemStatus: 0: Booting, 1: idle, 2: authorizing, 3: preparing, 4: charging, 5: terminating, 6: alarm, 7: fault, 8: Reserved, 9: maintain
|
|
|
+ if((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus != SYS_MODE_FAULT)&&(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus != SYS_MODE_ALARM)) //SYS_MODE_FAULT, SYS_MODE_ALARM
|
|
|
+ {
|
|
|
+
|
|
|
+ if(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_IDLE) //S_IDLE
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->CsMsg.bits[connectorIdInt-1].ReserveNowReq = 1;
|
|
|
+ strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Accepted]);
|
|
|
+ }
|
|
|
+ else if((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_MAINTAIN) || (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_DEBUG) || (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_UPDATE)) //S_TERMINATING //else if((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == '6') || (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == '9'))
|
|
|
+ {
|
|
|
+ strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Unavailable]);
|
|
|
+ }
|
|
|
+ else if((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_PREPARING) || (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_RESERVATION) ) //S_PRECHARGE
|
|
|
+ {
|
|
|
+ strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Occupied]);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Rejected]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus ==SYS_MODE_FAULT) || (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus ==SYS_MODE_ALARM) || (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus ==SYS_MODE_TERMINATING)) //SYS_MODE_FAULT, SYS_MODE_ALARM ,SYS_MODE_TERMINATING ---> SuspendedEV
|
|
|
+ {
|
|
|
+ strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Faulted]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ //replace reservation
|
|
|
+ ShmOCPP16Data->CsMsg.bits[connectorIdInt-1].ReserveNowReq = 1;
|
|
|
+ strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Accepted]);
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ }// END FOR GB_QUANTITY
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D') // 'D' means DC
|
|
|
+ {
|
|
|
+ tempIndex = 2;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tempIndex = (connectorIdInt -1);
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < AC_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
|
|
|
+ {
|
|
|
+
|
|
|
+ if(reservationIdInt != ShmSysConfigAndInfo->SysInfo.AcChargingData[index].ReservationId)
|
|
|
+ {
|
|
|
+
|
|
|
+ if((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus != SYS_MODE_FAULT)&&(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus != SYS_MODE_ALARM)) //SYS_MODE_FAULT, SYS_MODE_ALARM
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_IDLE) //S_IDLE
|
|
|
+ {
|
|
|
+ if((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PilotState == CP_STATE_B) ||(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PilotState == CP_STATE_C) || (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PilotState == CP_STATE_D))
|
|
|
+ {
|
|
|
+ strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Occupied]);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->CsMsg.bits[connectorIdInt-1].ReserveNowReq = 1;
|
|
|
+ strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Accepted]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_MAINTAIN) ||(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_DEBUG) || (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_UPDATE)) //S_TERMINATING //else if((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == 11) || (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == '9'))
|
|
|
+ {
|
|
|
+ strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Unavailable]);
|
|
|
+
|
|
|
+ }
|
|
|
+ else if((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_PREPARING) || (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_RESERVATION) ) //S_PRECHARGE
|
|
|
+ {
|
|
|
+ strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Occupied]);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Rejected]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_FAULT) ||(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_ALARM) || (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_TERMINATING)) //SYS_MODE_FAULT, SYS_MODE_ALARM, SYS_MODE_TERMINATING ---> SuspendedEV
|
|
|
+ {
|
|
|
+ strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Faulted]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ //replace reservation
|
|
|
+ ShmOCPP16Data->CsMsg.bits[connectorIdInt-1].ReserveNowReq = 1;
|
|
|
+ strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Accepted]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } // END FOR AC_QUANTITY
|
|
|
+ }
|
|
|
+
|
|
|
+ sprintf((char *)ShmOCPP16Data->ReserveNow[connectorIdInt-1].ResponseStatus, "%s" ,comfirmstr);
|
|
|
+ }
|
|
|
+ else if(connectorIdInt == 0)
|
|
|
+ {
|
|
|
+ //check Transaction active
|
|
|
+ for (int index = 0; index < CHAdeMO_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if(reservationIdInt != ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].ReservationId)
|
|
|
+ {
|
|
|
+ if((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_MAINTAIN) || (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_DEBUG) || (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_UPDATE)) //S_TERMINATING //else if((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == 11) || (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == '9'))
|
|
|
+ {
|
|
|
+ strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Unavailable]);
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+ else if(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_PREPARING) //S_PRECHARGE
|
|
|
+ {
|
|
|
+ strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Occupied]);
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+ else if((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_FAULT) || (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_ALARM) || (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_TERMINATING)) //SYS_MODE_FAULT, SYS_MODE_TERMINATING ---> SuspendedEV
|
|
|
+ {
|
|
|
+ strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Faulted]);
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+ else if(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus != SYS_MODE_IDLE) //S_IDLE
|
|
|
+ {
|
|
|
+ strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Rejected]);
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }// END FOR CHAdeMO_QUANTITY
|
|
|
+
|
|
|
+ for (int index = 0; index < CCS_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if(reservationIdInt != ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].ReservationId)
|
|
|
+ {
|
|
|
+ if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_MAINTAIN)||(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_DEBUG) || (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_UPDATE)) //S_TERMINATING //else if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == '6') || (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == '9'))
|
|
|
+ {
|
|
|
+ strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Unavailable]);
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+ else if(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_PREPARING) //SYS_MODE_PREPARING
|
|
|
+ {
|
|
|
+ strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Occupied]);
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+ else if((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus ==SYS_MODE_FAULT) || (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus ==SYS_MODE_ALARM) || (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus ==SYS_MODE_TERMINATING)) //SYS_MODE_FAULT, SYS_MODE_TERMINATING ---> SuspendedEV
|
|
|
+ {
|
|
|
+ strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Faulted]);
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+ else if(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus != SYS_MODE_IDLE) //S_IDLE
|
|
|
+ {
|
|
|
+ strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Rejected]);
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } // END FOR CCS_QUANTITY
|
|
|
+
|
|
|
+ for (int index = 0; index < GB_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if(reservationIdInt != ShmSysConfigAndInfo->SysInfo.GbChargingData[index].ReservationId)
|
|
|
+ {
|
|
|
+ if((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_MAINTAIN)||(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_DEBUG) || (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_UPDATE)) //S_TERMINATING //else if((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == '6') || (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == '9'))
|
|
|
+ {
|
|
|
+ strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Unavailable]);
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+ else if(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_PREPARING) //S_PRECHARGE
|
|
|
+ {
|
|
|
+ strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Occupied]);
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+ else if((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus ==SYS_MODE_FAULT) || (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus ==SYS_MODE_ALARM) || (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus ==SYS_MODE_TERMINATING) ) //SYS_MODE_FAULT, SYS_MODE_TERMINATING ---> SuspendedEV
|
|
|
+ {
|
|
|
+ strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Faulted]);
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+ else if(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus != SYS_MODE_IDLE) //S_IDLE
|
|
|
+ {
|
|
|
+ strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Rejected]);
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ } // END FOR GB_QUANTITY
|
|
|
+
|
|
|
+ for (int index = 0; index < AC_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if(reservationIdInt != ShmSysConfigAndInfo->SysInfo.AcChargingData[index].ReservationId)
|
|
|
+ {
|
|
|
+ if((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_MAINTAIN) || (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_DEBUG) || (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_UPDATE)) //S_TERMINATING //else if((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == 11) || (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == '9'))
|
|
|
+ {
|
|
|
+ strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Unavailable]);
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+ else if(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_PREPARING) //S_PRECHARGE
|
|
|
+ {
|
|
|
+ strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Occupied]);
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+ else if((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_FAULT) || (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_ALARM) || (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_TERMINATING)) //SYS_MODE_FAULT, SYS_MODE_TERMINATING ---> SuspendedEV
|
|
|
+ {
|
|
|
+ strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Faulted]);
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+ if(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_IDLE) //S_IDLE
|
|
|
+ {
|
|
|
+ if((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PilotState == CP_STATE_B) ||(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PilotState == CP_STATE_C) || (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PilotState == CP_STATE_D))
|
|
|
+ {
|
|
|
+ strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Occupied]);
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus != SYS_MODE_IDLE) //S_IDLE
|
|
|
+ {
|
|
|
+ strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Rejected]);
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }// END FOR AC_QUANTITY
|
|
|
+
|
|
|
+ //The connectorId is 0
|
|
|
+ ShmOCPP16Data->CsMsg.bits[0].ReserveNowReq = 1;
|
|
|
+ strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Accepted]);
|
|
|
+ sprintf((char *)ShmOCPP16Data->ReserveNow[0].ResponseStatus, "%s" ,comfirmstr);
|
|
|
+ ShmOCPP16Data->ReserveNow[0].ConnectorId = connectorIdInt;
|
|
|
+ sprintf((char *)ShmOCPP16Data->ReserveNow[0].ExpiryDate, "%s" , expiryDatestr);
|
|
|
+ sprintf((char *)ShmOCPP16Data->ReserveNow[0].IdTag, "%s" , idTagstr);
|
|
|
+ sprintf((char *)ShmOCPP16Data->ReserveNow[0].ParentIdTag, "%s" , parentIdTagstr);
|
|
|
+ ShmOCPP16Data->ReserveNow[0].ReservationId = reservationIdInt;
|
|
|
+ strcpy((char *)ShmOCPP16Data->ReserveNow[0].guid, uuid);
|
|
|
+
|
|
|
+ result = TRUE;
|
|
|
+ return result;
|
|
|
+
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ strcpy(comfirmstr, ReservationStatusStr[ReservationStatus_Rejected]);
|
|
|
+ sprintf((char *)ShmOCPP16Data->ReserveNow[connectorIdInt-1].ResponseStatus, "%s" ,comfirmstr);
|
|
|
+ }
|
|
|
+
|
|
|
+ if(strcmp(comfirmstr,"Accepted") == 0)
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->ReserveNow[connectorIdInt-1].ConnectorId = connectorIdInt;
|
|
|
+ sprintf((char *)ShmOCPP16Data->ReserveNow[connectorIdInt-1].ExpiryDate, "%s" , expiryDatestr);
|
|
|
+ sprintf((char *)ShmOCPP16Data->ReserveNow[connectorIdInt-1].IdTag, "%s" , idTagstr);
|
|
|
+ sprintf((char *)ShmOCPP16Data->ReserveNow[connectorIdInt-1].ParentIdTag, "%s" , parentIdTagstr);
|
|
|
+ ShmOCPP16Data->ReserveNow[connectorIdInt-1].ReservationId = reservationIdInt;
|
|
|
+ strcpy((char *)ShmOCPP16Data->ReserveNow[connectorIdInt-1].guid, uuid);
|
|
|
+
|
|
|
+ result = TRUE;
|
|
|
+ return result;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+end:
|
|
|
+ sendReserveNowTransactionConfirmation(uuid,comfirmstr);
|
|
|
+ //ShmOCPP16Data->CsMsg.bits[connectorIdInt-1].ReserveNowConf = 1;
|
|
|
+
|
|
|
+ return result;
|
|
|
+}
|
|
|
+
|
|
|
+int handleResetRequest(char *uuid, char *payload)
|
|
|
+{
|
|
|
+ mtrace();
|
|
|
+ int result = FAIL;
|
|
|
+
|
|
|
+ char sstr[10]={0},sstrtemp[30]={ 0 };
|
|
|
+ char typestr[10]={0};
|
|
|
+ char comfirmstr[20]={0};
|
|
|
+ int c = 0;
|
|
|
+ char *loc;
|
|
|
+
|
|
|
+ DEBUG_INFO("handleResetRequest...\n");
|
|
|
+
|
|
|
+ strcpy(sstrtemp, stringtrimspace(payload));
|
|
|
+ loc = strstr(sstrtemp, "type");
|
|
|
+ memset(sstr ,0, sizeof(sstr) );
|
|
|
+ c = 0;
|
|
|
+ while (loc[3+strlen("type")+c] != '\"')
|
|
|
+ {
|
|
|
+ sstr[c] = loc[3+strlen("type")+c];
|
|
|
+ c++;
|
|
|
+ }
|
|
|
+ sstr[c] = '\0';
|
|
|
+ strcpy(typestr,sstr);
|
|
|
+
|
|
|
+ sprintf((char *)ShmOCPP16Data->Reset.Type, "%s" ,typestr);
|
|
|
+ if((strcmp(typestr, ResetTypeStr[Hard])==0) || (strcmp(typestr, ResetTypeStr[Soft])==0))
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->MsMsg.bits.ResetReq = 1;
|
|
|
+ strcpy((char *)ShmOCPP16Data->Reset.guid, uuid);
|
|
|
+ result = TRUE;
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ strcpy(comfirmstr, ResetStatusStr[ResetStatus_Rejected]);
|
|
|
+ sprintf((char *)ShmOCPP16Data->Reset.ResponseStatus, "%s" ,comfirmstr);
|
|
|
+ goto errorend;
|
|
|
+ }
|
|
|
+
|
|
|
+errorend:
|
|
|
+ sendResetConfirmation(uuid, comfirmstr);
|
|
|
+ return result;
|
|
|
+}
|
|
|
+
|
|
|
+int handleSendLocalListRequest(char *uuid, char *payload)
|
|
|
+{
|
|
|
+ mtrace();
|
|
|
+ int result = FAIL;
|
|
|
+ int listVersionInt;
|
|
|
+ //char *updateTypestr, *idTagstr, *expiryDatestr, *parentIdTagstr, *statusstr;
|
|
|
+ char listsearch[]="listVersion";
|
|
|
+ char updateTypesearch[]="updateType";
|
|
|
+ char localAuthorizationListsearch[]="localAuthorizationList";
|
|
|
+ char sstr[60500]={ 0 },sstrtemp[60500]={ 0 };//sstr[200]={ 0 };
|
|
|
+ char CardList[500][160]={0};
|
|
|
+ char updateTypestr[15]={0};
|
|
|
+ char idTagstr[20]={0};
|
|
|
+ char parentIdTag[20]={0};
|
|
|
+ char expiryDate[30]={0};
|
|
|
+ char idTagstatus[16]={0};
|
|
|
+ int c = 0;
|
|
|
+ int i = 0;
|
|
|
+ char *delim1 = "}";
|
|
|
+ char * pch;
|
|
|
+ char *loc;
|
|
|
+ //char *ptr;
|
|
|
+ char comfirmstr[20];
|
|
|
+ //int n_localAuthorizations = 0;
|
|
|
+ int checkState_Faulted = FALSE;
|
|
|
+
|
|
|
+ DEBUG_INFO("handleSendLocalListRequest...\n");
|
|
|
+
|
|
|
+ if(strcmp((const char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemData, "FALSE") == 0) //For OCTT Test case
|
|
|
+ {
|
|
|
+ strcpy(comfirmstr, UpdateStatusStr[UpdateStatus_NotSupported]);
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+
|
|
|
+ //check Charge Point state
|
|
|
+ for (int index = 0; index < CHAdeMO_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_FAULT) //S_FAULT ---> Faulted
|
|
|
+ {
|
|
|
+ checkState_Faulted = TRUE; //OCPP Status: Faulted
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < CCS_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_FAULT) //S_FAULT ---> Faulted
|
|
|
+ {
|
|
|
+ checkState_Faulted = TRUE; //OCPP Status
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < GB_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_FAULT) //S_FAULT ---> Faulted
|
|
|
+ {
|
|
|
+ checkState_Faulted = TRUE; //OCPP Status: Faulted
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //check Charge Point state
|
|
|
+ for (int index = 0; index < AC_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_FAULT) //S_FAULT ---> Faulted
|
|
|
+ {
|
|
|
+ checkState_Faulted = TRUE; //OCPP Status: Faulted
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if(checkState_Faulted == TRUE)
|
|
|
+ {
|
|
|
+ strcpy(comfirmstr, UpdateStatusStr[UpdateStatus_Failed]);
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+
|
|
|
+ //Filter payload space
|
|
|
+ strcpy(sstrtemp, stringtrimspace(payload));
|
|
|
+
|
|
|
+ //listVersion
|
|
|
+ c = 0;
|
|
|
+ loc = strstr(sstrtemp, listsearch);
|
|
|
+ while ((loc[strlen("listVersion")+2+c] != ',')&&(loc[strlen("listVersion")+2+c] != '}'))
|
|
|
+ {
|
|
|
+ sstr[c] = loc[strlen("listVersion")+2+c];
|
|
|
+ c++;
|
|
|
+ }
|
|
|
+ sstr[c] = '\0';
|
|
|
+ listVersionInt = atoi(sstr);
|
|
|
+
|
|
|
+
|
|
|
+ ShmOCPP16Data->SendLocalList.ListVersion = listVersionInt;
|
|
|
+
|
|
|
+ //updateType
|
|
|
+ loc = strstr(sstrtemp, updateTypesearch);
|
|
|
+ c = 0;
|
|
|
+ while (loc[3+strlen(updateTypesearch)+c] != '\"')
|
|
|
+ {
|
|
|
+ sstr[c] = loc[3+strlen(updateTypesearch)+c];
|
|
|
+ c++;
|
|
|
+ }
|
|
|
+ sstr[c] = '\0';
|
|
|
+ strcpy(updateTypestr, sstr);
|
|
|
+ sprintf((char *)ShmOCPP16Data->SendLocalList.UpdateType, "%s", updateTypestr);
|
|
|
+
|
|
|
+ //localAuthorizationList
|
|
|
+ memset(sstr ,0, sizeof(sstr) );
|
|
|
+ loc = strstr(sstrtemp, localAuthorizationListsearch);
|
|
|
+ if(loc != NULL) // localAuthorizationList is not NULL
|
|
|
+ {
|
|
|
+ //Check UpdateType
|
|
|
+ if(strcmp(updateTypestr, UpdateTypeStr[Full]) == 0)
|
|
|
+ {
|
|
|
+ //Local list full update
|
|
|
+ printf("Local list full update.\n");
|
|
|
+
|
|
|
+ OCPP_getListVerion();
|
|
|
+
|
|
|
+ if(listVersionInt < localversion )//if(listVersionInt <= localversion ) for OCTT Case ---remove temporally
|
|
|
+ {
|
|
|
+ strcpy(comfirmstr, UpdateStatusStr[UpdateStatus_Failed]);
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+
|
|
|
+ OCPP_cleanLocalList();
|
|
|
+
|
|
|
+ }
|
|
|
+ else if(strcmp(updateTypestr, UpdateTypeStr[Differential]) == 0)
|
|
|
+ {
|
|
|
+ //Local list different update
|
|
|
+ printf("Local list different update.\n");
|
|
|
+
|
|
|
+ OCPP_getListVerion();
|
|
|
+
|
|
|
+ if(listVersionInt < localversion )//if(listVersionInt <= localversion ) for OCTT Case ---remove temporally
|
|
|
+ {
|
|
|
+ strcpy(comfirmstr, UpdateStatusStr[UpdateStatus_VersionMismatch]);
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ strcpy(comfirmstr, UpdateStatusStr[UpdateStatus_NotSupported]);
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+
|
|
|
+ c = 0;
|
|
|
+ while (loc[3+strlen(localAuthorizationListsearch)+c] != ']')
|
|
|
+ {
|
|
|
+ sstr[c] = loc[3+strlen(localAuthorizationListsearch)+c];
|
|
|
+ //printf("i=%d sstr=%c\n",c, sstr[c]);
|
|
|
+ c++;
|
|
|
+ }
|
|
|
+ sstr[c] = '\0';
|
|
|
+
|
|
|
+ //DEBUG_INFO("sstr=%s\n", sstr);
|
|
|
+
|
|
|
+ //parsing strings to words
|
|
|
+ i = 0;
|
|
|
+ pch = strtok(sstr,delim1);
|
|
|
+ while (pch != NULL)
|
|
|
+ {
|
|
|
+ strcpy(CardList[i], pch);
|
|
|
+ //DEBUG_INFO("CardList[i]=%s\n", CardList[i]);
|
|
|
+ pch = strtok (NULL, delim1);
|
|
|
+ i = i + 1;
|
|
|
+ }
|
|
|
+
|
|
|
+ //DEBUG_INFO("listVersionInt=%s\n", sstr);
|
|
|
+ //local Authorizations List Numbers
|
|
|
+ //n_localAuthorizations = i;
|
|
|
+ ShmOCPP16Data->SendLocalList.ListVersion = listVersionInt;
|
|
|
+
|
|
|
+ memset(ShmOCPP16Data->SendLocalList.LocalAuthorizationList, 0 , sizeof(struct StructLocalAuthorizationList)* 500);
|
|
|
+
|
|
|
+ c= 0;
|
|
|
+ while(c < i) // i is CardList Number
|
|
|
+ {
|
|
|
+ //Search "IdToken"
|
|
|
+ memset(sstr ,0, sizeof(sstr) );
|
|
|
+ loc = strstr(CardList[c], "idTag");
|
|
|
+ int j = 0;
|
|
|
+ while (loc[3+strlen("idTag")+j] != '\"')
|
|
|
+ {
|
|
|
+ sstr[j] = loc[3+strlen("idTag")+j];
|
|
|
+ //printf("i=%d sstr=%c\n",c, sstr[j]);
|
|
|
+ j++;
|
|
|
+ }
|
|
|
+ sstr[j] = '\0';
|
|
|
+ strcpy(idTagstr, sstr);
|
|
|
+ //DEBUG_INFO("idTagstr=%s\n", idTagstr);
|
|
|
+
|
|
|
+ //Search "expiryDate"
|
|
|
+ memset(sstr ,0, sizeof(sstr) );
|
|
|
+ loc = strstr(CardList[c], "expiryDate");
|
|
|
+ j = 0;
|
|
|
+ if(loc != NULL)
|
|
|
+ {
|
|
|
+ while (loc[3+strlen("expiryDate")+j] != '\"')
|
|
|
+ {
|
|
|
+ sstr[j] = loc[3+strlen("expiryDate")+j];
|
|
|
+ //printf("i=%d sstr=%c\n",c, sstr[j]);
|
|
|
+ j++;
|
|
|
+ }
|
|
|
+ sstr[j] = '\0';
|
|
|
+ strcpy(expiryDate, sstr);
|
|
|
+
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ strcpy(expiryDate, "");
|
|
|
+ }
|
|
|
+
|
|
|
+ //DEBUG_INFO("expiryDate=%s\n", expiryDate);
|
|
|
+
|
|
|
+ //Search "parentIdTag"
|
|
|
+ memset(sstr ,0, sizeof(sstr) );
|
|
|
+ loc = strstr(CardList[c], "parentIdTag");
|
|
|
+ j = 0;
|
|
|
+ if(loc != NULL)
|
|
|
+ {
|
|
|
+ while (loc[3+strlen("parentIdTag")+j] != '\"')
|
|
|
+ {
|
|
|
+ sstr[j] = loc[3+strlen("parentIdTag")+j];
|
|
|
+ //printf("i=%d sstr=%c\n",c, sstr[j]);
|
|
|
+ j++;
|
|
|
+ }
|
|
|
+ sstr[j] = '\0';
|
|
|
+ strcpy(parentIdTag, sstr);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ strcpy(parentIdTag, "");
|
|
|
+ }
|
|
|
+
|
|
|
+ //DEBUG_INFO("parentIdTag=%s\n", parentIdTag);
|
|
|
+
|
|
|
+
|
|
|
+ //Search "status"
|
|
|
+ memset(sstr ,0, sizeof(sstr) );
|
|
|
+ loc = strstr(CardList[c], "status");
|
|
|
+ j = 0;
|
|
|
+ while (loc[3+strlen("status")+j] != '\"')
|
|
|
+ {
|
|
|
+ sstr[j] = loc[3+strlen("status")+j];
|
|
|
+ //printf("i=%d sstr=%c\n",c, sstr[j]);
|
|
|
+ j++;
|
|
|
+ }
|
|
|
+ sstr[j] = '\0';
|
|
|
+ strcpy(idTagstatus, sstr);
|
|
|
+
|
|
|
+ //DEBUG_INFO("idTagstatus=%s\n", idTagstatus);
|
|
|
+
|
|
|
+ OCPP_getIdTag(idTagstr);
|
|
|
+ //OCPP_getIdTag("test"); For Test
|
|
|
+ //DEBUG_INFO("idTagAuthorization=%s\n",idTagAuthorization);
|
|
|
+ //DEBUG_INFO("updateTypestr=%s\n",updateTypestr);
|
|
|
+
|
|
|
+ if(strcmp(updateTypestr, UpdateTypeStr[Full]) == 0)
|
|
|
+ {
|
|
|
+ //Local list full update
|
|
|
+ DEBUG_INFO("Local list full update.\n");
|
|
|
+ // update list
|
|
|
+ OCPP_addLocalList_1(listVersionInt, idTagstr, parentIdTag, expiryDate, idTagstatus);
|
|
|
+ //DEBUG_INFO("Local list full update. 1\n");
|
|
|
+ //OCPP_get_TableAuthlocalAllData();
|
|
|
+ //DEBUG_INFO("Local list full update. 2\n");
|
|
|
+ }
|
|
|
+ else if(strcmp(updateTypestr, UpdateTypeStr[Differential]) == 0)
|
|
|
+ {
|
|
|
+ OCPP_addLocalList_1(listVersionInt, idTagstr, parentIdTag, expiryDate, idTagstatus); // update or add
|
|
|
+ }
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->SendLocalList.LocalAuthorizationList[c].IdTag, idTagstr);
|
|
|
+ strcpy((char *)ShmOCPP16Data->SendLocalList.LocalAuthorizationList[c].IdTagInfo.ExpiryDate, expiryDate);
|
|
|
+ strcpy((char *)ShmOCPP16Data->SendLocalList.LocalAuthorizationList[c].IdTagInfo.ParentIdTag, parentIdTag);
|
|
|
+ strcpy((char *)ShmOCPP16Data->SendLocalList.LocalAuthorizationList[c].IdTagInfo.Status, idTagstatus);
|
|
|
+
|
|
|
+ c++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ //Check UpdateType
|
|
|
+ if(strcmp(updateTypestr, UpdateTypeStr[Full]) == 0)
|
|
|
+ {
|
|
|
+ //Local list full update
|
|
|
+ DEBUG_INFO("If no (empty) localAuthorizationList is given and the updateType is Full, all identifications are removed from the list. \n");
|
|
|
+ OCPP_cleanLocalList();
|
|
|
+ strcpy(comfirmstr, UpdateStatusStr[UpdateStatus_Accepted]);
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(strcmp(updateTypestr, UpdateTypeStr[Differential]) == 0)
|
|
|
+ {
|
|
|
+ //Local list different update
|
|
|
+ DEBUG_INFO("Requesting a Differential update without (empty) localAuthorizationList will have no effect on the list\n");
|
|
|
+ strcpy(comfirmstr, UpdateStatusStr[UpdateStatus_Accepted]);
|
|
|
+ goto end;
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ strcpy(comfirmstr, UpdateStatusStr[UpdateStatus_Accepted]);
|
|
|
+
|
|
|
+end:
|
|
|
+
|
|
|
+ sendSendLocalListConfirmation(uuid, comfirmstr);
|
|
|
+ //ShmOCPP16Data->MsMsg.bits.SendLocalListConf = 1;
|
|
|
+
|
|
|
+ return result;
|
|
|
+}
|
|
|
+
|
|
|
+#define MAX 200
|
|
|
+int handleSetChargingProfileRequest(char *uuid, char *payload)
|
|
|
+{
|
|
|
+ mtrace();
|
|
|
+ int result = FAIL;
|
|
|
+ int connectorIdInt=0, chargingProfileIdInt=0, transactionIdInt=0,stackLevelInt=0, durationInt=0, startPeriodInt[10]={0}, numberPhasesInt[10]={0};
|
|
|
+ int tempconnectorIdInt=0, tempchargingProfileIdInt=0, tempstackLevelInt=0;
|
|
|
+ char chargingProfilePurposeStr[30]={0};
|
|
|
+ char chargingProfileKindStr[16]={0};
|
|
|
+ char recurrencyKindStr[10]={0};
|
|
|
+ char validFromStr[30]={0}, validToStr[30]={0}, startScheduleStr[30]={0}, chargingRateUnitStr[6]={0};
|
|
|
+ float minChargingRateFloat = 0.0, limitflaot[10] = {0.0};
|
|
|
+ int chargingSchedulePeriodCount = 0;
|
|
|
+ //int updateflag = FALSE;
|
|
|
+ char comfirmstr[20]={0};
|
|
|
+ int meet= FALSE;
|
|
|
+ char sstr[10]={0},sstrtemp[1600]={ 0 };
|
|
|
+ int c = 0;
|
|
|
+ char *loc;
|
|
|
+ FILE *fptr1;//, *fptr2;
|
|
|
+ //int lno=0;//, linectr = 0;
|
|
|
+ //int modifyflag = FALSE;
|
|
|
+ char filename[MAX]={0};
|
|
|
+ char tempfile[] = "/Storage/OCPP/SetChargingProfiletemp.json";
|
|
|
+ //int resultRename=0;
|
|
|
+ char rmFileCmd[50]={0};
|
|
|
+ char tempchargingProfilePurposeStr[30]={0};
|
|
|
+ char word[1600]={0};
|
|
|
+ int n_chargingProfile = 0;
|
|
|
+
|
|
|
+
|
|
|
+//[2,"d65bcbca-0b07-49c1-b679-e6c6ff9f5627","SetChargingProfile",{"connectorId":0,"csChargingProfiles":{"chargingProfileId":1,"transactionId":0,"stackLevel":0,"chargingProfilePurpose":"TxDefaultProfile","chargingProfileKind":"Absolute","recurrencyKind":"Daily","validFrom":"2019-07-01T02:39:55.000Z","validTo":"2019-07-04T02:39:55.000Z","chargingSchedule":{"duration":86400,"startSchedule":"2019-07-01T02:39:55.000Z","chargingRateUnit":"A","chargingSchedulePeriod":[{"startPeriod":0,"limit":20.0,"numberPhases":3},{"startPeriod":300,"limit":10.0,"numberPhases":3},{"startPeriod":600,"limit":20.0,"numberPhases":3},{"startPeriod":1200,"limit":10.0,"numberPhases":3},{"startPeriod":1800,"limit":20.0,"numberPhases":3},{"startPeriod":2400,"limit":10.0,"numberPhases":3},{"startPeriod":3000,"limit":20.0,"numberPhases":3}],"minChargingRate":20.1}}}]
|
|
|
+ DEBUG_INFO("handleSetChargingProfileRequest\n");
|
|
|
+
|
|
|
+ connectorIdInt = chargingProfileIdInt = transactionIdInt = stackLevelInt = 0;
|
|
|
+
|
|
|
+ //Filter string space
|
|
|
+ strcpy(sstrtemp, stringtrimspace(payload));
|
|
|
+
|
|
|
+ //*********************connectorId***************************/
|
|
|
+ loc = strstr(sstrtemp, "connectorId");
|
|
|
+ c = 0;
|
|
|
+ memset(sstr ,0, sizeof(sstr) );
|
|
|
+ while (loc[strlen("connectorId")+2+c] != ',')
|
|
|
+ {
|
|
|
+ sstr[c] = loc[strlen("connectorId")+2+c];
|
|
|
+ c++;
|
|
|
+ }
|
|
|
+ sstr[c] = '\0';
|
|
|
+ connectorIdInt = atoi(sstr);
|
|
|
+
|
|
|
+ if(connectorIdInt == 0) // an overall limit for the Charge Point.
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->SetChargingProfile[0].ConnectorId = connectorIdInt;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->SetChargingProfile[connectorIdInt -1].ConnectorId = connectorIdInt;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ //DEBUG_INFO("handleSetChargingProfileRequest -1\n");
|
|
|
+ //*********************chargingProfileId***************************/
|
|
|
+ loc = strstr(sstrtemp, "chargingProfileId");
|
|
|
+ c = 0;
|
|
|
+ memset(sstr ,0, sizeof(sstr) );
|
|
|
+ while (loc[strlen("chargingProfileId")+2+c] != ',')
|
|
|
+ {
|
|
|
+ sstr[c] = loc[strlen("chargingProfileId")+2+c];
|
|
|
+ c++;
|
|
|
+ }
|
|
|
+ sstr[c] = '\0';
|
|
|
+ chargingProfileIdInt = atoi(sstr);
|
|
|
+
|
|
|
+ if(connectorIdInt == 0) // an overall limit for the Charge Point.
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->SetChargingProfile[0].ChargingProfile.ChargingProfileId = chargingProfileIdInt;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->SetChargingProfile[connectorIdInt -1].ChargingProfile.ChargingProfileId = chargingProfileIdInt;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ //DEBUG_INFO("handleSetChargingProfileRequest -2\n");
|
|
|
+ //*********************transactionId***************************/
|
|
|
+ loc = strstr(sstrtemp, "transactionId");
|
|
|
+
|
|
|
+ if(loc != NULL)
|
|
|
+ {
|
|
|
+ c = 0;
|
|
|
+ memset(sstr ,0, sizeof(sstr) );
|
|
|
+ while (loc[strlen("transactionId")+2+c] != ',')
|
|
|
+ {
|
|
|
+ sstr[c] = loc[strlen("transactionId")+2+c];
|
|
|
+ c++;
|
|
|
+ }
|
|
|
+ sstr[c] = '\0';
|
|
|
+ transactionIdInt = atoi(sstr);
|
|
|
+
|
|
|
+
|
|
|
+ if(connectorIdInt == 0) // an overall limit for the Charge Point.
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->SetChargingProfile[0].ChargingProfile.TransactionId = transactionIdInt;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->SetChargingProfile[connectorIdInt -1].ChargingProfile.TransactionId = transactionIdInt;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ //DEBUG_INFO("handleSetChargingProfileRequest -3\n");
|
|
|
+ //*********************stackLevel***************************/
|
|
|
+ loc = strstr(sstrtemp, "stackLevel");
|
|
|
+ c = 0;
|
|
|
+ memset(sstr ,0, sizeof(sstr) );
|
|
|
+ while (loc[strlen("stackLevel")+2+c] != ',')
|
|
|
+ {
|
|
|
+ sstr[c] = loc[strlen("stackLevel")+2+c];
|
|
|
+ c++;
|
|
|
+ }
|
|
|
+ sstr[c] = '\0';
|
|
|
+ stackLevelInt = atoi(sstr);
|
|
|
+
|
|
|
+ if(connectorIdInt == 0) // an overall limit for the Charge Point.
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->SetChargingProfile[0].ChargingProfile.StackLevel = stackLevelInt;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->SetChargingProfile[connectorIdInt -1].ChargingProfile.StackLevel = stackLevelInt;
|
|
|
+ }
|
|
|
+
|
|
|
+ //DEBUG_INFO("handleSetChargingProfileRequest -4\n");
|
|
|
+ //*********************chargingProfilePurpose***************************/
|
|
|
+ loc = strstr(sstrtemp, "chargingProfilePurpose");
|
|
|
+ c = 0;
|
|
|
+ memset(sstr ,0, sizeof(sstr) );
|
|
|
+ while (loc[3+strlen("chargingProfilePurpose")+c] != '\"')
|
|
|
+ {
|
|
|
+ sstr[c] = loc[3+strlen("chargingProfilePurpose")+c];
|
|
|
+ //printf("i=%d sstr=%c\n",c, sstr[c]);
|
|
|
+ c++;
|
|
|
+ }
|
|
|
+ sstr[c] = '\0';
|
|
|
+ strcpy(chargingProfilePurposeStr,sstr);
|
|
|
+ //DEBUG_INFO("chargingProfilePurposeStr=%s\n",chargingProfilePurposeStr);
|
|
|
+
|
|
|
+ if(connectorIdInt == 0) // an overall limit for the Charge Point.
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->SetChargingProfile[0].ChargingProfile.ChargingProfilePurpose, chargingProfilePurposeStr);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->SetChargingProfile[connectorIdInt -1].ChargingProfile.ChargingProfilePurpose, chargingProfilePurposeStr);
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ //DEBUG_INFO("handleSetChargingProfileRequest -6\n");
|
|
|
+ //*********************chargingProfileKind***************************/
|
|
|
+ loc = strstr(sstrtemp, "chargingProfileKind");
|
|
|
+ c = 0;
|
|
|
+ memset(sstr ,0, sizeof(sstr) );
|
|
|
+ while (loc[3+strlen("chargingProfileKind")+c] != '\"')
|
|
|
+ {
|
|
|
+ sstr[c] = loc[3+strlen("chargingProfileKind")+c];
|
|
|
+ //printf("i=%d sstr=%c\n",c, sstr[c]);
|
|
|
+ c++;
|
|
|
+ }
|
|
|
+ sstr[c] = '\0';
|
|
|
+ strcpy(chargingProfileKindStr,sstr);
|
|
|
+
|
|
|
+ if(connectorIdInt == 0) // an overall limit for the Charge Point.
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->SetChargingProfile[0].ChargingProfile.ChargingProfileKind, chargingProfileKindStr);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->SetChargingProfile[connectorIdInt -1].ChargingProfile.ChargingProfileKind, chargingProfileKindStr);
|
|
|
+ }
|
|
|
+
|
|
|
+ //DEBUG_INFO("handleSetChargingProfileRequest -7\n");
|
|
|
+ //*********************recurrencyKind***************************/
|
|
|
+ loc = strstr(sstrtemp, "recurrencyKind");
|
|
|
+ if(loc != NULL)
|
|
|
+ {
|
|
|
+
|
|
|
+ c = 0;
|
|
|
+ memset(sstr ,0, sizeof(sstr) );
|
|
|
+ while (loc[3+strlen("recurrencyKind")+c] != '\"')
|
|
|
+ {
|
|
|
+ sstr[c] = loc[3+strlen("recurrencyKind")+c];
|
|
|
+ //printf("i=%d sstr=%c\n",c, sstr[c]);
|
|
|
+ c++;
|
|
|
+ }
|
|
|
+ sstr[c] = '\0';
|
|
|
+ strcpy(recurrencyKindStr,sstr);
|
|
|
+
|
|
|
+ if(connectorIdInt == 0) // an overall limit for the Charge Point.
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->SetChargingProfile[0].ChargingProfile.RecurrencyKind, recurrencyKindStr);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->SetChargingProfile[connectorIdInt -1].ChargingProfile.RecurrencyKind, recurrencyKindStr);
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if(connectorIdInt == 0) // an overall limit for the Charge Point.
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->SetChargingProfile[0].ChargingProfile.RecurrencyKind, "");
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->SetChargingProfile[connectorIdInt -1].ChargingProfile.RecurrencyKind, "");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //DEBUG_INFO("handleSetChargingProfileRequest -8\n");
|
|
|
+ //*********************validFrom***************************/
|
|
|
+ loc = strstr(sstrtemp, "validFrom");
|
|
|
+ if(loc != NULL)
|
|
|
+ {
|
|
|
+ c = 0;
|
|
|
+ memset(sstr ,0, sizeof(sstr) );
|
|
|
+ while (loc[3+strlen("validFrom")+c] != '\"')
|
|
|
+ {
|
|
|
+ sstr[c] = loc[3+strlen("validFrom")+c];
|
|
|
+ //printf("i=%d sstr=%c\n",c, sstr[c]);
|
|
|
+ c++;
|
|
|
+ }
|
|
|
+ sstr[c] = '\0';
|
|
|
+ strcpy(validFromStr,sstr);
|
|
|
+
|
|
|
+ if(connectorIdInt == 0) // an overall limit for the Charge Point.
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->SetChargingProfile[0].ChargingProfile.ValidFrom, validFromStr);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->SetChargingProfile[connectorIdInt -1].ChargingProfile.ValidFrom, validFromStr);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if(connectorIdInt == 0) // an overall limit for the Charge Point.
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->SetChargingProfile[0].ChargingProfile.ValidFrom, "");
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->SetChargingProfile[connectorIdInt -1].ChargingProfile.ValidFrom, "");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //DEBUG_INFO("handleSetChargingProfileRequest -9\n");
|
|
|
+ //*********************validTo***************************/
|
|
|
+ loc = strstr(sstrtemp, "validTo");
|
|
|
+ if(loc != NULL)
|
|
|
+ {
|
|
|
+ c = 0;
|
|
|
+ memset(sstr ,0, sizeof(sstr) );
|
|
|
+ while (loc[3+strlen("validTo")+c] != '\"')
|
|
|
+ {
|
|
|
+ sstr[c] = loc[3+strlen("validTo")+c];
|
|
|
+ //printf("i=%d sstr=%c\n",c, sstr[c]);
|
|
|
+ c++;
|
|
|
+ }
|
|
|
+ sstr[c] = '\0';
|
|
|
+ strcpy(validToStr,sstr);
|
|
|
+
|
|
|
+ if(connectorIdInt == 0) // an overall limit for the Charge Point.
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->SetChargingProfile[0].ChargingProfile.ValidTo, validToStr);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->SetChargingProfile[connectorIdInt -1].ChargingProfile.ValidTo, validToStr);
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if(connectorIdInt == 0) // an overall limit for the Charge Point.
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->SetChargingProfile[0].ChargingProfile.ValidTo, "");
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->SetChargingProfile[connectorIdInt -1].ChargingProfile.ValidTo, "");
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //DEBUG_INFO("handleSetChargingProfileRequest -10\n");
|
|
|
+ //*********************duration***************************/
|
|
|
+ loc = strstr(sstrtemp, "duration");
|
|
|
+ if(loc != NULL)
|
|
|
+ {
|
|
|
+ c = 0;
|
|
|
+ memset(sstr ,0, sizeof(sstr) );
|
|
|
+ while (loc[strlen("duration")+2+c] != ',')
|
|
|
+ {
|
|
|
+ sstr[c] = loc[strlen("duration")+2+c];
|
|
|
+ c++;
|
|
|
+ }
|
|
|
+ sstr[c] = '\0';
|
|
|
+ durationInt = atoi(sstr);
|
|
|
+
|
|
|
+ if(connectorIdInt == 0) // an overall limit for the Charge Point.
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->SetChargingProfile[0].ChargingProfile.ChargingSchedule.Duration = durationInt;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->SetChargingProfile[connectorIdInt -1].ChargingProfile.ChargingSchedule.Duration = durationInt;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if(connectorIdInt == 0) // an overall limit for the Charge Point.
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->SetChargingProfile[0].ChargingProfile.ChargingSchedule.Duration = 0;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->SetChargingProfile[connectorIdInt -1].ChargingProfile.ChargingSchedule.Duration = 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //DEBUG_INFO("handleSetChargingProfileRequest -11\n");
|
|
|
+ //*********************startSchedule***************************/
|
|
|
+ loc = strstr(sstrtemp, "startSchedule");
|
|
|
+ if(loc != NULL)
|
|
|
+ {
|
|
|
+ c = 0;
|
|
|
+ memset(sstr ,0, sizeof(sstr) );
|
|
|
+ while (loc[3+strlen("startSchedule")+c] != '\"')
|
|
|
+ {
|
|
|
+ sstr[c] = loc[3+strlen("startSchedule")+c];
|
|
|
+ //printf("i=%d sstr=%c\n",c, sstr[c]);
|
|
|
+ c++;
|
|
|
+ }
|
|
|
+ sstr[c] = '\0';
|
|
|
+ strcpy(startScheduleStr,sstr);
|
|
|
+
|
|
|
+ if(connectorIdInt == 0) // an overall limit for the Charge Point.
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->SetChargingProfile[0].ChargingProfile.ChargingSchedule.StartSchedule,startScheduleStr);
|
|
|
+
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->SetChargingProfile[connectorIdInt -1].ChargingProfile.ChargingSchedule.StartSchedule,startScheduleStr);
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if(connectorIdInt == 0) // an overall limit for the Charge Point.
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->SetChargingProfile[0].ChargingProfile.ChargingSchedule.StartSchedule,"");
|
|
|
+
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->SetChargingProfile[connectorIdInt -1].ChargingProfile.ChargingSchedule.StartSchedule,"");
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ //DEBUG_INFO("handleSetChargingProfileRequest -12\n");
|
|
|
+ //*********************chargingRateUnit***************************/
|
|
|
+ loc = strstr(sstrtemp, "chargingRateUnit");
|
|
|
+ if(loc != NULL)
|
|
|
+ {
|
|
|
+ c = 0;
|
|
|
+ memset(sstr ,0, sizeof(sstr) );
|
|
|
+ while (loc[3+strlen("chargingRateUnit")+c] != '\"')
|
|
|
+ {
|
|
|
+ sstr[c] = loc[3+strlen("chargingRateUnit")+c];
|
|
|
+ //printf("i=%d sstr=%c\n",c, sstr[c]);
|
|
|
+ c++;
|
|
|
+ }
|
|
|
+ sstr[c] = '\0';
|
|
|
+ strcpy(chargingRateUnitStr,sstr);
|
|
|
+
|
|
|
+ if(connectorIdInt == 0) // an overall limit for the Charge Point.
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->SetChargingProfile[0].ChargingProfile.ChargingSchedule.ChargingRateUnit,chargingRateUnitStr);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->SetChargingProfile[connectorIdInt -1].ChargingProfile.ChargingSchedule.ChargingRateUnit,chargingRateUnitStr);
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ //DEBUG_INFO("handleSetChargingProfileRequest -13\n");
|
|
|
+ //****************chargingSchedulePeriod count start*******************/
|
|
|
+ int what_len = strlen("startPeriod");
|
|
|
+
|
|
|
+ char tempChargingProfile[1600]={0};
|
|
|
+ strcpy(tempChargingProfile,(const char*)sstrtemp);
|
|
|
+ char *where = tempChargingProfile;
|
|
|
+ if (what_len)
|
|
|
+ {
|
|
|
+ while ((where = strstr(where, "startPeriod"))) {
|
|
|
+ where += what_len;
|
|
|
+ chargingSchedulePeriodCount++;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if( chargingSchedulePeriodCount > atoi((const char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleMaxPeriods].ItemData))
|
|
|
+ {
|
|
|
+ sprintf(comfirmstr, "%s", ChargingProfileStatusStr[ChargingProfileStatus_Rejected] );
|
|
|
+ goto end;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ //DEBUG_INFO("chargingSchedulePeriodCount=%d\n",chargingSchedulePeriodCount);
|
|
|
+ //where = payload;
|
|
|
+ int templength = 0;
|
|
|
+ //int searchstart = 0;
|
|
|
+ for(int periodNums=0; periodNums < chargingSchedulePeriodCount; periodNums++)
|
|
|
+ {
|
|
|
+ //****************startPeriod*******************/
|
|
|
+ c=0;
|
|
|
+ loc = strstr(tempChargingProfile + templength, "startPeriod");
|
|
|
+ memset(sstr ,0, sizeof(sstr) );
|
|
|
+ while ((loc[strlen("startPeriod")+2+c] != '}') && (loc[strlen("startPeriod")+2+c] != ','))
|
|
|
+ {
|
|
|
+ sstr[c] = loc[strlen("startPeriod")+2+c];
|
|
|
+ //printf("i=%d sstr=%c\n",c, sstr[c]);
|
|
|
+ c++;
|
|
|
+ }
|
|
|
+ sstr[c] = '\0';
|
|
|
+ startPeriodInt[periodNums] = atoi(sstr);
|
|
|
+ //DEBUG_INFO("sstr=%d\n",atoi(sstr));
|
|
|
+ //DEBUG_INFO("handleSetChargingProfileRequest -13 -1 -1\n");
|
|
|
+ if(connectorIdInt == 0) // an overall limit for the Charge Point.
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->SetChargingProfile[0].ChargingProfile.ChargingSchedule.ChargingSchedulePeriod[periodNums].StartPeriod = startPeriodInt[periodNums];
|
|
|
+
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->SetChargingProfile[connectorIdInt -1].ChargingProfile.ChargingSchedule.ChargingSchedulePeriod[periodNums].StartPeriod = startPeriodInt[periodNums];
|
|
|
+ }
|
|
|
+
|
|
|
+ templength = strlen("startPeriod")+2+c;
|
|
|
+
|
|
|
+ //DEBUG_INFO("handleSetChargingProfileRequest -13 -2\n");
|
|
|
+ //****************limit*******************/
|
|
|
+ c=0;
|
|
|
+ loc = strstr(tempChargingProfile + templength, "limit");
|
|
|
+ memset(sstr ,0, sizeof(sstr) );
|
|
|
+ while ((loc[strlen("limit")+2+c] != '}') && (loc[strlen("limit")+2+c] != ','))
|
|
|
+ {
|
|
|
+ sstr[c] = loc[strlen("limit")+2+c];
|
|
|
+ //printf("i=%d sstr=%c\n",c, sstr[c]);
|
|
|
+ c++;
|
|
|
+ }
|
|
|
+ sstr[c] = '\0';
|
|
|
+ limitflaot[periodNums] = atof(sstr);
|
|
|
+
|
|
|
+ if(connectorIdInt == 0) // an overall limit for the Charge Point.
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->SetChargingProfile[0].ChargingProfile.ChargingSchedule.ChargingSchedulePeriod[periodNums].Limit = limitflaot[periodNums];
|
|
|
+
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->SetChargingProfile[connectorIdInt -1].ChargingProfile.ChargingSchedule.ChargingSchedulePeriod[periodNums].Limit = limitflaot[periodNums];
|
|
|
+ }
|
|
|
+
|
|
|
+ templength = templength + strlen("limit")+2+c;
|
|
|
+
|
|
|
+ //****************numberPhases*******************/
|
|
|
+ loc = strstr(tempChargingProfile + templength, "numberPhases");
|
|
|
+ if(loc != NULL)
|
|
|
+ {
|
|
|
+ c=0;
|
|
|
+ memset(sstr ,0, sizeof(sstr) );
|
|
|
+ while ((loc[strlen("numberPhases")+2+c] != '}') && (loc[strlen("numberPhases")+2+c] != ','))
|
|
|
+ {
|
|
|
+ sstr[c] = loc[strlen("numberPhases")+2+c];
|
|
|
+ //printf("i=%d sstr=%c\n",c, sstr[c]);
|
|
|
+ c++;
|
|
|
+ }
|
|
|
+ sstr[c] = '\0';
|
|
|
+ numberPhasesInt[periodNums] = atoi(sstr);
|
|
|
+
|
|
|
+ if(connectorIdInt == 0) // an overall limit for the Charge Point.
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->SetChargingProfile[0].ChargingProfile.ChargingSchedule.ChargingSchedulePeriod[periodNums].NumberPhases = numberPhasesInt[periodNums];
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->SetChargingProfile[connectorIdInt -1].ChargingProfile.ChargingSchedule.ChargingSchedulePeriod[periodNums].NumberPhases = numberPhasesInt[periodNums];
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ templength = templength + strlen("numberPhases")+2+c;
|
|
|
+ }
|
|
|
+
|
|
|
+ //where = loc;
|
|
|
+ }
|
|
|
+ //****************chargingSchedulePeriod count end*******************/
|
|
|
+
|
|
|
+
|
|
|
+ //*********************minChargingRate***************************/
|
|
|
+ loc = strstr(sstrtemp, "minChargingRate");
|
|
|
+
|
|
|
+ if(loc != NULL)
|
|
|
+ {
|
|
|
+ c = 0;
|
|
|
+ memset(sstr ,0, sizeof(sstr) );
|
|
|
+ while ((loc[strlen("minChargingRate")+2+c] != ',')&&(loc[strlen("minChargingRate")+2+c] != '}'))
|
|
|
+ {
|
|
|
+ sstr[c] = loc[strlen("minChargingRate")+2+c];
|
|
|
+ c++;
|
|
|
+ }
|
|
|
+ sstr[c] = '\0';
|
|
|
+ minChargingRateFloat = atof(sstr);
|
|
|
+
|
|
|
+ if(connectorIdInt == 0) // an overall limit for the Charge Point.
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->SetChargingProfile[0].ChargingProfile.ChargingSchedule.MinChargingRate = minChargingRateFloat;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->SetChargingProfile[connectorIdInt -1].ChargingProfile.ChargingSchedule.MinChargingRate = minChargingRateFloat;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if(connectorIdInt == 0) // an overall limit for the Charge Point.
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->SetChargingProfile[0].ChargingProfile.ChargingSchedule.MinChargingRate = 0.0;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->SetChargingProfile[connectorIdInt -1].ChargingProfile.ChargingSchedule.MinChargingRate = 0.0;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ if(strcmp(chargingProfilePurposeStr, ChargingProfilePurposeTypeStr[ChargePointMaxProfile]) == 0)
|
|
|
+ {
|
|
|
+ DEBUG_INFO("chargingProfilePurposeStr is ChargePointMaxProfile !!! \n");
|
|
|
+ if(connectorIdInt != 0)
|
|
|
+ {
|
|
|
+ sprintf(comfirmstr, "%s", ChargingProfileStatusStr[ChargingProfileStatus_Rejected] );
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+
|
|
|
+ strcpy(filename, ChargePointMaxProfile_JSON );
|
|
|
+ fptr1 = fopen(filename, "r");
|
|
|
+ if (!fptr1)
|
|
|
+ {
|
|
|
+ //file not exist
|
|
|
+ DEBUG_INFO("Unable to open the input file!!\n");
|
|
|
+ fptr1 = fopen(filename, "w+");
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ //Check Charging Profile Count
|
|
|
+ while(fscanf(fptr1, "%s", word) != EOF)
|
|
|
+ {
|
|
|
+ //DEBUG_INFO("word=%s\n",word);
|
|
|
+ if(strstr(word, "chargingProfileId")!= NULL)
|
|
|
+ {
|
|
|
+ //DEBUG_INFO("test chargingProfileId \n");
|
|
|
+ n_chargingProfile = n_chargingProfile + 1;
|
|
|
+ //DEBUG_INFO("chargingProfileId Found\n");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ fclose(fptr1);
|
|
|
+
|
|
|
+ }
|
|
|
+ else if(strcmp(chargingProfilePurposeStr, ChargingProfilePurposeTypeStr[TxDefaultProfile]) == 0)
|
|
|
+ {
|
|
|
+ DEBUG_INFO("chargingProfilePurposeStr is TxDefaultProfile !!! \n");
|
|
|
+ if((connectorIdInt != 0) && (connectorIdInt > gunTotalNumber /*(CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY)*/))
|
|
|
+ {
|
|
|
+ sprintf(comfirmstr, "%s", ChargingProfileStatusStr[ChargingProfileStatus_Rejected] );
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+
|
|
|
+ memset(filename, 0, sizeof filename);
|
|
|
+ sprintf(filename, "/Storage/OCPP/TxDefaultProfile_%d.json", connectorIdInt);
|
|
|
+
|
|
|
+ fptr1 = fopen(filename, "r");
|
|
|
+ if (!fptr1)
|
|
|
+ {
|
|
|
+ //file not exist
|
|
|
+ //DEBUG_INFO("Unable to open the input file!!\n");
|
|
|
+ fptr1 = fopen(filename, "w+");
|
|
|
+
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ //Check Charging Profile Count
|
|
|
+ while(fscanf(fptr1, "%s", word) != EOF)
|
|
|
+ {
|
|
|
+ //DEBUG_INFO("word=%s\n",word);
|
|
|
+ if(strstr(word, "chargingProfileId")!= NULL)
|
|
|
+ {
|
|
|
+ //DEBUG_INFO("test chargingProfileId \n");
|
|
|
+ n_chargingProfile = n_chargingProfile + 1;
|
|
|
+ //DEBUG_INFO("chargingProfileId Found\n");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ fclose(fptr1);
|
|
|
+ }
|
|
|
+ else if(strcmp(chargingProfilePurposeStr, ChargingProfilePurposeTypeStr[TxProfile]) == 0)
|
|
|
+ {
|
|
|
+ //printf("set chargingProfile 1-4\n");
|
|
|
+ DEBUG_INFO("chargingProfilePurposeStr is TxProfile !!! \n");
|
|
|
+
|
|
|
+ //---TxProfile SHALL only be set at Charge Point ConnectorId > 0. ---//
|
|
|
+ if(connectorIdInt == 0)
|
|
|
+ {
|
|
|
+ sprintf(comfirmstr, "%s", ChargingProfileStatusStr[ChargingProfileStatus_Rejected] );
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+
|
|
|
+ int tempIndex = 0;
|
|
|
+ //check Transaction active
|
|
|
+ if(gunType[connectorIdInt -1] == 'J')
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
+ {
|
|
|
+ tempIndex = (((connectorIdInt -1)==2) ? 1: 0);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tempIndex = connectorIdInt -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < CHAdeMO_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_CHARGING) // S_CHARGING
|
|
|
+ {
|
|
|
+ if(transactionIdInt == ShmOCPP16Data->StartTransaction[connectorIdInt -1].ResponseTransactionId)
|
|
|
+ {
|
|
|
+ meet = TRUE;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+ else if((gunType[connectorIdInt -1] == 'U')||(gunType[connectorIdInt -1] == 'E'))
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
+ {
|
|
|
+ tempIndex = (((connectorIdInt -1)==2) ? 1: 0);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tempIndex = connectorIdInt -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < CCS_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_CHARGING) // S_CHARGING
|
|
|
+ {
|
|
|
+ if(transactionIdInt == ShmOCPP16Data->StartTransaction[connectorIdInt -1].ResponseTransactionId)
|
|
|
+ {
|
|
|
+ meet = TRUE;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ else if(gunType[connectorIdInt -1] == 'G')
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
+ {
|
|
|
+ tempIndex = (((connectorIdInt -1)==2) ? 1: 0);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tempIndex = connectorIdInt -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < GB_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_CHARGING) // S_CHARGING
|
|
|
+ {
|
|
|
+ if(transactionIdInt == ShmOCPP16Data->StartTransaction[connectorIdInt -1].ResponseTransactionId)
|
|
|
+ {
|
|
|
+ meet = TRUE;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D') // 'D' means DC
|
|
|
+ {
|
|
|
+ tempIndex = 2;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tempIndex = (connectorIdInt -1);
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < AC_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_CHARGING) // S_CHARGING
|
|
|
+ {
|
|
|
+ if(transactionIdInt == ShmOCPP16Data->StartTransaction[connectorIdInt -1].ResponseTransactionId)
|
|
|
+ {
|
|
|
+ meet = TRUE;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ //check Transaction active
|
|
|
+
|
|
|
+ if(meet == FALSE)
|
|
|
+ {
|
|
|
+ sprintf(comfirmstr, "%s", ChargingProfileStatusStr[ChargingProfileStatus_Rejected] );
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+
|
|
|
+ if((connectorIdInt != 0) && (connectorIdInt > gunTotalNumber /*(CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY)*/))
|
|
|
+ {
|
|
|
+ sprintf(comfirmstr, "%s", ChargingProfileStatusStr[ChargingProfileStatus_Rejected] );
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+
|
|
|
+ sprintf(filename, "/Storage/OCPP/TxProfile_%d.json", connectorIdInt);
|
|
|
+
|
|
|
+ fptr1 = fopen(filename, "r");
|
|
|
+ if (!fptr1)
|
|
|
+ {
|
|
|
+ //file not exist
|
|
|
+ DEBUG_INFO("Unable to open the input file!!\n");
|
|
|
+ fptr1 = fopen(filename, "w+");
|
|
|
+
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ //Check Charging Profile Count
|
|
|
+ while(fscanf(fptr1, "%s", word) != EOF)
|
|
|
+ {
|
|
|
+ //DEBUG_INFO("word=%s\n",word);
|
|
|
+ if(strstr(word, "chargingProfileId")!= NULL)
|
|
|
+ {
|
|
|
+ //DEBUG_INFO("test chargingProfileId \n");
|
|
|
+ n_chargingProfile = n_chargingProfile + 1;
|
|
|
+ //DEBUG_INFO("chargingProfileId Found\n");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ fclose(fptr1);
|
|
|
+ }
|
|
|
+
|
|
|
+ // Check ChargeProfileMaxStackLevel
|
|
|
+ if(n_chargingProfile >= atoi((const char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargeProfileMaxStackLevel].ItemData))
|
|
|
+ {
|
|
|
+ sprintf(comfirmstr, "%s", ChargingProfileStatusStr[ChargingProfileStatus_Rejected] );
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ //------------------------------Satrt: Check Configuration Key "MaxChargingProfilesInstalled" Logic---------------------------------------//
|
|
|
+ {
|
|
|
+ int i = 0;
|
|
|
+ char fnametemp[200]={0};
|
|
|
+ n_chargingProfile = 0;
|
|
|
+ //Check ChargePointMaxProfile.json exit
|
|
|
+ if((access("/Storage/OCPP/ChargePointMaxProfile.json",F_OK))!=-1)
|
|
|
+ {
|
|
|
+ fptr1 = fopen("/Storage/OCPP/ChargePointMaxProfile.json", "r");
|
|
|
+ //Check Charging Profile Count
|
|
|
+ while(fscanf(fptr1, "%s", word) != EOF)
|
|
|
+ {
|
|
|
+ //DEBUG_INFO("word=%s\n",word);
|
|
|
+ if(strstr(word, "chargingProfileId")!= NULL)
|
|
|
+ {
|
|
|
+ //DEBUG_INFO("test chargingProfileId \n");
|
|
|
+ n_chargingProfile = n_chargingProfile + 1;
|
|
|
+ i = i + 1;
|
|
|
+ //DEBUG_INFO("chargingProfileId Found\n");
|
|
|
+ }
|
|
|
+ memset(word, 0, sizeof word);
|
|
|
+ }
|
|
|
+ fclose(fptr1);
|
|
|
+ DEBUG_INFO("ChargePointMaxProfile.json has %d charging Profile\n",i );
|
|
|
+ }
|
|
|
+
|
|
|
+ //Check TxDefaultProfile_0.json exit
|
|
|
+ if((access("/Storage/OCPP/TxDefaultProfile_0.json",F_OK))!=-1)
|
|
|
+ {
|
|
|
+ i = 0;
|
|
|
+ fptr1 = fopen("/Storage/OCPP/TxDefaultProfile_0.json", "r");
|
|
|
+ //Check Charging Profile Count
|
|
|
+ while(fscanf(fptr1, "%s", word) != EOF)
|
|
|
+ {
|
|
|
+ //DEBUG_INFO("word=%s\n",word);
|
|
|
+ if(strstr(word, "chargingProfileId")!= NULL)
|
|
|
+ {
|
|
|
+ //DEBUG_INFO("test chargingProfileId \n");
|
|
|
+ n_chargingProfile = n_chargingProfile + 1;
|
|
|
+ i = i + 1;
|
|
|
+ //DEBUG_INFO("chargingProfileId Found\n");
|
|
|
+ }
|
|
|
+ memset(word, 0, sizeof word);
|
|
|
+ }
|
|
|
+ fclose(fptr1);
|
|
|
+ DEBUG_INFO("TxDefaultProfile_0.json has %d charging Profile\n",i );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ //Check TxDefaultProfile_%d.json
|
|
|
+ for(int j=1; j <= gunTotalNumber; j++)
|
|
|
+ {
|
|
|
+ memset(fnametemp, 0, sizeof fnametemp);
|
|
|
+ sprintf(fnametemp, "/Storage/OCPP/TxDefaultProfile_%d.json", j);
|
|
|
+ if((access(fnametemp,F_OK))!=-1)
|
|
|
+ {
|
|
|
+ i = 0;
|
|
|
+ fptr1 = fopen(fnametemp, "r");
|
|
|
+ //Check Charging Profile Count
|
|
|
+ while(fscanf(fptr1, "%s", word) != EOF)
|
|
|
+ {
|
|
|
+ //DEBUG_INFO("word=%s\n",word);
|
|
|
+ if(strstr(word, "chargingProfileId")!= NULL)
|
|
|
+ {
|
|
|
+ //DEBUG_INFO("test chargingProfileId \n");
|
|
|
+ n_chargingProfile = n_chargingProfile + 1;
|
|
|
+ i = i + 1;
|
|
|
+ //DEBUG_INFO("chargingProfileId Found\n");
|
|
|
+ }
|
|
|
+ memset(word, 0, sizeof word);
|
|
|
+ }
|
|
|
+ fclose(fptr1);
|
|
|
+ DEBUG_INFO("%s has %d charging Profile\n",fnametemp, i);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //Check TxProfile_%d.json
|
|
|
+ for(int j=1; j <= gunTotalNumber; j++)
|
|
|
+ {
|
|
|
+ memset(fnametemp, 0, sizeof fnametemp);
|
|
|
+ sprintf(fnametemp, "/Storage/OCPP/TxProfile_%d.json", j);
|
|
|
+ if((access(fnametemp,F_OK))!=-1)
|
|
|
+ {
|
|
|
+ i = 0;
|
|
|
+ fptr1 = fopen(fnametemp, "r");
|
|
|
+ //Check Charging Profile Count
|
|
|
+ while(fscanf(fptr1, "%s", word) != EOF)
|
|
|
+ {
|
|
|
+ //DEBUG_INFO("word=%s\n",word);
|
|
|
+ if(strstr(word, "chargingProfileId")!= NULL)
|
|
|
+ {
|
|
|
+ //DEBUG_INFO("test chargingProfileId \n");
|
|
|
+ n_chargingProfile = n_chargingProfile + 1;
|
|
|
+ i = i + 1;
|
|
|
+ //DEBUG_INFO("chargingProfileId Found\n");
|
|
|
+ }
|
|
|
+ memset(word, 0, sizeof word);
|
|
|
+ }
|
|
|
+ fclose(fptr1);
|
|
|
+ DEBUG_INFO("%s has %d charging Profile\n",fnametemp, i);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if( n_chargingProfile > atoi((const char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[MaxChargingProfilesInstalled].ItemData))
|
|
|
+ {
|
|
|
+ sprintf(comfirmstr, "%s", ChargingProfileStatusStr[ChargingProfileStatus_Rejected] );
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ //------------------------------End: Check Configuration Key "MaxChargingProfilesInstalled" Logic---------------------------------------//
|
|
|
+
|
|
|
+ //**********************************Write to File********************************************************/
|
|
|
+ FILE *infile;
|
|
|
+ FILE *outfile;
|
|
|
+
|
|
|
+ // open file for writing
|
|
|
+ infile = fopen (filename, "r");
|
|
|
+ outfile = fopen (tempfile, "w");
|
|
|
+
|
|
|
+
|
|
|
+ int d =0;
|
|
|
+ d = fgetc(infile);
|
|
|
+ //DEBUG_INFO("d:%d\n",d);
|
|
|
+ rewind(infile);
|
|
|
+
|
|
|
+ //*璉 瘚 辣蝏 1嚗 0 */
|
|
|
+ if(d == EOF)
|
|
|
+ {
|
|
|
+ //DEBUG_INFO("ChargingProfile content is NULL\n");
|
|
|
+
|
|
|
+ fprintf(outfile,"%s\n",payload);
|
|
|
+ sprintf(comfirmstr, "%s", ChargingProfileStatusStr[ChargingProfileStatus_Accepted] );
|
|
|
+
|
|
|
+
|
|
|
+ fclose(infile);
|
|
|
+ fclose(outfile);
|
|
|
+
|
|
|
+ sprintf(rmFileCmd,"rm -f %s",filename);
|
|
|
+ system(rmFileCmd);
|
|
|
+
|
|
|
+ rename(tempfile, filename);
|
|
|
+ sleep(1);
|
|
|
+ //sprintf(rmFileCmd,"rm -f %s",tempfile);
|
|
|
+ //system(rmFileCmd);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ char buf[1000]={0};
|
|
|
+ int ChargingProfileAdded = FALSE;
|
|
|
+
|
|
|
+ while (fgets(buf, sizeof(buf), infile) != NULL)
|
|
|
+ {
|
|
|
+ buf[strlen(buf) - 1] = '\0'; // eat the newline fgets() stores
|
|
|
+ //*************************tempconnectorIdInt*********************************/
|
|
|
+ loc = strstr(buf, "connectorId");
|
|
|
+ c = 0;
|
|
|
+ memset(sstr ,0, sizeof(sstr) );
|
|
|
+ while (loc[strlen("connectorId")+2+c] != ',')
|
|
|
+ {
|
|
|
+ sstr[c] = loc[strlen("connectorId")+2+c];
|
|
|
+ c++;
|
|
|
+ }
|
|
|
+ sstr[c] = '\0';
|
|
|
+ tempconnectorIdInt = atoi(sstr);
|
|
|
+
|
|
|
+
|
|
|
+ //*************************tempchargingProfileIdInt*********************************/
|
|
|
+ loc = strstr(buf, "chargingProfileId");
|
|
|
+ c = 0;
|
|
|
+ memset(sstr ,0, sizeof(sstr) );
|
|
|
+ while (loc[strlen("chargingProfileId")+2+c] != ',')
|
|
|
+ {
|
|
|
+ sstr[c] = loc[strlen("chargingProfileId")+2+c];
|
|
|
+ c++;
|
|
|
+ }
|
|
|
+ sstr[c] = '\0';
|
|
|
+ tempchargingProfileIdInt = atoi(sstr);
|
|
|
+
|
|
|
+
|
|
|
+ //*************************tempstackLevelInt*********************************/
|
|
|
+ loc = strstr(buf, "stackLevel");
|
|
|
+ c = 0;
|
|
|
+ memset(sstr ,0, sizeof(sstr) );
|
|
|
+ while (loc[strlen("stackLevel")+2+c] != ',')
|
|
|
+ {
|
|
|
+ sstr[c] = loc[strlen("stackLevel")+2+c];
|
|
|
+ c++;
|
|
|
+ }
|
|
|
+ sstr[c] = '\0';
|
|
|
+ tempstackLevelInt = atoi(sstr);
|
|
|
+
|
|
|
+
|
|
|
+ //*************************tempchargingProfilePurposeStr*********************************/
|
|
|
+ loc = strstr(payload, "chargingProfilePurpose");
|
|
|
+ c = 0;
|
|
|
+ memset(sstr ,0, sizeof(sstr) );
|
|
|
+ while (loc[3+strlen("chargingProfilePurpose")+c] != '\"')
|
|
|
+ {
|
|
|
+ sstr[c] = loc[3+strlen("chargingProfilePurpose")+c];
|
|
|
+ //printf("i=%d sstr=%c\n",c, sstr[c]);
|
|
|
+ c++;
|
|
|
+ }
|
|
|
+ sstr[c] = '\0';
|
|
|
+ strcpy(tempchargingProfilePurposeStr,sstr);
|
|
|
+
|
|
|
+ if((tempconnectorIdInt == connectorIdInt) && (tempchargingProfileIdInt == chargingProfileIdInt))
|
|
|
+ {
|
|
|
+ if((tempstackLevelInt == stackLevelInt) && (strcmp(tempchargingProfilePurposeStr, chargingProfilePurposeStr) == 0))
|
|
|
+ {
|
|
|
+ //DEBUG_INFO("update set chargingProfile to file -0\n");
|
|
|
+ if(ChargingProfileAdded == FALSE)
|
|
|
+ {
|
|
|
+ fprintf(outfile,"%s\n",payload);
|
|
|
+ ChargingProfileAdded = TRUE;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if(tempstackLevelInt < stackLevelInt)
|
|
|
+ {
|
|
|
+ if(ChargingProfileAdded == FALSE)
|
|
|
+ {
|
|
|
+ fprintf(outfile,"%s\n",payload);
|
|
|
+ ChargingProfileAdded = TRUE;
|
|
|
+ fprintf(outfile,"%s\n",buf);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ fprintf(outfile,"%s\n",buf);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if(ChargingProfileAdded == FALSE)
|
|
|
+ {
|
|
|
+ fprintf(outfile,"%s\n",buf);
|
|
|
+ fprintf(outfile,"%s\n",payload);
|
|
|
+ ChargingProfileAdded = TRUE;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ fprintf(outfile,"%s\n",buf);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if(tempchargingProfileIdInt < chargingProfileIdInt)
|
|
|
+ {
|
|
|
+ if(ChargingProfileAdded == FALSE)
|
|
|
+ {
|
|
|
+ fprintf(outfile,"%s\n",payload);
|
|
|
+ ChargingProfileAdded = TRUE;
|
|
|
+ fprintf(outfile,"%s\n",buf);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ fprintf(outfile,"%s\n",buf);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if(tempstackLevelInt < stackLevelInt)
|
|
|
+ {
|
|
|
+ if(ChargingProfileAdded == FALSE)
|
|
|
+ {
|
|
|
+ fprintf(outfile,"%s\n",payload);
|
|
|
+ ChargingProfileAdded = TRUE;
|
|
|
+ fprintf(outfile,"%s\n",buf);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ fprintf(outfile,"%s\n",buf);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if(ChargingProfileAdded == FALSE)
|
|
|
+ {
|
|
|
+ fprintf(outfile,"%s\n",buf);
|
|
|
+ fprintf(outfile,"%s\n",payload);
|
|
|
+ ChargingProfileAdded = TRUE;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ fprintf(outfile,"%s\n",buf);
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ } // end of while loop
|
|
|
+
|
|
|
+ fclose(infile);
|
|
|
+ fclose(outfile);
|
|
|
+
|
|
|
+ sprintf(rmFileCmd,"rm -f %s",filename);
|
|
|
+ system(rmFileCmd);
|
|
|
+
|
|
|
+ rename(tempfile, filename);
|
|
|
+ sleep(1);
|
|
|
+
|
|
|
+ result = TRUE;
|
|
|
+ sprintf(comfirmstr, "%s", ChargingProfileStatusStr[ChargingProfileStatus_Accepted] );
|
|
|
+ }
|
|
|
+
|
|
|
+end:
|
|
|
+ sendSetChargingProfileConfirmation(uuid, comfirmstr);
|
|
|
+ return result;
|
|
|
+
|
|
|
+ return result;
|
|
|
+}
|
|
|
+
|
|
|
+int handleTriggerMessageRequest(char *uuid, char *payload)
|
|
|
+{
|
|
|
+ mtrace();
|
|
|
+ int result = FAIL;
|
|
|
+ int connectorIdIsNULL = FALSE;
|
|
|
+ int connectorIdInt =0;
|
|
|
+ char sstr[40]={0},sstrtemp[100]={ 0 };
|
|
|
+ char requestedMessagestr[40]={0};
|
|
|
+ char comfirmstr[20]={0};
|
|
|
+ int c = 0;
|
|
|
+ char *loc;
|
|
|
+
|
|
|
+ DEBUG_INFO("handleTriggerMessageRequest\n");
|
|
|
+ //[2,"266e23f4-27a4-41cf-84cb-aadf56b9523f","TriggerMessage",{"requestedMessage":"DiagnosticsStatusNotification","connectorId":1}]
|
|
|
+ strcpy(sstrtemp, stringtrimspace(payload));
|
|
|
+
|
|
|
+ c = 0;
|
|
|
+ loc = strstr(sstrtemp, "requestedMessage");
|
|
|
+ while (loc[3+strlen("requestedMessage")+c] != '\"')
|
|
|
+ {
|
|
|
+ sstr[c] = loc[3+strlen("requestedMessage")+c];
|
|
|
+ c++;
|
|
|
+ }
|
|
|
+ sstr[c] = '\0';
|
|
|
+ strcpy(requestedMessagestr, sstr);
|
|
|
+
|
|
|
+ c = 0;
|
|
|
+ loc = strstr(sstrtemp, "connectorId");
|
|
|
+ if(loc == NULL)
|
|
|
+ {
|
|
|
+ connectorIdIsNULL = TRUE;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ memset(sstr ,0, sizeof(sstr) );
|
|
|
+ while ((loc[strlen("connectorId")+2+c] != ',')&&(loc[strlen("connectorId")+2+c] != '}'))
|
|
|
+ {
|
|
|
+ sstr[c] = loc[strlen("connectorId")+2+c];
|
|
|
+ //printf("i=%d sstr=%c\n",c, sstr[c]);
|
|
|
+ c++;
|
|
|
+ }
|
|
|
+ sstr[c] = '\0';
|
|
|
+ connectorIdInt = atoi(sstr);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ if(connectorIdIsNULL == FALSE && ((connectorIdInt > 0) && (connectorIdInt <= gunTotalNumber /*(CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY)*/ )))
|
|
|
+ {
|
|
|
+ //connectorIdInt = json_object_get_int(connectorId);
|
|
|
+ sprintf((char *)ShmOCPP16Data->TriggerMessage[connectorIdInt -1].RequestedMessage, "%s" ,requestedMessagestr);
|
|
|
+ ShmOCPP16Data->TriggerMessage[connectorIdInt -1].ConnectorId = connectorIdInt;
|
|
|
+ //ShmOCPP16Data->CsMsg.bits[connectorIdInt -1].TriggerMessageReq = 1;
|
|
|
+ sprintf(comfirmstr, "%s",TriggerMessageStatusStr[TriggerMessageStatus_Accepted] );
|
|
|
+ sendTriggerMessageConfirmation(uuid,comfirmstr);
|
|
|
+ }
|
|
|
+ else if(connectorIdIsNULL == FALSE && ((connectorIdInt <= 0) || (connectorIdInt > gunTotalNumber /*(CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY)*/) ))
|
|
|
+ {
|
|
|
+ sprintf(comfirmstr, "%s",TriggerMessageStatusStr[TriggerMessageStatus_Rejected] );
|
|
|
+ sendTriggerMessageConfirmation(uuid,comfirmstr);
|
|
|
+ return TRUE;
|
|
|
+ }
|
|
|
+
|
|
|
+ if((strcmp(requestedMessagestr, MessageTriggerStr[FirmwareStatusNotification]) != 0) &&
|
|
|
+ (strcmp(requestedMessagestr, MessageTriggerStr[DiagnosticsStatusNotification]) != 0) &&
|
|
|
+ (strcmp(requestedMessagestr, MessageTriggerStr[BootNotification]) != 0 ) &&
|
|
|
+ (strcmp(requestedMessagestr, MessageTriggerStr[Heartbeat]) != 0) &&
|
|
|
+ (strcmp(requestedMessagestr, MessageTriggerStr[MeterValues]) != 0) &&
|
|
|
+ (strcmp(requestedMessagestr, MessageTriggerStr[StatusNotification]) != 0 ))
|
|
|
+ {
|
|
|
+ sprintf(comfirmstr, "%s",TriggerMessageStatusStr[TriggerMessageStatus_NotImplemented] );
|
|
|
+ sendTriggerMessageConfirmation(uuid,comfirmstr);
|
|
|
+ return TRUE;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ sprintf(comfirmstr, "%s",TriggerMessageStatusStr[TriggerMessageStatus_Accepted] );
|
|
|
+ sendTriggerMessageConfirmation(uuid,comfirmstr);
|
|
|
+ }
|
|
|
+
|
|
|
+ if( strcmp(requestedMessagestr, MessageTriggerStr[FirmwareStatusNotification]) == 0)
|
|
|
+ {
|
|
|
+ if((FirmwareStatusNotificationStatus != FIRMWARE_STATUS_DOWNLOADING) &&
|
|
|
+ (FirmwareStatusNotificationStatus != FIRMWARE_STATUS_IDLE) &&
|
|
|
+ (FirmwareStatusNotificationStatus != FIRMWARE_STATUS_INSTALLING) )
|
|
|
+ {
|
|
|
+ FirmwareStatusNotificationStatus = FIRMWARE_STATUS_IDLE;
|
|
|
+ }
|
|
|
+
|
|
|
+ sendFirmwareStatusNotificationRequest(FirmwareStatusStr[FirmwareStatusNotificationStatus]);
|
|
|
+ //sprintf(comfirmstr, "%s",TriggerMessageStatusStr[TriggerMessageStatus_Accepted] );
|
|
|
+
|
|
|
+ }
|
|
|
+ else if(strcmp(requestedMessagestr, MessageTriggerStr[DiagnosticsStatusNotification]) == 0 )
|
|
|
+ {
|
|
|
+ //printf("DiagnosticsStatusStr[DiagnosticsStatus_Idle] =%s\n",DiagnosticsStatusStr[DiagnosticsStatus_Idle]);
|
|
|
+ sendDiagnosticsStatusNotificationRequest(DiagnosticsStatusStr[DiagnosticsStatusNotificationStatus]);
|
|
|
+ //sprintf(comfirmstr, "%s",TriggerMessageStatusStr[TriggerMessageStatus_Accepted] );
|
|
|
+
|
|
|
+ }
|
|
|
+ else if(strcmp(requestedMessagestr, MessageTriggerStr[BootNotification]) == 0 )
|
|
|
+ {
|
|
|
+ sendBootNotificationRequest();
|
|
|
+ //sprintf(comfirmstr, "%s",TriggerMessageStatusStr[TriggerMessageStatus_Accepted] );
|
|
|
+
|
|
|
+ }
|
|
|
+ else if(strcmp(requestedMessagestr, MessageTriggerStr[Heartbeat]) == 0 )
|
|
|
+ {
|
|
|
+ sendHeartbeatRequest(connectorIdInt);
|
|
|
+ //sprintf(comfirmstr, "%s",TriggerMessageStatusStr[TriggerMessageStatus_Accepted] );
|
|
|
+ }
|
|
|
+ else if (strcmp(requestedMessagestr, MessageTriggerStr[MeterValues]) == 0 )
|
|
|
+ {
|
|
|
+ if(connectorIdIsNULL == FALSE)
|
|
|
+ {
|
|
|
+ if((connectorIdInt > 0) && ((connectorIdInt -1) < gunTotalNumber))
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->CsMsg.bits[connectorIdInt -1].TriggerMessageReq = 1;
|
|
|
+ sendMeterValuesRequest(connectorIdInt -1);
|
|
|
+ //sprintf(comfirmstr, "%s",TriggerMessageStatusStr[TriggerMessageStatus_Accepted] );
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ for(int idx=0;idx< gunTotalNumber;idx++)
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->CsMsg.bits[idx].TriggerMessageReq = 1;
|
|
|
+ sendMeterValuesRequest(idx);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if(strcmp(requestedMessagestr, MessageTriggerStr[StatusNotification]) == 0 )
|
|
|
+ {
|
|
|
+ if(connectorIdIsNULL == FALSE)
|
|
|
+ {
|
|
|
+ if((connectorIdInt > 0) && ((connectorIdInt -1) < gunTotalNumber))
|
|
|
+ {
|
|
|
+ sendStatusNotificationRequest(connectorIdInt -1);
|
|
|
+ //sprintf(comfirmstr, "%s",TriggerMessageStatusStr[TriggerMessageStatus_Accepted] );
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ for(int idx=0;idx< gunTotalNumber;idx++)
|
|
|
+ sendStatusNotificationRequest(idx);
|
|
|
+
|
|
|
+ //sprintf(comfirmstr, "%s",TriggerMessageStatusStr[TriggerMessageStatus_Accepted] );
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ return result;
|
|
|
+}
|
|
|
+
|
|
|
+int handleUnlockConnectorRequest(char *uuid, char *payload)
|
|
|
+{
|
|
|
+ mtrace();
|
|
|
+ int result = FAIL;
|
|
|
+ char sstr[6]={0},sstrtemp[50]={ 0 };
|
|
|
+ int connectorIdInt =0;
|
|
|
+ char comfirmstr[20]={0};
|
|
|
+ int c = 0;
|
|
|
+ int tempIndex = 0;
|
|
|
+ char *loc;
|
|
|
+
|
|
|
+//[2,"ba1cbd49-2a76-493a-8f76-fa23e7606532","UnlockConnector",{"connectorId":1}]
|
|
|
+ DEBUG_INFO("handleUnlockConnectorRequest ...\n");
|
|
|
+
|
|
|
+ strcpy(sstrtemp, stringtrimspace(payload));
|
|
|
+ c = 0;
|
|
|
+ loc = strstr(sstrtemp, "connectorId");
|
|
|
+ memset(sstr ,0, sizeof(sstr) );
|
|
|
+ while (loc[strlen("connectorId")+2+c] != '}')
|
|
|
+ {
|
|
|
+ sstr[c] = loc[strlen("connectorId")+2+c];
|
|
|
+ //printf("i=%d sstr=%c\n",c, sstr[c]);
|
|
|
+ c++;
|
|
|
+ }
|
|
|
+ sstr[c] = '\0';
|
|
|
+ connectorIdInt = atoi(sstr);
|
|
|
+ DEBUG_INFO("\n unlock connectorIdInt=%d\n",connectorIdInt);
|
|
|
+
|
|
|
+ if(gunTotalNumber == 0)
|
|
|
+ {
|
|
|
+ sprintf(comfirmstr, "%s", UnlockStatusStr[UnlockStatus_NotSupported] );
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+ else if((connectorIdInt > gunTotalNumber/*CHAdeMO_QUANTITY+ CCS_QUANTITY + GB_QUANTITY*/) || (connectorIdInt <= 0))
|
|
|
+ {
|
|
|
+ //sprintf(comfirmstr, "%s", UnlockStatusStr[UnlockStatus_NotSupported] );
|
|
|
+ sprintf(comfirmstr, "%s", UnlockStatusStr[UnlockStatus_NotSupported] );
|
|
|
+ goto end;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ //check Transaction active
|
|
|
+ if(gunType[connectorIdInt-1] == 'J')
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
+ {
|
|
|
+ tempIndex = (((connectorIdInt -1)==2) ? 1: 0);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tempIndex = connectorIdInt -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < CHAdeMO_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if ((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex ) && ((ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_CHARGING) || (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].SystemStatus == SYS_MODE_IDLE) ))
|
|
|
+ {
|
|
|
+ //stop Transaction
|
|
|
+ ShmOCPP16Data->CsMsg.bits[connectorIdInt-1].UnlockConnectorReq = 1;
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if((gunType[connectorIdInt-1] == 'U')||(gunType[connectorIdInt-1] == 'E'))
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
+ {
|
|
|
+ tempIndex = (((connectorIdInt -1)==2) ? 1: 0);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tempIndex = connectorIdInt -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < CCS_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if ((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex ) && ((ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_CHARGING) || (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].SystemStatus == SYS_MODE_IDLE) ))
|
|
|
+ {
|
|
|
+ //stop Transaction
|
|
|
+ ShmOCPP16Data->CsMsg.bits[connectorIdInt-1].UnlockConnectorReq = 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if(gunType[connectorIdInt-1] == 'G')
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
+ {
|
|
|
+ tempIndex = (((connectorIdInt -1)==2) ? 1: 0);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tempIndex = connectorIdInt -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < GB_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if ((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex ) &&((ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_CHARGING)||(ShmSysConfigAndInfo->SysInfo.GbChargingData[index].SystemStatus == SYS_MODE_IDLE)))
|
|
|
+ {
|
|
|
+ //stop Transaction
|
|
|
+ ShmOCPP16Data->CsMsg.bits[connectorIdInt-1].UnlockConnectorReq = 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
|
|
|
+ {
|
|
|
+ tempIndex = 2;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tempIndex = connectorIdInt-1;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < AC_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if ((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex ) && ((ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_CHARGING) || (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].SystemStatus == SYS_MODE_IDLE) ))
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->CsMsg.bits[connectorIdInt-1].UnlockConnectorReq = 1;
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ ShmOCPP16Data->UnlockConnector[connectorIdInt-1].ConnectorId = connectorIdInt;
|
|
|
+ strcpy((char *)ShmOCPP16Data->UnlockConnector[connectorIdInt-1].guid, uuid);
|
|
|
+ result = TRUE;
|
|
|
+ return result;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+end:
|
|
|
+ //json_object_put(obj); --- remove temporally
|
|
|
+ sendUnlockConnectorConfirmation(uuid, comfirmstr);
|
|
|
+ return result;
|
|
|
+}
|
|
|
+
|
|
|
+static char UpdateFirmwarepayloadData[300]={0};
|
|
|
+int handleUpdateFirmwareRequest(char *uuid, char *payload)
|
|
|
+{
|
|
|
+ mtrace();
|
|
|
+ int result = FAIL;
|
|
|
+ pthread_t t;
|
|
|
+
|
|
|
+ sendUpdateFirmwareConfirmation(uuid);
|
|
|
+ memset(UpdateFirmwarepayloadData, 0, 300);
|
|
|
+ strcpy(UpdateFirmwarepayloadData, stringtrimspace(payload));
|
|
|
+ pthread_create(&t, NULL, UpdateFirmwareProcess, stringtrimspace(payload));
|
|
|
+ ////pthread_join(t, NULL); //
|
|
|
+ //pthread_detach(t);
|
|
|
+
|
|
|
+ //sendUpdateFirmwareConfirmation(uuid);
|
|
|
+ ShmOCPP16Data->MsMsg.bits.UpdateFirmwareConf =1;
|
|
|
+ //ShmOCPP16Data->MsMsg.bits.UpdateFirmwareReq = 1;
|
|
|
+ return result;
|
|
|
+}
|
|
|
+
|
|
|
+void *UpdateFirmwareProcess(void *data)
|
|
|
+{
|
|
|
+ pthread_detach(pthread_self());
|
|
|
+ mtrace();
|
|
|
+ int retriesInt =0, retryIntervalInt=0;
|
|
|
+ char protocol[10], user[50],password[50],host[50], path[50], ftppath[60],host1[50],path1[20];
|
|
|
+ int port=0;
|
|
|
+ char locationstr[160]={0}, retrieveDatestr[30]={0};
|
|
|
+ //char fname[50]="00000_2018-09-07 160902_CSULog.zip";
|
|
|
+ //char comfirmstr[20];
|
|
|
+ int isSuccess = 0;
|
|
|
+ char ftpbuf[200];
|
|
|
+ char temp[100];
|
|
|
+ char * pch;
|
|
|
+ int retriesISNULL=FALSE;
|
|
|
+ int retryInterval=FALSE;
|
|
|
+ int c = 0;
|
|
|
+ //int i = 0;
|
|
|
+ char *loc;
|
|
|
+ char sstr[300]={ 0 };
|
|
|
+ char str[300]={ 0 };
|
|
|
+ //char *str = (char*) data; // ? ?頛詨鞈 ?
|
|
|
+ DEBUG_INFO("handleUpdateFirmwareRequest ...\n");
|
|
|
+ //DEBUG_INFO("packet=%s\n", (const char*)payloadData);
|
|
|
+ strcpy(str,(const char*)UpdateFirmwarepayloadData);
|
|
|
+ //***************location **************/
|
|
|
+ loc = strstr(str, "location");
|
|
|
+ memset(sstr ,0, sizeof(sstr) );
|
|
|
+ c = 0;
|
|
|
+ while (loc[3+strlen("location")+c] != '\"')
|
|
|
+ {
|
|
|
+ sstr[c] = loc[3+strlen("location")+c];
|
|
|
+ c++;
|
|
|
+ }
|
|
|
+ sstr[c] = '\0';
|
|
|
+ strcpy(locationstr, sstr);
|
|
|
+
|
|
|
+ //***************retries**************/
|
|
|
+ c = 0;
|
|
|
+ loc = strstr(str, "retries");
|
|
|
+ if(loc == NULL)
|
|
|
+ {
|
|
|
+ retriesISNULL=TRUE;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ memset(sstr ,0, sizeof(sstr) );
|
|
|
+ while (loc[strlen("retries")+2+c] != ',')
|
|
|
+ {
|
|
|
+ sstr[c] = loc[strlen("retries")+2+c];
|
|
|
+ //printf("i=%d sstr=%c\n",c, sstr[c]);
|
|
|
+ c++;
|
|
|
+ }
|
|
|
+ sstr[c] = '\0';
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if(retriesISNULL == FALSE)
|
|
|
+ {
|
|
|
+ retriesInt = atoi(sstr);
|
|
|
+ }
|
|
|
+
|
|
|
+ //***************retrieveDate **************/
|
|
|
+ loc = strstr(str, "retrieveDate");
|
|
|
+ memset(sstr ,0, sizeof(sstr) );
|
|
|
+ c = 0;
|
|
|
+ while (loc[3+strlen("retrieveDate")+c] != '\"')
|
|
|
+ {
|
|
|
+ sstr[c] = loc[3+strlen("retrieveDate")+c];
|
|
|
+ c++;
|
|
|
+ }
|
|
|
+ sstr[c] = '\0';
|
|
|
+ strcpy(retrieveDatestr, sstr);
|
|
|
+
|
|
|
+ //***************retryInterval **************/
|
|
|
+ c = 0;
|
|
|
+ loc = strstr(str, "retryInterval");
|
|
|
+ memset(sstr ,0, sizeof(sstr) );
|
|
|
+ if(loc == NULL)
|
|
|
+ {
|
|
|
+ retryInterval=TRUE;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ while ((loc[strlen("retryInterval")+2+c] != ',') && (loc[strlen("retryInterval")+2+c] != '}'))
|
|
|
+ {
|
|
|
+ sstr[c] = loc[strlen("retryInterval")+2+c];
|
|
|
+ //DEBUG_INFO("i=%d sstr=%c\n",c, sstr[c]);
|
|
|
+ c++;
|
|
|
+ }
|
|
|
+ sstr[c] = '\0';
|
|
|
+ }
|
|
|
+
|
|
|
+ if(retryInterval==FALSE)
|
|
|
+ {
|
|
|
+ retryIntervalInt = atoi(sstr);
|
|
|
+ }
|
|
|
+
|
|
|
+ memset(ftppath, 0, sizeof(ftppath));
|
|
|
+ memset(path, 0, sizeof(path));
|
|
|
+
|
|
|
+ sendFirmwareStatusNotificationRequest(FirmwareStatusStr[FirmwareStatus_Downloading]);
|
|
|
+ ShmOCPP16Data->MsMsg.bits.UpdateFirmwareReq = 1;
|
|
|
+
|
|
|
+ if(strncmp(locationstr,"http", 4) == 0)
|
|
|
+ {
|
|
|
+ sscanf(locationstr,"%[^:]:%*2[/]%[^/]/%199[^\n]",
|
|
|
+ protocol, host, path);
|
|
|
+
|
|
|
+ //sscanf(locationstr,"%[^:]:%*2[/]%[^:]:%[^@]@%[^/]%199[^\n]",
|
|
|
+ // protocol, user, password, host, path);
|
|
|
+ sprintf(ftppath,"/%s", path);
|
|
|
+
|
|
|
+ //DEBUG_INFO("protocol =%s\n",protocol);
|
|
|
+
|
|
|
+ //DEBUG_INFO("host =%s\n",host);
|
|
|
+
|
|
|
+ //DEBUG_INFO("path =%s\n",path);
|
|
|
+ //DEBUG_INFO("ftppath=%s\n",ftppath);
|
|
|
+ int ftppathlen=strlen(ftppath);
|
|
|
+ int i=1;
|
|
|
+ char filenametemp[50];
|
|
|
+ while(i < ftppathlen)
|
|
|
+ {
|
|
|
+ int len=ftppathlen-i;
|
|
|
+ if(ftppath[len]== 47) // '/' ascll code: 47
|
|
|
+ {
|
|
|
+ DEBUG_INFO("compare '/' all right\n");
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ i=i+1;
|
|
|
+ }
|
|
|
+
|
|
|
+ memset(filenametemp, 0, sizeof(filenametemp));
|
|
|
+ strncpy(filenametemp, ftppath+(ftppathlen-i+1), i+1);
|
|
|
+ filenametemp[i+1] = 0;
|
|
|
+ //sendFirmwareStatusNotificationRequest(FirmwareStatusStr[FirmwareStatus_Downloading]);
|
|
|
+
|
|
|
+
|
|
|
+ do{
|
|
|
+ isSuccess = httpDownLoadFile(host, ftppath, filenametemp, locationstr);
|
|
|
+ sleep(retryIntervalInt);
|
|
|
+ }while((isSuccess == 0)&&(retriesInt > 0 && retriesInt --));
|
|
|
+
|
|
|
+ // isSuccess = httpDownLoadFile(host, ftppath, filenametemp, locationstr);
|
|
|
+
|
|
|
+ if(!isSuccess)
|
|
|
+ {
|
|
|
+ sendFirmwareStatusNotificationRequest(FirmwareStatusStr[FirmwareStatus_DownloadFailed]);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ //ShmOCPP16Data->MsMsg.bits.UpdateFirmwareReq = 1;
|
|
|
+ sendFirmwareStatusNotificationRequest(FirmwareStatusStr[FirmwareStatus_Downloaded]);
|
|
|
+ //isUpdateRequest = TRUE;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ else if(strncmp(locationstr,"ftp", 3) == 0) // ftp
|
|
|
+ {
|
|
|
+ memset(ftpbuf, 0, sizeof(ftpbuf));
|
|
|
+ memset(temp, 0, sizeof(temp));
|
|
|
+ //DEBUG_INFO("locationstr=%s\n",locationstr);
|
|
|
+ strcpy(ftpbuf, locationstr/*"ftp://ipc_ui:pht2016@ftp.phihong.com.tw/DC/log/DemoDC1_2018-07-13_185011_PSULog.zip"*/ );
|
|
|
+ int ftppathlen=strlen(ftpbuf);
|
|
|
+ int i=1;
|
|
|
+ char filenametemp[50];
|
|
|
+ while(i < ftppathlen)
|
|
|
+ {
|
|
|
+ int len=ftppathlen-i;
|
|
|
+ if(ftpbuf[len]== 47) // '/' ascll code: 47
|
|
|
+ {
|
|
|
+ DEBUG_INFO(" compare '/' all right\n");
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ i=i+1;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ memset(filenametemp, 0, sizeof(filenametemp));
|
|
|
+ strncpy(filenametemp, ftpbuf+(ftppathlen-i+1), i+1);
|
|
|
+ filenametemp[i+1] = 0;
|
|
|
+ strncpy(temp, ftpbuf, ftppathlen-i+1);
|
|
|
+
|
|
|
+ pch=strchr(temp,'@');
|
|
|
+ if(pch==NULL)
|
|
|
+ {
|
|
|
+ sscanf(temp,"%[^:]:%*2[/]%[^:]:%i/%[a-zA-Z0-9._/-]",
|
|
|
+ protocol, host, &port, path);
|
|
|
+ strcpy(user,"anonymous");
|
|
|
+ strcpy(password,"");
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ sscanf(temp,"%[^:]:%*2[/]%[^:]:%[^@]@%[^:]:%i/%199[^\n]",
|
|
|
+ protocol, user, password, host, &port, path);
|
|
|
+ }
|
|
|
+
|
|
|
+ sscanf(host,"%[^/]%s",host1, path1);
|
|
|
+ sprintf(ftppath,"%s", path1);
|
|
|
+
|
|
|
+ //DEBUG_INFO("protocol =%s\n",protocol);
|
|
|
+ //DEBUG_INFO("user =%s\n",user);
|
|
|
+ //DEBUG_INFO("password =%s\n",password);
|
|
|
+ //DEBUG_INFO("host1 =%s\n",host1);
|
|
|
+ //DEBUG_INFO("port =%d\n",port);
|
|
|
+ //DEBUG_INFO("path1 =%s\n",path1);
|
|
|
+ //DEBUG_INFO("ftppath=%s\n",ftppath);
|
|
|
+
|
|
|
+ //ftpFile(host, user, password, port, ftppath, fname);
|
|
|
+ //download firmware pthred
|
|
|
+ if(port == 0)
|
|
|
+ {
|
|
|
+ port = 21;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ //sendFirmwareStatusNotificationRequest(FirmwareStatusStr[FirmwareStatus_Downloading]);
|
|
|
+
|
|
|
+ do{
|
|
|
+ isSuccess = ftpDownLoadFile(host1, user, password, port, ftppath, filenametemp, locationstr);
|
|
|
+ sleep(retryIntervalInt);
|
|
|
+ }while((!isSuccess)&&(retriesInt > 0 && retriesInt --));
|
|
|
+
|
|
|
+
|
|
|
+ if(!isSuccess)
|
|
|
+ {
|
|
|
+ //BulldogUtil.sleepMs(interval*1000);
|
|
|
+ DEBUG_INFO("Update firmware request and download file fail.\n");
|
|
|
+ sendFirmwareStatusNotificationRequest(FirmwareStatusStr[FirmwareStatus_DownloadFailed]);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ //ShmOCPP16Data->MsMsg.bits.UpdateFirmwareReq = 1;
|
|
|
+ sendFirmwareStatusNotificationRequest(FirmwareStatusStr[FirmwareStatus_Downloaded]);
|
|
|
+ //isUpdateRequest = TRUE;
|
|
|
+ }
|
|
|
+ ShmOCPP16Data->MsMsg.bits.UpdateFirmwareReq = 1;
|
|
|
+
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+
|
|
|
+ sendFirmwareStatusNotificationRequest(FirmwareStatusStr[FirmwareStatus_DownloadFailed]);
|
|
|
+ //ShmOCPP16Data->MsMsg.bits.UpdateFirmwareReq = 1;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ pthread_exit(NULL);
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+//==========================================
|
|
|
+// Handle server response routine
|
|
|
+//==========================================
|
|
|
+void handleAuthorizeResponse(char *payload, int gun_index)
|
|
|
+{
|
|
|
+ mtrace();
|
|
|
+ char expiryDatestr[30]={0};
|
|
|
+ char parentIdTagstr[20]={0};
|
|
|
+ char statusstr[20]={0};
|
|
|
+ char expiryDatestrtemp[30]={0};
|
|
|
+ char parentIdTagstrtemp[20]={0};
|
|
|
+ char IdTagstrtemp[20]={0};
|
|
|
+ char statusstrtemp[20]={0};
|
|
|
+ int expiryDateISNULL=FALSE;
|
|
|
+ int parentIdTagISNULL=FALSE;
|
|
|
+ char sstr[160]={0};
|
|
|
+ char* filename = AuthorizationCache_JSON;
|
|
|
+ char tempfile[] = "/Storage/OCPP/Authorizetemp.json";
|
|
|
+ char *loc;
|
|
|
+ int resultRename=0;
|
|
|
+ int responseIdTagInfoAsZero= 0;
|
|
|
+ char rmFileCmd[50]={0};
|
|
|
+
|
|
|
+ DEBUG_INFO("handleAuthorizeResponse...\n");
|
|
|
+ json_object *Authorize;
|
|
|
+ Authorize = json_tokener_parse(payload);
|
|
|
+
|
|
|
+ if(!is_error(Authorize))
|
|
|
+ {
|
|
|
+ if(json_object_object_get(Authorize, "idTagInfo") != NULL)
|
|
|
+ {
|
|
|
+ // Required data
|
|
|
+ sprintf((char *)statusstr, "%s", json_object_get_string(json_object_object_get(json_object_object_get(Authorize,"idTagInfo"), "status")));
|
|
|
+
|
|
|
+ // Optional data
|
|
|
+ if(json_object_object_get(json_object_object_get(Authorize,"idTagInfo"), "expiryDate") != NULL)
|
|
|
+ sprintf((char *)expiryDatestr, "%s", json_object_get_string(json_object_object_get(json_object_object_get(Authorize,"idTagInfo"), "expiryDate")));
|
|
|
+
|
|
|
+ if(json_object_object_get(json_object_object_get(Authorize,"idTagInfo"), "parentIdTag") != NULL)
|
|
|
+ sprintf((char *)parentIdTagstr, "%s", json_object_get_string(json_object_object_get(json_object_object_get(Authorize,"idTagInfo"), "parentIdTag")));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ json_object_put(Authorize);
|
|
|
+
|
|
|
+
|
|
|
+ if(expiryDateISNULL == FALSE)
|
|
|
+ strcpy((char *)ShmOCPP16Data->Authorize.ResponseIdTagInfo.ExpiryDate, expiryDatestr);
|
|
|
+
|
|
|
+ if(parentIdTagISNULL == FALSE)
|
|
|
+ strcpy((char *)ShmOCPP16Data->Authorize.ResponseIdTagInfo.ParentIdTag, parentIdTagstr);
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->Authorize.ResponseIdTagInfo.Status, statusstr);
|
|
|
+
|
|
|
+ //Update idTag information to authorization cache if supproted
|
|
|
+ if((strcmp((const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizationCacheEnabled].ItemData, "TRUE") == 0) && (ShmOCPP16Data->Authorize.ResponseIdTagInfo.ParentIdTag != NULL) && (ShmOCPP16Data->Authorize.ResponseIdTagInfo.ExpiryDate != NULL) )
|
|
|
+ {
|
|
|
+ if((access(filename,F_OK))!=-1)
|
|
|
+ {
|
|
|
+ printf("AuthorizationCache exist.\n");
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ printf("AuthorizationCache not exist\n");
|
|
|
+ FILE *log = fopen(filename, "w+");
|
|
|
+
|
|
|
+ if(log == NULL)
|
|
|
+ {
|
|
|
+ printf("log is NULL\n");
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ fclose(log);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ FILE *infile;
|
|
|
+ FILE *outfile;
|
|
|
+ // open file for writing
|
|
|
+ infile = fopen (filename, "r");
|
|
|
+ outfile = fopen (tempfile, "w");
|
|
|
+
|
|
|
+
|
|
|
+ int c;
|
|
|
+ c = fgetc(infile);
|
|
|
+ //DEBUG_INFO("c:%d\n",c);
|
|
|
+ rewind(infile);
|
|
|
+
|
|
|
+ if(c == EOF)
|
|
|
+ {
|
|
|
+ DEBUG_INFO("Orignal File is NULL\n");
|
|
|
+ if(ShmOCPP16Data->Authorize.ResponseIdTagInfo.ExpiryDate != NULL)
|
|
|
+ {
|
|
|
+ strcpy(expiryDatestrtemp, (const char *)ShmOCPP16Data->Authorize.ResponseIdTagInfo.ExpiryDate);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ strcpy(expiryDatestrtemp, "");
|
|
|
+ }
|
|
|
+
|
|
|
+ if(ShmOCPP16Data->Authorize.ResponseIdTagInfo.ParentIdTag != NULL)
|
|
|
+ {
|
|
|
+ strcpy(parentIdTagstrtemp, (const char *)ShmOCPP16Data->Authorize.ResponseIdTagInfo.ParentIdTag);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ strcpy(parentIdTagstrtemp, (const char *)ShmOCPP16Data->Authorize.IdTag);
|
|
|
+ }
|
|
|
+
|
|
|
+ strcpy(statusstrtemp, (const char *)ShmOCPP16Data->Authorize.ResponseIdTagInfo.Status);
|
|
|
+
|
|
|
+ fprintf(outfile,"[{\"idTag\":\"%s\",\"idTagInfo\":{\"expiryDate\":\"%s\",\"parentIdTag\":\"%s\",\"status\":\"%s\"}}]\n",ShmOCPP16Data->Authorize.IdTag, expiryDatestrtemp, parentIdTagstrtemp, statusstrtemp);
|
|
|
+ fclose(infile);
|
|
|
+ fclose(outfile);
|
|
|
+
|
|
|
+ sprintf(rmFileCmd,"rm -f %s",filename);
|
|
|
+ system(rmFileCmd);
|
|
|
+
|
|
|
+ resultRename = rename(tempfile, filename);
|
|
|
+
|
|
|
+ if(resultRename == 0)
|
|
|
+ {
|
|
|
+ printf("File renamed successfully");
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ printf("Error: unable to rename the file");
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ char buf[160]={0};
|
|
|
+
|
|
|
+ while (fgets(buf, sizeof(buf), infile) != NULL)
|
|
|
+ {
|
|
|
+ buf[strlen(buf) - 1] = '\0'; // eat the newline fgets() stores
|
|
|
+
|
|
|
+ memset(expiryDatestr, 0, sizeof(expiryDatestrtemp));
|
|
|
+ memset(parentIdTagstr,0, sizeof(parentIdTagstrtemp));
|
|
|
+ memset(statusstr, 0, sizeof(statusstrtemp));
|
|
|
+ memset(IdTagstrtemp, 0, sizeof(IdTagstrtemp));
|
|
|
+ memset(expiryDatestrtemp, 0, sizeof(expiryDatestrtemp));
|
|
|
+ memset(parentIdTagstrtemp, 0, sizeof(parentIdTagstrtemp));
|
|
|
+ memset(statusstrtemp, 0, sizeof(statusstrtemp));
|
|
|
+
|
|
|
+ //------------------IdTag-----------------------
|
|
|
+ loc = strstr(buf, "idTag");
|
|
|
+ memset(sstr ,0, sizeof(sstr) );
|
|
|
+ c = 0;
|
|
|
+ while (loc[3+strlen("idTag")+c] != '\"')
|
|
|
+ {
|
|
|
+ sstr[c] = loc[3+strlen("idTag")+c];
|
|
|
+ c++;
|
|
|
+ }
|
|
|
+ sstr[c] = '\0';
|
|
|
+ strcpy(IdTagstrtemp,sstr);
|
|
|
+
|
|
|
+ //*********************expiryDate***************/
|
|
|
+ loc = strstr(buf, "expiryDate");
|
|
|
+ memset(sstr ,0, sizeof(sstr) );
|
|
|
+ c = 0;
|
|
|
+ while (loc[3+strlen("expiryDate")+c] != '\"')
|
|
|
+ {
|
|
|
+ sstr[c] = loc[3+strlen("expiryDate")+c];
|
|
|
+ c++;
|
|
|
+ }
|
|
|
+ sstr[c] = '\0';
|
|
|
+ strcpy(expiryDatestr,sstr);
|
|
|
+
|
|
|
+ //*********************parentIdTag***************/
|
|
|
+ loc = strstr(buf, "parentIdTag");
|
|
|
+ memset(sstr ,0, sizeof(sstr) );
|
|
|
+ c = 0;
|
|
|
+ while (loc[3+strlen("parentIdTag")+c] != '\"')
|
|
|
+ {
|
|
|
+ sstr[c] = loc[3+strlen("parentIdTag")+c];
|
|
|
+ c++;
|
|
|
+ }
|
|
|
+ sstr[c] = '\0';
|
|
|
+ strcpy(parentIdTagstr,sstr);
|
|
|
+
|
|
|
+ //*********************status***************/
|
|
|
+ loc = strstr(buf, "status");
|
|
|
+ memset(sstr ,0, sizeof(sstr) );
|
|
|
+ c = 0;
|
|
|
+ while (loc[3+strlen("status")+c] != '\"')
|
|
|
+ {
|
|
|
+ sstr[c] = loc[3+strlen("status")+c];
|
|
|
+ c++;
|
|
|
+ }
|
|
|
+ sstr[c] = '\0';
|
|
|
+ strcpy(statusstr,sstr);
|
|
|
+
|
|
|
+ if(((ShmOCPP16Data->Authorize.ResponseIdTagInfo.ParentIdTag == NULL) || strcmp((const char *)ShmOCPP16Data->Authorize.ResponseIdTagInfo.ParentIdTag, "") == 0) || (strcmp((const char *)ShmOCPP16Data->Authorize.IdTag, IdTagstrtemp) == 0))
|
|
|
+ {
|
|
|
+ DEBUG_INFO("ShmOCPP16Data->Authorize.ResponseIdTagInfo.ParentIdTag is NULL\n");
|
|
|
+ responseIdTagInfoAsZero = 1;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ DEBUG_INFO("ShmOCPP16Data->Authorize.ResponseIdTagInfo.ParentIdTag=%s\n",ShmOCPP16Data->Authorize.ResponseIdTagInfo.ParentIdTag);
|
|
|
+ }
|
|
|
+
|
|
|
+ if((responseIdTagInfoAsZero == 0)&&((strcmp(parentIdTagstr,(const char *)ShmOCPP16Data->Authorize.ResponseIdTagInfo.ParentIdTag) == 0)|| (strcmp(IdTagstrtemp,(const char *)ShmOCPP16Data->Authorize.IdTag) == 0)))
|
|
|
+ {
|
|
|
+ //modify item
|
|
|
+
|
|
|
+ if(ShmOCPP16Data->Authorize.ResponseIdTagInfo.ExpiryDate != NULL)
|
|
|
+ {
|
|
|
+ strcpy(expiryDatestrtemp,(const char *)ShmOCPP16Data->Authorize.ResponseIdTagInfo.ExpiryDate);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ strcpy(expiryDatestrtemp, "");
|
|
|
+ }
|
|
|
+
|
|
|
+ if(ShmOCPP16Data->Authorize.ResponseIdTagInfo.ParentIdTag != NULL)
|
|
|
+ {
|
|
|
+ strcpy(parentIdTagstrtemp,(const char *)ShmOCPP16Data->Authorize.ResponseIdTagInfo.ParentIdTag);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ strcpy(parentIdTagstrtemp, parentIdTagstr);
|
|
|
+ }
|
|
|
+ strcpy(statusstrtemp,(const char *)ShmOCPP16Data->Authorize.ResponseIdTagInfo.Status);
|
|
|
+
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ //wrie original item
|
|
|
+ strcpy(expiryDatestrtemp, expiryDatestr);
|
|
|
+ strcpy(parentIdTagstrtemp, parentIdTagstr);
|
|
|
+ strcpy(statusstrtemp, statusstr);
|
|
|
+ }
|
|
|
+
|
|
|
+ fprintf(outfile,"[{\"idTag\":\"%s\",\"idTagInfo\":{\"expiryDate\":\"%s\",\"parentIdTag\":\"%s\",\"status\":\"%s\"}}]\n",ShmOCPP16Data->Authorize.IdTag, expiryDatestrtemp, parentIdTagstrtemp, statusstrtemp);
|
|
|
+ }
|
|
|
+
|
|
|
+ fclose(infile);
|
|
|
+ fclose(outfile);
|
|
|
+
|
|
|
+ sprintf(rmFileCmd,"rm -f %s",filename);
|
|
|
+ system(rmFileCmd);
|
|
|
+
|
|
|
+ resultRename = rename(tempfile, filename);
|
|
|
+
|
|
|
+ if(resultRename == 0)
|
|
|
+ {
|
|
|
+ DEBUG_INFO("File renamed successfully");
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ DEBUG_INFO("Error: unable to rename the file");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+out:
|
|
|
+ ShmOCPP16Data->SpMsg.bits.AuthorizeReq = 0;
|
|
|
+ ShmOCPP16Data->SpMsg.bits.AuthorizeConf = 1; // inform csu
|
|
|
+ authorizeRetryTimes = 0;
|
|
|
+}
|
|
|
+
|
|
|
+char * strtrimc( char * s )
|
|
|
+{
|
|
|
+ char * p1 = s;
|
|
|
+ char * p2 = s;
|
|
|
+ while(*p1 != '\0')
|
|
|
+ {
|
|
|
+ while(*p1 == ' ' || *p1 == '\t' || *p1 == '\"' || *p1 == '\n' || *p1 == '}' || *p1 == '\r')
|
|
|
+ {
|
|
|
+ if(*p1 != ',')
|
|
|
+ {
|
|
|
+ p1 ++;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if(*p1 != ',')
|
|
|
+ {
|
|
|
+ * p2 ++ = *p1 ++;
|
|
|
+ //printf("p2=%s\n",p2);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ *p2 = '\0';
|
|
|
+ return (s);
|
|
|
+}
|
|
|
+
|
|
|
+void handleBootNotificationResponse(char *payload, int gun_index)
|
|
|
+{
|
|
|
+ mtrace();
|
|
|
+ char statusStr[12]={0};
|
|
|
+ char currentTimeStr[30]={0};
|
|
|
+ int intervalInt = 0;
|
|
|
+ struct tm tp;
|
|
|
+ char buf[28]={0};
|
|
|
+ char timebuf[50]={0};
|
|
|
+
|
|
|
+ DEBUG_INFO("handleBootNotificationResponse...\n");
|
|
|
+
|
|
|
+ json_object *BootNotification;
|
|
|
+ BootNotification = json_tokener_parse(payload);
|
|
|
+ if(!is_error(BootNotification))
|
|
|
+ {
|
|
|
+ // Required data
|
|
|
+ sprintf((char *)currentTimeStr, "%s", json_object_get_string(json_object_object_get(BootNotification,"currentTime")));
|
|
|
+ intervalInt = json_object_get_int(json_object_object_get(BootNotification,"interval"));
|
|
|
+ sprintf((char *)statusStr, "%s", json_object_get_string(json_object_object_get(BootNotification,"status")));
|
|
|
+ }
|
|
|
+ json_object_put(BootNotification);
|
|
|
+
|
|
|
+
|
|
|
+ ShmOCPP16Data->BootNotification.ResponseHeartbeatInterval = intervalInt;
|
|
|
+ BootNotificationInterval = intervalInt;
|
|
|
+ HeartBeatWaitTime = intervalInt;
|
|
|
+
|
|
|
+ //write back to ShmOCPP16Data->BootNotification
|
|
|
+ strcpy((char *)ShmOCPP16Data->BootNotification.ResponseCurrentTime, currentTimeStr);
|
|
|
+ ShmOCPP16Data->BootNotification.ResponseHeartbeatInterval = intervalInt;
|
|
|
+ strcpy((char *)ShmOCPP16Data->BootNotification.ResponseStatus, statusStr);
|
|
|
+
|
|
|
+ if((strcmp(statusStr, RegistrationStatusStr[RegistrationStatus_Accepted]) == 0 ))
|
|
|
+ {
|
|
|
+ server_sign = TRUE;
|
|
|
+ server_pending =FALSE;
|
|
|
+
|
|
|
+ }
|
|
|
+ else if(strcmp(statusStr, RegistrationStatusStr[RegistrationStatus_Pending]) == 0)
|
|
|
+ {
|
|
|
+ server_pending = TRUE;
|
|
|
+ }
|
|
|
+
|
|
|
+ strptime((const char *)ShmOCPP16Data->BootNotification.ResponseCurrentTime, "%Y-%m-%dT%H:%M:%S", &tp);
|
|
|
+ tp.tm_isdst = -1;
|
|
|
+ //time_t utc = mktime(&tp);
|
|
|
+
|
|
|
+ strftime(buf, 28, "%Y-%m-%d %H:%M:%S", &tp);
|
|
|
+ memset(timebuf, 0, sizeof timebuf);
|
|
|
+ sprintf(timebuf,"date -s '%s'",buf);
|
|
|
+ system(timebuf);
|
|
|
+
|
|
|
+ clientTime.Heartbeat = time((time_t*)NULL) - (ShmOCPP16Data->BootNotification.ResponseHeartbeatInterval-5);
|
|
|
+ //==============================================
|
|
|
+ // RTC sync
|
|
|
+ //==============================================
|
|
|
+ system("/sbin/hwclock -w --systohc");
|
|
|
+
|
|
|
+ ShmOCPP16Data->OcppConnStatus = 1; ////0: disconnected, 1: connected
|
|
|
+ ShmOCPP16Data->SpMsg.bits.BootNotificationConf = 1;
|
|
|
+
|
|
|
+ sendFirmwareVersionByDataTransfer();
|
|
|
+}
|
|
|
+
|
|
|
+void handleDataTransferResponse(char *payload, int gun_index)
|
|
|
+{
|
|
|
+ char sstr[160]={0};//sstr[200]={ 0 };
|
|
|
+ int c = 0;
|
|
|
+ char *loc;
|
|
|
+ DEBUG_INFO("handleDataTransferResponse ...\n");
|
|
|
+ loc = strstr(payload, "status");
|
|
|
+ printf("loc=%s\n",loc);
|
|
|
+ c = 0;
|
|
|
+ while (loc[3+strlen("status")+c] != '\"')
|
|
|
+ {
|
|
|
+ sstr[c] = loc[3+strlen("status")+c];
|
|
|
+ //printf("i=%d sstr=%c\n",c, sstr[c]);
|
|
|
+ c++;
|
|
|
+ }
|
|
|
+ sstr[c] = '\0';
|
|
|
+
|
|
|
+ DEBUG_INFO(" DataTransferResponse=%s\n", sstr);
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+void handleDiagnosticsStatusNotificationResponse(char *payload, int gun_index)
|
|
|
+{
|
|
|
+ DEBUG_INFO("handleDiagnosticsStatusNotificationResponse ...\n");
|
|
|
+ //struct json_object *obj;
|
|
|
+// obj = json_tokener_parse(payload);
|
|
|
+ ShmOCPP16Data->SpMsg.bits.DiagnosticsStatusNotificationReq = 0;
|
|
|
+ ShmOCPP16Data->SpMsg.bits.DiagnosticsStatusNotificationConf = 1;
|
|
|
+ //No fields are defined.
|
|
|
+}
|
|
|
+
|
|
|
+void handleFirmwareStatusNotificationResponse(char *payload, int gun_index)
|
|
|
+{
|
|
|
+ DEBUG_INFO("handleFirmwareStatusNotificationResponse ...\n");
|
|
|
+ //struct json_object *obj;
|
|
|
+// obj = json_tokener_parse(payload);
|
|
|
+ ShmOCPP16Data->SpMsg.bits.FirmwareStatusNotificationReq = 0;
|
|
|
+ ShmOCPP16Data->SpMsg.bits.FirmwareStatusNotificationConf = 1;
|
|
|
+
|
|
|
+ //No fields are defined.
|
|
|
+}
|
|
|
+
|
|
|
+void handleHeartbeatResponse(char *payload, int gun_index)
|
|
|
+{
|
|
|
+ mtrace();
|
|
|
+ struct tm tp;
|
|
|
+ char buf[28]={0};
|
|
|
+ char timebuf[50]={0};
|
|
|
+
|
|
|
+ DEBUG_INFO("handleHeartbeatResponse...\n");
|
|
|
+ json_object *Heartbeat;
|
|
|
+ Heartbeat = json_tokener_parse(payload);
|
|
|
+ if(!is_error(Heartbeat))
|
|
|
+ {
|
|
|
+ // Required data
|
|
|
+ sprintf((char *)ShmOCPP16Data->Heartbeat.ResponseCurrentTime, "%s", json_object_get_string(json_object_object_get(Heartbeat,"currentTime")));
|
|
|
+
|
|
|
+ }
|
|
|
+ json_object_put(BootNotification);
|
|
|
+
|
|
|
+ if(FirstHeartBeat == 0)
|
|
|
+ {
|
|
|
+ FirstHeartBeat = 1;
|
|
|
+ DEBUG_INFO("FirstHeartBeat \n");
|
|
|
+ }
|
|
|
+ HeartBeatWithNOResponse = 0;
|
|
|
+
|
|
|
+
|
|
|
+ strptime((const char *)ShmOCPP16Data->Heartbeat.ResponseCurrentTime, "%Y-%m-%dT%H:%M:%S", &tp);
|
|
|
+ tp.tm_isdst = -1;
|
|
|
+ //time_t utc = mktime(&tp);
|
|
|
+ strftime(buf, 28, "%Y-%m-%d %H:%M:%S", &tp);
|
|
|
+ memset(timebuf, 0, sizeof timebuf);
|
|
|
+ sprintf(timebuf,"date -s '%s'",buf);
|
|
|
+ system(timebuf);
|
|
|
+ //==============================================
|
|
|
+ // RTC sync
|
|
|
+ //==============================================
|
|
|
+ system("/sbin/hwclock -w --systohc");
|
|
|
+
|
|
|
+ //===============================================
|
|
|
+ //Print Out HeartBeat log
|
|
|
+ //===============================================
|
|
|
+ {
|
|
|
+ double diff_t;
|
|
|
+ struct tm tp,tp1;
|
|
|
+
|
|
|
+ // BootNotification Receive Time
|
|
|
+
|
|
|
+ strptime((const char *)ShmOCPP16Data->BootNotification.ResponseCurrentTime, "%Y-%m-%dT%H:%M:%S", &tp);
|
|
|
+ tp.tm_isdst = -1;
|
|
|
+ time_t BootNotificationReceiveTime = mktime(&tp);
|
|
|
+
|
|
|
+ //HeartBeat Receive Time
|
|
|
+ strptime((const char *)ShmOCPP16Data->Heartbeat.ResponseCurrentTime, "%Y-%m-%dT%H:%M:%S", &tp1);
|
|
|
+ tp1.tm_isdst = -1;
|
|
|
+ time_t HeartBeatReceiveTime = mktime(&tp1);
|
|
|
+
|
|
|
+ diff_t = difftime(HeartBeatReceiveTime, BootNotificationReceiveTime);
|
|
|
+
|
|
|
+ printf("handleHeartbeatResponse differnt time=%f..\n",diff_t);
|
|
|
+
|
|
|
+ if(((int)diff_t / 3600) > HeartBeatCountPerHour)
|
|
|
+ {
|
|
|
+ HeartBeatCountPerHour = (int)diff_t / 3600;
|
|
|
+ DEBUG_INFO("handleHeartbeatResponse ...\n");
|
|
|
+ DEBUG_INFO("After 1 hour, It will print out Heartbeat.\n");
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+void handleMeterValuesResponse(char *payload, int gun_index)
|
|
|
+{
|
|
|
+ mtrace();
|
|
|
+ DEBUG_INFO("handleMeterValuesResponse...\n");
|
|
|
+}
|
|
|
+
|
|
|
+void handleStartTransactionResponse(char *payload, int gun_index)
|
|
|
+{
|
|
|
+ mtrace();
|
|
|
+ //int transactionIdInt = 0;
|
|
|
+ FILE *outfile;
|
|
|
+ char data[100]={0};
|
|
|
+
|
|
|
+ DEBUG_INFO("handleStartTransactionResponse...\n");
|
|
|
+
|
|
|
+ json_object *StartTransaction;
|
|
|
+ StartTransaction = json_tokener_parse(payload);
|
|
|
+
|
|
|
+ if(!is_error(StartTransaction))
|
|
|
+ {
|
|
|
+
|
|
|
+ // Required data
|
|
|
+ sprintf((char *)ShmOCPP16Data->StartTransaction[gun_index].ResponseIdTagInfo.Status, "%s", json_object_get_string(json_object_object_get(json_object_object_get(StartTransaction,"idTagInfo"), "status")));
|
|
|
+ ShmOCPP16Data->StartTransaction[gun_index].ResponseTransactionId = json_object_get_int(json_object_object_get(StartTransaction,"transactionId"));
|
|
|
+
|
|
|
+ // Optional data
|
|
|
+ if(json_object_object_get(json_object_object_get(StartTransaction,"idTagInfo"), "expiryDate") != NULL)
|
|
|
+ sprintf((char *)ShmOCPP16Data->StartTransaction[gun_index].ResponseIdTagInfo.ExpiryDate, "%s", json_object_get_string(json_object_object_get(json_object_object_get(StartTransaction,"idTagInfo"), "expiryDate")));
|
|
|
+
|
|
|
+ if(json_object_object_get(json_object_object_get(StartTransaction,"idTagInfo"), "parentIdTag") != NULL)
|
|
|
+ sprintf((char *)ShmOCPP16Data->StartTransaction[gun_index].ResponseIdTagInfo.ParentIdTag, "%s", json_object_get_string(json_object_object_get(json_object_object_get(StartTransaction,"idTagInfo"), "parentIdTag")));
|
|
|
+ }
|
|
|
+ json_object_put(StartTransaction);
|
|
|
+
|
|
|
+ ShmOCPP16Data->CpMsg.bits[gun_index].StartTransactionConf = 1;
|
|
|
+ ShmOCPP16Data->CpMsg.bits[gun_index].StartTransactionReq = 0;
|
|
|
+
|
|
|
+ //-----------Start : write to the Queue TransactionId file -----------------//
|
|
|
+ if((access("/Storage/OCPP/QueueTransactionId",F_OK))!=-1)
|
|
|
+ {}
|
|
|
+ else
|
|
|
+ {
|
|
|
+ FILE *log = fopen("/Storage/OCPP/QueueTransactionId", "w+");
|
|
|
+
|
|
|
+ if(log == NULL)
|
|
|
+ {
|
|
|
+ DEBUG_INFO("Can't Create File QueueTransactionId \n");
|
|
|
+ return ;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ fclose(log);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // open file for writing
|
|
|
+ //-------------Start: write to the Queue TransactionId file------------------------------------------//
|
|
|
+ if((ShmOCPP16Data->StartTransaction[gun_index].ConnectorId !=0)&&(strcmp((const char *)ShmOCPP16Data->StartTransaction[gun_index].IdTag,"")!=0)&&(ShmOCPP16Data->StartTransaction[gun_index].ResponseTransactionId !=0))
|
|
|
+ {
|
|
|
+ outfile = fopen ("/Storage/OCPP/QueueTransactionId", "a");
|
|
|
+ sprintf(data,"%d,%s,%d\n", ShmOCPP16Data->StartTransaction[gun_index].ConnectorId , ShmOCPP16Data->StartTransaction[gun_index].IdTag, ShmOCPP16Data->StartTransaction[gun_index].ResponseTransactionId); // GunIndex, idtag, TransactionId
|
|
|
+ fputs(data, outfile);
|
|
|
+ fclose (outfile);
|
|
|
+ }
|
|
|
+
|
|
|
+ DEBUG_INFO("idTagInfo-expiryDate: %s\n", ShmOCPP16Data->StartTransaction[gun_index].ResponseIdTagInfo.ExpiryDate);
|
|
|
+ DEBUG_INFO("idTagInfo-parentIdTag: %s\n", ShmOCPP16Data->StartTransaction[gun_index].ResponseIdTagInfo.ParentIdTag);
|
|
|
+ DEBUG_INFO("idTagInfo-status: %s\n", ShmOCPP16Data->StartTransaction[gun_index].ResponseIdTagInfo.Status);
|
|
|
+ DEBUG_INFO("transactionId: %d\n", ShmOCPP16Data->StartTransaction[gun_index].ResponseTransactionId);
|
|
|
+}
|
|
|
+
|
|
|
+void handleStatusNotificationResponse(char *payload, int gun_index)
|
|
|
+{
|
|
|
+ mtrace();
|
|
|
+ DEBUG_INFO("handleStatusNotificationResponse...\n");
|
|
|
+
|
|
|
+ cpinitateMsg.bits[gun_index].StatusNotificationReq = 0;
|
|
|
+ cpinitateMsg.bits[gun_index].StatusNotificationConf = 1;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+void handleStopTransactionnResponse(char *payload, int gun_index)
|
|
|
+{
|
|
|
+ mtrace();
|
|
|
+ DEBUG_INFO("handleStopTransactionnResponse...\n");
|
|
|
+ json_object *StopTransaction;
|
|
|
+ StopTransaction = json_tokener_parse(payload);
|
|
|
+
|
|
|
+ if(!is_error(StopTransaction))
|
|
|
+ {
|
|
|
+ // Optional data
|
|
|
+ if(json_object_object_get(StopTransaction, "idTagInfo") != NULL)
|
|
|
+ {
|
|
|
+ sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].ResponseIdTagInfo.Status, "%s", json_object_get_string(json_object_object_get(json_object_object_get(StopTransaction,"idTagInfo"), "status")));
|
|
|
+
|
|
|
+ if(json_object_object_get(json_object_object_get(StopTransaction,"idTagInfo"), "expiryDate") != NULL)
|
|
|
+ sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].ResponseIdTagInfo.ExpiryDate, "%s", json_object_get_string(json_object_object_get(json_object_object_get(StopTransaction,"idTagInfo"), "expiryDate")));
|
|
|
+
|
|
|
+ if(json_object_object_get(json_object_object_get(StopTransaction,"idTagInfo"), "parentIdTag") != NULL)
|
|
|
+ sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].ResponseIdTagInfo.ParentIdTag, "%s", json_object_get_string(json_object_object_get(json_object_object_get(StopTransaction,"idTagInfo"), "parentIdTag")));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ json_object_put(StopTransaction);
|
|
|
+
|
|
|
+
|
|
|
+ ShmOCPP16Data->CpMsg.bits[gun_index].StopTransactionConf = 1;
|
|
|
+ ShmOCPP16Data->CpMsg.bits[gun_index].StopTransactionReq = 0;
|
|
|
+
|
|
|
+ DEBUG_INFO("idTagInfo-expiryDate: %s\n", ShmOCPP16Data->StopTransaction[gun_index].ResponseIdTagInfo.ExpiryDate);
|
|
|
+ DEBUG_INFO("idTagInfo-parentIdTag: %s\n", ShmOCPP16Data->StopTransaction[gun_index].ResponseIdTagInfo.ParentIdTag);
|
|
|
+ DEBUG_INFO("idTagInfo-status: %s\n", ShmOCPP16Data->StopTransaction[gun_index].ResponseIdTagInfo.Status);
|
|
|
+}
|
|
|
+
|
|
|
+//==========================================
|
|
|
+// Handle Error routine
|
|
|
+//==========================================
|
|
|
+void handleError(char *id, char *errorCode, char *errorDescription,char *payload)
|
|
|
+{
|
|
|
+ mtrace();
|
|
|
+ #ifdef SystemLogMessage
|
|
|
+ DEBUG_INFO("errorCode: %s\n", errorCode);
|
|
|
+
|
|
|
+ DEBUG_INFO("errorDescription: %s\n", errorDescription);
|
|
|
+
|
|
|
+ DEBUG_INFO("errorDetails: %s\n", payload);
|
|
|
+ #endif
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+//===============================================
|
|
|
+// Common routine
|
|
|
+//===============================================
|
|
|
+int initialConfigurationTable(void)
|
|
|
+{
|
|
|
+ //clock_t start_t, end_t, total_t;
|
|
|
+ FILE *fp;
|
|
|
+ FILE *outfile;
|
|
|
+ char str[200]={0};
|
|
|
+ char sstr[100]={0};
|
|
|
+ int c = 0;
|
|
|
+ char *loc;
|
|
|
+ DEBUG_INFO("initialConfigurationTable...\n");
|
|
|
+ //start_t = clock();
|
|
|
+ //printf("Starting of the program, start_t = %ld\n", start_t);
|
|
|
+ memset(&(ShmOCPP16Data->ConfigurationTable), 0, sizeof(struct OCPP16ConfigurationTable) );
|
|
|
+
|
|
|
+
|
|
|
+ if((access("/Storage/OCPP/OCPPConfiguration",F_OK))==-1)
|
|
|
+ {
|
|
|
+ outfile = fopen("/Storage/OCPP/OCPPConfiguration" , "w+");
|
|
|
+ if(outfile == NULL)
|
|
|
+ {
|
|
|
+ DEBUG_INFO("Error opening file\n");
|
|
|
+ return FALSE;
|
|
|
+ }
|
|
|
+
|
|
|
+ /*Core Profile*/
|
|
|
+ //AllowOfflineTxForUnknownId
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[AllowOfflineTxForUnknownId].ItemAccessibility = 1;
|
|
|
+ printf("AllowoddlineTXForUnknownId type: %d \n", ShmOCPP16Data->ConfigurationTable.CoreProfile[AllowOfflineTxForUnknownId].ItemAccessibility);
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AllowOfflineTxForUnknownId].ItemName, "AllowOfflineTxForUnknownId");
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AllowOfflineTxForUnknownId].ItemData, "FALSE" );
|
|
|
+
|
|
|
+ fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","AllowOfflineTxForUnknownId", "false", "FALSE");
|
|
|
+
|
|
|
+ //AuthorizationCacheEnabled
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizationCacheEnabled].ItemAccessibility = 1;
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizationCacheEnabled].ItemName, "AuthorizationCacheEnabled");
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizationCacheEnabled].ItemData, "FALSE" );
|
|
|
+
|
|
|
+ fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","AuthorizationCacheEnabled", "false", "FALSE");
|
|
|
+
|
|
|
+ //AuthorizeRemoteTxRequests
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizeRemoteTxRequests].ItemAccessibility = 0;
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizeRemoteTxRequests].ItemName, "AuthorizeRemoteTxRequests");
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizeRemoteTxRequests].ItemData, "FALSE" );
|
|
|
+
|
|
|
+ fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","AuthorizeRemoteTxRequests", "true", "FALSE");
|
|
|
+
|
|
|
+ //BlinkRepeat
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[BlinkRepeat].ItemAccessibility = 1;
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[BlinkRepeat].ItemName, "BlinkRepeat");
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[BlinkRepeat].ItemData, "0" );
|
|
|
+
|
|
|
+ fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","BlinkRepeat", "false", "0");
|
|
|
+
|
|
|
+ //ClockAlignedDataInterval
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[ClockAlignedDataInterval].ItemAccessibility = 1;
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ClockAlignedDataInterval].ItemName, "ClockAlignedDataInterval");
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ClockAlignedDataInterval].ItemData, "0" );
|
|
|
+
|
|
|
+ fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","ClockAlignedDataInterval", "false", "0");
|
|
|
+
|
|
|
+ //ConnectionTimeOut
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectionTimeOut].ItemAccessibility = 1;
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectionTimeOut].ItemName, "ConnectionTimeOut");
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectionTimeOut].ItemData, "180" );
|
|
|
+
|
|
|
+ fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","ConnectionTimeOut", "false", "180");
|
|
|
+
|
|
|
+ //GetConfigurationMaxKeys
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[GetConfigurationMaxKeys].ItemAccessibility =0;
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[GetConfigurationMaxKeys].ItemName, "GetConfigurationMaxKeys");
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[GetConfigurationMaxKeys].ItemData, "43" );
|
|
|
+
|
|
|
+ fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","GetConfigurationMaxKeys", "true", "43");
|
|
|
+
|
|
|
+ // HeartbeatInterval
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[HeartbeatInterval].ItemAccessibility = 1;
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[HeartbeatInterval].ItemName, "HeartbeatInterval");
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[HeartbeatInterval].ItemData, "10" );
|
|
|
+
|
|
|
+ fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","HeartbeatInterval", "false", "10");
|
|
|
+
|
|
|
+ // LightIntensity
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[LightIntensity].ItemAccessibility = 1;
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LightIntensity].ItemName, "LightIntensity");
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LightIntensity].ItemData, "0" );
|
|
|
+
|
|
|
+ fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","LightIntensity", "false", "0");
|
|
|
+
|
|
|
+
|
|
|
+ // LocalAuthorizeOffline
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalAuthorizeOffline].ItemAccessibility = 0;
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalAuthorizeOffline].ItemName, "LocalAuthorizeOffline");
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalAuthorizeOffline].ItemData, "TRUE" );
|
|
|
+
|
|
|
+ fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","LocalAuthorizeOffline", "true", "TRUE");
|
|
|
+
|
|
|
+ // LocalPreAuthorize
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalPreAuthorize].ItemAccessibility = 0;
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalPreAuthorize].ItemName, "LocalPreAuthorize");
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalPreAuthorize].ItemData, "FALSE" );
|
|
|
+
|
|
|
+ fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","LocalPreAuthorize", "true", "FALSE");
|
|
|
+
|
|
|
+ // MaxEnergyOnInvalidId
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[MaxEnergyOnInvalidId].ItemAccessibility = 1;
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MaxEnergyOnInvalidId].ItemName, "MaxEnergyOnInvalidId");
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MaxEnergyOnInvalidId].ItemData, "0" );
|
|
|
+ ShmSysConfigAndInfo->SysConfig.OfflineMaxChargeEnergy = 0;
|
|
|
+
|
|
|
+ fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","MaxEnergyOnInvalidId", "false", "0");
|
|
|
+
|
|
|
+ // MeterValuesAlignedData
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedData].ItemAccessibility = 0;
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedData].ItemName, "MeterValuesAlignedData");
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedData].ItemData, "" );
|
|
|
+
|
|
|
+ fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","MeterValuesAlignedData", "true", "");
|
|
|
+
|
|
|
+ // MeterValuesAlignedDataMaxLength
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedDataMaxLength].ItemAccessibility = 0;
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedDataMaxLength].ItemName, "MeterValuesAlignedDataMaxLength");
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedDataMaxLength].ItemData, "5" );
|
|
|
+
|
|
|
+ fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","MeterValuesAlignedDataMaxLength", "true", "5");
|
|
|
+
|
|
|
+
|
|
|
+ // MeterValuesSampledData
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledData].ItemAccessibility = 0;
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledData].ItemName, "MeterValuesSampledData");
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledData].ItemData, "Current.Import,Energy.Active.Import.Register,Energy.Active.Import.Interval,Power.Active.Import,Voltage,SOC" );
|
|
|
+
|
|
|
+ fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","MeterValuesSampledData", "true", "Current.Import,Energy.Active.Import.Register,Energy.Active.Import.Interval,Power.Active.Import,Voltage,SOC");
|
|
|
+
|
|
|
+
|
|
|
+ // MeterValuesSampledDataMaxLength
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledDataMaxLength].ItemAccessibility = 0;
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledDataMaxLength].ItemName, "MeterValuesSampledDataMaxLength");
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledDataMaxLength].ItemData, "6" );
|
|
|
+
|
|
|
+ fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","MeterValuesSampledDataMaxLength", "true", "6");
|
|
|
+
|
|
|
+ // MeterValueSampleInterval
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValueSampleInterval].ItemAccessibility = 1;
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValueSampleInterval].ItemName, "MeterValueSampleInterval");
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValueSampleInterval].ItemData, "10" );
|
|
|
+
|
|
|
+ fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","MeterValueSampleInterval", "false", "10");
|
|
|
+
|
|
|
+ // MinimumStatusDuration
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[MinimumStatusDuration].ItemAccessibility = 1;
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MinimumStatusDuration].ItemName, "MinimumStatusDuration");
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MinimumStatusDuration].ItemData, "120" );
|
|
|
+ server_cycle_Status = 120; //StatusNotification cycle
|
|
|
+ fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","MinimumStatusDuration", "false", "120");
|
|
|
+
|
|
|
+ // NumberOfConnectors
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[NumberOfConnectors].ItemAccessibility = 0;
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[NumberOfConnectors].ItemName, "NumberOfConnectors");
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
|
|
|
+ {
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[NumberOfConnectors].ItemData, "%d", (CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY));
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[NumberOfConnectors].ItemData, "%d", AC_QUANTITY);
|
|
|
+ }
|
|
|
+
|
|
|
+ fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","NumberOfConnectors", "true", ShmOCPP16Data->ConfigurationTable.CoreProfile[NumberOfConnectors].ItemData);
|
|
|
+
|
|
|
+ // ResetRetries
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[ResetRetries].ItemAccessibility = 1;
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ResetRetries].ItemName, "ResetRetries");
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ResetRetries].ItemData, "3" );
|
|
|
+
|
|
|
+ fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","ResetRetries", "false", "3");
|
|
|
+
|
|
|
+ // ConnectorPhaseRotation
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotation].ItemAccessibility = 1;
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotation].ItemName, "ConnectorPhaseRotation");
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotation].ItemData, "NotApplicable" );
|
|
|
+
|
|
|
+ fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","ConnectorPhaseRotation", "false", "NotApplicable");
|
|
|
+
|
|
|
+ // ConnectorPhaseRotationMaxLength
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotationMaxLength].ItemAccessibility = 0;
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotationMaxLength].ItemName, "ConnectorPhaseRotationMaxLength");
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotationMaxLength].ItemData, "1" );
|
|
|
+
|
|
|
+ fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","ConnectorPhaseRotationMaxLength", "true", "1");
|
|
|
+
|
|
|
+ // StopTransactionOnEVSideDisconnect
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnEVSideDisconnect].ItemAccessibility = 0;
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnEVSideDisconnect].ItemName, "StopTransactionOnEVSideDisconnect");
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnEVSideDisconnect].ItemData, "TRUE" );
|
|
|
+
|
|
|
+ fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","StopTransactionOnEVSideDisconnect", "true", "TRUE");
|
|
|
+
|
|
|
+ // StopTransactionOnInvalidId
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnInvalidId].ItemAccessibility = 0; //1;
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnInvalidId].ItemName, "StopTransactionOnInvalidId");
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnInvalidId].ItemData, "FALSE" );
|
|
|
+
|
|
|
+ fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","StopTransactionOnInvalidId", "true", "FALSE");
|
|
|
+
|
|
|
+ // StopTxnAlignedData
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedData].ItemAccessibility = 0;
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedData].ItemName, "StopTxnAlignedData");
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedData].ItemData, "Energy.Active.Import.Register" );
|
|
|
+
|
|
|
+ fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","StopTxnAlignedData", "true", "Energy.Active.Import.Register");
|
|
|
+
|
|
|
+ // StopTxnAlignedDataMaxLength
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedDataMaxLength].ItemAccessibility = 0;
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedDataMaxLength].ItemName, "StopTxnAlignedDataMaxLength");
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedDataMaxLength].ItemData, "0" );
|
|
|
+
|
|
|
+ fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","StopTxnAlignedDataMaxLength", "true", "0");
|
|
|
+
|
|
|
+ // StopTxnSampledData
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledData].ItemAccessibility = 0;
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledData].ItemName, "StopTxnSampledData");
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledData].ItemData, "Current.Import,Energy.Active.Import.Interval,Power.Active.Import,Voltage,SOC" );
|
|
|
+
|
|
|
+ fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","StopTxnSampledData", "true", "Current.Import,Energy.Active.Import.Interval,Power.Active.Import,Voltage,SOC");
|
|
|
+
|
|
|
+ // StopTxnSampledDataMaxLength
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledDataMaxLength].ItemAccessibility = 0;
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledDataMaxLength].ItemName, "StopTxnSampledDataMaxLength");
|
|
|
+
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
|
|
|
+ {
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledDataMaxLength].ItemData, "%d", 6);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledDataMaxLength].ItemData, "%d", 5);
|
|
|
+ }
|
|
|
+
|
|
|
+ //strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledDataMaxLength].ItemData, "0" );
|
|
|
+ fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","StopTxnSampledDataMaxLength", "true", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledDataMaxLength].ItemData);
|
|
|
+
|
|
|
+ // SupportedFeatureProfiles
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfiles].ItemAccessibility = 0;
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfiles].ItemName, "SupportedFeatureProfiles");
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfiles].ItemData, "Core,FirmwareManagement,LocalAuthListManagement,Reservation,SmartCharging,RemoteTrigger" );
|
|
|
+
|
|
|
+ fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","SupportedFeatureProfiles", "true", "Core,FirmwareManagement,LocalAuthListManagement,Reservation,SmartCharging,RemoteTrigger");
|
|
|
+
|
|
|
+ // SupportedFeatureProfilesMaxLength
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfilesMaxLength].ItemAccessibility = 0;
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfilesMaxLength].ItemName, "SupportedFeatureProfilesMaxLength");
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfilesMaxLength].ItemData, "6" );
|
|
|
+
|
|
|
+ fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","SupportedFeatureProfilesMaxLength", "true", "6");
|
|
|
+
|
|
|
+ // TransactionMessageAttempts
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageAttempts].ItemAccessibility = 1;
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageAttempts].ItemName, "TransactionMessageAttempts");
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageAttempts].ItemData, "3" );
|
|
|
+ TransactionMessageAttemptsValue = atoi((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageAttempts].ItemData);
|
|
|
+
|
|
|
+ fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","TransactionMessageAttempts", "false", "3");
|
|
|
+
|
|
|
+ // TransactionMessageRetryInterval
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageRetryInterval].ItemAccessibility = 1;
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageRetryInterval].ItemName, "TransactionMessageRetryInterval");
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageRetryInterval].ItemData, "60" );
|
|
|
+ TransactionMessageRetryIntervalValue = atoi((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageRetryInterval].ItemData);
|
|
|
+
|
|
|
+ fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","TransactionMessageRetryInterval", "false", "60");
|
|
|
+
|
|
|
+ // UnlockConnectorOnEVSideDisconnect
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[UnlockConnectorOnEVSideDisconnect].ItemAccessibility = 0;
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[UnlockConnectorOnEVSideDisconnect].ItemName, "UnlockConnectorOnEVSideDisconnect");
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[UnlockConnectorOnEVSideDisconnect].ItemData, "TRUE" );
|
|
|
+
|
|
|
+ fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","UnlockConnectorOnEVSideDisconnect", "true", "TRUE");
|
|
|
+
|
|
|
+
|
|
|
+ // WebSocketPingInterval
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[WebSocketPingInterval].ItemAccessibility = 1;
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[WebSocketPingInterval].ItemName, "WebSocketPingInterval");
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[WebSocketPingInterval].ItemData, "30" );
|
|
|
+
|
|
|
+ fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","WebSocketPingInterval", "false", "30");
|
|
|
+
|
|
|
+ //* Local Auth List Management Profile*/
|
|
|
+ #if 0
|
|
|
+ //For OCTT Test Case
|
|
|
+ ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemAccessibility = 1;
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemName, "LocalAuthorizationListEnabled");
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemData, "TRUE" );
|
|
|
+ #endif
|
|
|
+
|
|
|
+ #if 1
|
|
|
+ //LocalAuthListEnabled
|
|
|
+ ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemAccessibility = 1;
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemName, "LocalAuthListEnabled");
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemData, "TRUE" );
|
|
|
+ fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","LocalAuthListEnabled", "false", "TRUE");
|
|
|
+
|
|
|
+ #endif
|
|
|
+
|
|
|
+ //LocalAuthListMaxLength
|
|
|
+ ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListMaxLength].ItemAccessibility = 0;
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListMaxLength].ItemName, "LocalAuthListMaxLength");
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListMaxLength].ItemData, "500" );
|
|
|
+
|
|
|
+ fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","LocalAuthListMaxLength", "true", "500");
|
|
|
+
|
|
|
+ //SendLocalListMaxLength
|
|
|
+ ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[SendLocalListMaxLength].ItemAccessibility = 0;
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[SendLocalListMaxLength].ItemName, "SendLocalListMaxLength");
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[SendLocalListMaxLength].ItemData, "500" );
|
|
|
+
|
|
|
+ fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","SendLocalListMaxLength", "true", "500");
|
|
|
+
|
|
|
+
|
|
|
+ //ReserveConnectorZeroSupported
|
|
|
+ ShmOCPP16Data->ConfigurationTable.ReservationProfile[ReserveConnectorZeroSupported].ItemAccessibility = 0;
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.ReservationProfile[ReserveConnectorZeroSupported].ItemName, "ReserveConnectorZeroSupported");
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.ReservationProfile[ReserveConnectorZeroSupported].ItemData, "FALSE" );
|
|
|
+
|
|
|
+ fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","ReserveConnectorZeroSupported", "true", "FALSE");
|
|
|
+
|
|
|
+ //* Smart Charging Profile */
|
|
|
+ //ChargeProfileMaxStackLevel
|
|
|
+ ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargeProfileMaxStackLevel].ItemAccessibility = 0;
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargeProfileMaxStackLevel].ItemName, "ChargeProfileMaxStackLevel");
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargeProfileMaxStackLevel].ItemData, "3" );
|
|
|
+
|
|
|
+ fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","ChargeProfileMaxStackLevel", "true", "3");
|
|
|
+
|
|
|
+ // ChargingScheduleAllowedChargingRateUnit
|
|
|
+ ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleAllowedChargingRateUnit].ItemAccessibility = 0;
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleAllowedChargingRateUnit].ItemName, "ChargingScheduleAllowedChargingRateUnit");
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleAllowedChargingRateUnit].ItemData, "Current" );
|
|
|
+
|
|
|
+ fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","ChargingScheduleAllowedChargingRateUnit", "true", "Current");
|
|
|
+
|
|
|
+
|
|
|
+ // ChargingScheduleMaxPeriods
|
|
|
+ ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleMaxPeriods].ItemAccessibility = 0;
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleMaxPeriods].ItemName, "ChargingScheduleMaxPeriods");
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleMaxPeriods].ItemData, "10" );
|
|
|
+
|
|
|
+ fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","ChargingScheduleMaxPeriods", "true", "10");
|
|
|
+
|
|
|
+ // ConnectorSwitch3to1PhaseSupported
|
|
|
+ ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ConnectorSwitch3to1PhaseSupported].ItemAccessibility = 0;
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ConnectorSwitch3to1PhaseSupported].ItemName, "ConnectorSwitch3to1PhaseSupported");
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ConnectorSwitch3to1PhaseSupported].ItemData, "TRUE" );
|
|
|
+
|
|
|
+ fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","ConnectorSwitch3to1PhaseSupported", "true", "TRUE");
|
|
|
+
|
|
|
+ // MaxChargingProfilesInstalled
|
|
|
+ ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[MaxChargingProfilesInstalled].ItemAccessibility = 0;
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[MaxChargingProfilesInstalled].ItemName, "MaxChargingProfilesInstalled");
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[MaxChargingProfilesInstalled].ItemData, "3" );
|
|
|
+
|
|
|
+ fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","MaxChargingProfilesInstalled", "true", "3");
|
|
|
+
|
|
|
+ fclose(outfile);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ //DEBUG_INFO("../Storage/OCPP/OCPPConfiguration EXit\n");
|
|
|
+ char keystr[60]={0};
|
|
|
+ char readonlystr[10]={0};
|
|
|
+ char valuestr[100]={0};
|
|
|
+ fp = fopen("/Storage/OCPP/OCPPConfiguration" , "r");
|
|
|
+ if(fp == NULL) {
|
|
|
+ DEBUG_INFO("Error opening file");
|
|
|
+ return FALSE;
|
|
|
+ }
|
|
|
+
|
|
|
+ while( fgets (str, sizeof(str), fp)!=NULL )
|
|
|
+ {
|
|
|
+ //DEBUG_INFO("Get Configuration \n");
|
|
|
+
|
|
|
+ str[strlen(str) - 1] = '\0'; // eat the newline fgets() stores
|
|
|
+ //*************************key*********************************/
|
|
|
+ loc = strstr(str, "key");
|
|
|
+ c = 0;
|
|
|
+ memset(sstr ,0, sizeof(sstr) );
|
|
|
+ while (loc[strlen("key")+3+c] != '\"')
|
|
|
+ {
|
|
|
+ sstr[c] = loc[strlen("key")+3+c];
|
|
|
+ c++;
|
|
|
+ }
|
|
|
+ sstr[c] = '\0';
|
|
|
+ strcpy(keystr,sstr);
|
|
|
+
|
|
|
+
|
|
|
+ //*************************readonly*********************************/
|
|
|
+ loc = strstr(str, "readonly");
|
|
|
+ c = 0;
|
|
|
+ memset(sstr ,0, sizeof(sstr) );
|
|
|
+ while (loc[strlen("readonly")+2+c] != ',')
|
|
|
+ {
|
|
|
+ sstr[c] = loc[strlen("readonly")+2+c];
|
|
|
+ c++;
|
|
|
+ }
|
|
|
+ sstr[c] = '\0';
|
|
|
+ strcpy(readonlystr,sstr);
|
|
|
+
|
|
|
+ //*************************value*********************************/
|
|
|
+ loc = strstr(str, "value");
|
|
|
+ c = 0;
|
|
|
+ memset(sstr ,0, sizeof(sstr) );
|
|
|
+ while (loc[strlen("value")+3+c] != '\"')
|
|
|
+ {
|
|
|
+ sstr[c] = loc[strlen("value")+3+c];
|
|
|
+ c++;
|
|
|
+ }
|
|
|
+ sstr[c] = '\0';
|
|
|
+ strcpy(valuestr,sstr);
|
|
|
+
|
|
|
+// DEBUG_INFO("keystr=%s\n",keystr);
|
|
|
+// DEBUG_INFO("readonlystr=%s\n",readonlystr);
|
|
|
+// DEBUG_INFO("valuestr=%s\n",valuestr);
|
|
|
+
|
|
|
+ if(strcmp(keystr, "AllowOfflineTxForUnknownId") == 0)
|
|
|
+ {
|
|
|
+ //Charger.AllowOfflineTxForUnknownId = (value.toLowerCase().equals("true")?true:false);
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[AllowOfflineTxForUnknownId].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AllowOfflineTxForUnknownId].ItemData, "%s", valuestr );
|
|
|
+// DEBUG_INFO("AllowOfflineTxForUnknownId setting\n");
|
|
|
+// DEBUG_INFO("AllowOfflineTxForUnknownId setting\n");
|
|
|
+ }
|
|
|
+
|
|
|
+ if(strcmp(keystr, "AuthorizationCacheEnabled") == 0)
|
|
|
+ {
|
|
|
+ //Charger.AuthorizationCacheEnabled = (value.toLowerCase().equals("true")?true:false);
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizationCacheEnabled].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizationCacheEnabled].ItemData, "%s", valuestr );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if(strcmp(keystr, "AuthorizeRemoteTxRequests") == 0)
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizeRemoteTxRequests].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizeRemoteTxRequests].ItemData, "%s", valuestr );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if(strcmp(keystr, "BlinkRepeat") == 0)
|
|
|
+ {
|
|
|
+ //Charger.BlinkRepeat = Integer.parseInt(value);
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[BlinkRepeat].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[BlinkRepeat].ItemData, "%d", atoi(valuestr) );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if(strcmp(keystr, "ClockAlignedDataInterval") == 0)
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[ClockAlignedDataInterval].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ClockAlignedDataInterval].ItemData, "%d", atoi(valuestr) );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if(strcmp(keystr, "ConnectionTimeOut") == 0 )
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectionTimeOut].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectionTimeOut].ItemData, "%d", atoi(valuestr));
|
|
|
+ }
|
|
|
+
|
|
|
+ if(strcmp(keystr, "GetConfigurationMaxKeys") == 0)
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[GetConfigurationMaxKeys].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[GetConfigurationMaxKeys].ItemData, "%d", atoi(valuestr));
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if(strcmp(keystr, "HeartbeatInterval") == 0)
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[HeartbeatInterval].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[HeartbeatInterval].ItemData, "%d", atoi(valuestr));
|
|
|
+ HeartBeatWaitTime = atoi(valuestr);
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if(strcmp(keystr, "LightIntensity") == 0)
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[LightIntensity].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LightIntensity].ItemData, "%d", atoi(valuestr));
|
|
|
+ }
|
|
|
+
|
|
|
+ if(strcmp(keystr, "LocalAuthorizeOffline") == 0)
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalAuthorizeOffline].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalAuthorizeOffline].ItemData, "%s", valuestr );
|
|
|
+ }
|
|
|
+
|
|
|
+ if(strcmp(keystr, "LocalPreAuthorize") == 0)
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalPreAuthorize].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalPreAuthorize].ItemData, "%s", valuestr );
|
|
|
+ }
|
|
|
+
|
|
|
+ if(strcmp(keystr, "MaxEnergyOnInvalidId") == 0)
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[MaxEnergyOnInvalidId].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MaxEnergyOnInvalidId].ItemData, "%d", atoi(valuestr) );
|
|
|
+ ShmSysConfigAndInfo->SysConfig.OfflineMaxChargeEnergy = atoi(valuestr)/1000;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(strcmp(keystr, "MeterValuesAlignedData") == 0)
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedData].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedData].ItemData, "%s", valuestr );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if(strcmp(keystr, "MeterValuesAlignedDataMaxLength") == 0)
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedDataMaxLength].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedDataMaxLength].ItemData, "%d", atoi(valuestr));
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if(strcmp(keystr, "MeterValuesSampledData") == 0 )
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledData].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledData].ItemData, "%s", valuestr );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if(strcmp(keystr, "MeterValuesSampledDataMaxLength") == 0)
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledDataMaxLength].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledDataMaxLength].ItemData, "%d", atoi(valuestr));
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ if(strcmp(keystr, "MeterValueSampleInterval") == 0)
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValueSampleInterval].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValueSampleInterval].ItemData, "%d", atoi(valuestr));
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if(strcmp(keystr, "MinimumStatusDuration") == 0)
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[MinimumStatusDuration].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MinimumStatusDuration].ItemData, "%d", atoi(valuestr) );
|
|
|
+ server_cycle_Status = atoi(valuestr); //StatusNotification cycle
|
|
|
+ }
|
|
|
+
|
|
|
+ if(strcmp(keystr, "NumberOfConnectors") == 0)
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[NumberOfConnectors].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[NumberOfConnectors].ItemData, "%d", atoi(valuestr) );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if(strcmp(keystr, "ResetRetries") == 0)
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[ResetRetries].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ResetRetries].ItemData, "%d", atoi(valuestr) );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if(strcmp(keystr, "ConnectorPhaseRotation") == 0)
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotation].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotation].ItemData, "%s", valuestr );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if(strcmp(keystr, "ConnectorPhaseRotationMaxLength") == 0)
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotationMaxLength].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotationMaxLength].ItemData, "%d", atoi(valuestr) );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if(strcmp(keystr, "StopTransactionOnEVSideDisconnect") == 0)
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnEVSideDisconnect].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnEVSideDisconnect].ItemData, "%s", valuestr );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if(strcmp(keystr, "StopTransactionOnInvalidId") == 0)
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnInvalidId].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnInvalidId].ItemData, "%s", valuestr );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ if(strcmp(keystr, "StopTxnAlignedData") == 0)
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedData].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedData].ItemData, "%s", valuestr );
|
|
|
+ }
|
|
|
+
|
|
|
+ if(strcmp(keystr, "StopTxnAlignedDataMaxLength") == 0)
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedDataMaxLength].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedDataMaxLength].ItemData, "%d", atoi(valuestr) );
|
|
|
+ }
|
|
|
+
|
|
|
+ if(strcmp(keystr, "StopTxnSampledData") == 0)
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledData].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledData].ItemData, "%s", valuestr );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if(strcmp(keystr, "StopTxnSampledDataMaxLength") == 0)
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledDataMaxLength].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledDataMaxLength].ItemData, "%d", atoi(valuestr) );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if(strcmp(keystr, "SupportedFeatureProfiles") == 0)
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfiles].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfiles].ItemData, "%s", valuestr );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if(strcmp(keystr, "SupportedFeatureProfilesMaxLength") == 0)
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfilesMaxLength].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfilesMaxLength].ItemData, "%d", atoi(valuestr) );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if(strcmp(keystr, "TransactionMessageAttempts") == 0)
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageAttempts].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageAttempts].ItemData, "%d", atoi(valuestr) );
|
|
|
+ TransactionMessageAttemptsValue = atoi(valuestr);
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if(strcmp(keystr, "TransactionMessageRetryInterval") == 0)
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageRetryInterval].ItemAccessibility= (strcmp(readonlystr, "true")==0) ? 0 : 1;
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageRetryInterval].ItemData, "%d", atoi(valuestr) );
|
|
|
+ TransactionMessageRetryIntervalValue = atoi(valuestr);
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if(strcmp(keystr, "UnlockConnectorOnEVSideDisconnect") == 0)
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[UnlockConnectorOnEVSideDisconnect].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[UnlockConnectorOnEVSideDisconnect].ItemData, "%s", valuestr );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if(strcmp(keystr, "WebSocketPingInterval") == 0)
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[WebSocketPingInterval].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[WebSocketPingInterval].ItemData, "%d", atoi(valuestr) );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ if(strcmp(keystr, "LocalAuthListEnabled") == 0)
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemData, "%s", valuestr );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if(strcmp(keystr, "LocalAuthListMaxLength") == 0)
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListMaxLength].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListMaxLength].ItemData, "%d", atoi(valuestr) );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if(strcmp(keystr, "SendLocalListMaxLength") == 0)
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[SendLocalListMaxLength].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[SendLocalListMaxLength].ItemData, "%d", atoi(valuestr) );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if(strcmp(keystr, "ReserveConnectorZeroSupported") == 0)
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->ConfigurationTable.ReservationProfile[ReserveConnectorZeroSupported].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.ReservationProfile[ReserveConnectorZeroSupported].ItemData, "%s", valuestr );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if(strcmp(keystr, "ChargeProfileMaxStackLevel") == 0)
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargeProfileMaxStackLevel].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargeProfileMaxStackLevel].ItemData, "%d", atoi(valuestr) );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if(strcmp(keystr, "ChargingScheduleAllowedChargingRateUnit") == 0)
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleAllowedChargingRateUnit].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleAllowedChargingRateUnit].ItemData, "%s", valuestr );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if(strcmp(keystr, "ChargingScheduleMaxPeriods") == 0)
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleMaxPeriods].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleMaxPeriods].ItemData, "%d", atoi(valuestr) );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if(strcmp(keystr, "ConnectorSwitch3to1PhaseSupported") == 0)
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ConnectorSwitch3to1PhaseSupported].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ConnectorSwitch3to1PhaseSupported].ItemData, "%s", valuestr);
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if(strcmp(keystr, "MaxChargingProfilesInstalled") == 0)
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[MaxChargingProfilesInstalled].ItemAccessibility = (strcmp(readonlystr, "true")==0) ? 0 : 1;
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[MaxChargingProfilesInstalled].ItemData, "%d", atoi(valuestr) );
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ fclose(fp);
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+void StoreConfigurationTable(void)
|
|
|
+{
|
|
|
+ FILE *outfile;
|
|
|
+ outfile = fopen("/Storage/OCPP/OCPPConfiguration" , "w+");
|
|
|
+ if(outfile == NULL)
|
|
|
+ {
|
|
|
+ DEBUG_INFO("Error opening file");
|
|
|
+ return ;
|
|
|
+ }
|
|
|
+
|
|
|
+ /*Core Profile*/
|
|
|
+ //AllowOfflineTxForUnknownId
|
|
|
+ /*
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[AllowOfflineTxForUnknownId].ItemAccessibility = 1;
|
|
|
+ printf("AllowoddlineTXForUnknownId type: %d \n", ShmOCPP16Data->ConfigurationTable.CoreProfile[AllowOfflineTxForUnknownId].ItemAccessibility);
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AllowOfflineTxForUnknownId].ItemName, "AllowOfflineTxForUnknownId");
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AllowOfflineTxForUnknownId].ItemData, "TRUE" );
|
|
|
+ */
|
|
|
+
|
|
|
+ //DEBUG_INFO("data=%s\n",data);
|
|
|
+ fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","AllowOfflineTxForUnknownId", "false", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AllowOfflineTxForUnknownId].ItemData);
|
|
|
+
|
|
|
+ //AuthorizationCacheEnabled
|
|
|
+ /*
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizationCacheEnabled].ItemAccessibility = 1;
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizationCacheEnabled].ItemName, "AuthorizationCacheEnabled");
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizationCacheEnabled].ItemData, "FALSE" );
|
|
|
+ */
|
|
|
+
|
|
|
+ fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","AuthorizationCacheEnabled", "false", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizationCacheEnabled].ItemData);
|
|
|
+
|
|
|
+ //AuthorizeRemoteTxRequests
|
|
|
+ /*
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizeRemoteTxRequests].ItemAccessibility = 0;
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizeRemoteTxRequests].ItemName, "AuthorizeRemoteTxRequests");
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizeRemoteTxRequests].ItemData, "TRUE" );
|
|
|
+ */
|
|
|
+
|
|
|
+ fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","AuthorizeRemoteTxRequests", "true", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizeRemoteTxRequests].ItemData);
|
|
|
+
|
|
|
+ //BlinkRepeat
|
|
|
+ /*
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[BlinkRepeat].ItemAccessibility = 1;
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[BlinkRepeat].ItemName, "BlinkRepeat");
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[BlinkRepeat].ItemData, "0" );
|
|
|
+ */
|
|
|
+
|
|
|
+ fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","BlinkRepeat", "false", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[BlinkRepeat].ItemData);
|
|
|
+
|
|
|
+ //ClockAlignedDataInterval
|
|
|
+ /*
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[ClockAlignedDataInterval].ItemAccessibility = 1;
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ClockAlignedDataInterval].ItemName, "ClockAlignedDataInterval");
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ClockAlignedDataInterval].ItemData, "0" );
|
|
|
+ */
|
|
|
+
|
|
|
+ fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","ClockAlignedDataInterval", "false", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ClockAlignedDataInterval].ItemData);
|
|
|
+
|
|
|
+ //ConnectionTimeOut
|
|
|
+ /*
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectionTimeOut].ItemAccessibility = 1;
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectionTimeOut].ItemName, "ConnectionTimeOut");
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectionTimeOut].ItemData, "180" );
|
|
|
+ */
|
|
|
+
|
|
|
+ fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","ConnectionTimeOut", "false", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectionTimeOut].ItemData);
|
|
|
+
|
|
|
+ //GetConfigurationMaxKeys
|
|
|
+ /*
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[GetConfigurationMaxKeys].ItemAccessibility =0;
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[GetConfigurationMaxKeys].ItemName, "GetConfigurationMaxKeys");
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[GetConfigurationMaxKeys].ItemData, "43" );
|
|
|
+ */
|
|
|
+
|
|
|
+ fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","GetConfigurationMaxKeys", "true", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[GetConfigurationMaxKeys].ItemData);
|
|
|
+
|
|
|
+ // HeartbeatInterval
|
|
|
+ /*
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[HeartbeatInterval].ItemAccessibility = 1;
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[HeartbeatInterval].ItemName, "HeartbeatInterval");
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[HeartbeatInterval].ItemData, "10" );
|
|
|
+ */
|
|
|
+
|
|
|
+ fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","HeartbeatInterval", "false", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[HeartbeatInterval].ItemData);
|
|
|
+
|
|
|
+ // LightIntensity
|
|
|
+ /*
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[LightIntensity].ItemAccessibility = 1;
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LightIntensity].ItemName, "LightIntensity");
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LightIntensity].ItemData, "0" );
|
|
|
+ */
|
|
|
+
|
|
|
+ fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","LightIntensity", "false", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LightIntensity].ItemData);
|
|
|
+
|
|
|
+ // LocalAuthorizeOffline
|
|
|
+ /*
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalAuthorizeOffline].ItemAccessibility = 0;
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalAuthorizeOffline].ItemName, "LocalAuthorizeOffline");
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalAuthorizeOffline].ItemData, "TRUE" );
|
|
|
+ */
|
|
|
+
|
|
|
+ fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","LocalAuthorizeOffline", "true", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalAuthorizeOffline].ItemData);
|
|
|
+
|
|
|
+ // LocalPreAuthorize
|
|
|
+ /*
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalPreAuthorize].ItemAccessibility = 0;
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalPreAuthorize].ItemName, "LocalPreAuthorize");
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalPreAuthorize].ItemData, "FALSE" );
|
|
|
+ */
|
|
|
+
|
|
|
+ fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","LocalPreAuthorize", "true", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalPreAuthorize].ItemData);
|
|
|
+
|
|
|
+ // MaxEnergyOnInvalidId
|
|
|
+ /*
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[MaxEnergyOnInvalidId].ItemAccessibility = 1;
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MaxEnergyOnInvalidId].ItemName, "MaxEnergyOnInvalidId");
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MaxEnergyOnInvalidId].ItemData, "0" );
|
|
|
+ */
|
|
|
+ //ShmSysConfigAndInfo->SysConfig.OfflineMaxChargeEnergy = 0;
|
|
|
+
|
|
|
+ fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","MaxEnergyOnInvalidId", "false", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MaxEnergyOnInvalidId].ItemData);
|
|
|
+
|
|
|
+ // MeterValuesAlignedData
|
|
|
+ /*
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedData].ItemAccessibility = 1;
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedData].ItemName, "MeterValuesAlignedData");
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedData].ItemData, "Current.Export,Energy.Active.Export.Interval,Power.Active.Export,Voltage,SOC" );
|
|
|
+ */
|
|
|
+
|
|
|
+ fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","MeterValuesAlignedData", "true", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedData].ItemData);
|
|
|
+
|
|
|
+ // MeterValuesAlignedDataMaxLength
|
|
|
+ /*
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedDataMaxLength].ItemAccessibility = 0;
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedDataMaxLength].ItemName, "MeterValuesAlignedDataMaxLength");
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedDataMaxLength].ItemData, "5" );
|
|
|
+ */
|
|
|
+
|
|
|
+ fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","MeterValuesAlignedDataMaxLength", "true", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedDataMaxLength].ItemData);
|
|
|
+
|
|
|
+
|
|
|
+ // MeterValuesSampledData
|
|
|
+ /*
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledData].ItemAccessibility = 1;
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledData].ItemName, "MeterValuesSampledData");
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledData].ItemData, "Current.Export,Energy.Active.Export.Interval,Power.Active.Export,Voltage,SOC" );
|
|
|
+ */
|
|
|
+
|
|
|
+ fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","MeterValuesSampledData", "true", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledData].ItemData);
|
|
|
+
|
|
|
+
|
|
|
+ // MeterValuesSampledDataMaxLength
|
|
|
+ /*
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledDataMaxLength].ItemAccessibility = 0;
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledDataMaxLength].ItemName, "MeterValuesSampledDataMaxLength");
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledDataMaxLength].ItemData, "5" );
|
|
|
+ */
|
|
|
+
|
|
|
+ fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","MeterValuesSampledDataMaxLength", "true", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledDataMaxLength].ItemData);
|
|
|
+
|
|
|
+ // MeterValueSampleInterval
|
|
|
+ /*
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValueSampleInterval].ItemAccessibility = 1;
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValueSampleInterval].ItemName, "MeterValueSampleInterval");
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValueSampleInterval].ItemData, "10" );
|
|
|
+ */
|
|
|
+
|
|
|
+ fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","MeterValueSampleInterval", "false", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValueSampleInterval].ItemData);
|
|
|
+
|
|
|
+ // MinimumStatusDuration
|
|
|
+ /*
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[MinimumStatusDuration].ItemAccessibility = 1;
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MinimumStatusDuration].ItemName, "MinimumStatusDuration");
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MinimumStatusDuration].ItemData, "0" );
|
|
|
+ */
|
|
|
+
|
|
|
+ fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","MinimumStatusDuration", "false", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MinimumStatusDuration].ItemData);
|
|
|
+
|
|
|
+ // NumberOfConnectors
|
|
|
+ /*
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[NumberOfConnectors].ItemAccessibility = 0;
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[NumberOfConnectors].ItemName, "NumberOfConnectors");
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
|
|
|
+ {
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[NumberOfConnectors].ItemData, "%d", (CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY));
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[NumberOfConnectors].ItemData, "%d", AC_QUANTITY);
|
|
|
+ }
|
|
|
+ */
|
|
|
+
|
|
|
+ fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","NumberOfConnectors", "true", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[NumberOfConnectors].ItemData);
|
|
|
+
|
|
|
+ // ResetRetries
|
|
|
+ /*
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[ResetRetries].ItemAccessibility = 1;
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ResetRetries].ItemName, "ResetRetries");
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ResetRetries].ItemData, "3" );
|
|
|
+ */
|
|
|
+
|
|
|
+ fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","ResetRetries", "false", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ResetRetries].ItemData);
|
|
|
+
|
|
|
+ // ConnectorPhaseRotation
|
|
|
+ /*
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotation].ItemAccessibility = 1;
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotation].ItemName, "ConnectorPhaseRotation");
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotation].ItemData, "NotApplicable" );
|
|
|
+ */
|
|
|
+
|
|
|
+ fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","ConnectorPhaseRotation", "false", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotation].ItemData);
|
|
|
+
|
|
|
+ // ConnectorPhaseRotationMaxLength
|
|
|
+ /*
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotationMaxLength].ItemAccessibility = 0;
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotationMaxLength].ItemName, "ConnectorPhaseRotationMaxLength");
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotationMaxLength].ItemData, "1" );
|
|
|
+ */
|
|
|
+
|
|
|
+ fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","ConnectorPhaseRotationMaxLength", "true", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotationMaxLength].ItemData);
|
|
|
+
|
|
|
+ // StopTransactionOnEVSideDisconnect
|
|
|
+ /*
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnEVSideDisconnect].ItemAccessibility = 0;
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnEVSideDisconnect].ItemName, "StopTransactionOnEVSideDisconnect");
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnEVSideDisconnect].ItemData, "TRUE" );
|
|
|
+ */
|
|
|
+
|
|
|
+ fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","StopTransactionOnEVSideDisconnect", "true", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnEVSideDisconnect].ItemData);
|
|
|
+
|
|
|
+ // StopTransactionOnInvalidId
|
|
|
+ /*
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnInvalidId].ItemAccessibility = 0;
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnInvalidId].ItemName, "StopTransactionOnInvalidId");
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnInvalidId].ItemData, "FALSE" );
|
|
|
+ */
|
|
|
+
|
|
|
+ fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","StopTransactionOnInvalidId", "true", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnInvalidId].ItemData);
|
|
|
+
|
|
|
+ // StopTxnAlignedData
|
|
|
+ /*
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedData].ItemAccessibility = 1;
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedData].ItemName, "StopTxnAlignedData");
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedData].ItemData, "Energy.Active.Import.Register" );
|
|
|
+ */
|
|
|
+
|
|
|
+ fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","StopTxnAlignedData", "true", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedData].ItemData);
|
|
|
+
|
|
|
+ // StopTxnAlignedDataMaxLength
|
|
|
+ /*
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedDataMaxLength].ItemAccessibility = 0;
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedDataMaxLength].ItemName, "StopTxnAlignedDataMaxLength");
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedDataMaxLength].ItemData, "0" );
|
|
|
+ */
|
|
|
+
|
|
|
+ fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","StopTxnAlignedDataMaxLength", "true", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedDataMaxLength].ItemData);
|
|
|
+
|
|
|
+ // StopTxnSampledData
|
|
|
+ /*
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledData].ItemAccessibility = 1;
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledData].ItemName, "StopTxnSampledData");
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledData].ItemData, "Energy.Active.Import.Register" );
|
|
|
+ */
|
|
|
+
|
|
|
+ fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","StopTxnSampledData", "true", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledData].ItemData);
|
|
|
+
|
|
|
+ // StopTxnSampledDataMaxLength
|
|
|
+ /*
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledDataMaxLength].ItemAccessibility = 0;
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledDataMaxLength].ItemName, "StopTxnSampledDataMaxLength");
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledDataMaxLength].ItemData, "0" );
|
|
|
+ */
|
|
|
+
|
|
|
+ fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","StopTxnSampledDataMaxLength", "true", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledDataMaxLength].ItemData);
|
|
|
+
|
|
|
+ // SupportedFeatureProfiles
|
|
|
+ /*
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfiles].ItemAccessibility = 0;
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfiles].ItemName, "SupportedFeatureProfiles");
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfiles].ItemData, "Core,FirmwareManagement,LocalAuthListManagement,Reservation,SmartCharging,RemoteTrigger" );
|
|
|
+ */
|
|
|
+
|
|
|
+ fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","SupportedFeatureProfiles", "true", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfiles].ItemData);
|
|
|
+
|
|
|
+ // SupportedFeatureProfilesMaxLength
|
|
|
+ /*
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfilesMaxLength].ItemAccessibility = 0;
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfilesMaxLength].ItemName, "SupportedFeatureProfilesMaxLength");
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfilesMaxLength].ItemData, "6" );
|
|
|
+ */
|
|
|
+
|
|
|
+ fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","SupportedFeatureProfilesMaxLength", "true", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfilesMaxLength].ItemData);
|
|
|
+
|
|
|
+ // TransactionMessageAttempts
|
|
|
+ /*
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageAttempts].ItemAccessibility = 1;
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageAttempts].ItemName, "TransactionMessageAttempts");
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageAttempts].ItemData, "3" );
|
|
|
+ */
|
|
|
+
|
|
|
+ fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","TransactionMessageAttempts", "false", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageAttempts].ItemData);
|
|
|
+
|
|
|
+ // TransactionMessageRetryInterval
|
|
|
+ /*
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageRetryInterval].ItemAccessibility = 1;
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageRetryInterval].ItemName, "TransactionMessageRetryInterval");
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageRetryInterval].ItemData, "60" );
|
|
|
+ */
|
|
|
+
|
|
|
+ fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","TransactionMessageRetryInterval", "false", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageRetryInterval].ItemData);
|
|
|
+
|
|
|
+ // UnlockConnectorOnEVSideDisconnect
|
|
|
+ /*
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[UnlockConnectorOnEVSideDisconnect].ItemAccessibility = 0;
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[UnlockConnectorOnEVSideDisconnect].ItemName, "UnlockConnectorOnEVSideDisconnect");
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[UnlockConnectorOnEVSideDisconnect].ItemData, "TRUE" );
|
|
|
+ */
|
|
|
+
|
|
|
+ fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","UnlockConnectorOnEVSideDisconnect", "true", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[UnlockConnectorOnEVSideDisconnect].ItemData);
|
|
|
+
|
|
|
+
|
|
|
+ // WebSocketPingInterval
|
|
|
+ /*
|
|
|
+ ShmOCPP16Data->ConfigurationTable.CoreProfile[WebSocketPingInterval].ItemAccessibility = 1;
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[WebSocketPingInterval].ItemName, "WebSocketPingInterval");
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[WebSocketPingInterval].ItemData, "30" );
|
|
|
+ */
|
|
|
+
|
|
|
+ fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","WebSocketPingInterval", "false", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[WebSocketPingInterval].ItemData);
|
|
|
+
|
|
|
+ //* Local Auth List Management Profile*/
|
|
|
+ //LocalAuthListEnabled
|
|
|
+ /*
|
|
|
+ ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemAccessibility = 1;
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemName, "LocalAuthListEnabled");
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemData, "TRUE" );
|
|
|
+ */
|
|
|
+ fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","LocalAuthListEnabled", "false", (char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemData);
|
|
|
+
|
|
|
+ //LocalAuthListMaxLength
|
|
|
+ /*
|
|
|
+ ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListMaxLength].ItemAccessibility = 0;
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListMaxLength].ItemName, "LocalAuthListMaxLength");
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListMaxLength].ItemData, "500" );
|
|
|
+ */
|
|
|
+
|
|
|
+ fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","LocalAuthListMaxLength", "true", (char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListMaxLength].ItemData);
|
|
|
+
|
|
|
+ //SendLocalListMaxLength
|
|
|
+ /*
|
|
|
+ ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[SendLocalListMaxLength].ItemAccessibility = 0;
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[SendLocalListMaxLength].ItemName, "SendLocalListMaxLength");
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[SendLocalListMaxLength].ItemData, "500" );
|
|
|
+ */
|
|
|
+
|
|
|
+ fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","SendLocalListMaxLength", "true", (char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[SendLocalListMaxLength].ItemData);
|
|
|
+
|
|
|
+
|
|
|
+ //ReserveConnectorZeroSupported
|
|
|
+ /*
|
|
|
+ ShmOCPP16Data->ConfigurationTable.ReservationProfile[ReserveConnectorZeroSupported].ItemAccessibility = 0;
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.ReservationProfile[ReserveConnectorZeroSupported].ItemName, "ReserveConnectorZeroSupported");
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.ReservationProfile[ReserveConnectorZeroSupported].ItemData, "FALSE" );
|
|
|
+ */
|
|
|
+
|
|
|
+ fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","ReserveConnectorZeroSupported", "true", (char *)ShmOCPP16Data->ConfigurationTable.ReservationProfile[ReserveConnectorZeroSupported].ItemData);
|
|
|
+
|
|
|
+ //* Smart Charging Profile */
|
|
|
+ //ChargeProfileMaxStackLevel
|
|
|
+ /*
|
|
|
+ ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargeProfileMaxStackLevel].ItemAccessibility = 0;
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargeProfileMaxStackLevel].ItemName, "ChargeProfileMaxStackLevel");
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargeProfileMaxStackLevel].ItemData, "3" );
|
|
|
+ */
|
|
|
+
|
|
|
+ fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","ChargeProfileMaxStackLevel", "true", (char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargeProfileMaxStackLevel].ItemData);
|
|
|
+
|
|
|
+ // ChargingScheduleAllowedChargingRateUnit
|
|
|
+ /*
|
|
|
+ ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleAllowedChargingRateUnit].ItemAccessibility = 0;
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleAllowedChargingRateUnit].ItemName, "ChargingScheduleAllowedChargingRateUnit");
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleAllowedChargingRateUnit].ItemData, "Current" );
|
|
|
+ */
|
|
|
+
|
|
|
+ fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","ChargingScheduleAllowedChargingRateUnit", "true", (char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleAllowedChargingRateUnit].ItemData);
|
|
|
+
|
|
|
+ // ChargingScheduleMaxPeriods
|
|
|
+ /*
|
|
|
+ ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleMaxPeriods].ItemAccessibility = 0;
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleMaxPeriods].ItemName, "ChargingScheduleMaxPeriods");
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleMaxPeriods].ItemData, "10" );
|
|
|
+ */
|
|
|
+
|
|
|
+ fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","ChargingScheduleMaxPeriods", "true", (char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleMaxPeriods].ItemData);
|
|
|
+
|
|
|
+ // ConnectorSwitch3to1PhaseSupported
|
|
|
+ /*
|
|
|
+ ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ConnectorSwitch3to1PhaseSupported].ItemAccessibility = 0;
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ConnectorSwitch3to1PhaseSupported].ItemName, "ConnectorSwitch3to1PhaseSupported");
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ConnectorSwitch3to1PhaseSupported].ItemData, "TRUE" );
|
|
|
+ */
|
|
|
+
|
|
|
+ fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","ConnectorSwitch3to1PhaseSupported", "true", (char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ConnectorSwitch3to1PhaseSupported].ItemData);
|
|
|
+
|
|
|
+ // MaxChargingProfilesInstalled
|
|
|
+ /*
|
|
|
+ ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[MaxChargingProfilesInstalled].ItemAccessibility = 0;
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[MaxChargingProfilesInstalled].ItemName, "MaxChargingProfilesInstalled");
|
|
|
+ strcpy((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[MaxChargingProfilesInstalled].ItemData, "3" );
|
|
|
+ */
|
|
|
+
|
|
|
+ fprintf(outfile,"{\"key\":\"%s\",\"readonly\":%s,\"value\":\"%s\"}\n","MaxChargingProfilesInstalled", "true", (char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[MaxChargingProfilesInstalled].ItemData);
|
|
|
+
|
|
|
+ fclose(outfile);
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+void getKeyValue(char *keyReq)
|
|
|
+{
|
|
|
+ int isEmpty = FALSE;
|
|
|
+ int isKnowKey = FALSE;
|
|
|
+
|
|
|
+ DEBUG_INFO("keyReq = %s\n", keyReq);
|
|
|
+
|
|
|
+ if((keyReq == NULL) || (strlen(keyReq) == 0))
|
|
|
+ isEmpty = TRUE;
|
|
|
+
|
|
|
+ if(isEmpty || strcmp(keyReq, "AllowOfflineTxForUnknownId") == 0)
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_AllowOfflineTxForUnknownId].Item, "AllowOfflineTxForUnknownId");
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_AllowOfflineTxForUnknownId].Key, "AllowOfflineTxForUnknownId");
|
|
|
+ if(ShmOCPP16Data->ConfigurationTable.CoreProfile[AllowOfflineTxForUnknownId].ItemAccessibility == 1)
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_AllowOfflineTxForUnknownId].ReadOnly, "0"/*"FALSE"*/);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_AllowOfflineTxForUnknownId].ReadOnly, "1"/*"TRUE"*/);
|
|
|
+ }
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_AllowOfflineTxForUnknownId].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AllowOfflineTxForUnknownId].ItemData );
|
|
|
+ isKnowKey = TRUE;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(isEmpty || strcmp(keyReq, "AuthorizationCacheEnabled") == 0 )
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_AuthorizationCacheEnabled].Item, "AuthorizationCacheEnabled");
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_AuthorizationCacheEnabled].Key, "AuthorizationCacheEnabled");
|
|
|
+ if(ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizationCacheEnabled].ItemAccessibility == 1)
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_AuthorizationCacheEnabled].ReadOnly, "0"/*"FALSE"*/);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_AuthorizationCacheEnabled].ReadOnly, "1"/*"TRUE"*/);
|
|
|
+ }
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_AuthorizationCacheEnabled].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizationCacheEnabled].ItemData );
|
|
|
+ isKnowKey = TRUE;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(isEmpty || strcmp(keyReq, "AuthorizeRemoteTxRequests") == 0 )
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_AuthorizeRemoteTxRequests].Item, "AuthorizeRemoteTxRequests");
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_AuthorizeRemoteTxRequests].Key, "AuthorizeRemoteTxRequests");
|
|
|
+
|
|
|
+ if(ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizeRemoteTxRequests].ItemAccessibility == 1)
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_AuthorizeRemoteTxRequests].ReadOnly, "0"/*"FALSE"*/);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_AuthorizeRemoteTxRequests].ReadOnly, "1"/*"TRUE"*/);
|
|
|
+ }
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_AuthorizeRemoteTxRequests].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizeRemoteTxRequests].ItemData );
|
|
|
+ isKnowKey = TRUE;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(isEmpty || strcmp(keyReq, "BlinkRepeat") == 0 )
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_BlinkRepeat].Item, "BlinkRepeat");
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_BlinkRepeat].Key, "BlinkRepeat");
|
|
|
+
|
|
|
+ if(ShmOCPP16Data->ConfigurationTable.CoreProfile[BlinkRepeat].ItemAccessibility == 1)
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_BlinkRepeat].ReadOnly, "0"/*"FALSE"*/);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_BlinkRepeat].ReadOnly, "1"/*"TRUE"*/);
|
|
|
+ }
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_BlinkRepeat].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[BlinkRepeat].ItemData );
|
|
|
+ isKnowKey = TRUE;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(isEmpty || strcmp(keyReq, "ClockAlignedDataInterval") == 0 )
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_ClockAlignedDataInterval].Item, "ClockAlignedDataInterval");
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ClockAlignedDataInterval].Key, "ClockAlignedDataInterval");
|
|
|
+
|
|
|
+ if(ShmOCPP16Data->ConfigurationTable.CoreProfile[ClockAlignedDataInterval].ItemAccessibility == 1)
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ClockAlignedDataInterval].ReadOnly, "0"/*"FALSE"*/);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ClockAlignedDataInterval].ReadOnly, "1"/*"TRUE"*/);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ClockAlignedDataInterval].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ClockAlignedDataInterval].ItemData );
|
|
|
+ isKnowKey = TRUE;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(isEmpty || strcmp(keyReq, "ConnectionTimeOut") == 0 )
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_ConnectionTimeOut].Item, "ConnectionTimeOut");
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ConnectionTimeOut].Key, "ConnectionTimeOut");
|
|
|
+
|
|
|
+ if(ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectionTimeOut].ItemAccessibility == 1)
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ConnectionTimeOut].ReadOnly, "0"/*"FALSE"*/);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ConnectionTimeOut].ReadOnly, "1"/*"TRUE"*/);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ConnectionTimeOut].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectionTimeOut].ItemData );
|
|
|
+ isKnowKey = TRUE;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(isEmpty || strcmp(keyReq, "GetConfigurationMaxKeys") == 0 )
|
|
|
+ {
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_GetConfigurationMaxKeys].Item, "GetConfigurationMaxKeys");
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_GetConfigurationMaxKeys].Key, "GetConfigurationMaxKeys");
|
|
|
+
|
|
|
+ if(ShmOCPP16Data->ConfigurationTable.CoreProfile[GetConfigurationMaxKeys].ItemAccessibility == 1)
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_GetConfigurationMaxKeys].ReadOnly, "0"/*"FALSE"*/);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_GetConfigurationMaxKeys].ReadOnly, "1"/*"TRUE"*/);
|
|
|
+ }
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_GetConfigurationMaxKeys].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[GetConfigurationMaxKeys].ItemData );
|
|
|
+ isKnowKey = TRUE;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(isEmpty || strcmp(keyReq, "HeartbeatInterval") == 0 )
|
|
|
+ {
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_HeartbeatInterval].Item, "HeartbeatInterval");
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_HeartbeatInterval].Key, "HeartbeatInterval");
|
|
|
+
|
|
|
+ if(ShmOCPP16Data->ConfigurationTable.CoreProfile[HeartbeatInterval].ItemAccessibility == 1)
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_HeartbeatInterval].ReadOnly, "0"/*"FALSE"*/);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_HeartbeatInterval].ReadOnly, "1"/*"TRUE"*/);
|
|
|
+ }
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_HeartbeatInterval].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[HeartbeatInterval].ItemData );
|
|
|
+ isKnowKey = TRUE;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(isEmpty || strcmp(keyReq, "LightIntensity") == 0 )
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_LightIntensity].Item, "LightIntensity");
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_LightIntensity].Key, "LightIntensity");
|
|
|
+
|
|
|
+ if(ShmOCPP16Data->ConfigurationTable.CoreProfile[LightIntensity].ItemAccessibility == 1)
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_LightIntensity].ReadOnly, "0"/*"FALSE"*/);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_LightIntensity].ReadOnly, "1"/*"TRUE"*/);
|
|
|
+ }
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_LightIntensity].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LightIntensity].ItemData );
|
|
|
+ isKnowKey = TRUE;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(isEmpty || strcmp(keyReq, "LocalAuthorizeOffline") == 0 )
|
|
|
+ {
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_LocalAuthorizeOffline].Item, "LocalAuthorizeOffline");
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_LocalAuthorizeOffline].Key, "LocalAuthorizeOffline");
|
|
|
+
|
|
|
+ if(ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalAuthorizeOffline].ItemAccessibility == 1)
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_LocalAuthorizeOffline].ReadOnly, "0"/*"FALSE"*/);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_LocalAuthorizeOffline].ReadOnly, "1"/*"TRUE"*/);
|
|
|
+ }
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_LocalAuthorizeOffline].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalAuthorizeOffline].ItemData );
|
|
|
+ isKnowKey = TRUE;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(isEmpty || strcmp(keyReq, "LocalPreAuthorize") == 0 )
|
|
|
+ {
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_LocalPreAuthorize].Item, "LocalPreAuthorize");
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_LocalPreAuthorize].Key, "LocalPreAuthorize");
|
|
|
+
|
|
|
+ if(ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalPreAuthorize].ItemAccessibility == 1)
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_LocalPreAuthorize].ReadOnly, "0"/*"FALSE"*/);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_LocalPreAuthorize].ReadOnly, "1"/*"TRUE"*/);
|
|
|
+ }
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_LocalPreAuthorize].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalPreAuthorize].ItemData );
|
|
|
+ isKnowKey = TRUE;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(isEmpty || strcmp(keyReq, "MaxEnergyOnInvalidId") == 0 )
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_MaxEnergyOnInvalidId].Item, "MaxEnergyOnInvalidId");
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MaxEnergyOnInvalidId].Key, "MaxEnergyOnInvalidId");
|
|
|
+
|
|
|
+ if(ShmOCPP16Data->ConfigurationTable.CoreProfile[MaxEnergyOnInvalidId].ItemAccessibility == 1)
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MaxEnergyOnInvalidId].ReadOnly, "0"/*"FALSE"*/);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MaxEnergyOnInvalidId].ReadOnly, "1"/*"TRUE"*/);
|
|
|
+ }
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MaxEnergyOnInvalidId].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MaxEnergyOnInvalidId].ItemData );
|
|
|
+ ShmSysConfigAndInfo->SysConfig.OfflineMaxChargeEnergy = atoi((const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MaxEnergyOnInvalidId].ItemData)/1000;
|
|
|
+ isKnowKey = TRUE;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(isEmpty || strcmp(keyReq, "MeterValuesAlignedData") == 0 )
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_MeterValuesAlignedData].Item, "MeterValuesAlignedData");
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MeterValuesAlignedData].Key, "MeterValuesAlignedData");
|
|
|
+
|
|
|
+ if(ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedData].ItemAccessibility == 1)
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MeterValuesAlignedData].ReadOnly, "0"/*"FALSE"*/);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MeterValuesAlignedData].ReadOnly, "1"/*"TRUE"*/);
|
|
|
+ }
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MeterValuesAlignedData].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedData].ItemData );
|
|
|
+ isKnowKey = TRUE;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(isEmpty || strcmp(keyReq, "MeterValuesAlignedDataMaxLength") == 0 )
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_MeterValuesAlignedDataMaxLength].Item, "MeterValuesAlignedDataMaxLength");
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MeterValuesAlignedDataMaxLength].Key, "MeterValuesAlignedDataMaxLength");
|
|
|
+
|
|
|
+ if(ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedDataMaxLength].ItemAccessibility == 1)
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MeterValuesAlignedDataMaxLength].ReadOnly, "0"/*"FALSE"*/);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MeterValuesAlignedDataMaxLength].ReadOnly, "1"/*"TRUE"*/);
|
|
|
+ }
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MeterValuesAlignedDataMaxLength].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedDataMaxLength].ItemData );
|
|
|
+ isKnowKey = TRUE;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(isEmpty || strcmp(keyReq, "MeterValuesSampledData") == 0 )
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_MeterValuesSampledData].Item, "MeterValuesSampledData");
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MeterValuesSampledData].Key, "MeterValuesSampledData");
|
|
|
+
|
|
|
+ if(ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledData].ItemAccessibility == 1)
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MeterValuesSampledData].ReadOnly, "0"/*"FALSE"*/);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MeterValuesSampledData].ReadOnly, "1"/*"TRUE"*/);
|
|
|
+ }
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MeterValuesSampledData].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledData].ItemData );
|
|
|
+ isKnowKey = TRUE;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(isEmpty || strcmp(keyReq, "MeterValuesSampledDataMaxLength") == 0 )
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_MeterValuesSampledDataMaxLength].Item, "MeterValuesSampledDataMaxLength");
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MeterValuesSampledDataMaxLength].Key, "MeterValuesSampledDataMaxLength");
|
|
|
+
|
|
|
+ if(ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledDataMaxLength].ItemAccessibility == 1)
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MeterValuesSampledDataMaxLength].ReadOnly, "0"/*"FALSE"*/);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MeterValuesSampledDataMaxLength].ReadOnly, "1"/*"TRUE"*/);
|
|
|
+ }
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MeterValuesSampledDataMaxLength].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledDataMaxLength].ItemData );
|
|
|
+ isKnowKey = TRUE;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(isEmpty || strcmp(keyReq, "MeterValueSampleInterval") == 0 )
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_MeterValueSampleInterval].Item, "MeterValueSampleInterval");
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MeterValueSampleInterval].Key, "MeterValueSampleInterval");
|
|
|
+
|
|
|
+ if(ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValueSampleInterval].ItemAccessibility == 1)
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MeterValueSampleInterval].ReadOnly, "0"/*"FALSE"*/);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MeterValueSampleInterval].ReadOnly, "1"/*"TRUE"*/);
|
|
|
+ }
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MeterValueSampleInterval].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValueSampleInterval].ItemData );
|
|
|
+ isKnowKey = TRUE;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(isEmpty || strcmp(keyReq, "MinimumStatusDuration") == 0 )
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_MinimumStatusDuration].Item, "MinimumStatusDuration");
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MinimumStatusDuration].Key, "MinimumStatusDuration");
|
|
|
+
|
|
|
+ if(ShmOCPP16Data->ConfigurationTable.CoreProfile[MinimumStatusDuration].ItemAccessibility == 1)
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MinimumStatusDuration].ReadOnly, "0"/*"FALSE"*/);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MinimumStatusDuration].ReadOnly, "1"/*"TRUE"*/);
|
|
|
+ }
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MinimumStatusDuration].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[17].ItemData );
|
|
|
+ isKnowKey = TRUE;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(isEmpty || strcmp(keyReq, "NumberOfConnectors") == 0 )
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_NumberOfConnectors].Item, "NumberOfConnectors");
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_NumberOfConnectors].Key, "NumberOfConnectors");
|
|
|
+
|
|
|
+ if(ShmOCPP16Data->ConfigurationTable.CoreProfile[NumberOfConnectors].ItemAccessibility == 1)
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_NumberOfConnectors].ReadOnly, "0"/*"FALSE"*/);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_NumberOfConnectors].ReadOnly, "1"/*"TRUE"*/);
|
|
|
+ }
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_NumberOfConnectors].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[NumberOfConnectors].ItemData );
|
|
|
+ isKnowKey = TRUE;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(isEmpty || strcmp(keyReq, "ResetRetries") == 0 )
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_ResetRetries].Item, "ResetRetries");
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ResetRetries].Key, "ResetRetries");
|
|
|
+
|
|
|
+ if(ShmOCPP16Data->ConfigurationTable.CoreProfile[ResetRetries].ItemAccessibility == 1)
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ResetRetries].ReadOnly, "0"/*"FALSE"*/);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ResetRetries].ReadOnly, "1"/*"TRUE"*/);
|
|
|
+ }
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ResetRetries].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ResetRetries].ItemData );
|
|
|
+ isKnowKey = TRUE;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(isEmpty || strcmp(keyReq, "ConnectorPhaseRotation") == 0 )
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_ConnectorPhaseRotation].Item, "ConnectorPhaseRotation");
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ConnectorPhaseRotation].Key, "ConnectorPhaseRotation");
|
|
|
+
|
|
|
+ if(ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotation].ItemAccessibility == 1)
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ConnectorPhaseRotation].ReadOnly, "0"/*"FALSE"*/);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ConnectorPhaseRotation].ReadOnly, "1"/*"TRUE"*/);
|
|
|
+ }
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ConnectorPhaseRotation].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotation].ItemData );
|
|
|
+ isKnowKey = TRUE;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if(isEmpty || strcmp(keyReq, "ConnectorPhaseRotationMaxLength") == 0 )
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_ConnectorPhaseRotationMaxLength].Item, "ConnectorPhaseRotationMaxLength");
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ConnectorPhaseRotationMaxLength].Key, "ConnectorPhaseRotationMaxLength");
|
|
|
+
|
|
|
+ if(ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotationMaxLength].ItemAccessibility == 1)
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ConnectorPhaseRotationMaxLength].ReadOnly, "0"/*"FALSE"*/);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ConnectorPhaseRotationMaxLength].ReadOnly, "1"/*"TRUE"*/);
|
|
|
+ }
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ConnectorPhaseRotationMaxLength].Value,(const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotationMaxLength].ItemData );
|
|
|
+ isKnowKey = TRUE;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(isEmpty || strcmp(keyReq, "StopTransactionOnEVSideDisconnect") == 0 )
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_StopTransactionOnEVSideDisconnect].Item, "StopTransactionOnEVSideDisconnect");
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTransactionOnEVSideDisconnect].Key, "StopTransactionOnEVSideDisconnect");
|
|
|
+
|
|
|
+ if(ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnEVSideDisconnect].ItemAccessibility == 1)
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTransactionOnEVSideDisconnect].ReadOnly, "0"/*"FALSE"*/);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTransactionOnEVSideDisconnect].ReadOnly, "1"/*"TRUE"*/);
|
|
|
+ }
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTransactionOnEVSideDisconnect].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnEVSideDisconnect].ItemData );
|
|
|
+ isKnowKey = TRUE;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(isEmpty || strcmp(keyReq, "StopTransactionOnInvalidId") == 0 )
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_StopTransactionOnInvalidId].Item, "StopTransactionOnInvalidId");
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTransactionOnInvalidId].Key, "StopTransactionOnInvalidId");
|
|
|
+
|
|
|
+ if(ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnInvalidId].ItemAccessibility == 1)
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTransactionOnInvalidId].ReadOnly, "0"/*"FALSE"*/);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTransactionOnInvalidId].ReadOnly, "1"/*"TRUE"*/);
|
|
|
+ }
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTransactionOnInvalidId].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnInvalidId].ItemData );
|
|
|
+ isKnowKey = TRUE;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(isEmpty || strcmp(keyReq, "StopTxnAlignedData") == 0 )
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_StopTxnAlignedData].Item, "StopTxnAlignedData");
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTxnAlignedData].Key, "StopTxnAlignedData");
|
|
|
+
|
|
|
+ if(ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedData].ItemAccessibility == 1)
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTxnAlignedData].ReadOnly, "0"/*"FALSE"*/);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTxnAlignedData].ReadOnly, "1"/*"TRUE"*/);
|
|
|
+ }
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTxnAlignedData].Value,(const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedData].ItemData );
|
|
|
+ isKnowKey = TRUE;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(isEmpty || strcmp(keyReq, "StopTxnAlignedDataMaxLength") == 0 )
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_StopTxnAlignedDataMaxLength].Item, "StopTxnAlignedDataMaxLength");
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTxnAlignedDataMaxLength].Key, "StopTxnAlignedDataMaxLength");
|
|
|
+
|
|
|
+ if(ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedDataMaxLength].ItemAccessibility == 1)
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTxnAlignedDataMaxLength].ReadOnly, "0"/*"FALSE"*/);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTxnAlignedDataMaxLength].ReadOnly, "1"/*"TRUE"*/);
|
|
|
+ }
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTxnAlignedDataMaxLength].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedDataMaxLength].ItemData );
|
|
|
+ isKnowKey = TRUE;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(isEmpty || strcmp(keyReq, "StopTxnSampledData") == 0 )
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_StopTxnSampledData].Item, "StopTxnSampledData");
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTxnSampledData].Key, "StopTxnSampledData");
|
|
|
+
|
|
|
+ if(ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledData].ItemAccessibility == 1)
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTxnSampledData].ReadOnly, "0"/*"FALSE"*/);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTxnSampledData].ReadOnly, "1"/*"TRUE"*/);
|
|
|
+ }
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTxnSampledData].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledData].ItemData );
|
|
|
+ isKnowKey = TRUE;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(isEmpty || strcmp(keyReq, "StopTxnSampledDataMaxLength") == 0 )
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_StopTxnSampledDataMaxLength].Item, "StopTxnSampledDataMaxLength");
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTxnSampledDataMaxLength].Key, "StopTxnSampledDataMaxLength");
|
|
|
+
|
|
|
+ if(ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledDataMaxLength].ItemAccessibility == 1)
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTxnSampledDataMaxLength].ReadOnly, "0"/*"FALSE"*/);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTxnSampledDataMaxLength].ReadOnly, "1"/*"TRUE"*/);
|
|
|
+ }
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_StopTxnSampledDataMaxLength].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledDataMaxLength].ItemData );
|
|
|
+ isKnowKey = TRUE;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(isEmpty || strcmp(keyReq, "SupportedFeatureProfiles") == 0 )
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_SupportedFeatureProfiles].Item, "SupportedFeatureProfiles");
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_SupportedFeatureProfiles].Key, "SupportedFeatureProfiles");
|
|
|
+
|
|
|
+ if(ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfiles].ItemAccessibility == 1)
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_SupportedFeatureProfiles].ReadOnly, "0"/*"FALSE"*/);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_SupportedFeatureProfiles].ReadOnly, "1"/*"TRUE"*/);
|
|
|
+ }
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_SupportedFeatureProfiles].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfiles].ItemData );
|
|
|
+ isKnowKey = TRUE;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(isEmpty || strcmp(keyReq, "SupportedFeatureProfilesMaxLength") == 0 )
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_SupportedFeatureProfilesMaxLength].Item, "SupportedFeatureProfilesMaxLength");
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_SupportedFeatureProfilesMaxLength].Key, "SupportedFeatureProfilesMaxLength");
|
|
|
+
|
|
|
+ if(ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfilesMaxLength].ItemAccessibility == 1)
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_SupportedFeatureProfilesMaxLength].ReadOnly, "0"/*"FALSE"*/);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_SupportedFeatureProfilesMaxLength].ReadOnly, "1"/*"TRUE"*/);
|
|
|
+ }
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_SupportedFeatureProfilesMaxLength].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfilesMaxLength].ItemData );
|
|
|
+ isKnowKey = TRUE;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(isEmpty || strcmp(keyReq, "TransactionMessageAttempts") == 0 )
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_TransactionMessageAttempts].Item, "TransactionMessageAttempts");
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_TransactionMessageAttempts].Key, "TransactionMessageAttempts");
|
|
|
+
|
|
|
+ if(ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageAttempts].ItemAccessibility == 1)
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_TransactionMessageAttempts].ReadOnly, "0"/*"FALSE"*/);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_TransactionMessageAttempts].ReadOnly, "1"/*"TRUE"*/);
|
|
|
+ }
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_TransactionMessageAttempts].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageAttempts].ItemData );
|
|
|
+ isKnowKey = TRUE;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(isEmpty || strcmp(keyReq, "TransactionMessageRetryInterval") == 0 )
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_TransactionMessageRetryInterval].Item, "TransactionMessageRetryInterval");
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_TransactionMessageRetryInterval].Key, "TransactionMessageRetryInterval");
|
|
|
+
|
|
|
+ if(ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageRetryInterval].ItemAccessibility == 1)
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_TransactionMessageRetryInterval].ReadOnly, "0"/*"FALSE"*/);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_TransactionMessageRetryInterval].ReadOnly, "1"/*"TRUE"*/);
|
|
|
+ }
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_TransactionMessageRetryInterval].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageRetryInterval].ItemData );
|
|
|
+ isKnowKey = TRUE;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(isEmpty || strcmp(keyReq, "UnlockConnectorOnEVSideDisconnect") == 0 )
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_UnlockConnectorOnEVSideDisconnect].Item, "UnlockConnectorOnEVSideDisconnect");
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_UnlockConnectorOnEVSideDisconnect].Key, "UnlockConnectorOnEVSideDisconnect");
|
|
|
+
|
|
|
+ if(ShmOCPP16Data->ConfigurationTable.CoreProfile[UnlockConnectorOnEVSideDisconnect].ItemAccessibility == 1)
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_UnlockConnectorOnEVSideDisconnect].ReadOnly, "0"/*"FALSE"*/);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_UnlockConnectorOnEVSideDisconnect].ReadOnly, "1"/*"TRUE"*/);
|
|
|
+ }
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_UnlockConnectorOnEVSideDisconnect].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[UnlockConnectorOnEVSideDisconnect].ItemData );
|
|
|
+ isKnowKey = TRUE;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if(isEmpty || strcmp(keyReq, "WebSocketPingInterval") == 0 )
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_WebSocketPingInterval].Item, "WebSocketPingInterval");
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_WebSocketPingInterval].Key, "WebSocketPingInterval");
|
|
|
+
|
|
|
+ if(ShmOCPP16Data->ConfigurationTable.CoreProfile[WebSocketPingInterval].ItemAccessibility == 1)
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_WebSocketPingInterval].ReadOnly, "0"/*"FALSE"*/);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_WebSocketPingInterval].ReadOnly, "1"/*"TRUE"*/);
|
|
|
+ }
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_WebSocketPingInterval].Value, (const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[WebSocketPingInterval].ItemData );
|
|
|
+ isKnowKey = TRUE;
|
|
|
+
|
|
|
+ }
|
|
|
+#if 1
|
|
|
+ if(isEmpty || strcmp(keyReq, "LocalAuthListEnabled") == 0 )
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_LocalAuthListEnabled].Item, "LocalAuthListEnabled");
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_LocalAuthListEnabled].Key, "LocalAuthListEnabled");
|
|
|
+
|
|
|
+ if(ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemAccessibility == 1)
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_LocalAuthListEnabled].ReadOnly, "0"/*"FALSE"*/);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_LocalAuthListEnabled].ReadOnly, "1"/*"TRUE"*/);
|
|
|
+ }
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_LocalAuthListEnabled].Value, (const char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemData );
|
|
|
+ isKnowKey = TRUE;
|
|
|
+ }
|
|
|
+#endif
|
|
|
+
|
|
|
+ if(isEmpty || strcmp(keyReq, "LocalAuthListMaxLength") == 0 )
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_LocalAuthListMaxLength].Item, "LocalAuthListMaxLength");
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_LocalAuthListMaxLength].Key, "LocalAuthListMaxLength");
|
|
|
+
|
|
|
+ if(ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListMaxLength].ItemAccessibility == 1)
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_LocalAuthListMaxLength].ReadOnly, "0"/*"FALSE"*/);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_LocalAuthListMaxLength].ReadOnly, "1"/*"TRUE"*/);
|
|
|
+ }
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_LocalAuthListMaxLength].Value, (const char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListMaxLength].ItemData );
|
|
|
+ isKnowKey = TRUE;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(isEmpty || strcmp(keyReq, "SendLocalListMaxLength") == 0 )
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_SendLocalListMaxLength].Item, "SendLocalListMaxLength");
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_SendLocalListMaxLength].Key, "SendLocalListMaxLength");
|
|
|
+
|
|
|
+ if(ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[SendLocalListMaxLength].ItemAccessibility == 1)
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_SendLocalListMaxLength].ReadOnly, "0"/*"FALSE"*/);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_SendLocalListMaxLength].ReadOnly, "1"/*"TRUE"*/);
|
|
|
+ }
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_SendLocalListMaxLength].Value, (const char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[SendLocalListMaxLength].ItemData );
|
|
|
+ isKnowKey = TRUE;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(isEmpty || strcmp(keyReq, "ReserveConnectorZeroSupported") == 0 )
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_ReserveConnectorZeroSupported].Item, "ReserveConnectorZeroSupported");
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ReserveConnectorZeroSupported].Key, "ReserveConnectorZeroSupported");
|
|
|
+
|
|
|
+ if(ShmOCPP16Data->ConfigurationTable.ReservationProfile[ReserveConnectorZeroSupported].ItemAccessibility == 1)
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ReserveConnectorZeroSupported].ReadOnly, "0"/*"FALSE"*/);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ReserveConnectorZeroSupported].ReadOnly, "1"/*"TRUE"*/);
|
|
|
+ }
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ReserveConnectorZeroSupported].Value,(const char *)ShmOCPP16Data->ConfigurationTable.ReservationProfile[ReserveConnectorZeroSupported].ItemData);
|
|
|
+ isKnowKey = TRUE;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(isEmpty || strcmp(keyReq, "ChargeProfileMaxStackLevel") == 0 )
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_ChargeProfileMaxStackLevel].Item, "ChargeProfileMaxStackLevel");
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ChargeProfileMaxStackLevel].Key, "ChargeProfileMaxStackLevel");
|
|
|
+
|
|
|
+ if(ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargeProfileMaxStackLevel].ItemAccessibility == 1)
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ChargeProfileMaxStackLevel].ReadOnly, "0"/*"FALSE"*/);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ChargeProfileMaxStackLevel].ReadOnly, "1"/*"TRUE"*/);
|
|
|
+ }
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ChargeProfileMaxStackLevel].Value, (const char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargeProfileMaxStackLevel].ItemData);
|
|
|
+ isKnowKey = TRUE;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(isEmpty || strcmp(keyReq, "ChargingScheduleAllowedChargingRateUnit") == 0 )
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_ChargingScheduleAllowedChargingRateUnit].Item, "ChargingScheduleAllowedChargingRateUnit");
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ChargingScheduleAllowedChargingRateUnit].Key, "ChargingScheduleAllowedChargingRateUnit");
|
|
|
+
|
|
|
+ if(ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleAllowedChargingRateUnit].ItemAccessibility == 1)
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ChargingScheduleAllowedChargingRateUnit].ReadOnly, "0"/*"FALSE"*/);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ChargingScheduleAllowedChargingRateUnit].ReadOnly, "1"/*"TRUE"*/);
|
|
|
+ }
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ChargingScheduleAllowedChargingRateUnit].Value, (const char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleAllowedChargingRateUnit].ItemData);
|
|
|
+ isKnowKey = TRUE;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(isEmpty || strcmp(keyReq, "ChargingScheduleMaxPeriods") == 0 )
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_ChargingScheduleMaxPeriods].Item, "ChargingScheduleMaxPeriods");
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ChargingScheduleMaxPeriods].Key, "ChargingScheduleMaxPeriods");
|
|
|
+
|
|
|
+ if(ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleMaxPeriods].ItemAccessibility == 1)
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ChargingScheduleMaxPeriods].ReadOnly, "0"/*"FALSE"*/);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ChargingScheduleMaxPeriods].ReadOnly, "1"/*"TRUE"*/);
|
|
|
+ }
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ChargingScheduleMaxPeriods].Value, (const char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleMaxPeriods].ItemData);
|
|
|
+ isKnowKey = TRUE;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(isEmpty || strcmp(keyReq, "ConnectorSwitch3to1PhaseSupported") == 0 )
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_ConnectorSwitch3to1PhaseSupported].Item, "ConnectorSwitch3to1PhaseSupported");
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ConnectorSwitch3to1PhaseSupported].Key, "ConnectorSwitch3to1PhaseSupported");
|
|
|
+
|
|
|
+ if(ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ConnectorSwitch3to1PhaseSupported].ItemAccessibility == 1)
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ConnectorSwitch3to1PhaseSupported].ReadOnly, "0"/*"FALSE"*/);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ConnectorSwitch3to1PhaseSupported].ReadOnly, "1"/*"TRUE"*/);
|
|
|
+ }
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_ConnectorSwitch3to1PhaseSupported].Value, (const char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ConnectorSwitch3to1PhaseSupported].ItemData);
|
|
|
+ isKnowKey = TRUE;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(isEmpty || strcmp(keyReq, "MaxChargingProfilesInstalled") == 0 )
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.Key[GetConfiguration_MaxChargingProfilesInstalled].Item, "MaxChargingProfilesInstalled");
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MaxChargingProfilesInstalled].Key, "MaxChargingProfilesInstalled");
|
|
|
+
|
|
|
+ if(ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[MaxChargingProfilesInstalled].ItemAccessibility == 1)
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MaxChargingProfilesInstalled].ReadOnly, "0"/*"FLASE"*/);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MaxChargingProfilesInstalled].ReadOnly, "1"/*"TRUE"*/);
|
|
|
+ }
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->GetConfiguration.ResponseConfigurationKey[GetConfiguration_MaxChargingProfilesInstalled].Value, (const char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[MaxChargingProfilesInstalled].ItemData);
|
|
|
+ isKnowKey = TRUE;
|
|
|
+ }
|
|
|
+
|
|
|
+ //=========================================================
|
|
|
+
|
|
|
+ if(!isEmpty && !isKnowKey)
|
|
|
+ {
|
|
|
+ DEBUG_INFO("unKnowIndex =%d\n", UnknownKeynum);
|
|
|
+ strcpy(unknownkey[UnknownKeynum], keyReq);
|
|
|
+ UnknownKeynum = UnknownKeynum + 1;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+void processUnkownKey(void)
|
|
|
+{
|
|
|
+ DEBUG_INFO("processUnkownKey...\n");
|
|
|
+ memset(ShmOCPP16Data->GetConfiguration.ResponseUnknownKey, 0 , sizeof(struct StructConfigurationKeyItems)* 10);
|
|
|
+
|
|
|
+ for(int index=0; index < UnknownKeynum; index++)
|
|
|
+ {
|
|
|
+ if(ShmOCPP16Data->GetConfiguration.ResponseUnknownKey[index].Item[0] == 0)
|
|
|
+ {
|
|
|
+ strcpy((char *)(ShmOCPP16Data->GetConfiguration.ResponseUnknownKey[index].Item), unknownkey[index]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+int setKeyValue(char *key, char *value)
|
|
|
+{
|
|
|
+ int isSuccess = NotSupported;
|
|
|
+ int check_ascii=0;
|
|
|
+ char str[10]={0};
|
|
|
+
|
|
|
+ DEBUG_INFO(" setKeyValue %s = %s\n", key, value);
|
|
|
+
|
|
|
+ if(strcmp(key, "AllowOfflineTxForUnknownId") == 0)
|
|
|
+ {
|
|
|
+ //Charger.AllowOfflineTxForUnknownId = (value.toLowerCase().equals("true")?true:false);
|
|
|
+ if(ShmOCPP16Data->ConfigurationTable.CoreProfile[AllowOfflineTxForUnknownId].ItemAccessibility == 1)
|
|
|
+ {
|
|
|
+ strcpy(str, (const char*)value);
|
|
|
+ for(int i = 0; str[i]; i++){
|
|
|
+ str[i] = tolower(str[i]);
|
|
|
+ }
|
|
|
+
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AllowOfflineTxForUnknownId].ItemData, "%s", (strcmp(str, "true")==0) ?"TRUE":"FALSE" );
|
|
|
+ isSuccess = ConfigurationStatus_Accepted;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ isSuccess = ConfigurationStatus_Rejected;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if(strcmp(key, "AuthorizationCacheEnabled") == 0)
|
|
|
+ {
|
|
|
+ //Charger.AuthorizationCacheEnabled = (value.toLowerCase().equals("true")?true:false);
|
|
|
+ if(ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizationCacheEnabled].ItemAccessibility == 1)
|
|
|
+ {
|
|
|
+ strcpy(str, (const char*)value);
|
|
|
+ for(int i = 0; str[i]; i++){
|
|
|
+ str[i] = tolower(str[i]);
|
|
|
+ }
|
|
|
+
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizationCacheEnabled].ItemData, "%s", (strcmp(str, "true")==0) ?"TRUE":"FALSE" );
|
|
|
+ isSuccess = ConfigurationStatus_Accepted;
|
|
|
+ //updateSetting("AuthorizationCacheEnabled",(char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[1].ItemData);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ isSuccess = ConfigurationStatus_Rejected;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if(strcmp(key, "AuthorizeRemoteTxRequests") == 0)
|
|
|
+ {
|
|
|
+ if(ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizeRemoteTxRequests].ItemAccessibility == 1)
|
|
|
+ {
|
|
|
+ strcpy(str, (const char*)value);
|
|
|
+ for(int i = 0; str[i]; i++)
|
|
|
+ {
|
|
|
+ str[i] = tolower(str[i]);
|
|
|
+ }
|
|
|
+ //Charger.AuthorizeRemoteTxRequests = (value.toLowerCase().equals("true")?true:false);
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[AuthorizeRemoteTxRequests].ItemData, "%s", (strcmp(str, "true")==0) ?"TRUE":"FALSE" );
|
|
|
+ isSuccess = ConfigurationStatus_Accepted;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ isSuccess = ConfigurationStatus_Rejected;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if(strcmp(key, "BlinkRepeat") == 0)
|
|
|
+ {
|
|
|
+ //Charger.BlinkRepeat = Integer.parseInt(value);
|
|
|
+ if(ShmOCPP16Data->ConfigurationTable.CoreProfile[BlinkRepeat].ItemAccessibility == 1)
|
|
|
+ {
|
|
|
+ check_ascii = value[0];
|
|
|
+ if( (check_ascii < 48) || (check_ascii > 57) )
|
|
|
+ {
|
|
|
+ isSuccess = ConfigurationStatus_Rejected;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[BlinkRepeat].ItemData, "%d", atoi(value) );
|
|
|
+ isSuccess = ConfigurationStatus_Accepted;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ isSuccess = ConfigurationStatus_Rejected;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if(strcmp(key, "ClockAlignedDataInterval") == 0)
|
|
|
+ {
|
|
|
+ if(ShmOCPP16Data->ConfigurationTable.CoreProfile[ClockAlignedDataInterval].ItemAccessibility == 1)
|
|
|
+ {
|
|
|
+ check_ascii = value[0];
|
|
|
+ if( (check_ascii < 48) || (check_ascii > 57) )
|
|
|
+ {
|
|
|
+ isSuccess = ConfigurationStatus_Rejected;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ //Charger.ClockAlignedDataInterval = Integer.parseInt(value)*1000;
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ClockAlignedDataInterval].ItemData, "%d", atoi(value) );
|
|
|
+ isSuccess = ConfigurationStatus_Accepted;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ isSuccess = ConfigurationStatus_Rejected;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if(strcmp(key, "ConnectionTimeOut") == 0 )
|
|
|
+ {
|
|
|
+ if(ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectionTimeOut].ItemAccessibility == 1)
|
|
|
+ {
|
|
|
+ check_ascii = value[0];
|
|
|
+ if( (check_ascii < 48) || (check_ascii > 57) )
|
|
|
+ {
|
|
|
+ isSuccess = ConfigurationStatus_Rejected;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ //Charger.ConnectionTimeOut = Integer.parseInt(value)*1000;
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectionTimeOut].ItemData, "%d", atoi(value));
|
|
|
+ isSuccess = ConfigurationStatus_Accepted;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ isSuccess = ConfigurationStatus_Rejected;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if(strcmp(key, "GetConfigurationMaxKeys") == 0)
|
|
|
+ {
|
|
|
+ if(ShmOCPP16Data->ConfigurationTable.CoreProfile[GetConfigurationMaxKeys].ItemAccessibility == 1)
|
|
|
+ {
|
|
|
+ check_ascii = value[0];
|
|
|
+ if( (check_ascii < 48) || (check_ascii > 57) )
|
|
|
+ {
|
|
|
+ isSuccess = ConfigurationStatus_Rejected;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ //Charger.HeartbeatInterval = Integer.parseInt(value)*1000;
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[GetConfigurationMaxKeys].ItemData, "%d", atoi(value) );
|
|
|
+ isSuccess = ConfigurationStatus_Accepted;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ isSuccess = ConfigurationStatus_Rejected;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if(strcmp(key, "HeartbeatInterval") == 0)
|
|
|
+ {
|
|
|
+ if(ShmOCPP16Data->ConfigurationTable.CoreProfile[HeartbeatInterval].ItemAccessibility == 1)
|
|
|
+ {
|
|
|
+ check_ascii = value[0];
|
|
|
+ if( (check_ascii < 48) || (check_ascii > 57) )
|
|
|
+ {
|
|
|
+ isSuccess = ConfigurationStatus_Rejected;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ //Charger.HeartbeatInterval = Integer.parseInt(value)*1000;
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[HeartbeatInterval].ItemData, "%d", atoi(value));
|
|
|
+ HeartBeatWaitTime = atoi(value);
|
|
|
+ isSuccess = ConfigurationStatus_Accepted;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ isSuccess = ConfigurationStatus_Rejected;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if(strcmp(key, "LightIntensity") == 0)
|
|
|
+ {
|
|
|
+ if(ShmOCPP16Data->ConfigurationTable.CoreProfile[LightIntensity].ItemAccessibility == 1)
|
|
|
+ {
|
|
|
+ check_ascii = value[0];
|
|
|
+ if( (check_ascii < 48) || (check_ascii > 57) )
|
|
|
+ {
|
|
|
+ isSuccess = ConfigurationStatus_Rejected;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LightIntensity].ItemData, "%d", atoi(value) );
|
|
|
+ isSuccess = ConfigurationStatus_Accepted;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ isSuccess = ConfigurationStatus_Rejected;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if(strcmp(key, "LocalAuthorizeOffline") == 0)
|
|
|
+ {
|
|
|
+ if(ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalAuthorizeOffline].ItemAccessibility == 1)
|
|
|
+ {
|
|
|
+ strcpy(str, (const char*)value);
|
|
|
+ for(int i = 0; str[i]; i++)
|
|
|
+ {
|
|
|
+ str[i] = tolower(str[i]);
|
|
|
+ }
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalAuthorizeOffline].ItemData, "%s", (strcmp(str, "true")==0) ?"TRUE":"FALSE" );
|
|
|
+ isSuccess = ConfigurationStatus_Accepted;
|
|
|
+ //updateSetting("LocalAuthorizeOffline", (char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalAuthorizeOffline].ItemData);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ isSuccess = ConfigurationStatus_Rejected;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if(strcmp(key, "LocalPreAuthorize") == 0)
|
|
|
+ {
|
|
|
+ if(ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalPreAuthorize].ItemAccessibility == 1)
|
|
|
+ {
|
|
|
+ strcpy(str, (const char*)value);
|
|
|
+ for(int i = 0; str[i]; i++)
|
|
|
+ {
|
|
|
+ str[i] = tolower(str[i]);
|
|
|
+ }
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[LocalPreAuthorize].ItemData, "%s", (strcmp(str, "true")==0) ?"TRUE":"FALSE" );
|
|
|
+ isSuccess = ConfigurationStatus_Accepted;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ isSuccess = ConfigurationStatus_Rejected;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if(strcmp(key, "MaxEnergyOnInvalidId") == 0)
|
|
|
+ {
|
|
|
+ if(ShmOCPP16Data->ConfigurationTable.CoreProfile[MaxEnergyOnInvalidId].ItemAccessibility == 1)
|
|
|
+ {
|
|
|
+ check_ascii = value[0];
|
|
|
+ if( (check_ascii < 48) || (check_ascii > 57) )
|
|
|
+ {
|
|
|
+ isSuccess = ConfigurationStatus_Rejected;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MaxEnergyOnInvalidId].ItemData, "%d", atoi(value) );
|
|
|
+ ShmSysConfigAndInfo->SysConfig.OfflineMaxChargeEnergy = atoi(value)/1000;
|
|
|
+ isSuccess = ConfigurationStatus_Accepted;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ isSuccess = ConfigurationStatus_Rejected;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if(strcmp(key, "MeterValuesAlignedData") == 0)
|
|
|
+ {
|
|
|
+ if(ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedData].ItemAccessibility == 1)
|
|
|
+ {
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedData].ItemData, "%s", value );
|
|
|
+ isSuccess = ConfigurationStatus_Accepted;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ isSuccess = ConfigurationStatus_Rejected;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if(strcmp(key, "MeterValuesAlignedDataMaxLength") == 0)
|
|
|
+ {
|
|
|
+ if(ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedDataMaxLength].ItemAccessibility == 1)
|
|
|
+ {
|
|
|
+ check_ascii = value[0];
|
|
|
+ if( (check_ascii < 48) || (check_ascii > 57) )
|
|
|
+ {
|
|
|
+ isSuccess = ConfigurationStatus_Rejected;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ //Charger.MeterValueSampleInterval = Integer.parseInt(value)*1000;
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesAlignedDataMaxLength].ItemData, "%d", atoi(value));
|
|
|
+ isSuccess = ConfigurationStatus_Accepted;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ isSuccess = ConfigurationStatus_Rejected;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if(strcmp(key, "MeterValuesSampledData") == 0 )
|
|
|
+ {
|
|
|
+ if(ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledData].ItemAccessibility == 1)
|
|
|
+ {
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledData].ItemData, "%s", value );
|
|
|
+ isSuccess = ConfigurationStatus_Accepted;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ isSuccess = ConfigurationStatus_Rejected;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if(strcmp(key, "MeterValuesSampledDataMaxLength") == 0)
|
|
|
+ {
|
|
|
+ if(ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledDataMaxLength].ItemAccessibility == 1)
|
|
|
+ {
|
|
|
+ check_ascii = value[0];
|
|
|
+ if( (check_ascii < 48) || (check_ascii > 57) )
|
|
|
+ {
|
|
|
+ isSuccess = ConfigurationStatus_Rejected;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ //Charger.MeterValueSampleInterval = Integer.parseInt(value)*1000;
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValuesSampledDataMaxLength].ItemData, "%d", atoi(value));
|
|
|
+ isSuccess = ConfigurationStatus_Accepted;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ isSuccess = ConfigurationStatus_Rejected;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ if(strcmp(key, "MeterValueSampleInterval") == 0)
|
|
|
+ {
|
|
|
+ if(ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValueSampleInterval].ItemAccessibility == 1)
|
|
|
+ {
|
|
|
+ check_ascii = value[0];
|
|
|
+ if( (check_ascii < 48) || (check_ascii > 57) )
|
|
|
+ {
|
|
|
+ isSuccess = ConfigurationStatus_Rejected;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ //Charger.MeterValueSampleInterval = Integer.parseInt(value)*1000;
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MeterValueSampleInterval].ItemData, "%d", atoi(value));
|
|
|
+ isSuccess = ConfigurationStatus_Accepted;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ isSuccess = ConfigurationStatus_Rejected;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if(strcmp(key, "MinimumStatusDuration") == 0)
|
|
|
+ {
|
|
|
+ if(ShmOCPP16Data->ConfigurationTable.CoreProfile[MinimumStatusDuration].ItemAccessibility == 1)
|
|
|
+ {
|
|
|
+ check_ascii = value[0];
|
|
|
+ if( (check_ascii < 48) || (check_ascii > 57) )
|
|
|
+ {
|
|
|
+ isSuccess = ConfigurationStatus_Rejected;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if(atoi(value) == 0) // MinimumStatusDuration's value can not be 0
|
|
|
+ {
|
|
|
+ isSuccess = ConfigurationStatus_Rejected;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ //Charger.MinimumStatusDuration = Integer.parseInt(value);
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[MinimumStatusDuration].ItemData, "%d", atoi(value) );
|
|
|
+ server_cycle_Status = atoi(value); //StatusNotification Cycle
|
|
|
+ isSuccess = ConfigurationStatus_Accepted;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ isSuccess = ConfigurationStatus_Rejected;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if(strcmp(key, "NumberOfConnectors") == 0)
|
|
|
+ {
|
|
|
+ if(ShmOCPP16Data->ConfigurationTable.CoreProfile[NumberOfConnectors].ItemAccessibility == 1)
|
|
|
+ {
|
|
|
+ check_ascii = value[0];
|
|
|
+ if( (check_ascii < 48) || (check_ascii > 57) )
|
|
|
+ {
|
|
|
+ isSuccess = ConfigurationStatus_Rejected;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ //Charger.ResetRetries = Integer.parseInt(value);
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[NumberOfConnectors].ItemData, "%d", atoi(value) );
|
|
|
+ isSuccess = ConfigurationStatus_Accepted;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ isSuccess = ConfigurationStatus_Rejected;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if(strcmp(key, "ResetRetries") == 0)
|
|
|
+ {
|
|
|
+ if(ShmOCPP16Data->ConfigurationTable.CoreProfile[ResetRetries].ItemAccessibility == 1)
|
|
|
+ {
|
|
|
+ check_ascii = value[0];
|
|
|
+ if( (check_ascii < 48) || (check_ascii > 57) )
|
|
|
+ {
|
|
|
+ isSuccess = ConfigurationStatus_Rejected;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ //Charger.ResetRetries = Integer.parseInt(value);
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ResetRetries].ItemData, "%d", atoi(value) );
|
|
|
+ isSuccess = ConfigurationStatus_Accepted;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ isSuccess = ConfigurationStatus_Rejected;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if(strcmp(key, "ConnectorPhaseRotation") == 0)
|
|
|
+ {
|
|
|
+ if(ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotation].ItemAccessibility == 1)
|
|
|
+ {
|
|
|
+ strcpy(str, (const char*)value);
|
|
|
+ for(int i = 0; str[i]; i++)
|
|
|
+ {
|
|
|
+ str[i] = tolower(str[i]);
|
|
|
+ }
|
|
|
+
|
|
|
+ if(strcmp(str, "notapplicable")== 0)
|
|
|
+ {
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotation].ItemData, "%s", "NotApplicable" );
|
|
|
+ isSuccess = ConfigurationStatus_Accepted;
|
|
|
+ }
|
|
|
+ else if(strcmp(str, "unknown")== 0)
|
|
|
+ {
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotation].ItemData, "%s", "Unknown" );
|
|
|
+ isSuccess = ConfigurationStatus_Accepted;
|
|
|
+ }
|
|
|
+ else if(strcmp(str, "rst")== 0)
|
|
|
+ {
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotation].ItemData, "%s", "RST" );
|
|
|
+ isSuccess = ConfigurationStatus_Accepted;
|
|
|
+ }
|
|
|
+ else if(strcmp(str, "rts")== 0)
|
|
|
+ {
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotation].ItemData, "%s", "RTS" );
|
|
|
+ isSuccess = ConfigurationStatus_Accepted;
|
|
|
+ }
|
|
|
+ else if(strcmp(str, "srt")== 0)
|
|
|
+ {
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotation].ItemData, "%s", "SRT" );
|
|
|
+ isSuccess = ConfigurationStatus_Accepted;
|
|
|
+ }
|
|
|
+ else if(strcmp(str, "str")== 0)
|
|
|
+ {
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotation].ItemData, "%s", "STR" );
|
|
|
+ isSuccess = ConfigurationStatus_Accepted;
|
|
|
+ }
|
|
|
+ else if(strcmp(str, "trs")== 0)
|
|
|
+ {
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotation].ItemData, "%s", "TRS" );
|
|
|
+ isSuccess = ConfigurationStatus_Accepted;
|
|
|
+ }
|
|
|
+ else if(strcmp(str, "tsr")== 0)
|
|
|
+ {
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotation].ItemData, "%s", "TSR" );
|
|
|
+ isSuccess = ConfigurationStatus_Accepted;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ isSuccess = ConfigurationStatus_Rejected;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ isSuccess = ConfigurationStatus_Rejected;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if(strcmp(key, "ConnectorPhaseRotationMaxLength") == 0)
|
|
|
+ {
|
|
|
+ if(ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotationMaxLength].ItemAccessibility == 1)
|
|
|
+ {
|
|
|
+ check_ascii = value[0];
|
|
|
+ if( (check_ascii < 48) || (check_ascii > 57) )
|
|
|
+ {
|
|
|
+ isSuccess = ConfigurationStatus_Rejected;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[ConnectorPhaseRotationMaxLength].ItemData, "%d", atoi(value) );
|
|
|
+ isSuccess = ConfigurationStatus_Accepted;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ isSuccess = ConfigurationStatus_Rejected;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if(strcmp(key, "StopTransactionOnEVSideDisconnect") == 0)
|
|
|
+ {
|
|
|
+ if(ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnEVSideDisconnect].ItemAccessibility == 1)
|
|
|
+ {
|
|
|
+ strcpy(str, (const char*)value);
|
|
|
+ for(int i = 0; str[i]; i++)
|
|
|
+ {
|
|
|
+ str[i] = tolower(str[i]);
|
|
|
+ }
|
|
|
+ //Charger.StopTransactionOnEVSideDisconnect = (value.toLowerCase().equals("true")?true:false);
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnEVSideDisconnect].ItemData, "%s", (strcmp(str, "true")==0) ?"TRUE":"FALSE" );
|
|
|
+ isSuccess = ConfigurationStatus_Accepted;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ isSuccess = ConfigurationStatus_Rejected;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if(strcmp(key, "StopTransactionOnInvalidId") == 0)
|
|
|
+ {
|
|
|
+ if(ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnInvalidId].ItemAccessibility == 1)
|
|
|
+ {
|
|
|
+ strcpy(str, (const char*)value);
|
|
|
+ for(int i = 0; str[i]; i++)
|
|
|
+ {
|
|
|
+ str[i] = tolower(str[i]);
|
|
|
+ }
|
|
|
+ //Charger.StopTransactionOnInvalidId = (value.toLowerCase().equals("true")?true:false);
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTransactionOnInvalidId].ItemData, "%s", (strcmp(str, "true")==0) ?"TRUE":"FALSE" );
|
|
|
+ isSuccess = ConfigurationStatus_Accepted;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ isSuccess = ConfigurationStatus_Rejected;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ if(strcmp(key, "StopTxnAlignedData") == 0)
|
|
|
+ {
|
|
|
+ if(ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedData].ItemAccessibility == 1)
|
|
|
+ {
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedData].ItemData, "%s", value );
|
|
|
+ isSuccess = ConfigurationStatus_Accepted;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ isSuccess = ConfigurationStatus_Rejected;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if(strcmp(key, "StopTxnAlignedDataMaxLength") == 0)
|
|
|
+ {
|
|
|
+ if(ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedDataMaxLength].ItemAccessibility == 1)
|
|
|
+ {
|
|
|
+ check_ascii = value[0];
|
|
|
+ if( (check_ascii < 48) || (check_ascii > 57) )
|
|
|
+ {
|
|
|
+ isSuccess = ConfigurationStatus_Rejected;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnAlignedDataMaxLength].ItemData, "%d", atoi(value) );
|
|
|
+ isSuccess = ConfigurationStatus_Accepted;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ isSuccess = ConfigurationStatus_Rejected;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if(strcmp(key, "StopTxnSampledData") == 0)
|
|
|
+ {
|
|
|
+ if(ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledData].ItemAccessibility == 1)
|
|
|
+ {
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledData].ItemData, "%s", value );
|
|
|
+ isSuccess = ConfigurationStatus_Accepted;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ isSuccess = ConfigurationStatus_Rejected;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if(strcmp(key, "StopTxnSampledDataMaxLength") == 0)
|
|
|
+ {
|
|
|
+ if(ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledDataMaxLength].ItemAccessibility == 1)
|
|
|
+ {
|
|
|
+ check_ascii = value[0];
|
|
|
+ if( (check_ascii < 48) || (check_ascii > 57) )
|
|
|
+ {
|
|
|
+ isSuccess = ConfigurationStatus_Rejected;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[StopTxnSampledDataMaxLength].ItemData, "%d", atoi(value) );
|
|
|
+ isSuccess = ConfigurationStatus_Accepted;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ isSuccess = ConfigurationStatus_Rejected;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if(strcmp(key, "SupportedFeatureProfiles") == 0)
|
|
|
+ {
|
|
|
+ if(ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfiles].ItemAccessibility == 1)
|
|
|
+ {
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfiles].ItemData, "%s", value );
|
|
|
+ isSuccess = ConfigurationStatus_Accepted;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ isSuccess = ConfigurationStatus_Rejected;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if(strcmp(key, "SupportedFeatureProfilesMaxLength") == 0)
|
|
|
+ {
|
|
|
+ if(ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfilesMaxLength].ItemAccessibility == 1)
|
|
|
+ {
|
|
|
+ check_ascii = value[0];
|
|
|
+ if( (check_ascii < 48) || (check_ascii > 57) )
|
|
|
+ {
|
|
|
+ isSuccess = ConfigurationStatus_Rejected;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[SupportedFeatureProfilesMaxLength].ItemData, "%d", atoi(value) );
|
|
|
+ isSuccess = ConfigurationStatus_Accepted;
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ isSuccess = ConfigurationStatus_Rejected;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if(strcmp(key, "TransactionMessageAttempts") == 0)
|
|
|
+ {
|
|
|
+ if(ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageAttempts].ItemAccessibility == 1)
|
|
|
+ {
|
|
|
+ check_ascii = value[0];
|
|
|
+ if( (check_ascii < 48) || (check_ascii > 57) )
|
|
|
+ {
|
|
|
+ isSuccess = ConfigurationStatus_Rejected;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ //Charger.TransactionMessageAttempts = Integer.parseInt(value);
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageAttempts].ItemData, "%d", atoi(value) );
|
|
|
+ TransactionMessageAttemptsValue = atoi(value);
|
|
|
+ isSuccess = ConfigurationStatus_Accepted;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ isSuccess = ConfigurationStatus_Rejected;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if(strcmp(key, "TransactionMessageRetryInterval") == 0)
|
|
|
+ {
|
|
|
+ if(ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageRetryInterval].ItemAccessibility == 1)
|
|
|
+ {
|
|
|
+ check_ascii = value[0];
|
|
|
+ if( (check_ascii < 48) || (check_ascii > 57) )
|
|
|
+ {
|
|
|
+ isSuccess = ConfigurationStatus_Rejected;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ //Charger.TransactionMessageRetryInterval = Integer.parseInt(value)*1000;
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageRetryInterval].ItemData, "%d", atoi(value) );
|
|
|
+ TransactionMessageRetryIntervalValue = atoi(value);
|
|
|
+ isSuccess = ConfigurationStatus_Accepted;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ isSuccess = ConfigurationStatus_Rejected;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if(strcmp(key, "UnlockConnectorOnEVSideDisconnect") == 0)
|
|
|
+ {
|
|
|
+ if(ShmOCPP16Data->ConfigurationTable.CoreProfile[UnlockConnectorOnEVSideDisconnect].ItemAccessibility == 1)
|
|
|
+ {
|
|
|
+ strcpy(str, (const char*)value);
|
|
|
+ for(int i = 0; str[i]; i++)
|
|
|
+ {
|
|
|
+ str[i] = tolower(str[i]);
|
|
|
+ }
|
|
|
+ //Charger.UnlockConnectorOnEVSideDisconnect = (value.toLowerCase().equals("true")?true:false);
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[UnlockConnectorOnEVSideDisconnect].ItemData, "%s", (strcmp(str, "true")==0) ?"TRUE":"FALSE" );
|
|
|
+ isSuccess = ConfigurationStatus_Accepted;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ isSuccess = ConfigurationStatus_Rejected;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if(strcmp(key, "WebSocketPingInterval") == 0)
|
|
|
+ {
|
|
|
+ if(ShmOCPP16Data->ConfigurationTable.CoreProfile[WebSocketPingInterval].ItemAccessibility == 1)
|
|
|
+ {
|
|
|
+ check_ascii = value[0];
|
|
|
+ if( (check_ascii < 48) || (check_ascii > 57) )
|
|
|
+ {
|
|
|
+ isSuccess = ConfigurationStatus_Rejected;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[WebSocketPingInterval].ItemData, "%d", atoi(value) );
|
|
|
+ isSuccess = ConfigurationStatus_Accepted;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ isSuccess = ConfigurationStatus_Rejected;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+#if 0
|
|
|
+ //For OCPP Test Case
|
|
|
+ if(strcmp(key, "LocalAuthorizationListEnabled") == 0)
|
|
|
+ {
|
|
|
+ if(ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemAccessibility == 1)
|
|
|
+ {
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemData, "%s", (strcmp(value, "true")==0) ?"TRUE":"FALSE" );
|
|
|
+ isSuccess = ConfigurationStatus_Accepted;
|
|
|
+ //updateSetting("LocalAuthorizationListEnabled", (char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemData);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ isSuccess = ConfigurationStatus_Rejected;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+#endif
|
|
|
+
|
|
|
+#if 1
|
|
|
+ if(strcmp(key, "LocalAuthListEnabled") == 0)
|
|
|
+ {
|
|
|
+ if(ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemAccessibility == 1)
|
|
|
+ {
|
|
|
+ strcpy(str, (const char*)value);
|
|
|
+ for(int i = 0; str[i]; i++)
|
|
|
+ {
|
|
|
+ str[i] = tolower(str[i]);
|
|
|
+ }
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemData, "%s", (strcmp(str, "true")==0) ?"TRUE":"FALSE" );
|
|
|
+ isSuccess = ConfigurationStatus_Accepted;
|
|
|
+ //updateSetting("LocalAuthListEnabled", (char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListEnabled].ItemData);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ isSuccess = ConfigurationStatus_Rejected;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+#endif
|
|
|
+
|
|
|
+ if(strcmp(key, "LocalAuthListMaxLength") == 0)
|
|
|
+ {
|
|
|
+ if(ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListMaxLength].ItemAccessibility == 1)
|
|
|
+ {
|
|
|
+ check_ascii = value[0];
|
|
|
+ if( (check_ascii < 48) || (check_ascii > 57) )
|
|
|
+ {
|
|
|
+ isSuccess = ConfigurationStatus_Rejected;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[LocalAuthListMaxLength].ItemData, "%d", atoi(value) );
|
|
|
+ isSuccess = ConfigurationStatus_Accepted;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ isSuccess = ConfigurationStatus_Rejected;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if(strcmp(key, "SendLocalListMaxLength") == 0)
|
|
|
+ {
|
|
|
+ if(ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[SendLocalListMaxLength].ItemAccessibility == 1)
|
|
|
+ {
|
|
|
+ check_ascii = value[0];
|
|
|
+ if( (check_ascii < 48) || (check_ascii > 57) )
|
|
|
+ {
|
|
|
+ isSuccess = ConfigurationStatus_Rejected;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.LocalAuthListManagementProfile[SendLocalListMaxLength].ItemData, "%d", atoi(value) );
|
|
|
+ isSuccess = ConfigurationStatus_Accepted;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ isSuccess = ConfigurationStatus_Rejected;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if(strcmp(key, "ReserveConnectorZeroSupported") == 0)
|
|
|
+ {
|
|
|
+ if(ShmOCPP16Data->ConfigurationTable.ReservationProfile[ReserveConnectorZeroSupported].ItemAccessibility == 1)
|
|
|
+ {
|
|
|
+ strcpy(str, (const char*)value);
|
|
|
+ for(int i = 0; str[i]; i++)
|
|
|
+ {
|
|
|
+ str[i] = tolower(str[i]);
|
|
|
+ }
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.ReservationProfile[ReserveConnectorZeroSupported].ItemData, "%s", (strcmp(str, "true")==0) ?"TRUE":"FALSE" );
|
|
|
+ isSuccess = ConfigurationStatus_Accepted;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ isSuccess = ConfigurationStatus_Rejected;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if(strcmp(key, "ChargeProfileMaxStackLevel") == 0)
|
|
|
+ {
|
|
|
+ if(ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargeProfileMaxStackLevel].ItemAccessibility == 1)
|
|
|
+ {
|
|
|
+ check_ascii = value[0];
|
|
|
+ if( (check_ascii < 48) || (check_ascii > 57) )
|
|
|
+ {
|
|
|
+ isSuccess = ConfigurationStatus_Rejected;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargeProfileMaxStackLevel].ItemData, "%d", atoi(value) );
|
|
|
+ isSuccess = ConfigurationStatus_Accepted;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ isSuccess = ConfigurationStatus_Rejected;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if(strcmp(key, "ChargingScheduleAllowedChargingRateUnit") == 0)
|
|
|
+ {
|
|
|
+ if(ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleAllowedChargingRateUnit].ItemAccessibility == 1)
|
|
|
+ {
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleAllowedChargingRateUnit].ItemData, "%s", value );
|
|
|
+ isSuccess = ConfigurationStatus_Accepted;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ isSuccess = ConfigurationStatus_Rejected;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if(strcmp(key, "ChargingScheduleMaxPeriods") == 0)
|
|
|
+ {
|
|
|
+ if(ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleMaxPeriods].ItemAccessibility == 1)
|
|
|
+ {
|
|
|
+ check_ascii = value[0];
|
|
|
+ if( (check_ascii < 48) || (check_ascii > 57) )
|
|
|
+ {
|
|
|
+ isSuccess = ConfigurationStatus_Rejected;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ChargingScheduleMaxPeriods].ItemData, "%d", atoi(value) );
|
|
|
+ isSuccess = ConfigurationStatus_Accepted;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ isSuccess = ConfigurationStatus_Rejected;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if(strcmp(key, "ConnectorSwitch3to1PhaseSupported") == 0)
|
|
|
+ {
|
|
|
+ if(ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ConnectorSwitch3to1PhaseSupported].ItemAccessibility == 1)
|
|
|
+ {
|
|
|
+ strcpy(str, (const char*)value);
|
|
|
+ for(int i = 0; str[i]; i++)
|
|
|
+ {
|
|
|
+ str[i] = tolower(str[i]);
|
|
|
+ }
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[ConnectorSwitch3to1PhaseSupported].ItemData, "%s", (strcmp(str, "true")==0) ?"TRUE":"FALSE" );
|
|
|
+ isSuccess = ConfigurationStatus_Accepted;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ isSuccess = ConfigurationStatus_Rejected;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if(strcmp(key, "MaxChargingProfilesInstalled") == 0)
|
|
|
+ {
|
|
|
+ if(ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[MaxChargingProfilesInstalled].ItemAccessibility == 1)
|
|
|
+ {
|
|
|
+ check_ascii = value[0];
|
|
|
+ if( (check_ascii < 48) || (check_ascii > 57) )
|
|
|
+ {
|
|
|
+ isSuccess = ConfigurationStatus_Rejected;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+
|
|
|
+ sprintf((char *)ShmOCPP16Data->ConfigurationTable.SmartChargingProfile[MaxChargingProfilesInstalled].ItemData, "%d", atoi(value) );
|
|
|
+ isSuccess = ConfigurationStatus_Accepted;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ isSuccess = ConfigurationStatus_Rejected;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ return isSuccess;
|
|
|
+}
|
|
|
+
|
|
|
+int TransactionMessageAttemptsGet(void)
|
|
|
+{
|
|
|
+ return TransactionMessageAttemptsValue;
|
|
|
+}
|
|
|
+
|
|
|
+int FirstHeartBeatResponse(void)
|
|
|
+{
|
|
|
+ return FirstHeartBeat;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+int TransactionMessageRetryIntervalGet(void)
|
|
|
+{
|
|
|
+ return TransactionMessageRetryIntervalValue;//atoi((const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageRetryInterval].ItemData);
|
|
|
+}
|
|
|
+
|
|
|
+int ReadHttpStatus(int sock)
|
|
|
+{
|
|
|
+ //char c;
|
|
|
+ char buff[1024]="",*ptr=buff+1;
|
|
|
+ int bytes_received, status;
|
|
|
+ DEBUG_INFO("Begin Response ..\n");
|
|
|
+ while((bytes_received = recv(sock, ptr, 1, 0))){
|
|
|
+ if(bytes_received==-1){
|
|
|
+ perror("ReadHttpStatus");
|
|
|
+ exit(1);
|
|
|
+ }
|
|
|
+
|
|
|
+ if((ptr[-1]=='\r') && (*ptr=='\n' )) break;
|
|
|
+ ptr++;
|
|
|
+ }
|
|
|
+ *ptr=0;
|
|
|
+ ptr=buff+1;
|
|
|
+
|
|
|
+ sscanf(ptr,"%*s %d ", &status);
|
|
|
+
|
|
|
+ DEBUG_INFO("%s\n",ptr);
|
|
|
+ DEBUG_INFO("status=%d\n",status);
|
|
|
+ DEBUG_INFO("End Response ..\n");
|
|
|
+ return (bytes_received>0)?status:0;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+//the only filed that it parsed is 'Content-Length'
|
|
|
+int ParseHeader(int sock)
|
|
|
+{
|
|
|
+ //char c;
|
|
|
+ char buff[1024]="",*ptr=buff+4;
|
|
|
+ int bytes_received;
|
|
|
+ DEBUG_INFO("Begin HEADER ..\n");
|
|
|
+ while((bytes_received = recv(sock, ptr, 1, 0))){
|
|
|
+ if(bytes_received==-1){
|
|
|
+ perror("Parse Header");
|
|
|
+ exit(1);
|
|
|
+ }
|
|
|
+
|
|
|
+ if(
|
|
|
+ (ptr[-3]=='\r') && (ptr[-2]=='\n' ) &&
|
|
|
+ (ptr[-1]=='\r') && (*ptr=='\n' )
|
|
|
+ ) break;
|
|
|
+ ptr++;
|
|
|
+ }
|
|
|
+
|
|
|
+ *ptr=0;
|
|
|
+ ptr=buff+4;
|
|
|
+ //printf("%s",ptr);
|
|
|
+
|
|
|
+ if(bytes_received){
|
|
|
+ ptr=strstr(ptr,"Content-Length:");
|
|
|
+ if(ptr){
|
|
|
+ sscanf(ptr,"%*s %d",&bytes_received);
|
|
|
+
|
|
|
+ }else
|
|
|
+ bytes_received=-1; //unknown size
|
|
|
+
|
|
|
+ DEBUG_INFO("Content-Length: %d\n",bytes_received);
|
|
|
+ }
|
|
|
+ DEBUG_INFO("End HEADER ..\n");
|
|
|
+ return bytes_received ;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+int httpDownLoadFile(char *location, char *path, char *filename,char *url)
|
|
|
+{
|
|
|
+ char rmFileCmd[100]={0};
|
|
|
+ char FilePath[100]={0};
|
|
|
+ char ftpbuf[200];
|
|
|
+ int systemresult;
|
|
|
+
|
|
|
+ //DEBUG_INFO("filename=%s\n",filename);
|
|
|
+ //DEBUG_INFO("url=%s\n",url);
|
|
|
+ sprintf(FilePath,"/mnt/%s",filename);
|
|
|
+
|
|
|
+ if((access(FilePath,F_OK))!=-1)
|
|
|
+ {
|
|
|
+ DEBUG_INFO("filename=%s exist.\n",FilePath);
|
|
|
+ sprintf(rmFileCmd,"rm -f %s",FilePath);
|
|
|
+ system(rmFileCmd);
|
|
|
+ }
|
|
|
+ memset(ftpbuf, 0, sizeof(ftpbuf));
|
|
|
+ sprintf(ftpbuf, "wget --tries=3 -O /mnt/%s -c %s",filename, url);
|
|
|
+ //sprintf(ftpbuf, "ftpput -u %s -p %s %s -P %d %s%s %s",user,password,IPbuffer,21,filename,filename,path);
|
|
|
+ systemresult = system(ftpbuf);
|
|
|
+
|
|
|
+ //DEBUG_INFO("systemresult=%d\n",systemresult);
|
|
|
+ if(systemresult != 0)
|
|
|
+ {
|
|
|
+ DEBUG_INFO("http DownLoad error!\n");
|
|
|
+ return FALSE;
|
|
|
+ }
|
|
|
+
|
|
|
+ return TRUE;
|
|
|
+}
|
|
|
+
|
|
|
+int ftpDownLoadFile(char *location, char *user, char *password, int port, char *path, char *filename,char *url)
|
|
|
+{
|
|
|
+ char rmFileCmd[100]={0};
|
|
|
+ char FilePath[100]={0};
|
|
|
+ char ftpbuf[200];
|
|
|
+ int systemresult;
|
|
|
+ //char temp[100];
|
|
|
+ sprintf(FilePath,"/mnt/%s",filename);
|
|
|
+
|
|
|
+ if((access(FilePath,F_OK))!=-1)
|
|
|
+ {
|
|
|
+ DEBUG_INFO("filename=%s exist.\n",FilePath);
|
|
|
+ sprintf(rmFileCmd,"rm -f %s",FilePath);
|
|
|
+ system(rmFileCmd);
|
|
|
+ }
|
|
|
+
|
|
|
+ memset(ftpbuf, 0, sizeof(ftpbuf));
|
|
|
+
|
|
|
+ sprintf(ftpbuf, "wget --tries=3 -O /mnt/%s -c %s",filename, url);
|
|
|
+ //sprintf(ftpbuf, "ftpget -u %s -p %s %s -P %d %s %s%s",user,password,IPbuffer,port/*21*/,filename,path,filename); --- remove temporally
|
|
|
+ //DEBUG_INFO("ftpbuf=%s\n",ftpbuf);
|
|
|
+ //sprintf(ftpbuf, "ftpput -u %s -p %s %s -P %d %s%s %s",user,password,IPbuffer,21,filename,filename,path);
|
|
|
+ systemresult = system(ftpbuf);
|
|
|
+
|
|
|
+ //DEBUG_INFO("systemresult=%d\n",systemresult);
|
|
|
+ if(systemresult != 0)
|
|
|
+ {
|
|
|
+ printf("wget error!\n");
|
|
|
+ return FALSE;
|
|
|
+ }
|
|
|
+
|
|
|
+ return TRUE;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+int httpUploadFile(char *location, char *path, char *filename,char *url)
|
|
|
+{
|
|
|
+ char rmFileCmd[100]={0};
|
|
|
+ char FilePath[100]={0};
|
|
|
+ char ftpbuf[200];
|
|
|
+ int systemresult;
|
|
|
+
|
|
|
+ //DEBUG_INFO("filename=%s\n",filename);
|
|
|
+ //DEBUG_INFO("url=%s\n",url);
|
|
|
+ sprintf(FilePath,"%s","/mnt/upload_file.txt");
|
|
|
+
|
|
|
+ if((access(FilePath,F_OK))!=-1)
|
|
|
+ {
|
|
|
+ DEBUG_INFO("filename=%s exist.\n",FilePath);
|
|
|
+ sprintf(rmFileCmd,"rm -f %s",FilePath);
|
|
|
+ system(rmFileCmd);
|
|
|
+ }
|
|
|
+
|
|
|
+ FILE *fp = fopen("/mnt/upload_file.txt", "w+");
|
|
|
+
|
|
|
+ if(fp == NULL)
|
|
|
+ {
|
|
|
+ DEBUG_INFO("log is NULL\n");
|
|
|
+ return FALSE;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ fprintf(fp, "%s\n", url);
|
|
|
+ fprintf(fp, "%s\n", filename);
|
|
|
+ fclose(fp);
|
|
|
+ }
|
|
|
+
|
|
|
+ memset(ftpbuf, 0, sizeof(ftpbuf));
|
|
|
+ sprintf(ftpbuf, "%s","/bin/php-cgi /var/www/ocpp_upload.php");
|
|
|
+ systemresult = system(ftpbuf);
|
|
|
+
|
|
|
+ DEBUG_INFO("systemresult = %d\n",systemresult);
|
|
|
+ if(systemresult != 0)
|
|
|
+ {
|
|
|
+ DEBUG_INFO("http upload error!\n");
|
|
|
+ return FALSE;
|
|
|
+ }
|
|
|
+
|
|
|
+ return TRUE;
|
|
|
+}
|
|
|
+
|
|
|
+int ftpFile(char *location, char *user, char *password, int port, char *path, char *fnamePlusPath,char *filename)
|
|
|
+{
|
|
|
+ struct hostent* server;
|
|
|
+ char *IPbuffer;
|
|
|
+ char ftpbuf[200];
|
|
|
+ int systemresult;
|
|
|
+
|
|
|
+ // To retrieve host information
|
|
|
+ server = gethostbyname(location);
|
|
|
+ // To convert an Internet network
|
|
|
+ // address into ASCII string
|
|
|
+ IPbuffer = inet_ntoa(*((struct in_addr*)
|
|
|
+ server->h_addr_list[0]));
|
|
|
+
|
|
|
+ memset(ftpbuf, 0, sizeof(ftpbuf));
|
|
|
+
|
|
|
+ /* format : ftpput -u phihong -p y42j%2f4cj84 112.91.88.35 -P 21 /2020-02.zip ../mnt/2020-02.zip*/
|
|
|
+ /* format : ftpput -u username -p passwd IP target source*/
|
|
|
+ sprintf(ftpbuf, "ftpput -u %s -p %s %s -P %d %s%s %s",user,password,IPbuffer,port/*21*/,path,filename,fnamePlusPath);
|
|
|
+ DEBUG_INFO("ftpbuf=%s\n",ftpbuf);
|
|
|
+ //sprintf(ftpbuf, "ftpput -u %s -p %s %s -P %d %s%s %s",user,password,IPbuffer,21,filename,filename,path);
|
|
|
+ systemresult = system(ftpbuf);
|
|
|
+
|
|
|
+ DEBUG_INFO("systemresult=%d\n",systemresult);
|
|
|
+ if(systemresult != 0)
|
|
|
+ {
|
|
|
+ DEBUG_INFO("ftpput error!\n");
|
|
|
+ return FALSE;
|
|
|
+ }
|
|
|
+
|
|
|
+ return TRUE;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * Place the contents of the specified file into a memory buffer
|
|
|
+ *
|
|
|
+ * @param[in] filename The path and name of the file to read
|
|
|
+ * @param[out] filebuffer A pointer to the contents in memory
|
|
|
+ * @return status 0 success, 1 on failure
|
|
|
+ */
|
|
|
+int get_file_contents(const char* filename, char** outbuffer) {
|
|
|
+ FILE* file = NULL;
|
|
|
+ long filesize;
|
|
|
+ const int blocksize = 1;
|
|
|
+ size_t readsize;
|
|
|
+ char* filebuffer;
|
|
|
+
|
|
|
+ // Open the file
|
|
|
+ file = fopen(filename, "r");
|
|
|
+ if (NULL == file)
|
|
|
+ {
|
|
|
+ printf("'%s' not opened\n", filename);
|
|
|
+ exit(EXIT_FAILURE);
|
|
|
+ }
|
|
|
+
|
|
|
+ // Determine the file size
|
|
|
+ fseek(file, 0, SEEK_END);
|
|
|
+ filesize = ftell(file);
|
|
|
+ rewind (file);
|
|
|
+
|
|
|
+ // Allocate memory for the file contents
|
|
|
+ filebuffer = (char*) malloc(sizeof(char) * filesize);
|
|
|
+ *outbuffer = filebuffer;
|
|
|
+ if (filebuffer == NULL)
|
|
|
+ {
|
|
|
+ fputs ("malloc out-of-memory", stderr);
|
|
|
+ exit(EXIT_FAILURE);
|
|
|
+ }
|
|
|
+
|
|
|
+ // Read in the file
|
|
|
+ readsize = fread(filebuffer, blocksize, filesize, file);
|
|
|
+ if (readsize != filesize)
|
|
|
+ {
|
|
|
+ fputs ("didn't read file completely",stderr);
|
|
|
+ exit(EXIT_FAILURE);
|
|
|
+ }
|
|
|
+
|
|
|
+ // Clean exit
|
|
|
+ fclose(file);
|
|
|
+ return EXIT_SUCCESS;
|
|
|
+}
|
|
|
+
|
|
|
+static int selectSqlCount = 0;
|
|
|
+static int callback(void *data, int argc, char **argv, char **azColName){
|
|
|
+ int i;
|
|
|
+ //printf("%s: ", (const char*)data);
|
|
|
+ selectSqlCount = argc;
|
|
|
+ for(i = 0; i<argc; i++){
|
|
|
+ // printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
|
|
|
+ }
|
|
|
+
|
|
|
+ //printf("\n");
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static int versioncallback(void *data, int argc, char **argv, char **azColName){
|
|
|
+ //int i;
|
|
|
+ //printf("%s:\n", (const char*)data);
|
|
|
+ localversion = argv[5] ? atoi(argv[5]) : 0;
|
|
|
+ //printf("localversion=%d\n", localversion);
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static int IdTagcallback(void *data, int argc, char **argv, char **azColName){
|
|
|
+ //int i;
|
|
|
+ //printf("%s:\n", (const char*)data);
|
|
|
+
|
|
|
+ //idTag
|
|
|
+ sprintf(idTagAuthorization,"%s", argv[1] ? argv[1] : "NULL");
|
|
|
+ sprintf(idTagQuery.idTagstr,"%s", argv[1] ? argv[1] : "NULL");
|
|
|
+
|
|
|
+ //parentIdTag
|
|
|
+ sprintf(idTagQuery.parentIdTag,"%s", argv[2] ? argv[2] : "NULL");
|
|
|
+
|
|
|
+ //expir_date
|
|
|
+ sprintf(idTagQuery.expiryDate,"%s", argv[3] ? argv[3] : "NULL");
|
|
|
+
|
|
|
+ //status
|
|
|
+ sprintf(idTagQuery.idTagstatus,"%s", argv[4] ? argv[4] : "NULL");
|
|
|
+
|
|
|
+ //version
|
|
|
+ idTagQuery.listVersionInt = atoi(argv[5]);
|
|
|
+
|
|
|
+ //DEBUG_INFO("IdTag=%s\n", idTagAuthorization);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static int deleteIdTagcallback(void *data, int argc, char **argv, char **azColName)
|
|
|
+{
|
|
|
+// localversion = argv[5] ? atoi(argv[5]) : 0;
|
|
|
+// printf("localversion=%d\n", localversion);
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+//=========================================
|
|
|
+// Sqlite3 related function
|
|
|
+//=========================================
|
|
|
+int sqlite3_exec_callback(void *data, int n_columns, char **col_values, char **col_names)
|
|
|
+{
|
|
|
+ for (int i = 0; i < n_columns; i++)
|
|
|
+ {
|
|
|
+ DEBUG_INFO("%s/t", col_values[i]);
|
|
|
+ }
|
|
|
+ DEBUG_INFO("/n");
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+void OCPP_getListVerion()
|
|
|
+{
|
|
|
+ int rc = 0;
|
|
|
+ // const char* data = "Callback function called";
|
|
|
+ char sql[100];
|
|
|
+ char zErrMsg[100];
|
|
|
+
|
|
|
+ memset(sql, 0, 100);
|
|
|
+ memset(zErrMsg, 0, 100);
|
|
|
+
|
|
|
+ strcpy(sql, "select * from ocpp_auth_local order by idx");
|
|
|
+
|
|
|
+ /* Execute SQL statement */
|
|
|
+ rc = sqlite3_exec(db, sql, versioncallback, 0, (char **)&zErrMsg);
|
|
|
+
|
|
|
+ if( rc != SQLITE_OK )
|
|
|
+ {
|
|
|
+ DEBUG_INFO("SQL error: %s", zErrMsg);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+void OCPP_getIdTag(char idTag[])
|
|
|
+{
|
|
|
+ int rc = 0;
|
|
|
+ // const char* data = "Callback function called";
|
|
|
+ char sql[100];
|
|
|
+ char zErrMsg[100];
|
|
|
+
|
|
|
+ memset(sql, 0, 100);
|
|
|
+ memset(zErrMsg, 0, 100);
|
|
|
+ memset(idTagAuthorization, 0, sizeof(idTagAuthorization));
|
|
|
+ memset(&idTagQuery, 0, sizeof(idTagQuery));
|
|
|
+
|
|
|
+ //DEBUG_INFO("look up card: %s in ocpp_auth_local table", idTag);
|
|
|
+ sprintf(sql,"select * from ocpp_auth_local where idtag='%s'", idTag);
|
|
|
+
|
|
|
+ /* Execute SQL statement */
|
|
|
+
|
|
|
+ rc = sqlite3_exec(db, sql, IdTagcallback, 0, (char **)&zErrMsg);
|
|
|
+
|
|
|
+ if( rc != SQLITE_OK )
|
|
|
+ {
|
|
|
+ DEBUG_INFO("SQL error: %s", zErrMsg);
|
|
|
+ }
|
|
|
+
|
|
|
+ //return ver;
|
|
|
+}
|
|
|
+
|
|
|
+void OCPP_get_TableAuthlocalAllData(void)
|
|
|
+{
|
|
|
+ int rc = 0;
|
|
|
+ char sql[100];
|
|
|
+ char zErrMsg[100];
|
|
|
+
|
|
|
+ memset(sql, 0, 100);
|
|
|
+ memset(zErrMsg, 0, 100);
|
|
|
+
|
|
|
+ sprintf(sql,"select * from ocpp_auth_local ");
|
|
|
+
|
|
|
+ /* Execute SQL statement */
|
|
|
+
|
|
|
+ rc = sqlite3_exec(db, sql, &sqlite3_exec_callback, 0,(char **)&zErrMsg);
|
|
|
+
|
|
|
+ if( rc != SQLITE_OK )
|
|
|
+ {
|
|
|
+ DEBUG_INFO("SQL error: %s", zErrMsg);
|
|
|
+ }
|
|
|
+
|
|
|
+ //return ver;
|
|
|
+}
|
|
|
+
|
|
|
+int OCPP_cleanLocalList()
|
|
|
+{
|
|
|
+ char * sqlcleanLocalList = "delete from ocpp_auth_local";
|
|
|
+ char *errMsg = 0;
|
|
|
+ int rc =sqlite3_exec(db, sqlcleanLocalList, 0, 0, &errMsg);
|
|
|
+
|
|
|
+ if (SQLITE_OK != rc)
|
|
|
+ {
|
|
|
+ DEBUG_INFO("%s\n",errMsg);
|
|
|
+ return FALSE;
|
|
|
+ }
|
|
|
+
|
|
|
+ return TRUE;
|
|
|
+}
|
|
|
+
|
|
|
+int OCPP_addLocalList_1(int version, char *idTag, char *parentTage, char *expiryDate, char *status)
|
|
|
+{
|
|
|
+ int isSuccess = FALSE;
|
|
|
+ int ret = 0;
|
|
|
+ //const char* data = "Callback function called";
|
|
|
+ char sql[300];
|
|
|
+ char zErrMsg[200];
|
|
|
+
|
|
|
+ memset(sql, 0, 300);
|
|
|
+ memset(zErrMsg, 0, 200);
|
|
|
+
|
|
|
+ sprintf(sql,"insert or replace into ocpp_auth_local (idtag, parent_idtag, expir_date, status, version) " "VALUES ('%s', '%s', '%s', '%s', %d ); ""SELECT * from ocpp_auth_local", idTag, parentTage, expiryDate, status, version);
|
|
|
+
|
|
|
+ //* Execute SQL statement */
|
|
|
+ ret = sqlite3_exec(db, sql, callback, 0, (char **)&zErrMsg);
|
|
|
+ if( ret != SQLITE_OK )
|
|
|
+ {
|
|
|
+ DEBUG_INFO("SQL error: %s\n", zErrMsg);
|
|
|
+ return isSuccess;
|
|
|
+ }
|
|
|
+
|
|
|
+ memset(sql, 0, 300);
|
|
|
+ sprintf(sql, "UPDATE ocpp_auth_local SET version=%d",version);
|
|
|
+ ret = sqlite3_exec(db, sql, NULL, NULL, (char **)&zErrMsg);
|
|
|
+ if( ret != SQLITE_OK )
|
|
|
+ {
|
|
|
+ DEBUG_INFO("SQL error: %s\n", zErrMsg);
|
|
|
+ return isSuccess;
|
|
|
+ }
|
|
|
+
|
|
|
+ isSuccess = TRUE;
|
|
|
+ return isSuccess;
|
|
|
+}
|
|
|
+
|
|
|
+void OCPP_deleteIdTag(char idTag[])
|
|
|
+{
|
|
|
+ //int ver = 0;
|
|
|
+ //int isSuccess = FALSE;
|
|
|
+ int rc = 0;
|
|
|
+ char sql[100];
|
|
|
+ char zErrMsg[100];
|
|
|
+
|
|
|
+ memset(sql, 0, 100);
|
|
|
+ memset(zErrMsg, 0, 100);
|
|
|
+ sprintf(sql,"DELETE from ocpp_auth_local where idtag='%s'; SELECT * from ocpp_auth_local;", idTag);
|
|
|
+
|
|
|
+ //* Execute SQL statement */
|
|
|
+ rc = sqlite3_exec(db, sql, deleteIdTagcallback, 0,(char **)&zErrMsg);
|
|
|
+ if( rc != SQLITE_OK )
|
|
|
+ {
|
|
|
+ DEBUG_INFO("SQL error: %s", zErrMsg);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+int GetOcppServerURL()
|
|
|
+{
|
|
|
+ int result = FALSE;
|
|
|
+ memset(OcppProtocol, 0, sizeof(OcppProtocol));
|
|
|
+ memset(OcppHost, 0, sizeof(OcppHost));
|
|
|
+ memset(OcppTempPath, 0, sizeof(OcppTempPath));
|
|
|
+
|
|
|
+ if((ShmSysConfigAndInfo->SysConfig.OcppServerURL != NULL) && (strcmp((const char *)ShmSysConfigAndInfo->SysConfig.OcppServerURL,"") != 0) )
|
|
|
+ {
|
|
|
+#if 1
|
|
|
+ sscanf((const char *)ShmSysConfigAndInfo->SysConfig.OcppServerURL,
|
|
|
+ "%[^:]:%*2[/]%[^:]:%i/%[a-zA-Z0-9._/-]",
|
|
|
+ OcppProtocol, OcppHost, &OcppPort, OcppTempPath);
|
|
|
+#endif
|
|
|
+ result = TRUE;
|
|
|
+ goto End;
|
|
|
+ }
|
|
|
+ else if((ShmOCPP16Data->OcppServerURL != NULL) && (strcmp((const char *)ShmOCPP16Data->OcppServerURL,"") != 0))
|
|
|
+ {
|
|
|
+ sscanf((const char *)ShmOCPP16Data->OcppServerURL,
|
|
|
+ "%[^:]:%*2[/]%[^:]:%i/%[a-zA-Z0-9._/-]",
|
|
|
+ OcppProtocol, OcppHost, &OcppPort, OcppTempPath);
|
|
|
+ result = TRUE;
|
|
|
+ goto End;
|
|
|
+
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ strcpy(OcppHost,"");
|
|
|
+ }
|
|
|
+
|
|
|
+End:
|
|
|
+ return result;
|
|
|
+}
|
|
|
+
|
|
|
+int GetOcppPath()
|
|
|
+{
|
|
|
+ int result = FALSE;
|
|
|
+ if((ShmSysConfigAndInfo->SysConfig.ChargeBoxId != NULL) && (strcmp((const char *)ShmSysConfigAndInfo->SysConfig.ChargeBoxId,"") != 0) )
|
|
|
+ {
|
|
|
+ if(OcppTempPath == NULL)
|
|
|
+ {
|
|
|
+ sprintf(OcppPath,"/%s",ShmSysConfigAndInfo->SysConfig.ChargeBoxId);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ sprintf(OcppPath,"/%s%s",OcppTempPath,ShmSysConfigAndInfo->SysConfig.ChargeBoxId);
|
|
|
+ }
|
|
|
+ result = TRUE;
|
|
|
+ goto End;
|
|
|
+ }
|
|
|
+ else if((ShmOCPP16Data->ChargeBoxId != NULL) && (strcmp((const char *)ShmOCPP16Data->ChargeBoxId,"") != 0))
|
|
|
+ {
|
|
|
+ if(OcppTempPath == NULL)
|
|
|
+ {
|
|
|
+ sprintf(OcppPath,"/%s",ShmOCPP16Data->ChargeBoxId);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ sprintf(OcppPath,"/%s%s",OcppTempPath,ShmOCPP16Data->ChargeBoxId);
|
|
|
+ }
|
|
|
+ result = TRUE;
|
|
|
+ goto End;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ strcpy(OcppPath,"");
|
|
|
+ }
|
|
|
+
|
|
|
+End:
|
|
|
+ return result;
|
|
|
+}
|
|
|
+
|
|
|
+int GetOcppPort()
|
|
|
+{
|
|
|
+ return OcppPort;
|
|
|
+}
|
|
|
+
|
|
|
+int GetOcppConnStatus(void)
|
|
|
+{
|
|
|
+ return ShmOCPP16Data->OcppConnStatus;
|
|
|
+}
|
|
|
+
|
|
|
+void SetOcppConnStatus(uint8_t status)
|
|
|
+{
|
|
|
+ ShmOCPP16Data->OcppConnStatus = status;
|
|
|
+ ShmSysConfigAndInfo->SysInfo.OcppConnStatus = status;
|
|
|
+}
|
|
|
+
|
|
|
+int GetHeartBeatWithNOResponse(void)
|
|
|
+{
|
|
|
+ return HeartBeatWithNOResponse;
|
|
|
+}
|
|
|
+
|
|
|
+void SetHeartBeatWithNOResponse(void)
|
|
|
+{
|
|
|
+ HeartBeatWithNOResponse = 0;
|
|
|
+}
|
|
|
+
|
|
|
+void GetStartTransactionIdTag(int gun_index)
|
|
|
+{
|
|
|
+ memset(StartTransactionIdTagTemp, 0 ,sizeof(StartTransactionIdTagTemp));
|
|
|
+ strcpy(StartTransactionIdTagTemp, (const char *)ShmOCPP16Data->StartTransaction[gun_index].IdTag);
|
|
|
+ DEBUG_INFO("gun_index=%d StartTransactionIdTagTemp=%s\n",gun_index,StartTransactionIdTagTemp);
|
|
|
+}
|
|
|
+
|
|
|
+int GetTransactionId(int gunindex, unsigned char idTag[])
|
|
|
+{
|
|
|
+ char ch;
|
|
|
+ FILE *fptr1;
|
|
|
+ int temptransactionId;
|
|
|
+ char str[100]={0};
|
|
|
+
|
|
|
+ temptransactionId = 0;
|
|
|
+
|
|
|
+ if((strcmp((const char*)idTag, "")==0)||(idTag[0]=='\0'))
|
|
|
+ {
|
|
|
+ DEBUG_INFO("test 1 \n");
|
|
|
+ return temptransactionId;
|
|
|
+ }
|
|
|
+
|
|
|
+ /*------ Read the file ----------------*/
|
|
|
+ fptr1=fopen("/Storage/OCPP/QueueTransactionId","r");
|
|
|
+ if (!fptr1)
|
|
|
+ {
|
|
|
+ DEBUG_INFO("test 2 \n");
|
|
|
+ //printf(" File not found or unable to open the input file!!\n");
|
|
|
+ return temptransactionId;
|
|
|
+ }
|
|
|
+
|
|
|
+ ch=fgetc(fptr1);
|
|
|
+ //printf(" Now the content of the file %s is : \n","/Storage/OCPP/QueueTransactionId");
|
|
|
+ rewind(fptr1);
|
|
|
+ if(ch!=EOF)
|
|
|
+ {
|
|
|
+ // printf("%c",ch);
|
|
|
+ while (fgets(str, 100, fptr1) != NULL)
|
|
|
+ {
|
|
|
+ str[strlen(str) - 1] = '\0'; // eat the newline fgets() stores
|
|
|
+
|
|
|
+ if(str[0]=='\0')
|
|
|
+ {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ char *revbuf[8] = {0}; //存放分割後的子字串
|
|
|
+ int num = 0;//分割後子字串的個數
|
|
|
+ splitstring(str,",",revbuf,&num); //呼叫函式進行分割
|
|
|
+ if((revbuf[1][0] != '\0')&&(revbuf[2][0] != '\0'))
|
|
|
+ {
|
|
|
+ if((atoi(revbuf[0])==gunindex) || (strcmp(revbuf[1],(const char *)idTag)==0))
|
|
|
+ {
|
|
|
+ temptransactionId = atoi(revbuf[2]);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ fclose(fptr1);
|
|
|
+ /*------- End of reading ---------------*/
|
|
|
+ return temptransactionId;
|
|
|
+}
|
|
|
+
|
|
|
+void SetTransactionIdZero(int transactionId)
|
|
|
+{
|
|
|
+ char ch;
|
|
|
+ FILE *fptr1, *fptr2;
|
|
|
+ int temptransactionId = 0;
|
|
|
+ char str[100]={0}, strtemp[100]={0}, temp[] = "/Storage/OCPP/QueueTransactionIdtemp.json";
|
|
|
+
|
|
|
+ fptr1 = fopen("/Storage/OCPP/QueueTransactionId", "r");
|
|
|
+ if (!fptr1)
|
|
|
+ {
|
|
|
+ //printf(" File not found or unable to open the input file!!\n");
|
|
|
+ return ;
|
|
|
+ }
|
|
|
+
|
|
|
+ fptr2 = fopen(temp, "w"); // open the temporary file in write mode
|
|
|
+ if (!fptr2)
|
|
|
+ {
|
|
|
+ DEBUG_INFO("Unable to open a temporary file to write!!\n");
|
|
|
+ fclose(fptr1);
|
|
|
+ return ;
|
|
|
+ }
|
|
|
+
|
|
|
+ ch=fgetc(fptr1);
|
|
|
+
|
|
|
+ rewind(fptr1);
|
|
|
+ if(ch!=EOF)
|
|
|
+ {
|
|
|
+ // copy all contents to the temporary file except the specific line
|
|
|
+ while (fgets(str, 100, fptr1) != NULL)
|
|
|
+ {
|
|
|
+ str[strlen(str) - 1] = '\0'; // eat the newline fgets() stores
|
|
|
+
|
|
|
+ if(str[0]=='\0')
|
|
|
+ {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ char *revbuf[8] = {0};
|
|
|
+ int num = 0;
|
|
|
+
|
|
|
+ strcpy(strtemp, str);
|
|
|
+ splitstring(str,",",revbuf,&num);
|
|
|
+
|
|
|
+ if(revbuf[2][0] != '\0')
|
|
|
+ {
|
|
|
+ temptransactionId = atoi(revbuf[2]);
|
|
|
+ if(transactionId != temptransactionId)
|
|
|
+ {
|
|
|
+ fprintf(fptr2, "%s\n", strtemp);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ fclose(fptr1);
|
|
|
+ fclose(fptr2);
|
|
|
+ remove("/Storage/OCPP/QueueTransactionId"); // remove the original file
|
|
|
+ rename(temp, "/Storage/OCPP/QueueTransactionId"); // rename the temporary file to original name
|
|
|
+/*------ Read the file ----------------*/
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+int InternetDisconnect(void)
|
|
|
+{
|
|
|
+ return (ShmStatusCodeData->InfoCode.InfoEvents.bits.InternetDisconnectVia4Gi && ShmStatusCodeData->InfoCode.InfoEvents.bits.InternetDisconnectViaEthernet && ShmStatusCodeData->InfoCode.InfoEvents.bits.InternetDisconnectViaWiFi );
|
|
|
+}
|
|
|
+
|
|
|
+//Note: It is not real StopTransaction. It is temporary StopTransaction.
|
|
|
+void storeTempStopTransaction(int gun_index)
|
|
|
+{
|
|
|
+ char guid[37]={0};
|
|
|
+ int tempIndex = 0;
|
|
|
+ DEBUG_INFO("storeTempStopTransaction...\n");
|
|
|
+ memset(queuedata, 0, sizeof(queuedata));
|
|
|
+
|
|
|
+ //ENERGY_ACTIVE_IMPORT_REGISTER
|
|
|
+ //J: CHAdeMO U: CCS1 combo E: CCS2 combo G: GBT DCcc
|
|
|
+ if(gunType[gun_index] == 'J')
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
+ {
|
|
|
+ tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tempIndex = gun_index;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < CHAdeMO_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->StopTransaction[gun_index].MeterStop = ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PowerConsumption;
|
|
|
+ }
|
|
|
+ }// END OF CHAdeMO_QUANTITY
|
|
|
+ }
|
|
|
+ else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
+ {
|
|
|
+ tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tempIndex = gun_index;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < CCS_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->StopTransaction[gun_index].MeterStop = ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PowerConsumption;
|
|
|
+ }
|
|
|
+ }// END OF CCS_QUANTITY
|
|
|
+
|
|
|
+ }
|
|
|
+ else if(gunType[gun_index] == 'G')
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
+ {
|
|
|
+ tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tempIndex = gun_index;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < GB_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->StopTransaction[gun_index].MeterStop = ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PowerConsumption;
|
|
|
+ }
|
|
|
+ }// END OF GB_QUANTITY
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
|
|
|
+ {
|
|
|
+ tempIndex = 2;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tempIndex = gun_index;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < AC_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
|
|
|
+ {
|
|
|
+ ShmOCPP16Data->StopTransaction[gun_index].MeterStop = ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PowerConsumption;
|
|
|
+ }
|
|
|
+ }// END OF AC_QUANTITY
|
|
|
+ }
|
|
|
+
|
|
|
+ //Stop Transaction Time
|
|
|
+ struct timeval tmnow;
|
|
|
+ struct tm *tm;
|
|
|
+ char buf[28];//, usec_buf[6];
|
|
|
+ gettimeofday(&tmnow, NULL);
|
|
|
+
|
|
|
+ time_t t;
|
|
|
+ t = time(NULL);
|
|
|
+ /*UTC time and date*/
|
|
|
+ tm = gmtime(&t);
|
|
|
+ strftime(buf,28,"%Y-%m-%dT%H:%M:%SZ", tm);
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].Timestamp,buf);
|
|
|
+ ShmOCPP16Data->StopTransaction[gun_index].TransactionId = ShmOCPP16Data->StartTransaction[gun_index].ResponseTransactionId;
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].IdTag, (const char*)ShmOCPP16Data->StartTransaction[gun_index].IdTag);
|
|
|
+
|
|
|
+ random_uuid(guid);
|
|
|
+
|
|
|
+ /***********************************transactionData******************************************************/
|
|
|
+ memset(ShmOCPP16Data->StopTransaction[gun_index].TransactionData, 0, sizeof(sizeof(struct StructMeterValue)));
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].TimeStamp, buf);
|
|
|
+
|
|
|
+ //=================================
|
|
|
+ //1. Transaction_Begin
|
|
|
+ //=================================
|
|
|
+ // Energy.Active.Export.Interval
|
|
|
+ //idx_sample=0;
|
|
|
+ sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Value, "%.1f",(float)(ShmOCPP16Data->StartTransaction[gun_index].MeterStart)); // MeterStart is 0~6553.5 kWh
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Context,ReadingContextStr[ReadingContext_Transaction_Begin]);
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Format,ValueFormatStr[Raw]);
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Measurand,MeasurandStr[Energy_Active_Import_Interval]);//MeasurandStr[Energy_Active_Export_Interval/*Energy_Reactive_Export_Register*/]);
|
|
|
+
|
|
|
+ //J: CHAdeMO U: CCS1 combo E: CCS2 combo G: GBT DCcc
|
|
|
+ if((gunType[gun_index] == 'J')||(gunType[gun_index] == 'U')||(gunType[gun_index] == 'E')||(gunType[gun_index] == 'G'))
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Phase,PhaseStr[L3_N]);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Phase,PhaseStr[L1_N]);
|
|
|
+ }
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Location,LocationStr[Location_Outlet]);
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Unit,UnitOfMeasureStr[UnitOfMeasure_kWh]);
|
|
|
+
|
|
|
+ //=================================
|
|
|
+ //2. Transaction_End
|
|
|
+ //=================================
|
|
|
+ //2.1 Current.Export
|
|
|
+ //idx_sample=1;
|
|
|
+ //J: CHAdeMO U: CCS1 combo E: CCS2 combo G : GBT DC
|
|
|
+ if(gunType[gun_index] == 'J')
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
+ {
|
|
|
+ tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tempIndex = gun_index;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < CHAdeMO_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
|
|
|
+ {
|
|
|
+ sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargingCurrent );// PresentChargingCurrent is 0~6553.5 amp
|
|
|
+ }
|
|
|
+ }// End of for CHAdeMO_QUANTITY
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Phase,PhaseStr[L3_N]);
|
|
|
+ }
|
|
|
+ else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
+ {
|
|
|
+ tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tempIndex = gun_index;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < CCS_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
|
|
|
+ {
|
|
|
+ sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargingCurrent );// PresentChargingCurrent is 0~6553.5 amp
|
|
|
+ }
|
|
|
+ }// End of for CCS_QUANTITY
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Phase,PhaseStr[L3_N]);
|
|
|
+ }
|
|
|
+ else if(gunType[gun_index] == 'G')
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
+ {
|
|
|
+ tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tempIndex = gun_index;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < GB_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
|
|
|
+ {
|
|
|
+ sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargingCurrent );// PresentChargingCurrent is 0~6553.5 amp
|
|
|
+ }
|
|
|
+ }// End of for GB_QUANTITY
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Phase,PhaseStr[L3_N]);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
|
|
|
+ {
|
|
|
+ tempIndex = 2;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tempIndex = gun_index;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < AC_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
|
|
|
+ {
|
|
|
+ sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PresentChargingCurrent );// 0~6553.5 amp for EVSE
|
|
|
+ }
|
|
|
+ }// End of for AC_QUANTITY
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Phase,PhaseStr[L1_N]);
|
|
|
+ }
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Context,ReadingContextStr[ReadingContext_Transaction_End]);
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Format,ValueFormatStr[Raw]);
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Measurand,MeasurandStr[Current_Import]);
|
|
|
+ //strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Phase,PhaseStr[L1_N]);
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Location,LocationStr[Location_Outlet]);
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Unit,UnitOfMeasureStr[UnitOfMeasure_A]);
|
|
|
+
|
|
|
+ //2.2 Energy.Active.Export.Interval
|
|
|
+ //idx_sample=2;
|
|
|
+ //J: CHAdeMO U: CCS1 combo E: CCS2 combo G: GBT DC
|
|
|
+
|
|
|
+ if(gunType[gun_index] == 'J')
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
+ {
|
|
|
+ tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tempIndex = gun_index;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < CHAdeMO_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
|
|
|
+ {
|
|
|
+ sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargedEnergy );// PresentChargedEnergy is 0~6553.5 kWh
|
|
|
+ }
|
|
|
+ }// END OF CHAdeMO_QUANTITY
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Phase,PhaseStr[L3_N]);
|
|
|
+
|
|
|
+ }
|
|
|
+ else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
+ {
|
|
|
+ tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tempIndex = gun_index;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < CCS_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
|
|
|
+ {
|
|
|
+ sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargedEnergy );// PresentChargedEnergy is 0~6553.5 kWh
|
|
|
+ }
|
|
|
+ }// END OF CCS_QUANTITY
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Phase,PhaseStr[L3_N]);
|
|
|
+
|
|
|
+ }
|
|
|
+ else if(gunType[gun_index] == 'G')
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
+ {
|
|
|
+ tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tempIndex = gun_index;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < GB_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
|
|
|
+ {
|
|
|
+ sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargedEnergy );// PresentChargedEnergy is 0~6553.5 kWh
|
|
|
+ }
|
|
|
+ }// END OF GB_QUANTITY
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Phase,PhaseStr[L3_N]);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
|
|
|
+ {
|
|
|
+ tempIndex = 2;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tempIndex = gun_index;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ for (int index = 0; index < AC_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
|
|
|
+ {
|
|
|
+ sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PresentChargedEnergy );// PresentChargedEnergy is 0~6553.5 kWh
|
|
|
+ }
|
|
|
+ }// END OF AC_QUANTITY
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Phase,PhaseStr[L1_N]);
|
|
|
+ }
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Context,ReadingContextStr[ReadingContext_Transaction_End]);
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Format,ValueFormatStr[Raw]);
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Measurand,MeasurandStr[Energy_Active_Import_Interval]);
|
|
|
+ //strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Phase,PhaseStr[L1_N]);
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Location,LocationStr[Location_Outlet]);
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Unit,UnitOfMeasureStr[UnitOfMeasure_kWh]);
|
|
|
+
|
|
|
+ //2.3 Power.Active.Export
|
|
|
+ //idx_sample=3;
|
|
|
+ //J: CHAdeMO U: CCS1 combo E: CCS2 combo G: GBT DC
|
|
|
+
|
|
|
+ if(gunType[gun_index] == 'J')
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
+ {
|
|
|
+ tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tempIndex = gun_index;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < CHAdeMO_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
|
|
|
+ {
|
|
|
+ sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargingPower );// PresentChargingPower is 0~6553.5 kW
|
|
|
+ }
|
|
|
+ } // End for CHAdeMO_QUANTITY
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Phase,PhaseStr[L3_N]);
|
|
|
+ }
|
|
|
+ else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
+ {
|
|
|
+ tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tempIndex = gun_index;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < CCS_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
|
|
|
+ {
|
|
|
+ sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargingPower );// PresentChargingPower is 0~6553.5 kW
|
|
|
+ }
|
|
|
+ } // END for CCS_QUANTITY
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Phase,PhaseStr[L3_N]);
|
|
|
+ }
|
|
|
+ else if(gunType[gun_index] == 'G')
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
+ {
|
|
|
+ tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tempIndex = gun_index;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < GB_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
|
|
|
+ {
|
|
|
+ sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargingPower );// PresentChargingPower is 0~6553.5 kW
|
|
|
+ }
|
|
|
+ }// END for GB_QUANTITY
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Phase,PhaseStr[L3_N]);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
|
|
|
+ {
|
|
|
+ tempIndex = 2;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tempIndex = gun_index;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < AC_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
|
|
|
+ {
|
|
|
+ sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PresentChargingPower );// PresentChargingPower is 0~6553.5 kW
|
|
|
+ }
|
|
|
+ } // END for AC_QUANTITY
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Phase,PhaseStr[L1_N]);
|
|
|
+ }
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Context,ReadingContextStr[ReadingContext_Transaction_End]);
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Format,ValueFormatStr[Raw]);
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Measurand,MeasurandStr[Power_Active_Import]);
|
|
|
+ //strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Phase,PhaseStr[L1_N]);
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Location,LocationStr[Location_Outlet]);
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Unit,UnitOfMeasureStr[UnitOfMeasure_kW/*UnitOfMeasure_kWh*/]);
|
|
|
+
|
|
|
+ //2.4 Voltage
|
|
|
+ //idx_sample=4;
|
|
|
+ //J: CHAdeMO U: CCS1 combo E: CCS2 combo G: GBT DC
|
|
|
+ if(gunType[gun_index] == 'J')
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
+ {
|
|
|
+ tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tempIndex = gun_index;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < CHAdeMO_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
|
|
|
+ {
|
|
|
+ sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PresentChargingVoltage );// PresentChargingVoltage is 0~6553.5 volt
|
|
|
+ }
|
|
|
+ } // END OF FOR CHAdeMO_QUANTITY
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Phase,PhaseStr[L3_N]);
|
|
|
+
|
|
|
+ }
|
|
|
+ else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
+ {
|
|
|
+ tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tempIndex = gun_index;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < CCS_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
|
|
|
+ {
|
|
|
+ sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PresentChargingVoltage );// PresentChargingVoltage is 0~6553.5 volt
|
|
|
+ }
|
|
|
+ } // END OF FOR CCS_QUANTITY
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Phase,PhaseStr[L3_N]);
|
|
|
+ }
|
|
|
+ else if(gunType[gun_index] == 'G')
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
+ {
|
|
|
+ tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tempIndex = gun_index;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < GB_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
|
|
|
+ {
|
|
|
+ sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PresentChargingVoltage );// PresentChargingVoltage is 0~6553.5 volt
|
|
|
+ }
|
|
|
+ } // END OF FOR GB_QUANTITY
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Phase,PhaseStr[L3_N]);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D')
|
|
|
+ {
|
|
|
+ tempIndex = 2;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tempIndex = gun_index;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < AC_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.AcChargingData[index].Index == tempIndex)
|
|
|
+ {
|
|
|
+ sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Value, "%.1f" ,ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PresentChargingVoltage );//AcChargingVoltage is 0~6553.5 volt for AC EVSE
|
|
|
+ }
|
|
|
+ } // END OF FOR AC_QUANTITY
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Phase,PhaseStr[L1_N]);
|
|
|
+ }
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Context,ReadingContextStr[ReadingContext_Transaction_End]);
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Format,ValueFormatStr[Raw]);
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Measurand,MeasurandStr[Voltage]);
|
|
|
+ //strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Phase,PhaseStr[L1_N]);
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Location,LocationStr[Location_Outlet]);
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Unit,UnitOfMeasureStr[UnitOfMeasure_V]);
|
|
|
+
|
|
|
+ //2.5 SoC
|
|
|
+ //idx_sample=5;
|
|
|
+ //J : CHAdeMO U: CCS1 combo E: CCS2 combo G: GBT DC
|
|
|
+ if((gunType[gun_index] == 'J')||(gunType[gun_index] == 'U')||(gunType[gun_index] == 'E')||(gunType[gun_index] == 'G'))
|
|
|
+ {
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[8] != '0')
|
|
|
+ {
|
|
|
+ tempIndex = ((gun_index==2) ? 1: 0);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ tempIndex = gun_index;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(gunType[gun_index] == 'J')
|
|
|
+ {
|
|
|
+ for (int index = 0; index < CHAdeMO_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == tempIndex)
|
|
|
+ {
|
|
|
+ sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Value, "%d" ,ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].EvBatterySoc );// 0~100%
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if((gunType[gun_index] == 'U')||(gunType[gun_index] == 'E'))
|
|
|
+ {
|
|
|
+ for (int index = 0; index < CCS_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == tempIndex)
|
|
|
+ {
|
|
|
+ sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Value, "%d" ,ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].EvBatterySoc );// 0~100%
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ else if(gunType[gun_index] == 'G')
|
|
|
+ {
|
|
|
+ for (int index = 0; index < GB_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == tempIndex)
|
|
|
+ {
|
|
|
+ sprintf((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Value, "%d" ,ShmSysConfigAndInfo->SysInfo.GbChargingData[index].EvBatterySoc );// 0~100%
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Context,ReadingContextStr[ReadingContext_Transaction_End]);
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Format,ValueFormatStr[Raw]);
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Measurand,MeasurandStr[SoC/*Energy_Reactive_Export_Register*/]);
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Phase,PhaseStr[L3_N]);
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Location,LocationStr[Location_Outlet]);
|
|
|
+ strcpy((char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Unit,UnitOfMeasureStr[UnitOfMeasure_Percent/*UnitOfMeasure_kWh*/]);
|
|
|
+
|
|
|
+ } // END FOR DC CASE
|
|
|
+
|
|
|
+ if((gunType[gun_index] == 'J')||(gunType[gun_index] == 'U')||(gunType[gun_index] == 'E')||(gunType[gun_index] == 'G'))
|
|
|
+ {
|
|
|
+ sprintf(queuedata,"%d,[%d,\"%s\",\"StopTransaction\",{\"idTag\":\"%s\",\"meterStop\":%d,\"timestamp\":\"%s\",\"transactionId\":%d,\"reason\":\"%s\",\"transactionData\":[{\"timestamp\":\"%s\",\"sampledValue\":[{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"}]}]}]"
|
|
|
+
|
|
|
+ ,gun_index
|
|
|
+ ,MESSAGE_TYPE_CALL
|
|
|
+ ,guid
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].IdTag
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].MeterStop
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].Timestamp
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionId
|
|
|
+ ,"PowerLoss"
|
|
|
+ ,(const char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].TimeStamp
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Value
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Context
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Format
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Measurand
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Phase
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Location
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Unit
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Value
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Context
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Format
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Measurand
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Phase
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Location
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Unit
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Value
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Context
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Format
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Measurand
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Phase
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Location
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Unit
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Value
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Context
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Format
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Measurand
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Phase
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Location
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Unit
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Value
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Context
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Format
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Measurand
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Phase
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Location
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Unit
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Value
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Context
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Format
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Measurand
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Phase
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Location
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[5].Unit
|
|
|
+ );
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ sprintf(queuedata,"%d,[%d,\"%s\",\"StopTransaction\",{\"idTag\":\"%s\",\"meterStop\":%d,\"timestamp\":\"%s\",\"transactionId\":%d,\"reason\":\"%s\",\"transactionData\":[{\"timestamp\":\"%s\",\"sampledValue\":[{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"},{\"value\":\"%s\",\"context\":\"%s\",\"format\":\"%s\",\"measurand\":\"%s\",\"phase\":\"%s\",\"location\":\"%s\",\"unit\":\"%s\"}]}]}]"
|
|
|
+
|
|
|
+ ,gun_index
|
|
|
+ ,MESSAGE_TYPE_CALL
|
|
|
+ ,guid
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].IdTag
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].MeterStop
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].Timestamp
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionId
|
|
|
+ ,"PowerLoss"
|
|
|
+ ,(const char *)ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].TimeStamp
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Value
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Context
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Format
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Measurand
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Phase
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Location
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[0].Unit
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Value
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Context
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Format
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Measurand
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Phase
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Location
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[1].Unit
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Value
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Context
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Format
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Measurand
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Phase
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Location
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[2].Unit
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Value
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Context
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Format
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Measurand
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Phase
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Location
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[3].Unit
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Value
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Context
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Format
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Measurand
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Phase
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Location
|
|
|
+ ,ShmOCPP16Data->StopTransaction[gun_index].TransactionData[0].SampledValue[4].Unit
|
|
|
+ );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ // Check File "TempStopTransaction" Exist
|
|
|
+ if((access("/Storage/OCPP/TempStopTransaction",F_OK))!=-1)
|
|
|
+ {
|
|
|
+ //DEBUG_INFO("TransactionRelatedQueue exist.\n");
|
|
|
+ fclose(fopen("/Storage/OCPP/TempStopTransaction", "w"));
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ //DEBUG_INFO("TransactionRelatedQueue not exist\n");
|
|
|
+ FILE *log = fopen("/Storage/OCPP/TempStopTransaction", "w+");
|
|
|
+
|
|
|
+ if(log == NULL)
|
|
|
+ {
|
|
|
+ //DEBUG_INFO("Can't Create File TransactionRelatedQueue \n");
|
|
|
+ return ;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ fclose(log);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //Add TempStopTransaction | Update TempStopTransaction
|
|
|
+ // open file for writing
|
|
|
+ FILE *outfile;
|
|
|
+ outfile = fopen ("/Storage/OCPP/TempStopTransaction", "a");
|
|
|
+ //DEBUG_INFO("data = %s\n", queuedata);
|
|
|
+ fputs(queuedata, outfile);
|
|
|
+ fputs("\n", outfile);
|
|
|
+ fclose (outfile);
|
|
|
+}
|
|
|
+
|
|
|
+void checkTempStopTransaction(int gun_index)
|
|
|
+{
|
|
|
+ FILE *fptr1;
|
|
|
+ char ch;
|
|
|
+ char str[1200]={0};
|
|
|
+ char guid[37]={0};
|
|
|
+ char tempdata[65]={0};
|
|
|
+ char connectorStr[2]={0};
|
|
|
+
|
|
|
+ fptr1 = fopen("/Storage/OCPP/TempStopTransaction", "r");
|
|
|
+
|
|
|
+ //TempStopTransaction格式: 槍號,StopTransaction封包
|
|
|
+ if (!fptr1)
|
|
|
+ {
|
|
|
+ //printf(" File not found or unable to open the input file!!\n");
|
|
|
+ return ;
|
|
|
+ }
|
|
|
+
|
|
|
+ ch=fgetc(fptr1);
|
|
|
+ //printf(" Now the content of the file %s is : \n",fname);
|
|
|
+
|
|
|
+ rewind(fptr1);
|
|
|
+ if(ch!=EOF)
|
|
|
+ {
|
|
|
+ // copy all contents to the temporary file except the specific line
|
|
|
+ while (fgets(str, 1200, fptr1) != NULL)
|
|
|
+ {
|
|
|
+ str[strlen(str) - 1] = '\0'; // eat the newline fgets() stores
|
|
|
+
|
|
|
+ if(str[0]=='\0')
|
|
|
+ {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ //TempStopTransaction格式: 槍號,StopTransaction封包
|
|
|
+ strncpy(connectorStr, str, 1);
|
|
|
+ if(atoi(connectorStr) != gun_index)
|
|
|
+ {
|
|
|
+ DEBUG_INFO("atoi(connectorStr)=%d\n",atoi(connectorStr));
|
|
|
+ return ;
|
|
|
+ }
|
|
|
+
|
|
|
+ //random_uuid(guid);
|
|
|
+ strncpy(guid, str+4, 36); //copy guid
|
|
|
+ sprintf(tempdata, "StopTransaction,%d", (gun_index));
|
|
|
+ if(hashmap_operation(0, guid, tempdata) == 1)
|
|
|
+ {
|
|
|
+ DEBUG_INFO("StopTransaction mapitem pass\n");
|
|
|
+ }
|
|
|
+ queue_operation(4, guid, str+2 );//addq(guid, queuedata); ---> remove temporally
|
|
|
+
|
|
|
+ memset(str,0,sizeof str);
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ // fptr1=freopen(NULL,"w",fptr1); // reset the fptr1 again
|
|
|
+ fclose(fptr1);
|
|
|
+ remove("/Storage/OCPP/TempStopTransaction"); // remove the original file
|
|
|
+}
|
|
|
+
|
|
|
+void FillStartTransaction(int ConnectorId, unsigned char IdTag[], int MeterStart,int ReservationId,unsigned char Timestamp[])
|
|
|
+{
|
|
|
+ ShmOCPP16Data->StartTransaction[ConnectorId-1].ConnectorId = ConnectorId;
|
|
|
+ ShmOCPP16Data->StartTransaction[ConnectorId-1].ReservationId = ReservationId;
|
|
|
+ ShmOCPP16Data->StartTransaction[ConnectorId-1].MeterStart = MeterStart;
|
|
|
+ strcpy((char *)ShmOCPP16Data->StartTransaction[ConnectorId-1].IdTag, (char *)IdTag);
|
|
|
+ strcpy((char *)ShmOCPP16Data->StartTransaction[ConnectorId-1].Timestamp,(char *) Timestamp);
|
|
|
+}
|
|
|
+
|
|
|
+int GetWebSocketPingInterval(void)
|
|
|
+{
|
|
|
+ return atoi((const char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[WebSocketPingInterval].ItemData);
|
|
|
+}
|
|
|
+
|
|
|
+int GetServerSign(void)
|
|
|
+{
|
|
|
+ return server_sign;
|
|
|
+}
|
|
|
+
|
|
|
+void SetServerSign(int value)
|
|
|
+{
|
|
|
+ server_sign = value;
|
|
|
+}
|
|
|
+
|
|
|
+int GetBootNotificationInterval(void)
|
|
|
+{
|
|
|
+ return BootNotificationInterval;
|
|
|
+}
|
|
|
+
|
|
|
+int GetInternetConn(void)
|
|
|
+{
|
|
|
+ return ShmSysConfigAndInfo->SysInfo.InternetConn;
|
|
|
+}
|
|
|
+
|
|
|
+void InitialSystemValue(void)
|
|
|
+{
|
|
|
+ int connectorIndex = 0;
|
|
|
+ //int valueASCII = 0;
|
|
|
+ server_cycle_Status = 120;
|
|
|
+ gunTotalNumber=0;
|
|
|
+ SystemInitial = 0;
|
|
|
+ localversion=0;
|
|
|
+ BootNotificationInterval = 0;
|
|
|
+ authorizeRetryTimes = 0;
|
|
|
+ GunStatusInterval = 10;
|
|
|
+
|
|
|
+ TransactionMessageAttemptsValue = atoi((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageAttempts].ItemData);
|
|
|
+ TransactionMessageRetryIntervalValue = atoi((char *)ShmOCPP16Data->ConfigurationTable.CoreProfile[TransactionMessageRetryInterval].ItemData);
|
|
|
+
|
|
|
+ //Hear Beat
|
|
|
+ HeartBeatWithNOResponse = 0;
|
|
|
+ HeartBeatCountPerHour = 0;
|
|
|
+ HeartBeatWaitTime = 10;
|
|
|
+ FirstHeartBeat = 0;
|
|
|
+
|
|
|
+ FirmwareStatusNotificationStatus = 3; // Idle
|
|
|
+ DiagnosticsStatusNotificationStatus = 0; // Idle
|
|
|
+
|
|
|
+ memset(CurrentChargingProfileScheduleStr, 0, sizeof(CurrentChargingProfileScheduleStr));
|
|
|
+ memset(statusModeChage, 0, sizeof(statusModeChage));
|
|
|
+ memset(ChademoPreviousSystemStatus, 0, sizeof(ChademoPreviousSystemStatus));
|
|
|
+ memset(CcsPreviousSystemStatus, 0, sizeof(CcsPreviousSystemStatus));
|
|
|
+ memset(GbPreviousSystemStatus, 0, sizeof(GbPreviousSystemStatus));
|
|
|
+ memset(AcPreviousSystemStatus, 0, sizeof(AcPreviousSystemStatus));
|
|
|
+ memset(ChademoPreviousConnectorPlugIn, 0, sizeof(ChademoPreviousConnectorPlugIn));
|
|
|
+ memset(CcsPreviousConnectorPlugIn, 0, sizeof(CcsPreviousConnectorPlugIn));
|
|
|
+ memset(GbPreviousConnectorPlugIn, 0, sizeof(GbPreviousConnectorPlugIn));
|
|
|
+ memset(AcPreviousConnectorPlugIn, 0, sizeof(AcPreviousConnectorPlugIn));
|
|
|
+ memset(gunType, 0, sizeof(gunType));
|
|
|
+
|
|
|
+ if(ShmSysConfigAndInfo->SysConfig.ModelName[0]=='D') // 'D' means DC
|
|
|
+ {
|
|
|
+ //check connector / socket type (index: 8, 9, 10)
|
|
|
+ for(int index=7; index <10 ; index++)
|
|
|
+ {
|
|
|
+ if(index != 8)
|
|
|
+ {
|
|
|
+ // DC Connector
|
|
|
+ if ((ShmSysConfigAndInfo->SysConfig.ModelName[index] >= 'A') && (ShmSysConfigAndInfo->SysConfig.ModelName[index] <= 'Z'))
|
|
|
+ {
|
|
|
+ SystemInitial = SystemInitial + 1;
|
|
|
+ gunTotalNumber = gunTotalNumber + 1;
|
|
|
+ gunType[connectorIndex] = ShmSysConfigAndInfo->SysConfig.ModelName[index];
|
|
|
+ connectorIndex = connectorIndex + 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ // AC Connector
|
|
|
+ if ((ShmSysConfigAndInfo->SysConfig.ModelName[index] > '0') && (ShmSysConfigAndInfo->SysConfig.ModelName[index] <= '9'))
|
|
|
+ {
|
|
|
+ SystemInitial = SystemInitial + 1;
|
|
|
+ gunTotalNumber = gunTotalNumber + 1;
|
|
|
+ gunType[connectorIndex] = ShmSysConfigAndInfo->SysConfig.ModelName[index];
|
|
|
+ connectorIndex = connectorIndex + 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //DEBUG_INFO("DC ...\n");
|
|
|
+ }
|
|
|
+ else if (ShmSysConfigAndInfo->SysConfig.ModelName[0]=='A') //'A' means AC
|
|
|
+ {
|
|
|
+ //check connector / socket type (index: 8, 9, 10)
|
|
|
+ for(int index=7; index <10 ; index++)
|
|
|
+ {
|
|
|
+ if ((ShmSysConfigAndInfo->SysConfig.ModelName[index] > '0') && (ShmSysConfigAndInfo->SysConfig.ModelName[index] <= '9'))
|
|
|
+ {
|
|
|
+ SystemInitial = SystemInitial + 1;
|
|
|
+ gunTotalNumber = gunTotalNumber + 1;
|
|
|
+ gunType[connectorIndex] = ShmSysConfigAndInfo->SysConfig.ModelName[index];
|
|
|
+ connectorIndex = connectorIndex + 1;
|
|
|
+
|
|
|
+ DEBUG_INFO("AC: %d, %c\n", index, ShmSysConfigAndInfo->SysConfig.ModelName[index]);
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ DEBUG_INFO("gunTotalNumber: %d\n", gunTotalNumber);
|
|
|
+ DEBUG_INFO("connectorIndex: %d\n", connectorIndex);
|
|
|
+ DEBUG_INFO("SystemInitial: %d\n", SystemInitial);
|
|
|
+ //DEBUG_INFO("AC ...\n");
|
|
|
+ }
|
|
|
+
|
|
|
+ //Status && ConnectorPlugIn Setting
|
|
|
+ for (int index = 0; index < CHAdeMO_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ ChademoPreviousSystemStatus[index]= ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].PreviousSystemStatus;
|
|
|
+ ChademoPreviousConnectorPlugIn[index] = ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].ConnectorPlugIn;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < CCS_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ CcsPreviousSystemStatus[index] = ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].PreviousSystemStatus;
|
|
|
+ CcsPreviousConnectorPlugIn[index] = ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].ConnectorPlugIn;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < GB_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ GbPreviousSystemStatus[index] = ShmSysConfigAndInfo->SysInfo.GbChargingData[index].PreviousSystemStatus;
|
|
|
+ GbPreviousConnectorPlugIn[index] = ShmSysConfigAndInfo->SysInfo.GbChargingData[index].ConnectorPlugIn;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int index = 0; index < AC_QUANTITY; index++)
|
|
|
+ {
|
|
|
+ AcPreviousSystemStatus[index]= ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PreviousSystemStatus;
|
|
|
+ AcPreviousConnectorPlugIn[index] = ShmSysConfigAndInfo->SysInfo.AcChargingData[index].PilotState;
|
|
|
+ }
|
|
|
+
|
|
|
+ for(int gun_index=0; gun_index < gunTotalNumber; gun_index++ )
|
|
|
+ {
|
|
|
+ cpinitateMsg.bits[gun_index].StatusNotificationReq = 0;
|
|
|
+ cpinitateMsg.bits[gun_index].StatusNotificationConf = 0;
|
|
|
+ clientTime.MeterValues[gun_index] = time((time_t*)NULL);
|
|
|
+ clientTime.StatusNotification[gun_index] = time((time_t*)NULL);
|
|
|
+ }
|
|
|
+
|
|
|
+ // Charger PRE_SYS_MODE
|
|
|
+ memset(PRE_SYS_MODE, 0, sizeof(PRE_SYS_MODE));
|
|
|
+
|
|
|
+ memset( (void *)unknownkey, 0, sizeof(unknownkey));
|
|
|
+
|
|
|
+ clientTime.Heartbeat=time((time_t*)NULL);
|
|
|
+
|
|
|
+ sleep(1);
|
|
|
+}
|
|
|
+
|
|
|
+void LWS_Send(char * str)
|
|
|
+{
|
|
|
+ //=====================================================
|
|
|
+ // Check InternetConn 0: disconnected, 1: connected
|
|
|
+ //====================================================
|
|
|
+ if(ShmSysConfigAndInfo->SysInfo.InternetConn == 0)
|
|
|
+ {
|
|
|
+ DEBUG_INFO("\n offline now !!!\n");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ pthread_mutex_lock(&lock);
|
|
|
+ memset(SendBuffer, 0, SendBufLen);
|
|
|
+ sprintf((char *)SendBuffer, "%s", str);
|
|
|
+ pthread_mutex_unlock(&lock);
|
|
|
+
|
|
|
+ lws_callback_on_writable(wsi_client);
|
|
|
+ lws_service(context, 100);//timeout_ms
|
|
|
}
|