/*
* Connection.c
*
* Created on: 4 June 2018
* Author: shlomo
*/
#include <Container.h>
#include <DataDef.h>
#include <PMR/Common/MessageContainer.pb-c.h>
#include <PMR/Connection/ConnectRequest.pb-c.h>
#include <PMR/Connection/ConnectResponse.pb-c.h>
#include <PMR/Connection/DisConnectRequest.pb-c.h>
#include <PMR/Connection/DisConnectResponse.pb-c.h>
#include <PMR/Connection/KeepAliveRequest.pb-c.h>
#include <PMR/Connection/KeepAliveResponse.pb-c.h>
#include <PMR/Connection/DeviceInformation.pb-c.h>
#include "Common/SW_Info/SW_Info.h"
#include "Common/report/report.h"
#include <utils/ustdlib.h>
#include "drivers/FPGA/FPGA.h"
#include "StateMachines/Printing/PrintingSTM.h"
#include "Modules/heaters/heaters_ex.h"
#include "modules/Diagnostics/Diagnostics.h"
#include "Modules/AlarmHandling/AlarmHandling.h"
#include "Modules/Stubs_Handler/Stub_HW_Version.h"
char HexToDecimal(char hex)
{
int i = hex % 0x10;
int j = hex / 0x10;
return j*10+i;
}
void ConnectionRequest(MessageContainer* requestContainer)
{
MessageContainer responseContainer;
ConnectRequest* request = connect_request__unpack(NULL, requestContainer->data.len, requestContainer->data.data);
DeviceInformation DevInfo = DEVICE_INFORMATION__INIT;
ConnectResponse response = CONNECT_RESPONSE__INIT;
if (GeneralHwReady == false)
{
return;
}
unsigned char Major = 0;
unsigned char Year = 0 ;
unsigned char Month = 0;
unsigned char Day = 0;
char Version[30] = {0};
char FPGA1Version[30] = {0};
char FPGA2Version[30] = {0};
char FPGA3Version[30] = {0};
char BoardVersion[30] = {0};
char AssyVersion[30] = {0};
response.deviceinformation = &DevInfo;
/*
extern TangoVersion_t _gTangoVersion;
extern char Dat[50];
extern char _gTangoName [MAX_STRING_LEN];//d
*/
DevInfo.builddate = Dat;
DevInfo.name = _gTangoName;
usnprintf(Version, 30, "%d.%d.%d.%d",_gTangoVersion.m_major,_gTangoVersion.m_minor,_gTangoVersion.m_patch,_gTangoVersion.m_build);
DevInfo.version = Version;
FPGA_ReadVersion(1, &Major, &Year, &Month, &Day);
usnprintf(FPGA1Version, 30, "FPGA1: Ver %d %d/%d/20%d",HexToDecimal(Major), HexToDecimal(Day),HexToDecimal(Month),HexToDecimal(Year));
DevInfo.fpga1version = FPGA1Version;
FPGA_ReadVersion(2, &Major, &Year, &Month, &Day);
usnprintf(FPGA2Version, 30, "FPGA2: Ver %d %d/%d/20%d",HexToDecimal(Major), HexToDecimal(Day),HexToDecimal(Month),HexToDecimal(Year));
DevInfo.fpga2version = FPGA2Version;
FPGA_ReadVersion(3, &Major, &Year, &Month, &Day);
usnprintf(FPGA3Version, 30, "FPGA3: Ver %d %d/%d/20%d",HexToDecimal(Major), HexToDecimal(Day),HexToDecimal(Month),HexToDecimal(Year));
DevInfo.fpga3version = FPGA3Version;
Read_HW_Version(BoardVersion, AssyVersion);
DevInfo.boardrevision = BoardVersion;
DevInfo.assemblyversion = AssyVersion;
responseContainer = createContainer(MESSAGE_TYPE__ConnectResponse, requestContainer->token, true, &response, &connect_response__pack, &connect_response__get_packed_size);
//-------------------------------------------------------------------------------------------
uint8_t* container_buffer = my_malloc(message_container__get_packed_size(&responseContainer));
size_t container_size = message_container__pack(&responseContainer, container_buffer);
my_free(responseContainer.data.data);
SendChars((char*)container_buffer, container_size);
connect_request__free_unpacked(request,NULL);
}
void DisconnectionRequest(MessageContainer* requestContainer)
{
MessageContainer responseContainer;
//DisconnectRequest* request = disconnect_request__unpack(NULL, requestContainer->data.len, requestContainer->data.data);
DisconnectResponse response = DISCONNECT_RESPONSE__INIT;
responseContainer = createContainer(MESSAGE_TYPE__DisconnectResponse, requestContainer->token, true, &response, &disconnect_response__pack, &disconnect_response__get_packed_size);
ReportStopReporting();
DiagnosticsStop();
JobStopReporting();
AlarmHandlingStop();
//UART_ResetBuffers();
//-------------------------------------------------------------------------------------------
uint8_t* container_buffer = my_malloc(message_container__get_packed_size(&responseContainer));
size_t container_size = message_container__pack(&responseContainer, container_buffer);
my_free(responseContainer.data.data);
SendChars((char*)container_buffer, container_size);
//disconnect_request__free_unpacked(request,NULL);
//CommunicationMailboxFlush();
//USBCDCD_Reinit();
}
int KeepAliveOneSecondCounter = 0;
#define KEEPALIVE_COMMUNICATION_ABORT_LIMIT 30
bool KeepAliveActive = false;
void KeepAliveRequestFunc(MessageContainer* requestContainer)
{
MessageContainer responseContainer;
//KeepAliveRequest* request = keep_alive_request__unpack(NULL, requestContainer->data.len, requestContainer->data.data);
KeepAliveResponse response = KEEP_ALIVE_RESPONSE__INIT;
KeepAliveOneSecondCounter = 0;
KeepAliveActive = true;
responseContainer = createContainer(MESSAGE_TYPE__KeepAliveResponse, requestContainer->token, true, &response, &keep_alive_response__pack, &keep_alive_response__get_packed_size);
//-------------------------------------------------------------------------------------------
uint8_t* container_buffer = my_malloc(message_container__get_packed_size(&responseContainer));
size_t container_size = message_container__pack(&responseContainer, container_buffer);
my_free(responseContainer.data.data);
SendChars((char*)container_buffer, container_size);
//keep_alive_request__free_unpacked(request,NULL);
}
void KeepAliveOneSecondCall(void)
{
if (KeepAliveActive == false)
return;
KeepAliveOneSecondCounter++;
if (KeepAliveOneSecondCounter > KEEPALIVE_COMMUNICATION_ABORT_LIMIT)
{
LOG_ERROR(KeepAliveOneSecondCounter, "Communication keepalive failed");
KeepAliveOneSecondCounter = 0;
KeepAliveActive = false;
ReportStopReporting();
DiagnosticsStop();
JobStopReporting();
AlarmHandlingStop();
//CommunicationMailboxFlush();
USBCDCD_Reinit();
//UART_ResetBuffers();
}
}