/*
 * MeterDriver.c
 *
 *  Created on: 2021/6/4
 *      Author: foluswen
 */
#include 	"meterComm.h"
#include 	"curlApi.h"
#include 	"SystemLogMessage.h" 
#include	"json-c/json.h"

#define is_error(ptr) 			((unsigned long)ptr > (unsigned long)-4000L)


#define _DEBUG_ 0

#if _DEBUG_
#define PR(...) printf(__VA_ARGS__)
#else
#define PR(...)
#endif

unsigned char 	meterModel = 0;
char			meterApiAddress[128];


/**
 * Meter model initialize
 * @param model
 */
void meterInitialize(uint8_t model)
{
	meterModel = model;
}

/**
 * Output voltage read
 * @param meter_info
 * @return
 */
int readMeterLivemeasure(uint8_t meterIndex, Meter_Info *meter_info)
{
	int result = FAIL;
	char host[128]="";
	uint8_t	data[4096];

	sprintf(host, "http://192.168.0.%d/v1/livemeasure", (31 + meterIndex));
	
	switch(meterModel)
	{

		case METER_MODEL_LEM_L18005A:
		default:
			if(httpGet((uint8_t*)host, data) != FAIL)
			{
				//PR("data: %s\n", data);
				//PR("meterApiAddress: %s\n", meterApiAddress);
				json_object *livemeasure;
				livemeasure = json_tokener_parse((char*)data);
				if(!is_error(livemeasure))
				{
					if(json_object_object_get(livemeasure, "voltage") != NULL)
						meter_info->presetVoltage = json_object_get_double(json_object_object_get(livemeasure, "voltage"));
						PR("Output voltage %d : %.3f V\n", meter_info->presetVoltage);

					if(json_object_object_get(livemeasure, "current") != NULL)
						meter_info->presentCurrent = json_object_get_double(json_object_object_get(livemeasure, "current"));
						PR("Output current %d : %.3f V\n", meter_info->presentCurrent);

					if(json_object_object_get(livemeasure, "power") != NULL)
						meter_info->presentPower = json_object_get_double(json_object_object_get(livemeasure, "power"));
						PR("Output power %d : %.3f V\n", meter_info->presentPower);

					if(json_object_object_get(livemeasure, "energyImportTotal") != NULL)
						meter_info->totlizeImportEnergy = json_object_get_double(json_object_object_get(livemeasure, "energyImportTotal"));
						PR("Totalize import energy %d : %.3f V\n", meter_info->totlizeImportEnergy);

					if(json_object_object_get(livemeasure, "energyExportTotal") != NULL)
						meter_info->totlizeExportEnergy = json_object_get_double(json_object_object_get(livemeasure, "energyExportTotal"));
						PR("Totalize export energy %d : %.3f V\n", meter_info->totlizeExportEnergy);

					if(json_object_object_get(livemeasure, "timestamp") != NULL){						
						sprintf((char*)&meter_info->timestamp, "%s", json_object_get_string(json_object_object_get(livemeasure, "timestamp")));
						PR("timestamp : %s\n",meter_info->timestamp);	
					}
					
					PR("\n\n\n\n\n\n\n\n");
						
					result = PASS;
				}
				json_object_put(livemeasure);
			}

			break;
	}

	return result;
}

/**
 * Export & import totalize energy read
 * @param meter_info
 * @return
 */
