Skip to content

File syn_ocpp.h

File List > proto > syn_ocpp.h

Go to the documentation of this file

#ifndef SYN_OCPP_H
#define SYN_OCPP_H

#include "../common/syn_defs.h"

#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>

#ifdef __cplusplus
extern "C" {
#endif

#define SYN_OCPP_MSG_TYPE_CALL 2U       
#define SYN_OCPP_MSG_TYPE_CALLRESULT 3U 
#define SYN_OCPP_MSG_TYPE_CALLERROR 4U  
#define SYN_OCPP_ERROR_NOT_IMPLEMENTED "NotImplemented"         
#define SYN_OCPP_ERROR_NOT_SUPPORTED "NotSupported"             
#define SYN_OCPP_ERROR_INTERNAL_ERROR "InternalError"           
#define SYN_OCPP_ERROR_PROTOCOL_ERROR "ProtocolError"           
#define SYN_OCPP_ERROR_SECURITY_ERROR "SecurityError"           
#define SYN_OCPP_ERROR_FORMATION_VIOLATION "FormationViolation" 
#define SYN_OCPP_ERROR_PROPERTY_CONSTRAINT_VIOLATION \
    "PropertyConstraintViolation" 
#define SYN_OCPP_ERROR_OCCURRENCE_CONSTRAINT_VIOLATION \
    "OccurenceConstraintViolation" 
#define SYN_OCPP_ERROR_TYPE_CONSTRAINT_VIOLATION \
    "TypeConstraintViolation"                       
#define SYN_OCPP_ERROR_GENERIC_ERROR "GenericError" 
#define SYN_OCPP_SUBPROTOCOL_2_1 "ocpp2.1"     
#define SYN_OCPP_SUBPROTOCOL_2_0_1 "ocpp2.0.1" 
#define SYN_OCPP_SUBPROTOCOL_1_6 "ocpp1.6"     
typedef enum {
    SYN_OCPP_VERSION_1_6 = 0, 
    SYN_OCPP_VERSION_2_0_1,   
    SYN_OCPP_VERSION_2_1      
} SYN_OCPP_Version;

typedef enum {
    SYN_OCPP_V2G_SCHEDULED = 0, 
    SYN_OCPP_V2G_DYNAMIC        
} SYN_OCPP_V2GMode;

typedef struct {
    uint32_t message_id;     
    const char *header;      
    const char *content;     
    uint32_t display_time_s; 
} SYN_OCPP_DisplayMessage;

typedef enum {
    SYN_OCPP_STATUS_AVAILABLE = 0,  
    SYN_OCPP_STATUS_PREPARING,      
    SYN_OCPP_STATUS_CHARGING,       
    SYN_OCPP_STATUS_SUSPENDED_EV,   
    SYN_OCPP_STATUS_SUSPENDED_EVSE, 
    SYN_OCPP_STATUS_FINISHING,      
    SYN_OCPP_STATUS_RESERVED,       
    SYN_OCPP_STATUS_UNAVAILABLE,    
    SYN_OCPP_STATUS_FAULTED         
} SYN_OCPP_ChargePointStatus;

typedef enum {
    SYN_OCPP_REGISTRATION_ACCEPTED = 0, 
    SYN_OCPP_REGISTRATION_PENDING,      
    SYN_OCPP_REGISTRATION_REJECTED      
} SYN_OCPP_RegistrationStatus;

typedef enum {
    SYN_OCPP_AUTH_ACCEPTED = 0, 
    SYN_OCPP_AUTH_BLOCKED,      
    SYN_OCPP_AUTH_EXPIRED,      
    SYN_OCPP_AUTH_INVALID       
} SYN_OCPP_AuthorizationStatus;

typedef struct {
    const char *charge_point_vendor; 
    const char *charge_point_model;  
    const char *serial_number;       
    const char *firmware_version;    
} SYN_OCPP_ChargePointInfo;

typedef struct {
    uint32_t energy_wh;  
    uint16_t voltage_v;  
    uint16_t current_a;  
    uint16_t power_kw;   
    uint8_t soc_percent; 
} SYN_OCPP_MeterValues;

/* ── Client Callbacks ── */

typedef bool (*SYN_OCPP_RemoteStartHandler)(uint32_t connector_id, const char *id_tag,
                                            void *user_ctx);

typedef bool (*SYN_OCPP_RemoteStopHandler)(int32_t transaction_id, void *user_ctx);

typedef void (*SYN_OCPP_RegistrationHandler)(SYN_OCPP_RegistrationStatus status,
                                             uint32_t heartbeat_interval_sec, void *user_ctx);

typedef void (*SYN_OCPP_AuthorizationHandler)(const char *id_tag,
                                              SYN_OCPP_AuthorizationStatus status, void *user_ctx);

typedef void (*SYN_OCPP_StartTxHandler)(int32_t transaction_id, SYN_OCPP_AuthorizationStatus status,
                                        void *user_ctx);

typedef struct {
    SYN_OCPP_Version version;  
    SYN_OCPP_V2GMode v2g_mode; 
    SYN_OCPP_RegistrationStatus registration_status; 
    uint32_t heartbeat_interval_sec;                 
    uint32_t heartbeat_timer_ms;                     
    uint32_t connector_id;                       
    SYN_OCPP_ChargePointStatus connector_status; 
    int32_t active_transaction_id; 
    char active_id_tag[32];        
    uint32_t tx_start_energy_wh;   
    uint32_t message_counter; 
    SYN_OCPP_RegistrationHandler reg_cb;         
    SYN_OCPP_AuthorizationHandler auth_cb;       
    SYN_OCPP_StartTxHandler start_tx_cb;         
    SYN_OCPP_RemoteStartHandler remote_start_cb; 
    SYN_OCPP_RemoteStopHandler remote_stop_cb;   
    void *user_ctx;                              
} SYN_OCPP_Client;

/* ── Server Callbacks ── */

typedef SYN_OCPP_RegistrationStatus (*SYN_OCPP_ServerBootHandler)(
    const SYN_OCPP_ChargePointInfo *info, uint32_t *heartbeat_sec, void *user_ctx);

typedef SYN_OCPP_AuthorizationStatus (*SYN_OCPP_ServerAuthorizeHandler)(const char *id_tag,
                                                                        void *user_ctx);

typedef int32_t (*SYN_OCPP_ServerStartTxHandler)(uint32_t connector_id, const char *id_tag,
                                                 uint32_t meter_start_wh, void *user_ctx);

typedef struct {
    uint32_t message_counter;                  
    int32_t next_transaction_id;               
    SYN_OCPP_ServerBootHandler boot_cb;        
    SYN_OCPP_ServerAuthorizeHandler auth_cb;   
    SYN_OCPP_ServerStartTxHandler start_tx_cb; 
    void *user_ctx;                            
} SYN_OCPP_Server;

/* ── Client API Declarations ─────────────────────────────────────────── */

SYN_Status syn_ocpp_init(SYN_OCPP_Client *client);

SYN_Status syn_ocpp_set_callbacks(SYN_OCPP_Client *client, SYN_OCPP_RegistrationHandler reg_cb,
                                  SYN_OCPP_AuthorizationHandler auth_cb,
                                  SYN_OCPP_StartTxHandler start_tx_cb,
                                  SYN_OCPP_RemoteStartHandler remote_start_cb,
                                  SYN_OCPP_RemoteStopHandler remote_stop_cb, void *user_ctx);

SYN_Status syn_ocpp_format_boot_notification(SYN_OCPP_Client *client,
                                             const SYN_OCPP_ChargePointInfo *info, char *out_buf,
                                             size_t max_len, size_t *out_len);

SYN_Status syn_ocpp_format_heartbeat(SYN_OCPP_Client *client, char *out_buf, size_t max_len,
                                     size_t *out_len);

SYN_Status syn_ocpp_format_status_notification(SYN_OCPP_Client *client, uint32_t connector_id,
                                               SYN_OCPP_ChargePointStatus status,
                                               const char *error_code, char *out_buf,
                                               size_t max_len, size_t *out_len);

SYN_Status syn_ocpp_format_authorize(SYN_OCPP_Client *client, const char *id_tag, char *out_buf,
                                     size_t max_len, size_t *out_len);

SYN_Status syn_ocpp_format_start_transaction(SYN_OCPP_Client *client, uint32_t connector_id,
                                             const char *id_tag, uint32_t meter_start_wh,
                                             char *out_buf, size_t max_len, size_t *out_len);

SYN_Status syn_ocpp_format_stop_transaction(SYN_OCPP_Client *client, int32_t transaction_id,
                                            uint32_t meter_stop_wh, const char *reason,
                                            char *out_buf, size_t max_len, size_t *out_len);

SYN_Status syn_ocpp_format_meter_values(SYN_OCPP_Client *client, uint32_t connector_id,
                                        const SYN_OCPP_MeterValues *values, char *out_buf,
                                        size_t max_len, size_t *out_len);

SYN_Status syn_ocpp_format_display_message(SYN_OCPP_Client *client,
                                           const SYN_OCPP_DisplayMessage *msg, char *out_buf,
                                           size_t max_len, size_t *out_len);

SYN_Status syn_ocpp_format_v2g_energy_transfer(SYN_OCPP_Client *client, SYN_OCPP_V2GMode mode,
                                               int32_t power_limit_w, char *out_buf, size_t max_len,
                                               size_t *out_len);

SYN_Status syn_ocpp_process_message(SYN_OCPP_Client *client, const char *in_buf, size_t in_len,
                                    char *out_resp, size_t max_resp_len, size_t *out_resp_len);

void syn_ocpp_tick(SYN_OCPP_Client *client, uint32_t dt_ms, char *out_hb_buf, size_t max_len,
                   size_t *out_len);

/* ── Server API Declarations (CSMS Role) ─────────────────────────────── */

SYN_Status syn_ocpp_server_init(SYN_OCPP_Server *server);

SYN_Status syn_ocpp_server_set_callbacks(SYN_OCPP_Server *server,
                                         SYN_OCPP_ServerBootHandler boot_cb,
                                         SYN_OCPP_ServerAuthorizeHandler auth_cb,
                                         SYN_OCPP_ServerStartTxHandler start_tx_cb, void *user_ctx);

SYN_Status syn_ocpp_server_format_remote_start(SYN_OCPP_Server *server, uint32_t connector_id,
                                               const char *id_tag, char *out_buf, size_t max_len,
                                               size_t *out_len);

SYN_Status syn_ocpp_server_format_remote_stop(SYN_OCPP_Server *server, int32_t transaction_id,
                                              char *out_buf, size_t max_len, size_t *out_len);

SYN_Status syn_ocpp_server_process_message(SYN_OCPP_Server *server, const char *in_buf,
                                           size_t in_len, char *out_resp, size_t max_resp_len,
                                           size_t *out_resp_len);

SYN_Status syn_ocpp_format_call_error(const char *msg_id, const char *error_code,
                                      const char *error_description, char *out_buf, size_t max_len,
                                      size_t *out_len);

#ifdef __cplusplus
}
#endif

#endif /* SYN_OCPP_H */