/*
** Copyright 2017-present Open Networking Foundation
**
** Licensed under the Apache License, Version 2.0 (the "License");
** you may not use this file except in compliance with the License.
** You may obtain a copy of the License at
**
** http://www.apache.org/licenses/LICENSE-2.0
**
** Unless required by applicable law or agreed to in writing, software
** distributed under the License is distributed on an "AS IS" BASIS,
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
** See the License for the specific language governing permissions and
** limitations under the License.
*/

#ifndef DRIVERAPP_ASFVOLT16_DRIVER
#define DRIVERAPP_ASFVOLT16_DRIVER

/* Includes related to proto buf */
#include "bal_msg_type.grpc-c.h"
#include "bal_osmsg.grpc-c.h"
#include "bal_model_ids.grpc-c.h"
#include "bal_obj.grpc-c.h"
#include "bal_model_types.grpc-c.h"
#include "bal_errno.grpc-c.h"
#include "bal.grpc-c.h"

#include <stdio.h>

#define ASFVOLT_ERROR 1
#define ASFVOLT_INFO  2
#define ASFVOLT_DEBUG 3
#define ASFVOLT_MAX_PKT_SIZE 500
#define ASFVOLT_MAX_DEVICE_ID_SIZE 50
#define MAX_CHAR_LENGTH  20
#define MAX_OMCI_MSG_LENGTH 44

char voltha_device_id[ASFVOLT_MAX_DEVICE_ID_SIZE];
unsigned int is_reboot;

typedef struct BalCoreIpInfo
{
   char bal_core_arg1[4]; 
   char bal_core_ip_port[24]; 
   char bal_core_arg2[4]; 
   char bal_shared_lib_ip_port[24]; 
}balCoreIpInfo;

#define ASFVOLT_LOG(log_type, format, args...) \
   if(log_type) \
   {\
      printf("File(%s): Line(%d): ", __FUNCTION__, __LINE__);\
      printf(format, ## args);\
   }


#define ASFVOLT_CFG_PROP_SET(cfg, obj, param, pram_prst, param_val) \
   if(pram_prst)\
   {\
       BCMBAL_CFG_PROP_SET(&cfg, obj, param, param_val);\
   }

/***************************************************************
*                                                              *
*              Function Declarations                           *
*                                                              *
****************************************************************/
extern uint32_t asfvolt16_bal_init(BalInit *bal_init, balCoreIpInfo *coreInfo);
extern uint32_t asfvolt16_bal_finish(void);
extern uint32_t bal_register_indication_cbs(void);
extern uint32_t asfvolt16_bal_cfg_set(BalCfg *cfg);
extern uint32_t asfvolt16_bal_cfg_clear(BalKey *key);
extern uint32_t asfvolt16_bal_cfg_get(BalKey *key, BalCfg *cfg);
extern void asfvolt16_send_omci_msg(uint16_t olt_no, uint32_t onu_nu, char* packet_to_send);
extern uint32_t asfvolt16_bal_stats_get(BalIntfType intf_type, uint32_t intf_id, BalInterfaceStatData *statData,
                                        BalInterfaceKey *statKey);
grpc_c_client_t *client;

#endif /* DRIVERAPP_ASFVOLT16_DRIVER */