int readMeterStatusInfo(uint8_t meterIndex, Meter_Status_Info *meter_status_info)
{
	int result = FAIL;
	char host[128]="";
	uint8_t	data[4096];
	
	sprintf(host, "http://192.168.0.%d/v1/status", (31 + meterIndex));
	
	switch(meterModel)
	{
		case METER_MODEL_LEM_L18005A:
		default:
			//if(httpGet((uint8_t*)meterApiAddress, data) != FAIL)
			if(httpGet((uint8_t*)host,data)!= FAIL)	
			{
				json_object *livemeasure;
				livemeasure = json_tokener_parse((char*)data);
				
				//PR("Get %s\n",data);
				
				if(!is_error(livemeasure))
				{
						if(json_object_object_get(json_object_object_get(livemeasure, "status"), "value") != NULL)
						{
							meter_status_info->StatusValue = json_object_get_int(json_object_object_get(json_object_object_get(livemeasure, "status"), "value"));
							PR("status-value : %d \n",meter_status_info->StatusValue);
						}
						
						//ststus bit
						if(json_object_object_get(json_object_object_get(json_object_object_get(livemeasure, "status"), "bits"), "suLinkStatusIsOk") != NULL)
						{
							meter_status_info->MeterStatusFlag.bits.suLinkStatusIsOk = json_object_get_boolean(json_object_object_get(json_object_object_get
							(json_object_object_get(livemeasure, "status"), "bits"), "suLinkStatusIsOk"));
							PR("bits-suLinkStatusIsOk : %d \n",meter_status_info->MeterStatusFlag.bits.suLinkStatusIsOk);
						}

						if(json_object_object_get(json_object_object_get(json_object_object_get(livemeasure, "status"), "bits"), "muFatalErrorOccured") != NULL)
						{
							meter_status_info->MeterStatusFlag.bits.muFatalErrorOccured = json_object_get_boolean(json_object_object_get(json_object_object_get
							(json_object_object_get(livemeasure, "status"), "bits"), "muFatalErrorOccured"));
							PR("bits-muFatalErrorOccured : %d \n",meter_status_info->MeterStatusFlag.bits.muFatalErrorOccured);
						}
										
						if(json_object_object_get(json_object_object_get(json_object_object_get(livemeasure, "status"), "bits"), "transactionIsOnGoing") != NULL)
						{
							meter_status_info->MeterStatusFlag.bits.transactionIsOnGoing = json_object_get_boolean(json_object_object_get(json_object_object_get
							(json_object_object_get(livemeasure, "status"), "bits"), "transactionIsOnGoing"));
							PR("bits-transactionIsOnGoing : %d \n",meter_status_info->MeterStatusFlag.bits.transactionIsOnGoing);
						}

						if(json_object_object_get(json_object_object_get(json_object_object_get(livemeasure, "status"), "bits"), "tamperingIsDetected") != NULL)
						{
							meter_status_info->MeterStatusFlag.bits.tamperingIsDetected = json_object_get_boolean(json_object_object_get(json_object_object_get
							(json_object_object_get(livemeasure, "status"), "bits"), "tamperingIsDetected"));
							PR("bits-tamperingIsDetected : %d \n",meter_status_info->MeterStatusFlag.bits.tamperingIsDetected);
						}
						
						if(json_object_object_get(json_object_object_get(json_object_object_get(livemeasure, "status"), "bits"), "timeSyncStatusIsOk") != NULL)
						{
							meter_status_info->MeterStatusFlag.bits.timeSyncStatusIsOk = json_object_get_boolean(json_object_object_get(json_object_object_get
							(json_object_object_get(livemeasure, "status"), "bits"), "timeSyncStatusIsOk"));
							PR("bits-timeSyncStatusIsOk : %d \n",meter_status_info->MeterStatusFlag.bits.timeSyncStatusIsOk);
						}
						
						if(json_object_object_get(json_object_object_get(json_object_object_get(livemeasure, "status"), "bits"), "overTemperatureIsDetected") != NULL)
						{
							meter_status_info->MeterStatusFlag.bits.overTemperatureIsDetected = json_object_get_boolean(json_object_object_get(json_object_object_get
							(json_object_object_get(livemeasure, "status"), "bits"), "overTemperatureIsDetected"));
							PR("bits-overTemperatureIsDetected : %d \n",meter_status_info->MeterStatusFlag.bits.overTemperatureIsDetected);
						}
						
						if(json_object_object_get(json_object_object_get(json_object_object_get(livemeasure, "status"), "bits"), "reversedVoltage") != NULL)
						{
							meter_status_info->MeterStatusFlag.bits.reversedVoltage = json_object_get_boolean(json_object_object_get(json_object_object_get
							(json_object_object_get(livemeasure, "status"), "bits"), "reversedVoltage"));
							PR("bits-reversedVoltage : %d \n",meter_status_info->MeterStatusFlag.bits.reversedVoltage);
						}
						
						if(json_object_object_get(json_object_object_get(json_object_object_get(livemeasure, "status"), "bits"), "suMeasureFailureOccurred") != NULL)
						{
							meter_status_info->MeterStatusFlag.bits.suMeasureFailureOccurred = json_object_get_boolean(json_object_object_get(json_object_object_get
							(json_object_object_get(livemeasure, "status"), "bits"), "suMeasureFailureOccurred"));
							PR("bits-suMeasureFailureOccurred : %d \n",meter_status_info->MeterStatusFlag.bits.suMeasureFailureOccurred);
						}
				
		
						if(json_object_object_get(json_object_object_get(livemeasure, "version"), "applicationFirmwareVersion") != NULL)
						{
								sprintf((char*)&meter_status_info->applicationFirmwareVersion, "%s", json_object_get_string(json_object_object_get
								(json_object_object_get(livemeasure, "version"), "applicationFirmwareVersion")));
								PR("applicationFirmwareVersion : %s\n",meter_status_info->applicationFirmwareVersion);
						}

						if(json_object_object_get(json_object_object_get(livemeasure, "version"), "applicationFirmwareAuthTag") != NULL)
						{
								sprintf((char*)&meter_status_info->applicationFirmwareAuthTag, "%s", json_object_get_string(json_object_object_get
								(json_object_object_get(livemeasure, "version"), "applicationFirmwareAuthTag")));
								PR("applicationFirmwareAuthTag : %s\n",meter_status_info->applicationFirmwareAuthTag);
						}
						
						if(json_object_object_get(json_object_object_get(livemeasure, "version"), "legalFirmwareVersion") != NULL)
						{
								sprintf((char*)&meter_status_info->legalFirmwareVersion, "%s", json_object_get_string(json_object_object_get
								(json_object_object_get(livemeasure, "version"), "legalFirmwareVersion")));
								PR("applicationFirmwareAuthTag : %s\n",meter_status_info->legalFirmwareVersion);
						}
						
						if(json_object_object_get(json_object_object_get(livemeasure, "version"), "legalFirmwareAuthTag") != NULL)
						{
								sprintf((char*)&meter_status_info->legalFirmwareAuthTag, "%s", json_object_get_string(json_object_object_get
								(json_object_object_get(livemeasure, "version"), "legalFirmwareAuthTag")));
								PR("applicationFirmwareAuthTag : %s\n",meter_status_info->legalFirmwareAuthTag);
						}
						
						if(json_object_object_get(json_object_object_get(livemeasure, "version"), "sensorFirmwareVersion") != NULL)
						{
								sprintf((char*)&meter_status_info->sensorFirmwareVersion, "%s", json_object_get_string(json_object_object_get
								(json_object_object_get(livemeasure, "version"), "sensorFirmwareVersion")));
								PR("applicationFirmwareAuthTag : %s\n",meter_status_info->sensorFirmwareVersion);
						}

						if(json_object_object_get(json_object_object_get(livemeasure, "version"), "sensorFirmwareCrc") != NULL)
						{
								sprintf((char*)&meter_status_info->sensorFirmwareCrc, "%s", json_object_get_string(json_object_object_get
								(json_object_object_get(livemeasure, "version"), "sensorFirmwareCrc")));
								PR("applicationFirmwareAuthTag : %s\n",meter_status_info->sensorFirmwareCrc);
						}
						
						if(json_object_object_get(livemeasure, "ipAddress") != NULL)
						{
								sprintf((char*)&meter_status_info->ipAddress, "%s", json_object_get_string(json_object_object_get(livemeasure, "ipAddress")));
								PR("ipAddress : %s\n",meter_status_info->ipAddress);
						}

						if(json_object_object_get(livemeasure, "meterId") != NULL)
						{
								sprintf((char*)&meter_status_info->meterId, "%s", json_object_get_string(json_object_object_get(livemeasure, "meterId")));
								PR("meterId : %s\n",meter_status_info->meterId);
						}

						//error bit
						if(json_object_object_get(json_object_object_get(json_object_object_get(livemeasure, "errors"), "bits"), "muInitIsFailed") != NULL)
						{
							meter_status_info->MeterErrorFlag.bits.muInitIsFailed = json_object_get_boolean(json_object_object_get(json_object_object_get
							(json_object_object_get(livemeasure, "errors"), "bits"), "muInitIsFailed"));
							PR("bits-muInitIsFailed : %d \n",meter_status_info->MeterErrorFlag.bits.muInitIsFailed);
						}

						if(json_object_object_get(json_object_object_get(json_object_object_get(livemeasure, "errors"), "bits"), "suStateIsInvalid") != NULL)
						{
							meter_status_info->MeterErrorFlag.bits.suStateIsInvalid = json_object_get_boolean(json_object_object_get(json_object_object_get
							(json_object_object_get(livemeasure, "errors"), "bits"), "suStateIsInvalid"));
							PR("bits-suStateIsInvalid : %d \n",meter_status_info->MeterErrorFlag.bits.suStateIsInvalid);
						}
										
						if(json_object_object_get(json_object_object_get(json_object_object_get(livemeasure, "errors"), "bits"), "versionCheckIsFailed") != NULL)
						{
							meter_status_info->MeterErrorFlag.bits.versionCheckIsFailed = json_object_get_boolean(json_object_object_get(json_object_object_get
							(json_object_object_get(livemeasure, "errors"), "bits"), "versionCheckIsFailed"));
							PR("bits-versionCheckIsFailed : %d \n",meter_status_info->MeterErrorFlag.bits.versionCheckIsFailed);
						}

						if(json_object_object_get(json_object_object_get(json_object_object_get(livemeasure, "errors"), "bits"), "muRngInitIsFailed") != NULL)
						{
							meter_status_info->MeterErrorFlag.bits.muRngInitIsFailed = json_object_get_boolean(json_object_object_get(json_object_object_get
							(json_object_object_get(livemeasure, "errors"), "bits"), "muRngInitIsFailed"));
							PR("bits-muRngInitIsFailed : %d \n",meter_status_info->MeterErrorFlag.bits.muRngInitIsFailed);
						}
						
						if(json_object_object_get(json_object_object_get(json_object_object_get(livemeasure, "errors"), "bits"), "muDataIntegrityIsFailed") != NULL)
						{
							meter_status_info->MeterErrorFlag.bits.muDataIntegrityIsFailed = json_object_get_boolean(json_object_object_get(json_object_object_get
							(json_object_object_get(livemeasure, "errors"), "bits"), "muDataIntegrityIsFailed"));
							PR("bits-muDataIntegrityIsFailed : %d \n",meter_status_info->MeterErrorFlag.bits.muDataIntegrityIsFailed);
						}
						
						if(json_object_object_get(json_object_object_get(json_object_object_get(livemeasure, "errors"), "bits"), "muFwIntegrityIsFailed") != NULL)
						{
							meter_status_info->MeterErrorFlag.bits.muFwIntegrityIsFailed = json_object_get_boolean(json_object_object_get(json_object_object_get
							(json_object_object_get(livemeasure, "errors"), "bits"), "muFwIntegrityIsFailed"));
							PR("bits-muFwIntegrityIsFailed : %d \n",meter_status_info->MeterErrorFlag.bits.muFwIntegrityIsFailed);
						}
						
						if(json_object_object_get(json_object_object_get(json_object_object_get(livemeasure, "errors"), "bits"), "suIntegrityIsFailed") != NULL)
						{
							meter_status_info->MeterErrorFlag.bits.suIntegrityIsFailed = json_object_get_boolean(json_object_object_get(json_object_object_get
							(json_object_object_get(livemeasure, "errors"), "bits"), "suIntegrityIsFailed"));
							PR("bits-suIntegrityIsFailed : %d \n",meter_status_info->MeterErrorFlag.bits.suIntegrityIsFailed);
						}
						
						if(json_object_object_get(json_object_object_get(json_object_object_get(livemeasure, "errors"), "bits"), "logbookIntegrityIsFailed") != NULL)
						{
							meter_status_info->MeterErrorFlag.bits.logbookIntegrityIsFailed = json_object_get_boolean(json_object_object_get(json_object_object_get
							(json_object_object_get(livemeasure, "errors"), "bits"), "logbookIntegrityIsFailed"));
							PR("bits-logbookIntegrityIsFailed : %d \n",meter_status_info->MeterErrorFlag.bits.logbookIntegrityIsFailed);
						}					
						
						if(json_object_object_get(json_object_object_get(json_object_object_get(livemeasure, "errors"), "bits"), "logbookIsFull") != NULL)
						{
							meter_status_info->MeterErrorFlag.bits.logbookIsFull = json_object_get_boolean(json_object_object_get(json_object_object_get
							(json_object_object_get(livemeasure, "errors"), "bits"), "logbookIsFull"));
							PR("bits-logbookIsFull : %d \n",meter_status_info->MeterErrorFlag.bits.logbookIsFull);
						}
						
						if(json_object_object_get(json_object_object_get(json_object_object_get(livemeasure, "errors"), "bits"), "memoryAccessIsFailed") != NULL)
						{
							meter_status_info->MeterErrorFlag.bits.memoryAccessIsFailed = json_object_get_boolean(json_object_object_get(json_object_object_get
							(json_object_object_get(livemeasure, "errors"), "bits"), "memoryAccessIsFailed"));
							PR("bits-memoryAccessIsFailed : %d \n",meter_status_info->MeterErrorFlag.bits.memoryAccessIsFailed);
						}
						
						if(json_object_object_get(json_object_object_get(json_object_object_get(livemeasure, "errors"), "bits"), "muStateIsFailed") != NULL)
						{
							meter_status_info->MeterErrorFlag.bits.muStateIsFailed = json_object_get_boolean(json_object_object_get(json_object_object_get
							(json_object_object_get(livemeasure, "errors"), "bits"), "muStateIsFailed"));
							PR("bits-muStateIsFailed : %d \n",meter_status_info->MeterErrorFlag.bits.muStateIsFailed);
						}	

							
						if(json_object_object_get(livemeasure, "publicKey") != NULL)
						{
								sprintf((char*)&meter_status_info->publicKey, "%s", json_object_get_string(json_object_object_get(livemeasure, "publicKey")));
								PR("publicKey : %s\n",meter_status_info->publicKey);
						}

						if(json_object_object_get(livemeasure, "publicKeyOcmf") != NULL)
						{
								sprintf((char*)&meter_status_info->publicKeyOcmf, "%s", json_object_get_string(json_object_object_get(livemeasure, "publicKeyOcmf")));
								PR("publicKeyOcmf : %s\n",meter_status_info->publicKeyOcmf);
						}

						if(json_object_object_get(livemeasure, "indexOfLastTransaction") != NULL)
						{
								meter_status_info->indexOfLastTransaction = json_object_get_int(json_object_object_get(livemeasure, "indexOfLastTransaction"));
								PR("indexOfLastTransaction : %d \n",meter_status_info->indexOfLastTransaction);
						}
						
						if(json_object_object_get(livemeasure, "numberOfStoredTransactions") != NULL)
						{
								meter_status_info->numberOfStoredTransactions = json_object_get_int(json_object_object_get(livemeasure, "numberOfStoredTransactions"));
								PR("numberOfStoredTransactions : %d \n",meter_status_info->numberOfStoredTransactions);
						}
						
						PR("\n\n\n\n\n\n\n\n");

					result = PASS;
				}
				
				json_object_put(livemeasure);
			}
			break;
	}
	
	return result;
}


