/* * Connection.c * * Created on: 4 June 2018 * Author: shlomo */ #include #include #include #include #include #include #include #include #include #include #include "Common/SWUpdate/FileSystem.h" #include "Common/SW_Info/SW_Info.h" #include "Common/report/report.h" #include "Communication/CommunicationTask.h" #include #include "drivers/FPGA/FPGA.h" #include "Drivers/FPGA/FPGA_GPIO/FPGA_GPIO.h" #include "driverlib/hibernate.h" #include "StateMachines/Printing/PrintingSTM.h" #include "StateMachines/Initialization/InitSequence.h" #include "StateMachines/Initialization/PowerOffSequence.h" #include "Modules/General/MachineStatus.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" bool FirstConnection = true; char HexToDecimal(char hex) { int i = hex % 0x10; int j = hex / 0x10; return j*10+i; } bool KeepAliveActive = false; void StopRecurringReports(void) { ReportStopReporting(); DiagnosticsStop(); JobStopReporting(); AlarmHandlingStop(); PowerUpStopReporting(); MachineUpdateStopReporting(); PowerDownStopReporting(); HomingStopReporting(); KeepAliveActive = false; } struct tm LocalTime;//Months since January - [0,11] TimeAScii LocalTimeInAScii; void LocalTimeToAScii()//'D''D''/''M''M''/''Y''Y' Nedded for RFID { LocalTimeInAScii.Byte.YearL = '0' + LocalTime.tm_year%10; LocalTimeInAScii.Byte.YearH = '0' + (LocalTime.tm_year/10)%10; LocalTimeInAScii.Byte.SlashM = '/'; LocalTimeInAScii.Byte.MonthL = '0' + (LocalTime.tm_mon)%10; LocalTimeInAScii.Byte.MonthH = '0' + ((LocalTime.tm_mon)/10)%10; LocalTimeInAScii.Byte.SlashD = '/'; LocalTimeInAScii.Byte.DayL = '0' + LocalTime.tm_mday%10; LocalTimeInAScii.Byte.DayH = '0' + (LocalTime.tm_mday/10)%10; } 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; if (request->has_unixtime) utilsUpdateDateTime(request->unixtime);//(request->seconds); ulocaltime(request->unixtime, &LocalTime); HibernateCalendarSet(&LocalTime); ReportWithPackageFilter(ThreadFilter,"Set Time: ",__FILE__,LocalTime.tm_hour,LocalTime.tm_min,RpWarning,(int) LocalTime.tm_sec,0); LocalTimeToAScii(); StopRecurringReports(); /* 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; DevInfo.has_diagnosticsinterval = true; DevInfo.diagnosticsinterval = GetDiagnosticCollectionLimit(); response.has_isafterreset = true; response.isafterreset = FirstConnection; FirstConnection = false; 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(); HomingStopReporting(); //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 10 bool keepalivetest = 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; 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); } int KARequestId = 0x41414141; char KARequestToken[36+1]; void KeepAliveResponseFunc(MessageContainer* requestContainer) { //KeepAliveRequest* request = KeepAliveResponse *response = keep_alive_response__unpack(NULL, requestContainer->data.len, requestContainer->data.data); if (strcmp(requestContainer->token,KARequestToken)==0) { if (keepalivetest == false) KeepAliveOneSecondCounter = 0; KeepAliveActive = true; //Report("keepalive response received",__FILE__,__LINE__,KARequestId,RpWarning,msec_millisecondCounter, 0); } keep_alive_response__free_unpacked(response,NULL); } void KeepAliveRequest1Second(void) { MessageContainer responseContainer; KeepAliveResponse request = KEEP_ALIVE_REQUEST__INIT; strcpy(KARequestToken,"Happy days are coming to us, soonZYX"); memcpy(&KARequestToken[32],&KARequestId,sizeof(KARequestId)); KARequestId++; //Report("keepalive request sent",__FILE__,__LINE__,KARequestId,RpWarning,msec_millisecondCounter, 0); if (keepalivetest == true) return; // KeepAliveOneSecondCounter = 0; //KeepAliveActive = true; responseContainer = createContainer(MESSAGE_TYPE__KeepAliveRequest, KARequestToken, true, &request, &keep_alive_request__pack, &keep_alive_request__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); SendChars((char*)container_buffer, container_size); } void KeepAliveOneSecondCall(void) { if (FileUploadGetState()==false) return; if (FileAnalysisGetState()==true) return; KeepAliveRequest1Second(); if (KeepAliveActive == false) return; KeepAliveOneSecondCounter++; if (KeepAliveOneSecondCounter > (KEEPALIVE_COMMUNICATION_ABORT_LIMIT/2)) { Report("keepalive danger",__FILE__,__LINE__,KeepAliveOneSecondCounter,RpWarning,msec_millisecondCounter, 0); } if (KeepAliveOneSecondCounter > KEEPALIVE_COMMUNICATION_ABORT_LIMIT) { Report("keepalive ",__FILE__,__LINE__,KeepAliveOneSecondCounter,RpWarning,msec_millisecondCounter, 0); //LOG_ERROR(KeepAliveOneSecondCounter, "Communication keepalive failed"); KeepAliveOneSecondCounter = 0; StopRecurringReports(); CommunicationMailboxFlush(); keepalivetest = false; //USBCDCD_init(); USBCDCD_Reinit(); //UART_ResetBuffers(); } }