int startMeterTransaction(uint8_t meterIndex, Meter_transaction_Action *meter_transaction_Action)
{
	int result = FAIL;
	char host[128]="";
	uint8_t data[4096];
	uint8_t tmp[4096];

	json_object *TransactionStartData = json_object_new_object();	
	json_object_object_add(TransactionStartData, "evseId", json_object_new_string((char*)meter_transaction_Action->head.evseId));
	json_object_object_add(TransactionStartData, "transactionId", json_object_new_string((char*)meter_transaction_Action->head.transactionId));
	json_object_object_add(TransactionStartData, "clientId", json_object_new_string((char*)meter_transaction_Action->head.clientId));
	json_object_object_add(TransactionStartData, "tariffId", json_object_new_int(meter_transaction_Action->head.tariffId));
	json_object_object_add(TransactionStartData, "cableId", json_object_new_int(meter_transaction_Action->head.cableId));
	json_object_object_add(TransactionStartData, "userData", json_object_new_string((char*)meter_transaction_Action->head.userData));

	sprintf((char*)tmp, "%s",  json_object_to_json_string_ext(TransactionStartData, JSON_C_TO_STRING_PLAIN));

	sprintf(host, "http://192.168.0.%d/v1/legal", (31 + meterIndex));
		 
	switch(meterModel)
	{
		case METER_MODEL_LEM_L18005A:
		default:
 
     
			if(httpPost((uint8_t*)host,tmp,data)!= FAIL)
			{
				json_object *livemeasure;
				livemeasure = json_tokener_parse((char*)data);
				
				if(!is_error(livemeasure))
				{							
					PR("PostStartGet %s\n",data);
				 result = PASS;
				}
				json_object_put(livemeasure);
				json_object_put(TransactionStartData);
			}

			break;
	}
					
	return result;
	
}


int stopMeterTransaction(uint8_t meterIndex, Meter_transaction_Action *meter_transaction_Action,Meter_transaction_Result *meter_transaction_Result)
{
	int result = FAIL;
	char host[128]="";
	uint8_t data[4096];
	uint8_t tmp[4096];

	sprintf(host, "http://192.168.0.%d/v1/legal?transactionId=%s",(31 + meterIndex), meter_transaction_Action->head.transactionId);
           
	json_object *TransactionStopData = json_object_new_object();
	json_object_object_add(TransactionStopData, "running", json_object_new_boolean(0));
	sprintf((char*)tmp, "%s", json_object_to_json_string_ext(TransactionStopData, JSON_C_TO_STRING_PLAIN));
	
	switch(meterModel)
	{
		case METER_MODEL_LEM_L18005A:
		default:

			if(httpPut((uint8_t*)host,tmp,data)!= FAIL)
			//if(httpGet(host,data)!= FAIL)	
			{
				json_object *livemeasure;
				livemeasure = json_tokener_parse((char*)data);
				
				if(!is_error(livemeasure))
				{							
					PR("PutStopGet %s\n",data);
					
					
						if(json_object_object_get(livemeasure, "paginationCounter") != NULL)
						{
								meter_transaction_Result->paginationCounter = json_object_get_int(json_object_object_get(livemeasure, "paginationCounter"));
								PR("paginationCounter : %d\n",meter_transaction_Result->paginationCounter);										
						}

						if(json_object_object_get(livemeasure, "transactionId") != NULL)
						{
								sprintf((char*)&meter_transaction_Result->head.transactionId, "%s", json_object_get_string(json_object_object_get(livemeasure, "transactionId")));
								PR("transactionId : %s\n",meter_transaction_Result->head.transactionId);										
						}

						if(json_object_object_get(livemeasure, "evseId") != NULL)
						{
								sprintf((char*)&meter_transaction_Result->head.evseId, "%s", json_object_get_string(json_object_object_get(livemeasure, "evseId")));
								PR("evseId : %s\n",meter_transaction_Result->head.evseId);										
						}
												

						if(json_object_object_get(livemeasure, "clientId") != NULL)
						{
								sprintf((char*)&meter_transaction_Result->head.clientId, "%s", json_object_get_string(json_object_object_get(livemeasure, "clientId")));
								PR("clientId : %s\n",meter_transaction_Result->head.clientId);										
						}

						if(json_object_object_get(livemeasure, "tariffId") != NULL)
						{
								meter_transaction_Result->head.tariffId = json_object_get_int(json_object_object_get(livemeasure, "tariffId"));
								PR("tariffId : %d\n",meter_transaction_Result->head.tariffId);
						}					

						if(json_object_object_get(livemeasure, "userData") != NULL)
						{
								sprintf((char*)&meter_transaction_Result->head.userData, "%s", json_object_get_string(json_object_object_get(livemeasure, "userData")));
								PR("clientId : %s\n",meter_transaction_Result->head.userData);										
						}					

						if(json_object_object_get(json_object_object_get(livemeasure, "meterValue"), "timestampStart") != NULL)
						{
								sprintf((char*)&meter_transaction_Result->timestampStart, "%s", json_object_get_string(json_object_object_get
								(json_object_object_get(livemeasure, "meterValue"), "timestampStart")));
								PR("timestampStart : %s\n",meter_transaction_Result->timestampStart);
						}

						if(json_object_object_get(json_object_object_get(livemeasure, "meterValue"), "timestampStop") != NULL)
						{
								sprintf((char*)&meter_transaction_Result->timestampStop, "%s", json_object_get_string(json_object_object_get
								(json_object_object_get(livemeasure, "meterValue"), "timestampStop")));
								PR("timestampStop : %s\n",meter_transaction_Result->timestampStop);
						}

						if(json_object_object_get(json_object_object_get(livemeasure, "meterValue"), "transactionDuration") != NULL)
						{
								meter_transaction_Result->transactionDuration = json_object_get_int(json_object_object_get
								(json_object_object_get(livemeasure, "meterValue"), "transactionDuration"));
								PR("transactionDuration : %d\n",meter_transaction_Result->transactionDuration);
						}

						if(json_object_object_get(json_object_object_get(livemeasure, "meterValue"), "transactionStatus") != NULL)
						{
								meter_transaction_Result->transactionStatus = json_object_get_int(json_object_object_get
								(json_object_object_get(livemeasure, "meterValue"), "transactionStatus"));
								PR("transactionStatus : %d\n",meter_transaction_Result->transactionStatus);
						}

						if(json_object_object_get(json_object_object_get(json_object_object_get(livemeasure, "meterValue"), "sampleValue"), "energyUnit") != NULL)
						{
							strcpy((char*)meter_transaction_Result->energyUnit, json_object_get_string(json_object_object_get(json_object_object_get(json_object_object_get
							(livemeasure, "meterValue"), "sampleValue"), "energyUnit")));
							PR("energyUnit : %s\n",meter_transaction_Result->energyUnit);
						}
						
						if(json_object_object_get(json_object_object_get(json_object_object_get(livemeasure, "meterValue"), "sampleValue"), "energyImport") != NULL)
						{
							meter_transaction_Result->energyImport = json_object_get_double(json_object_object_get(json_object_object_get(json_object_object_get
							(livemeasure, "meterValue"), "sampleValue"), "energyImport"));
							PR("energyImport : %.3f\n",meter_transaction_Result->energyImport);
						}
						
						if(json_object_object_get(json_object_object_get(json_object_object_get(livemeasure, "meterValue"), "sampleValue"), "energyImportTotalStart") != NULL)
						{
							meter_transaction_Result->energyImportTotalStart = json_object_get_double(json_object_object_get(json_object_object_get(json_object_object_get
							(livemeasure, "meterValue"), "sampleValue"), "energyImportTotalStart"));
							PR("energyImportTotalStart : %.3f\n",meter_transaction_Result->energyImportTotalStart);
						}

						if(json_object_object_get(json_object_object_get(json_object_object_get(livemeasure, "meterValue"), "sampleValue"), "energyImportTotalStop") != NULL)
						{
							meter_transaction_Result->energyImportTotalStop = json_object_get_double(json_object_object_get(json_object_object_get(json_object_object_get
							(livemeasure, "meterValue"), "sampleValue"), "energyImportTotalStop"));
							PR("energyImportTotalStop : %.3f\n",meter_transaction_Result->energyImportTotalStop);
						}


						if(json_object_object_get(json_object_object_get(json_object_object_get(livemeasure, "meterValue"), "sampleValue"), "energyExport") != NULL)
						{
							meter_transaction_Result->energyExport = json_object_get_double(json_object_object_get(json_object_object_get(json_object_object_get
							(livemeasure, "meterValue"), "sampleValue"), "energyExport"));
							PR("energyExport : %.3f\n",meter_transaction_Result->energyExport);
						}

						if(json_object_object_get(json_object_object_get(json_object_object_get(livemeasure, "meterValue"), "sampleValue"), "energyExportTotalStart") != NULL)
						{
							meter_transaction_Result->energyExportTotalStart = json_object_get_double(json_object_object_get(json_object_object_get(json_object_object_get
							(livemeasure, "meterValue"), "sampleValue"), "energyExportTotalStart"));
							PR("energyExportTotalStart : %.3f\n",meter_transaction_Result->energyExportTotalStart);
						}

						if(json_object_object_get(json_object_object_get(json_object_object_get(livemeasure, "meterValue"), "sampleValue"), "energyExportTotalStop") != NULL)
						{
							meter_transaction_Result->energyExportTotalStop = json_object_get_double(json_object_object_get(json_object_object_get(json_object_object_get
							(livemeasure, "meterValue"), "sampleValue"), "energyExportTotalStop"));
							PR("energyExportTotalStop : %.3f\n",meter_transaction_Result->energyExportTotalStop);
						}
						
						if(json_object_object_get(livemeasure, "signature") != NULL)
						{
								sprintf((char*)&meter_transaction_Result->signature, "%s", json_object_get_string(json_object_object_get(livemeasure, "signature")));
								PR("signature : %s\n",meter_transaction_Result->signature);										
						}
						
						PR("\n\n\n\n\n\n\n\n");
											
				 	result = PASS;
				}
			json_object_put(livemeasure);
			json_object_put(TransactionStopData);		
				
			}
			break;
	}
					
	
	
	return result;
	
}


int readMeterTransactionOCMF(uint8_t meterIndex, Meter_transaction_Action *meter_transaction_Action)
{
	int result = FAIL;
	char host[128]="";
	uint8_t data[4096];
		
	sprintf(host, "http://192.168.0.%d/v1/ocmf?transactionId=%s",(31 + meterIndex),meter_transaction_Action->head.transactionId);
 	//printf ("host : %s\n",host);
	
	switch(meterModel)
	{
		case METER_MODEL_LEM_L18005A:
		default:

			if(httpGet((uint8_t*)host,data)!= FAIL)	
			{
				
				PR("Get %s\n",data);
				sprintf((char*)&meter_transaction_Action->transactionOCMF, "%s", data);
				//printf("GETOCMF %s\n",meter_transaction_Result->transactionOCMF);
				json_object *livemeasure;
				livemeasure = json_tokener_parse((char*)data);
				
				if(!is_error(livemeasure))
				{							
					result = PASS;
				}
				
				json_object_put(livemeasure);
				
			}
			break;
	}
					
	
	
	return result;
	
}


int readMeterLegal(uint8_t meterIndex, Meter_transaction_Action *meter_transaction_Action)
{
	int result = FAIL;
	char host[128]="";
	uint8_t data[4096];
		
	sprintf(host, "http://192.168.0.%d/v1/legal",(31 + meterIndex));
 	//printf ("host : %s\n",host);
	
	switch(meterModel)
	{
		case METER_MODEL_LEM_L18005A:
		default:

			if(httpGet((uint8_t*)host,data)!= FAIL)	
			{
				
				json_object *livemeasure;
				livemeasure = json_tokener_parse((char*)data);
				
				if(!is_error(livemeasure))
				{	
					if(json_object_object_get(livemeasure, "transactionId") != NULL)
					{
								sprintf((char*)&meter_transaction_Action->head.transactionId, "%s", json_object_get_string(json_object_object_get(livemeasure, "transactionId")));
								PR("transactionId : %s\n",meter_transaction_Action->head.transactionId);										
					}
					result = PASS;
				}
				
				json_object_put(livemeasure);
				
			}
			break;
	}
					
	
	
	return result;
	
}


int configure_meter_time(uint8_t meterIndex)
{
	int result = FAIL;
	
	char host[256]="";
	uint8_t	postdata[256];
	uint8_t data[4096];
		
	time_t tmi;
	struct tm* utcTime;

	time(&tmi);
	utcTime = gmtime(&tmi);
	
  //{"time": { "utc":"2022-06-29T13:09:26Z" }}
	sprintf(host,"http://192.168.0.%d/v1/settings",(31 + meterIndex));
	memset(postdata, 0, sizeof(postdata));
	sprintf((char*)postdata,"{\"time\": { \"utc\":\"%d-%d-%dT%02d:%02d:%02dZ\" }}", (utcTime->tm_year+1900), (utcTime->tm_mon+1), (utcTime->tm_mday), (utcTime->tm_hour) % 24, utcTime->tm_min, utcTime->tm_sec);
	//sprintf(postdata,"{\"time\": { \"utc\":\"%d-%d-%dT%02d:%02d:%02dZ\" }}", 2021, (utcTime->tm_mon+1), (utcTime->tm_mday), (utcTime->tm_hour) % 24, utcTime->tm_min, utcTime->tm_sec); 
	
		PR("Local time and date: %s\n", postdata);
	
	switch(meterModel)
	{
		case METER_MODEL_LEM_L18005A:
		default:

			if(httpPut((uint8_t*)host,postdata, data)!= FAIL)
			{
				json_object *livemeasure;
				livemeasure = json_tokener_parse((char*)data);
				
				if(!is_error(livemeasure))
				{							
					PR("PutConfingTimeGet %s\n",data);
					PR("\n\n\n\n\n\n\n\n");
					
					if(json_object_object_get(livemeasure, "result") != NULL)
					{
						PR("configure_meter_time resul: %d \n",json_object_get_int(json_object_object_get(livemeasure, "result")));
					}
				 	
				 	result = PASS;
				}
			json_object_put(livemeasure);
				
			}
			break;
	}
	
	return result;
	
}