From e859f581bb925e575bba10e4468c3644a92ad266 Mon Sep 17 00:00:00 2001 From: Shlomo Hecht Date: Sun, 7 Apr 2019 14:34:19 +0300 Subject: power down and idle changes --- .../Embedded/Common/SWUpdate/FileSystem.c | 51 +- .../Embedded/Common/SWUpdate/FirmwareUpgrade.c | 85 +- .../Embedded/Common/SWUpdate/FirmwareUpgrade.h | 1 + .../Embedded_SW/Embedded/Common/SW_Info/SW_Info.c | 2 +- .../Embedded/Common/report/distributor.c | 2 +- .../Embedded/Common/report/reportInit.c | 37 +- .../Embedded_SW/Embedded/Communication/Container.c | 5 +- .../PMR/Debugging/DebugLogCategory.pb-c.c | 4 +- .../PMR/Debugging/DebugLogCategory.pb-c.h | 2 +- .../PMR/EmbeddedParameters/AlarmSourceType.pb-c.c | 16 +- .../PMR/EmbeddedParameters/AlarmSourceType.pb-c.h | 5 +- .../ConfigurationParameters.pb-c.c | 110 +- .../ConfigurationParameters.pb-c.h | 18 +- .../Communication/PMR/Printing/JobTicket.pb-c.c | 19 +- .../Communication/PMR/Printing/JobTicket.pb-c.h | 4 +- Software/Embedded_SW/Embedded/DataDef.h | 25 +- .../Embedded/Drivers/ADC_Sampling/ADC.c | 68 +- .../Embedded/Drivers/ADC_Sampling/ADC.h | 29 +- Software/Embedded_SW/Embedded/Drivers/FPGA/FPGA.c | 68 +- Software/Embedded_SW/Embedded/Drivers/FPGA/FPGA.h | 3 +- .../Embedded_SW/Embedded/Drivers/FPGA/FPGA_Comm.h | 47 +- .../Embedded/Drivers/FPGA/FPGA_GPIO/FPGA_GPIO.c | 115 +- .../Embedded/Drivers/FPGA/FPGA_GPIO/FPGA_GPIO.h | 4 + .../Embedded/Drivers/FPGA/FPGA_SPI_Comm.c | 73 +- .../Embedded/Drivers/FPGA/FPGA_SPI_Comm.h | 5 + .../Drivers/FPGA/Full_Vme/ispvme/ispvm_ui.c | 9 +- .../Drivers/FPGA/Full_Vme/ispvme/ivm_core.c | 1 + .../Drivers/FPGA/Full_Vme/ispvme/vmopcode.h | 3 + .../Embedded/Drivers/FPGA/Moters_Driver/L6470.c | 705 ----------- .../Embedded/Drivers/FPGA/Moters_Driver/L6470.h | 341 ----- .../Drivers/FPGA/Moters_Driver/PowerSTEP01.h | 168 --- .../Embedded/Drivers/FPGA/Motors_Driver/L6470.c | 703 +++++++++++ .../Embedded/Drivers/FPGA/Motors_Driver/L6470.h | 341 +++++ .../Drivers/FPGA/Motors_Driver/PowerSTEP01.h | 168 +++ .../Embedded_SW/Embedded/Drivers/Heater/Heater.c | 30 +- .../Drivers/I2C_Communication/ADC_MUX/ADC_MUX.c | 33 +- .../Drivers/I2C_Communication/ADC_MUX/ADC_MUX.h | 21 +- .../Dispenser_Card/IO_Ports/Dispenser_IO.c | 334 ++--- .../Embedded_SW/Embedded/Drivers/Motors/Motor.c | 35 +- .../Embedded_SW/Embedded/Drivers/Motors/Motor.h | 11 + .../Embedded/Drivers/Motors/MotorActions.c | 160 ++- .../Embedded_SW/Embedded/Drivers/SPI/SPI_Comm.c | 4 +- .../Embedded/Drivers/SSI_Comm/Dancer/Dancer.c | 5 + .../Embedded/Drivers/SSI_Comm/Dancer/Dancer.h | 1 + .../Embedded_SW/Embedded/Drivers/Valves/Valve.c | 13 +- .../Embedded/Drivers/flash_ram/FlashProgram.c | 6 +- Software/Embedded_SW/Embedded/Main.c | 19 +- .../Embedded/Modules/AlarmHandling/AlarmHandling.c | 585 +++++---- .../Embedded/Modules/AlarmHandling/AlarmHandling.h | 1 + .../Embedded/Modules/Control/MillisecTask.c | 16 +- .../Embedded/Modules/Control/MillisecTask.h | 1 + .../Modules/Diagnostics/DiagnosticActions.c | 6 + .../Embedded/Modules/Diagnostics/Diagnostics.c | 94 +- .../Embedded/Modules/General/GeneralHardware.c | 10 +- .../Embedded_SW/Embedded/Modules/General/buttons.c | 153 +-- .../Embedded_SW/Embedded/Modules/General/buttons.h | 6 +- .../Embedded_SW/Embedded/Modules/General/process.c | 2 + .../Embedded/Modules/Heaters/Heaters_print.c | 23 +- Software/Embedded_SW/Embedded/Modules/IDS/IDS.h | 5 + .../Embedded/Modules/IDS/IDS_Cleaning.c | 56 + .../Embedded/Modules/IDS/IDS_dispenser.c | 61 +- Software/Embedded_SW/Embedded/Modules/IDS/IDS_ex.h | 19 +- .../Embedded_SW/Embedded/Modules/IDS/IDS_maint.c | 12 +- .../Embedded_SW/Embedded/Modules/IDS/IDS_print.c | 858 ++++++++++--- .../Embedded/Modules/Stubs_Handler/Progress.c | 3 +- .../Embedded/Modules/Stubs_Handler/Stub_Dancer.c | 3 +- .../Modules/Stubs_Handler/Stub_Dispenser.c | 37 +- .../Embedded/Modules/Stubs_Handler/Stub_IntADC.c | 2 +- .../Embedded/Modules/Stubs_Handler/Stub_L6470.c | 3 +- .../Embedded/Modules/Stubs_Handler/Stub_Motor.c | 3 +- .../Modules/Stubs_Handler/Stub_SpeedSensor.c | 3 +- .../Modules/Stubs_Handler/Stub_TempSensor.c | 3 +- .../Embedded/Modules/Stubs_Handler/Stub_Valve.c | 11 +- .../Embedded_SW/Embedded/Modules/Thread/Thread.h | 2 + .../Embedded/Modules/Thread/ThreadLoad.c | 63 +- .../Embedded/Modules/Thread/Thread_Winder.c | 70 +- .../Embedded/Modules/Thread/Thread_ex.h | 8 +- .../Embedded/Modules/Thread/Thread_init.c | 9 +- .../Embedded/Modules/Thread/Thread_print.c | 96 +- .../Embedded_SW/Embedded/Modules/Waste/Waste.h | 105 ++ .../Embedded/Modules/Waste/Waste_init.c | 1326 ++++++++++++++++++++ .../StateMachines/Initialization/InitSequence.c | 103 +- .../StateMachines/Initialization/PowerIdle.c | 130 ++ .../StateMachines/Initialization/PowerIdle.h | 27 + .../Initialization/PowerOffSequence.c | 347 +++++ .../Initialization/PowerOffSequence.h | 36 + .../Embedded/StateMachines/Printing/JobSTM.c | 31 +- .../Embedded/StateMachines/Printing/PrintingSTM.c | 257 +++- .../Embedded/StateMachines/Printing/PrintingSTM.h | 13 + 89 files changed, 6238 insertions(+), 2270 deletions(-) delete mode 100644 Software/Embedded_SW/Embedded/Drivers/FPGA/Moters_Driver/L6470.c delete mode 100644 Software/Embedded_SW/Embedded/Drivers/FPGA/Moters_Driver/L6470.h delete mode 100644 Software/Embedded_SW/Embedded/Drivers/FPGA/Moters_Driver/PowerSTEP01.h create mode 100644 Software/Embedded_SW/Embedded/Drivers/FPGA/Motors_Driver/L6470.c create mode 100644 Software/Embedded_SW/Embedded/Drivers/FPGA/Motors_Driver/L6470.h create mode 100644 Software/Embedded_SW/Embedded/Drivers/FPGA/Motors_Driver/PowerSTEP01.h create mode 100644 Software/Embedded_SW/Embedded/Modules/IDS/IDS_Cleaning.c create mode 100644 Software/Embedded_SW/Embedded/StateMachines/Initialization/PowerIdle.c create mode 100644 Software/Embedded_SW/Embedded/StateMachines/Initialization/PowerIdle.h create mode 100644 Software/Embedded_SW/Embedded/StateMachines/Initialization/PowerOffSequence.c create mode 100644 Software/Embedded_SW/Embedded/StateMachines/Initialization/PowerOffSequence.h (limited to 'Software/Embedded_SW') diff --git a/Software/Embedded_SW/Embedded/Common/SWUpdate/FileSystem.c b/Software/Embedded_SW/Embedded/Common/SWUpdate/FileSystem.c index c311e9787..3357cfc06 100644 --- a/Software/Embedded_SW/Embedded/Common/SWUpdate/FileSystem.c +++ b/Software/Embedded_SW/Embedded/Common/SWUpdate/FileSystem.c @@ -55,6 +55,7 @@ int32_t FileSentLength = 0; static char g_cCwdBuf[50] = "/"; uint32_t WrittenBytes = 0; uint32_t ReadBytes = 0; +Task_Handle CommRxTaskHandle; ErrorCode getErrorCode(FRESULT Fresult) @@ -81,27 +82,34 @@ uint32_t FileUploadRequestFunc(MessageContainer* requestContainer) FileUploadResponse response = FILE_UPLOAD_RESPONSE__INIT; WrittenBytes=0; - UploadFileHandle = my_malloc(sizeof(FIL)); - if (UploadFileHandle == 0) + if (JobIsActive()) Fresult = FR_DENIED; else { - Fresult = f_open(UploadFileHandle,request->path,FA_READ | FA_WRITE | FA_OPEN_ALWAYS ); - if (Fresult == FR_OK) - { - FileLength = request->length; - response.has_maxchunklength = true; - response.maxchunklength = MAX_CHUNK_LENGTH; - strcpy(FileHandleChar, "1234"); - response.uploadid = FileHandleChar; //supporting only single file at each time. - } + UploadFileHandle = my_malloc(sizeof(FIL)); + if (UploadFileHandle == 0) + Fresult = FR_DENIED; else { - free (UploadFileHandle); - UploadFileHandle = 0; - } + Fresult = f_open(UploadFileHandle,request->path,FA_READ | FA_WRITE | FA_OPEN_ALWAYS | FA_CREATE_ALWAYS); + if (Fresult == FR_OK) + { + FileLength = request->length; + response.has_maxchunklength = true; + response.maxchunklength = MAX_CHUNK_LENGTH; + strcpy(FileHandleChar, "1234"); + response.uploadid = FileHandleChar; //supporting only single file at each time. + } + else + { + free (UploadFileHandle); + UploadFileHandle = 0; + } + } } + CommRxTaskHandle = Task_self(); + Task_setPri(CommRxTaskHandle, 4); responseContainer = createContainer(MESSAGE_TYPE__FileUploadResponse, requestContainer->token, false, &response, &file_upload_response__pack, &file_upload_response__get_packed_size); @@ -123,6 +131,7 @@ uint32_t FileChunkUploadRequestFunc(MessageContainer* requestContainer) { //uint32_t status = OK; FRESULT Fresult = FR_OK; + bool FileDone = false; MessageContainer responseContainer; @@ -142,6 +151,7 @@ uint32_t FileChunkUploadRequestFunc(MessageContainer* requestContainer) if(Fresult != FR_OK) { LOG_ERROR (Fresult,"f_write error"); + FileDone = true; } else { @@ -152,6 +162,7 @@ uint32_t FileChunkUploadRequestFunc(MessageContainer* requestContainer) f_close(ReceivedFileHandle); free (UploadFileHandle); FileReceivedLength = 0; + FileDone = true; } else { @@ -161,6 +172,7 @@ uint32_t FileChunkUploadRequestFunc(MessageContainer* requestContainer) f_close(ReceivedFileHandle); free (UploadFileHandle); FileReceivedLength = 0; + FileDone = true; } } } @@ -185,6 +197,8 @@ uint32_t FileChunkUploadRequestFunc(MessageContainer* requestContainer) file_chunk_upload_request__free_unpacked(request,NULL); my_free(responseContainer.data.data); SendChars(container_buffer, container_size); + if (FileDone == true) + Task_setPri(CommRxTaskHandle, 9); return OK; } @@ -504,7 +518,7 @@ uint32_t GetFilesRequestFunc(MessageContainer* requestContainer) #define MAX_NUM_OF_FILES 10 DIR dir; FILINFO* fno[MAX_NUM_OF_FILES]; - char FullPath[MAX_NUM_OF_FILES][50]; + char FullPath[MAX_NUM_OF_FILES][100]; int i,NumOfFiles = 0; FRESULT Fresult = FR_OK; @@ -580,11 +594,14 @@ uint32_t GetFilesRequestFunc(MessageContainer* requestContainer) } responseContainer.continuous = false; uint8_t* container_buffer = my_malloc(message_container__get_packed_size(&responseContainer)); - size_t container_size = message_container__pack(&responseContainer, container_buffer); + if (container_buffer) + { + size_t container_size = message_container__pack(&responseContainer, container_buffer); + SendChars(container_buffer, container_size); + } my_free(responseContainer.data.data); my_free(FilesInfo); get_files_request__free_unpacked(request,NULL); - SendChars(container_buffer, container_size); for (i = 0;i < NumOfFiles;i++) { if (fno[i]) diff --git a/Software/Embedded_SW/Embedded/Common/SWUpdate/FirmwareUpgrade.c b/Software/Embedded_SW/Embedded/Common/SWUpdate/FirmwareUpgrade.c index c66300b7e..d54280fee 100644 --- a/Software/Embedded_SW/Embedded/Common/SWUpdate/FirmwareUpgrade.c +++ b/Software/Embedded_SW/Embedded/Common/SWUpdate/FirmwareUpgrade.c @@ -21,8 +21,62 @@ #include #include +#include "drivers/FPGA/FPGA_GPIO/FPGA_GPIO.h" #include "drivers/FPGA/Full_Vme/FPGA_Programming_Up.h" +#include "drivers/FPGA/Full_Vme/ispvme/vmopcode.h" +#include "Common/Utilities/Utils.h" + #include "Common/SWUpdate/FileSystem.h" +#include "Modules/Control/Control.h" + +int NumberOfFiles = 0,CurrentRunningFile; +int CurrentFileSize = 0; +uint32_t ActivateVersionControlId = 0xFF; +char activateString[100]; +char ActivateToken[36+1]={0}; +bool Reboot = false; + + +bool SwUpgradeActive(void) +{ + if (ActivateVersionControlId != 0xFF) + { + Reboot = false; + return true; + } + return false; +} +uint32_t ActivateVersionCallBackFunction(uint32_t IfIndex, uint32_t BusyFlag) +{ + //ActivateVersionResponse response = ACTIVATE_VERSION_RESPONSE__INIT; + //MessageContainer responseContainer; + + usnprintf(activateString, 1000, "file %d of %d bytes %d of %d",CurrentRunningFile,NumberOfFiles,vme_index,CurrentFileSize); + + Report(activateString,__FILE__,__LINE__,(int)CurrentRunningFile,RpWarning,CurrentFileSize,0); + + if (CurrentRunningFiledata.len, requestContainer->data.data); @@ -42,6 +100,7 @@ uint32_t ActivateVersionRequestFunc(MessageContainer* requestContainer) FPGA_ID FileDestinationToFPGAId[VERSION_FILE_DESTINATION__FPGA3+1] = {MAX_FPGA,FPGA1,FPGA2,FPGA3}; + ustrncpy (ActivateToken, requestContainer->token,36); strcpy (SWUpgradePath,request->path); strcat(SWUpgradePath,"/package.cfg"); @@ -50,8 +109,18 @@ uint32_t ActivateVersionRequestFunc(MessageContainer* requestContainer) if (Fresult == FR_OK) { VersionPackage = version_package_descriptor__unpack(NULL,Bytes,buffer); + NumberOfFiles = VersionPackage->n_filedescriptors; + if (NumberOfFiles) + { + CurrentRunningFile = 0; + //add control 1 second + ActivateVersionControlId = AddControlCallback( ActivateVersionCallBackFunction, eOneSecond, TemplateDataReadCBFunction,0,0, 0 ); + } for (File_i = 0;File_in_filedescriptors;File_i++) { + CurrentRunningFile = 0; + CurrentFileSize = -1; + vme_index = 0; switch(VersionPackage->filedescriptors[File_i]->destination) { case VERSION_FILE_DESTINATION__MCU: @@ -62,11 +131,11 @@ uint32_t ActivateVersionRequestFunc(MessageContainer* requestContainer) //validate //update usnprintf(FullPath, 50, "%s%s%s", request->path,"/", VersionPackage->filedescriptors[File_i]->filename); - if (VersionPackage->filedescriptors[File_i]->destination == VERSION_FILE_DESTINATION__FPGA3) - Reboot = true; - else - Reboot = false; - Fresult = FPGA_Programming_Request( FileDestinationToFPGAId[VersionPackage->filedescriptors[File_i]->destination], FullPath, Reboot); + Reboot = true; + memset (fno,0,sizeof(FILINFO)); + Fresult = f_stat(FullPath,fno); + CurrentFileSize = fno->fsize; + Fresult = FPGA_Programming_Request( FileDestinationToFPGAId[VersionPackage->filedescriptors[File_i]->destination], FullPath, false); break; case VERSION_FILE_DESTINATION__ConfigParams: usnprintf(FullPath, 50, "%s%s%s", request->path,"/", VersionPackage->filedescriptors[File_i]->filename); @@ -108,6 +177,10 @@ uint32_t ActivateVersionRequestFunc(MessageContainer* requestContainer) activate_version_request__free_unpacked(request,NULL); SendChars(container_buffer, container_size); + if (Reboot == true) + { + Power_Reset(); + } return OK; } diff --git a/Software/Embedded_SW/Embedded/Common/SWUpdate/FirmwareUpgrade.h b/Software/Embedded_SW/Embedded/Common/SWUpdate/FirmwareUpgrade.h index 9af76f96f..6f817fe90 100644 --- a/Software/Embedded_SW/Embedded/Common/SWUpdate/FirmwareUpgrade.h +++ b/Software/Embedded_SW/Embedded/Common/SWUpdate/FirmwareUpgrade.h @@ -11,6 +11,7 @@ uint32_t ActivateVersionRequestFunc(MessageContainer* requestContainer); uint32_t ValidateVersionRequestFunc(MessageContainer* requestContainer); +bool SwUpgradeActive(void); diff --git a/Software/Embedded_SW/Embedded/Common/SW_Info/SW_Info.c b/Software/Embedded_SW/Embedded/Common/SW_Info/SW_Info.c index 15e9fe828..030c4229e 100644 --- a/Software/Embedded_SW/Embedded/Common/SW_Info/SW_Info.c +++ b/Software/Embedded_SW/Embedded/Common/SW_Info/SW_Info.c @@ -20,7 +20,7 @@ typedef struct } TangoVersion_t; -TangoVersion_t _gTangoVersion = {1,3,7,88}; +TangoVersion_t _gTangoVersion = {1,3,8,3}; #define BUILD_DATE __DATE__ char Dat[50] = BUILD_DATE; char _gTangoName [MAX_STRING_LEN] = "Tango01 ";//d diff --git a/Software/Embedded_SW/Embedded/Common/report/distributor.c b/Software/Embedded_SW/Embedded/Common/report/distributor.c index 0515b0472..f011653ec 100644 --- a/Software/Embedded_SW/Embedded/Common/report/distributor.c +++ b/Software/Embedded_SW/Embedded/Common/report/distributor.c @@ -242,7 +242,7 @@ Void reportService(UArg arg0, UArg arg1) ReportInitParams InitParams; InitParams.DistributorQueueMaxMsgs = 30; InitParams.DistributorTaskPriority = 6; - InitParams.MaxNumOfFilterNames = 1; + InitParams.MaxNumOfFilterNames = 30; InitParams.MaxNumberOfPrivateDistributors = 2; ReportInit (InitParams); diff --git a/Software/Embedded_SW/Embedded/Common/report/reportInit.c b/Software/Embedded_SW/Embedded/Common/report/reportInit.c index feb13504a..bc3cbe20b 100644 --- a/Software/Embedded_SW/Embedded/Common/report/reportInit.c +++ b/Software/Embedded_SW/Embedded/Common/report/reportInit.c @@ -38,6 +38,21 @@ #include "PMR/debugging/StartDebugLogResponse.pb-c.h" #include "PMR/debugging/StopDebugLogResponse.pb-c.h" +/*PackageHandle ControlFilter; +PackageHandle HeatersFilter; +PackageHandle JobFilter ; +PackageHandle WasteFilter ; +PackageHandle AlarmFilter ; +PackageHandle DiagnosticsFilter; +PackageHandle IDSFilter; +PackageHandle ThreadFilter; +PackageHandle GeneralFilter; +PackageHandle CommFilter; +PackageHandle FPGAFilter; +PackageHandle LoadFilter; +PackageHandle InitFilter; +PackageHandle MaintFilter;*/ + char protobufToken[36+1] = {0}; int ReportResponseFunc(char *message, /* The formatted message */ @@ -115,11 +130,6 @@ uint32_t ReportInitMessage(MessageContainer* requestContainer) StartDebugLogRequest* request = start_debug_log_request__unpack(NULL, requestContainer->data.len, requestContainer->data.data); ustrncpy (protobufToken, requestContainer->token,36); - /* InitParams.DistributorQueueMaxMsgs = 20; - InitParams.DistributorTaskPriority = 6; - InitParams.MaxNumOfFilterNames = 1; - InitParams.MaxNumberOfPrivateDistributors = 2; - status |= ReportInit (InitParams);*/ DistributorHandle ReportHandle = ReportAddDistributor("ProtoBuf"); if (ReportHandle == NULL) status |= 0x8; status |= ReportFunc(ReportResponseFunc , REPORT_ADD, ReportHandle); @@ -166,7 +176,6 @@ void ReportStopReporting(void) protobufToken[0] = 0; } -#define REPORT_RESERVED_NUM_OF_FILTER_PACKAGES 30 /* This reserved for swinfra packages */ /*************************************************************************** * @@ -204,10 +213,24 @@ STATUS ReportInit(ReportInitParams InitParams) //ReportMonitorFunc(REPORT_ADD, 0); MaxNumOfFilterNames = InitParams.MaxNumOfFilterNames; - MaxNumOfFilterNames += REPORT_RESERVED_NUM_OF_FILTER_PACKAGES; status = filterTableInit(MaxNumOfFilterNames); if (status == OK) initialized = true; +/* ControlFilter = ReportAddFilterPackage("Control"); + HeatersFilter = ReportAddFilterPackage("Heaters"); + JobFilter = ReportAddFilterPackage("Job"); + WasteFilter = ReportAddFilterPackage("Waste"); + AlarmFilter = ReportAddFilterPackage("Alarm"); + DiagnosticsFilter = ReportAddFilterPackage("Diagnostics"); + IDSFilter = ReportAddFilterPackage("IDS"); + ThreadFilter = ReportAddFilterPackage("Thread"); + GeneralFilter = ReportAddFilterPackage("General"); + CommFilter = ReportAddFilterPackage("Comm"); + FPGAFilter = ReportAddFilterPackage("FPGA"); + LoadFilter = ReportAddFilterPackage("Load"); + InitFilter = ReportAddFilterPackage("Init"); + MaintFilter = ReportAddFilterPackage("Maint");*/ +// Filter = ReportAddFilterPackage(""); return status; } diff --git a/Software/Embedded_SW/Embedded/Communication/Container.c b/Software/Embedded_SW/Embedded/Communication/Container.c index bb6b82743..b0c063a5e 100644 --- a/Software/Embedded_SW/Embedded/Communication/Container.c +++ b/Software/Embedded_SW/Embedded/Communication/Container.c @@ -43,6 +43,7 @@ #include "Communication/CommunicationTask.h" #include "StateMachines/Printing/PrintingSTM.h" +#include "StateMachines/Initialization/PowerIdle.h" #include "Common/report/report.h" #include "Connection.h" @@ -130,13 +131,15 @@ void receive_callback(char* buffer, size_t length) if (requestContainer == NULL) return; // HeatingTestSendResonse(0, false,true,true, /*OriginalMotorSpd_2PPS[index]*/length,requestContainer->type,0,0, "Container"); + if (requestContainer->type != MESSAGE_TYPE__KeepAliveRequest) //user action resets the idle counter + resetIdleCounter(); msgId[index] = requestContainer->type; Length[index] = length; DataLength[index] = requestContainer->data.len; if (index++>=MAX_CONT_LOG) index = 0; - REPORT_MSG(requestContainer->type,"Message received"); + //REPORT_MSG(requestContainer->type,"Message received"); switch(requestContainer->type) { case MESSAGE_TYPE__CalculateRequest: diff --git a/Software/Embedded_SW/Embedded/Communication/PMR/Debugging/DebugLogCategory.pb-c.c b/Software/Embedded_SW/Embedded/Communication/PMR/Debugging/DebugLogCategory.pb-c.c index b651d2acb..ebb901ba8 100644 --- a/Software/Embedded_SW/Embedded/Communication/PMR/Debugging/DebugLogCategory.pb-c.c +++ b/Software/Embedded_SW/Embedded/Communication/PMR/Debugging/DebugLogCategory.pb-c.c @@ -13,7 +13,7 @@ static const ProtobufCEnumValue debug_log_category__enum_values_by_number[5] = { "Warning", "DEBUG_LOG_CATEGORY__Warning", 1 }, { "Error", "DEBUG_LOG_CATEGORY__Error", 2 }, { "Critical", "DEBUG_LOG_CATEGORY__Critical", 3 }, - { "Safety", "DEBUG_LOG_CATEGORY__Safety", 4 }, + { "Debug", "DEBUG_LOG_CATEGORY__Debug", 4 }, }; static const ProtobufCIntRange debug_log_category__value_ranges[] = { {0, 0},{0, 5} @@ -21,9 +21,9 @@ static const ProtobufCIntRange debug_log_category__value_ranges[] = { static const ProtobufCEnumValueIndex debug_log_category__enum_values_by_name[5] = { { "Critical", 3 }, + { "Debug", 4 }, { "Error", 2 }, { "Info", 0 }, - { "Safety", 4 }, { "Warning", 1 }, }; const ProtobufCEnumDescriptor debug_log_category__descriptor = diff --git a/Software/Embedded_SW/Embedded/Communication/PMR/Debugging/DebugLogCategory.pb-c.h b/Software/Embedded_SW/Embedded/Communication/PMR/Debugging/DebugLogCategory.pb-c.h index 1fda3ab01..d97b42d33 100644 --- a/Software/Embedded_SW/Embedded/Communication/PMR/Debugging/DebugLogCategory.pb-c.h +++ b/Software/Embedded_SW/Embedded/Communication/PMR/Debugging/DebugLogCategory.pb-c.h @@ -24,7 +24,7 @@ typedef enum _DebugLogCategory { DEBUG_LOG_CATEGORY__Warning = 1, DEBUG_LOG_CATEGORY__Error = 2, DEBUG_LOG_CATEGORY__Critical = 3, - DEBUG_LOG_CATEGORY__Safety = 4 + DEBUG_LOG_CATEGORY__Debug = 4 PROTOBUF_C__FORCE_ENUM_TO_BE_INT_SIZE(DEBUG_LOG_CATEGORY) } DebugLogCategory; diff --git a/Software/Embedded_SW/Embedded/Communication/PMR/EmbeddedParameters/AlarmSourceType.pb-c.c b/Software/Embedded_SW/Embedded/Communication/PMR/EmbeddedParameters/AlarmSourceType.pb-c.c index 59509c39e..4167a9599 100644 --- a/Software/Embedded_SW/Embedded/Communication/PMR/EmbeddedParameters/AlarmSourceType.pb-c.c +++ b/Software/Embedded_SW/Embedded/Communication/PMR/EmbeddedParameters/AlarmSourceType.pb-c.c @@ -7,7 +7,7 @@ #endif #include "AlarmSourceType.pb-c.h" -static const ProtobufCEnumValue alarm_source_type__enum_values_by_number[7] = +static const ProtobufCEnumValue alarm_source_type__enum_values_by_number[10] = { { "TemperatureAlarm", "ALARM_SOURCE_TYPE__TemperatureAlarm", 0 }, { "LimitSwitchAlarm", "ALARM_SOURCE_TYPE__LimitSwitchAlarm", 1 }, @@ -16,18 +16,24 @@ static const ProtobufCEnumValue alarm_source_type__enum_values_by_number[7] = { "MotorAlarm", "ALARM_SOURCE_TYPE__MotorAlarm", 4 }, { "CoversAlarm", "ALARM_SOURCE_TYPE__CoversAlarm", 5 }, { "DoNotPollAlarm", "ALARM_SOURCE_TYPE__DoNotPollAlarm", 6 }, + { "HardLimitAlarm", "ALARM_SOURCE_TYPE__HardLimitAlarm", 7 }, + { "TachoAlarm", "ALARM_SOURCE_TYPE__TachoAlarm", 8 }, + { "FluidLevelAlarm", "ALARM_SOURCE_TYPE__FluidLevelAlarm", 9 }, }; static const ProtobufCIntRange alarm_source_type__value_ranges[] = { -{0, 0},{0, 7} +{0, 0},{0, 10} }; -static const ProtobufCEnumValueIndex alarm_source_type__enum_values_by_name[7] = +static const ProtobufCEnumValueIndex alarm_source_type__enum_values_by_name[10] = { { "CoversAlarm", 5 }, { "CurrentAlarm", 3 }, { "DoNotPollAlarm", 6 }, + { "FluidLevelAlarm", 9 }, + { "HardLimitAlarm", 7 }, { "LimitSwitchAlarm", 1 }, { "MotorAlarm", 4 }, { "PressureAlarm", 2 }, + { "TachoAlarm", 8 }, { "TemperatureAlarm", 0 }, }; const ProtobufCEnumDescriptor alarm_source_type__descriptor = @@ -37,9 +43,9 @@ const ProtobufCEnumDescriptor alarm_source_type__descriptor = "AlarmSourceType", "AlarmSourceType", "", - 7, + 10, alarm_source_type__enum_values_by_number, - 7, + 10, alarm_source_type__enum_values_by_name, 1, alarm_source_type__value_ranges, diff --git a/Software/Embedded_SW/Embedded/Communication/PMR/EmbeddedParameters/AlarmSourceType.pb-c.h b/Software/Embedded_SW/Embedded/Communication/PMR/EmbeddedParameters/AlarmSourceType.pb-c.h index 2f6135176..4c7d0f91e 100644 --- a/Software/Embedded_SW/Embedded/Communication/PMR/EmbeddedParameters/AlarmSourceType.pb-c.h +++ b/Software/Embedded_SW/Embedded/Communication/PMR/EmbeddedParameters/AlarmSourceType.pb-c.h @@ -26,7 +26,10 @@ typedef enum _AlarmSourceType { ALARM_SOURCE_TYPE__CurrentAlarm = 3, ALARM_SOURCE_TYPE__MotorAlarm = 4, ALARM_SOURCE_TYPE__CoversAlarm = 5, - ALARM_SOURCE_TYPE__DoNotPollAlarm = 6 + ALARM_SOURCE_TYPE__DoNotPollAlarm = 6, + ALARM_SOURCE_TYPE__HardLimitAlarm = 7, + ALARM_SOURCE_TYPE__TachoAlarm = 8, + ALARM_SOURCE_TYPE__FluidLevelAlarm = 9 PROTOBUF_C__FORCE_ENUM_TO_BE_INT_SIZE(ALARM_SOURCE_TYPE) } AlarmSourceType; diff --git a/Software/Embedded_SW/Embedded/Communication/PMR/EmbeddedParameters/ConfigurationParameters.pb-c.c b/Software/Embedded_SW/Embedded/Communication/PMR/EmbeddedParameters/ConfigurationParameters.pb-c.c index b5e08ea1f..c4c74c826 100644 --- a/Software/Embedded_SW/Embedded/Communication/PMR/EmbeddedParameters/ConfigurationParameters.pb-c.c +++ b/Software/Embedded_SW/Embedded/Communication/PMR/EmbeddedParameters/ConfigurationParameters.pb-c.c @@ -52,7 +52,7 @@ void configuration_parameters__free_unpacked assert(message->base.descriptor == &configuration_parameters__descriptor); protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); } -static const ProtobufCFieldDescriptor configuration_parameters__field_descriptors[21] = +static const ProtobufCFieldDescriptor configuration_parameters__field_descriptors[29] = { { "BreakSensorLimit", @@ -306,12 +306,110 @@ static const ProtobufCFieldDescriptor configuration_parameters__field_descriptor 0, /* flags */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, + { + "CurrentAlarmLowLimit", + 22, + PROTOBUF_C_LABEL_OPTIONAL, + PROTOBUF_C_TYPE_DOUBLE, + offsetof(ConfigurationParameters, has_currentalarmlowlimit), + offsetof(ConfigurationParameters, currentalarmlowlimit), + NULL, + NULL, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "CurrentAlarmHighLimit", + 23, + PROTOBUF_C_LABEL_OPTIONAL, + PROTOBUF_C_TYPE_DOUBLE, + offsetof(ConfigurationParameters, has_currentalarmhighlimit), + offsetof(ConfigurationParameters, currentalarmhighlimit), + NULL, + NULL, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "IDS_SegmentRefillTimeout", + 24, + PROTOBUF_C_LABEL_OPTIONAL, + PROTOBUF_C_TYPE_DOUBLE, + offsetof(ConfigurationParameters, has_ids_segmentrefilltimeout), + offsetof(ConfigurationParameters, ids_segmentrefilltimeout), + NULL, + NULL, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "IDS_PreSegmentBuildupTime", + 25, + PROTOBUF_C_LABEL_OPTIONAL, + PROTOBUF_C_TYPE_DOUBLE, + offsetof(ConfigurationParameters, has_ids_presegmentbuilduptime), + offsetof(ConfigurationParameters, ids_presegmentbuilduptime), + NULL, + NULL, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "IDS_CleaningSpeed", + 26, + PROTOBUF_C_LABEL_OPTIONAL, + PROTOBUF_C_TYPE_DOUBLE, + offsetof(ConfigurationParameters, has_ids_cleaningspeed), + offsetof(ConfigurationParameters, ids_cleaningspeed), + NULL, + NULL, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "IDS_CleaningStopBeforeSegmentTime", + 27, + PROTOBUF_C_LABEL_OPTIONAL, + PROTOBUF_C_TYPE_DOUBLE, + offsetof(ConfigurationParameters, has_ids_cleaningstopbeforesegmenttime), + offsetof(ConfigurationParameters, ids_cleaningstopbeforesegmenttime), + NULL, + NULL, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "IDS_LeftCleaningMotorSpeed", + 28, + PROTOBUF_C_LABEL_OPTIONAL, + PROTOBUF_C_TYPE_DOUBLE, + offsetof(ConfigurationParameters, has_ids_leftcleaningmotorspeed), + offsetof(ConfigurationParameters, ids_leftcleaningmotorspeed), + NULL, + NULL, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, + { + "IDS_RightCleaningMotorSpeed", + 29, + PROTOBUF_C_LABEL_OPTIONAL, + PROTOBUF_C_TYPE_DOUBLE, + offsetof(ConfigurationParameters, has_ids_rightcleaningmotorspeed), + offsetof(ConfigurationParameters, ids_rightcleaningmotorspeed), + NULL, + NULL, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, }; static const unsigned configuration_parameters__field_indices_by_name[] = { 13, /* field[13] = ACHeatersLowerOperationLimit */ 14, /* field[14] = ACHeatersUpperOperationLimit */ 0, /* field[0] = BreakSensorLimit */ 4, /* field[4] = CloseValveTimeout */ + 22, /* field[22] = CurrentAlarmHighLimit */ + 21, /* field[21] = CurrentAlarmLowLimit */ 15, /* field[15] = DCHeatersLowerOperationLimit */ 16, /* field[16] = DCHeatersUpperOperationLimit */ 1, /* field[1] = DiagnosticCollectionLimit */ @@ -321,6 +419,12 @@ static const unsigned configuration_parameters__field_indices_by_name[] = { 11, /* field[11] = DispenserBuildPressureTimeout */ 18, /* field[18] = DispenserPresegmentWFCF */ 20, /* field[20] = GeneralParameters */ + 25, /* field[25] = IDS_CleaningSpeed */ + 26, /* field[26] = IDS_CleaningStopBeforeSegmentTime */ + 27, /* field[27] = IDS_LeftCleaningMotorSpeed */ + 24, /* field[24] = IDS_PreSegmentBuildupTime */ + 28, /* field[28] = IDS_RightCleaningMotorSpeed */ + 23, /* field[23] = IDS_SegmentRefillTimeout */ 6, /* field[6] = InitialDispenserPressure */ 8, /* field[8] = InitialDispenserTimeLag */ 7, /* field[7] = InitialDispenserTimeout */ @@ -333,7 +437,7 @@ static const unsigned configuration_parameters__field_indices_by_name[] = { static const ProtobufCIntRange configuration_parameters__number_ranges[1 + 1] = { { 1, 0 }, - { 0, 21 } + { 0, 29 } }; const ProtobufCMessageDescriptor configuration_parameters__descriptor = { @@ -343,7 +447,7 @@ const ProtobufCMessageDescriptor configuration_parameters__descriptor = "ConfigurationParameters", "", sizeof(ConfigurationParameters), - 21, + 29, configuration_parameters__field_descriptors, configuration_parameters__field_indices_by_name, 1, configuration_parameters__number_ranges, diff --git a/Software/Embedded_SW/Embedded/Communication/PMR/EmbeddedParameters/ConfigurationParameters.pb-c.h b/Software/Embedded_SW/Embedded/Communication/PMR/EmbeddedParameters/ConfigurationParameters.pb-c.h index 3911bbcb1..1b729c0d0 100644 --- a/Software/Embedded_SW/Embedded/Communication/PMR/EmbeddedParameters/ConfigurationParameters.pb-c.h +++ b/Software/Embedded_SW/Embedded/Communication/PMR/EmbeddedParameters/ConfigurationParameters.pb-c.h @@ -68,10 +68,26 @@ struct _ConfigurationParameters protobuf_c_boolean startheatingoninitsequence; size_t n_generalparameters; double *generalparameters; + protobuf_c_boolean has_currentalarmlowlimit; + double currentalarmlowlimit; + protobuf_c_boolean has_currentalarmhighlimit; + double currentalarmhighlimit; + protobuf_c_boolean has_ids_segmentrefilltimeout; + double ids_segmentrefilltimeout; + protobuf_c_boolean has_ids_presegmentbuilduptime; + double ids_presegmentbuilduptime; + protobuf_c_boolean has_ids_cleaningspeed; + double ids_cleaningspeed; + protobuf_c_boolean has_ids_cleaningstopbeforesegmenttime; + double ids_cleaningstopbeforesegmenttime; + protobuf_c_boolean has_ids_leftcleaningmotorspeed; + double ids_leftcleaningmotorspeed; + protobuf_c_boolean has_ids_rightcleaningmotorspeed; + double ids_rightcleaningmotorspeed; }; #define CONFIGURATION_PARAMETERS__INIT \ { PROTOBUF_C_MESSAGE_INIT (&configuration_parameters__descriptor) \ - , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,NULL } + , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } /* ConfigurationParameters methods */ diff --git a/Software/Embedded_SW/Embedded/Communication/PMR/Printing/JobTicket.pb-c.c b/Software/Embedded_SW/Embedded/Communication/PMR/Printing/JobTicket.pb-c.c index d624cee6a..a47ff627b 100644 --- a/Software/Embedded_SW/Embedded/Communication/PMR/Printing/JobTicket.pb-c.c +++ b/Software/Embedded_SW/Embedded/Communication/PMR/Printing/JobTicket.pb-c.c @@ -52,7 +52,7 @@ void job_ticket__free_unpacked assert(message->base.descriptor == &job_ticket__descriptor); protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator); } -static const ProtobufCFieldDescriptor job_ticket__field_descriptors[11] = +static const ProtobufCFieldDescriptor job_ticket__field_descriptors[12] = { { "Guid", @@ -186,9 +186,22 @@ static const ProtobufCFieldDescriptor job_ticket__field_descriptors[11] = 0, /* flags */ 0,NULL,NULL /* reserved1,reserved2, etc */ }, + { + "EnableLubrication", + 12, + PROTOBUF_C_LABEL_OPTIONAL, + PROTOBUF_C_TYPE_BOOL, + offsetof(JobTicket, has_enablelubrication), + offsetof(JobTicket, enablelubrication), + NULL, + NULL, + 0, /* flags */ + 0,NULL,NULL /* reserved1,reserved2, etc */ + }, }; static const unsigned job_ticket__field_indices_by_name[] = { 2, /* field[2] = EnableInterSegment */ + 11, /* field[11] = EnableLubrication */ 0, /* field[0] = Guid */ 3, /* field[3] = InterSegmentLength */ 10, /* field[10] = JobDescriptionFile */ @@ -203,7 +216,7 @@ static const unsigned job_ticket__field_indices_by_name[] = { static const ProtobufCIntRange job_ticket__number_ranges[1 + 1] = { { 1, 0 }, - { 0, 11 } + { 0, 12 } }; const ProtobufCMessageDescriptor job_ticket__descriptor = { @@ -213,7 +226,7 @@ const ProtobufCMessageDescriptor job_ticket__descriptor = "JobTicket", "", sizeof(JobTicket), - 11, + 12, job_ticket__field_descriptors, job_ticket__field_indices_by_name, 1, job_ticket__number_ranges, diff --git a/Software/Embedded_SW/Embedded/Communication/PMR/Printing/JobTicket.pb-c.h b/Software/Embedded_SW/Embedded/Communication/PMR/Printing/JobTicket.pb-c.h index 6e6794e63..bf75643a9 100644 --- a/Software/Embedded_SW/Embedded/Communication/PMR/Printing/JobTicket.pb-c.h +++ b/Software/Embedded_SW/Embedded/Communication/PMR/Printing/JobTicket.pb-c.h @@ -48,10 +48,12 @@ struct _JobTicket protobuf_c_boolean has_uploadstrategy; JobUploadStrategy uploadstrategy; char *jobdescriptionfile; + protobuf_c_boolean has_enablelubrication; + protobuf_c_boolean enablelubrication; }; #define JOB_TICKET__INIT \ { PROTOBUF_C_MESSAGE_INIT (&job_ticket__descriptor) \ - , NULL, NULL, 0, 0, 0, 0, 0, 0, NULL, 0, JOB_WINDING_METHOD__Embroidery, NULL, 0,NULL, 0, JOB_UPLOAD_STRATEGY__Default, NULL } + , NULL, NULL, 0, 0, 0, 0, 0, 0, NULL, 0, JOB_WINDING_METHOD__Embroidery, NULL, 0,NULL, 0, JOB_UPLOAD_STRATEGY__Default, NULL, 0, 0 } /* JobTicket methods */ diff --git a/Software/Embedded_SW/Embedded/DataDef.h b/Software/Embedded_SW/Embedded/DataDef.h index 3b62a0489..1b5f000f2 100644 --- a/Software/Embedded_SW/Embedded/DataDef.h +++ b/Software/Embedded_SW/Embedded/DataDef.h @@ -5,6 +5,7 @@ #include #include #include +#include "common/report/report.h" //#define EVALUATION_BOARD // to use the LCD only when using the evaluation board //#define USE_USB @@ -128,8 +129,7 @@ enum #define DOUBLE_BUFFER 2 -#define No_Safety_Event 1 -#define Safety_Event_Occurred 0 + #define CurrentMotDriver 0x08 #define VoltageMotDriver 0x00 @@ -141,6 +141,8 @@ enum //#define FPGA_Reg_Size_Bits 16 +#define FPGA_Freq 29166667 + #define MIDTANK_DIRECTION 0 #define MIXER_DIRECTION 1 @@ -294,6 +296,9 @@ typedef union #define LIMIT 0 // Limit Switch #define NO_LIMIT 1 +#define No_Safety_Event 1 +#define Safety_Event_Occurred 0 + //#define INVERSION_POLARITY_LIMIT 1 // Limit Switch //#define INVERSION_POLARITY_NO_LIMIT 0 @@ -396,4 +401,20 @@ Supports diagnostic (--diag_suppress, - pds) #define MIXER_PT100 TEMP_SENSE_ANALOG_MIXCHIP_TEMP +extern PackageHandle ControlFilter; +extern PackageHandle HeatersFilter; +extern PackageHandle JobFilter ; +extern PackageHandle WasteFilter ; +extern PackageHandle AlarmFilter ; +extern PackageHandle DiagnosticsFilter; +extern PackageHandle IDSFilter; +extern PackageHandle ThreadFilter; +extern PackageHandle GeneralFilter; +extern PackageHandle CommFilter; +extern PackageHandle FPGAFilter; +extern PackageHandle LoadFilter; +extern PackageHandle InitFilter; +extern PackageHandle MaintFilter; + + #endif /* DATADEF_H */ diff --git a/Software/Embedded_SW/Embedded/Drivers/ADC_Sampling/ADC.c b/Software/Embedded_SW/Embedded/Drivers/ADC_Sampling/ADC.c index 9518e9791..b9d8ee1f6 100644 --- a/Software/Embedded_SW/Embedded/Drivers/ADC_Sampling/ADC.c +++ b/Software/Embedded_SW/Embedded/Drivers/ADC_Sampling/ADC.c @@ -91,26 +91,26 @@ void ADCAcquireStop(void) //MillisecStop // Physical ADC connected channels in the TIVA //***************************************************************************** -#define CHAN_AIR_PRESSURE_1 0//ADC_CTL_CH0 -#define CHAN_AIR_PRESSURE_2 1//ADC_CTL_CH1 -#define CHAN_DISPENSE_PRESSURE_1 2//ADC_CTL_CH2 -#define CHAN_DISPENSE_PRESSURE_2 3//ADC_CTL_CH3 -#define CHAN_DISPENSE_PRESSURE_3 4//ADC_CTL_CH4 -#define CHAN_DISPENSE_PRESSURE_4 5//ADC_CTL_CH5 -#define CHAN_DISPENSE_PRESSURE_5 6//ADC_CTL_CH6 -#define CHAN_DISPENSE_PRESSURE_6 7//ADC_CTL_CH7 -#define CHAN_DISPENSE_PRESSURE_7 8//ADC_CTL_CH8 -#define CHAN_DISPENSE_PRESSURE_8 9//ADC_CTL_CH9 -#define CHAN_VOCSENS 10//ADC_CTL_CH10 -#define CHAN_SPARE1 11//ADC_CTL_CH11 -#define CHAN_SPARE2 12//ADC_CTL_CH12 -#define CHAN_LEFT_DANCER_1 13//ADC_CTL_CH13 -#define CHAN_LEFT_DANCER_2 14//ADC_CTL_CH14 -#define CHAN_RIGHT_DANCER 15//ADC_CTL_CH15 -#define CHAN_DRYER_CURRENT_2 16//ADC_CTL_CH16 //Dryer Heater 2 -#define CHAN_DRYER_CURRENT_1 17//ADC_CTL_CH17 //Dryer Heater 1 -#define CHAN_DRYER_CURRENT_3 18//ADC_CTL_CH18 -#define CHAN_3V3_FPGA 19//ADC_CTL_CH19 +#define CHAN_AIR_PRESSURE_1 ADC_CTL_CH0 +#define CHAN_AIR_PRESSURE_2 ADC_CTL_CH1 +#define CHAN_DISPENSE_PRESSURE_1 ADC_CTL_CH2 +#define CHAN_DISPENSE_PRESSURE_2 ADC_CTL_CH3 +#define CHAN_DISPENSE_PRESSURE_3 ADC_CTL_CH4 +#define CHAN_DISPENSE_PRESSURE_4 ADC_CTL_CH5 +#define CHAN_DISPENSE_PRESSURE_5 ADC_CTL_CH6 +#define CHAN_DISPENSE_PRESSURE_6 ADC_CTL_CH7 +#define CHAN_DISPENSE_PRESSURE_7 ADC_CTL_CH8 +#define CHAN_DISPENSE_PRESSURE_8 ADC_CTL_CH9 +#define CHAN_VOCSENS ADC_CTL_CH10 +#define CHAN_SPARE1 ADC_CTL_CH11 +#define CHAN_SPARE2 ADC_CTL_CH12 +#define CHAN_LEFT_DANCER_1 ADC_CTL_CH13 +#define CHAN_LEFT_DANCER_2 ADC_CTL_CH14 +#define CHAN_RIGHT_DANCER ADC_CTL_CH15 +#define CHAN_DRYER_CURRENT_2 ADC_CTL_CH16 //Dryer Heater 2 +#define CHAN_DRYER_CURRENT_1 ADC_CTL_CH17 //Dryer Heater 1 +#define CHAN_DRYER_CURRENT_3 ADC_CTL_CH18 +#define CHAN_3V3_FPGA ADC_CTL_CH19 /* Connected with pull down to reg GND ADC_CTL_CH20 Connected with pull down to reg GND ADC_CTL_CH21 @@ -129,7 +129,7 @@ config as Digital input from FPGA 3 ADC_CTL_CH23 //***************************************************************************** -uint32_t g_pui32ADCSeq[MAX_ADC_DEVICES] = +uint32_t g_pui32ADCSeq[ADC_MAX_ADC_DEVICES] = { CHAN_AIR_PRESSURE_1, //0 CHAN_AIR_PRESSURE_2, //1 @@ -155,7 +155,7 @@ uint32_t g_pui32ADCSeq[MAX_ADC_DEVICES] = //#define NUM_ADC_CHANNELS (sizeof(g_pui32ADCSeq) / \ sizeof(g_pui32ADCSeq[0])) -int DispenserIdToPressureSensorId[MAX_DISPENSERS] = {CHAN_DISPENSE_PRESSURE_1, CHAN_DISPENSE_PRESSURE_2 , CHAN_DISPENSE_PRESSURE_3 , CHAN_DISPENSE_PRESSURE_4 , CHAN_DISPENSE_PRESSURE_5 , CHAN_DISPENSE_PRESSURE_6 , CHAN_DISPENSE_PRESSURE_7 , CHAN_DISPENSE_PRESSURE_8 }; +int DispenserIdToPressureSensorId[MAX_DISPENSERS] = {ADC_DISPENSE_PRESSURE_1, ADC_DISPENSE_PRESSURE_2 , ADC_DISPENSE_PRESSURE_3 , ADC_DISPENSE_PRESSURE_4 , ADC_DISPENSE_PRESSURE_5 , ADC_DISPENSE_PRESSURE_6 , ADC_DISPENSE_PRESSURE_7 , ADC_DISPENSE_PRESSURE_8 }; //const uint8_t Num_ADC_Channels = ( sizeof(g_pui32ADCSeq) / sizeof(g_pui32ADCSeq[0]) ); @@ -176,7 +176,7 @@ static int bufferFlipFlop = 0; // A buffer to hold one set of ADC data that is acquired per sample time. // //***************************************************************************** -static uint32_t g_pui32ADCData[DOUBLE_BUFFER][MAX_ADC_DEVICES]; +static uint32_t g_pui32ADCData[DOUBLE_BUFFER][ADC_MAX_ADC_DEVICES]; //***************************************************************************** //configured in the cfg file and thats why should be defined as extern @@ -209,10 +209,10 @@ uint32_t ADC_TriggerCollection(void) // (called by MillisecLoop) // ADC Data get for a single data read // //***************************************************************************** -uint32_t ADC_GetReading(int DataItemId) // 0 - 19 // ADC Data get for a single data read +uint32_t ADC_GetReading(ADC_TYPE DataItemId) // 0 - 19 // ADC Data get for a single data read { int bufnotinuse; - assert (DataItemId VADC ---- @@ -518,7 +518,7 @@ uint8_t Calculate_Gas_Power_Consumption() // WHS uint8_t PPM = sizeof(VOC_Vsensor) / sizeof(VOC_Vsensor[0]), i; - VsampleInBits = ADC_GetReading(CHAN_VOCSENS); + VsampleInBits = ADC_GetReading(ADC_VOCSENS); //---- VBits -> VADC ---- @@ -582,18 +582,18 @@ uint32_t Read_Dryer_Heaters_Current(HEATERS_CURRENT Heater_ID) // switch(Heater_ID) { - case DRYER_CURRENT_1: - temp = ADC_GetReading(CHAN_DRYER_CURRENT_1);//ADC_CTL_CH17 + case HEATER_DRYER_CURRENT_1: + temp = ADC_GetReading(ADC_DRYER_CURRENT_1);//ADC_CTL_CH17 R = 50;//50 Ohm //Expected 8A break; - case DRYER_CURRENT_2: - temp = ADC_GetReading(CHAN_DRYER_CURRENT_2);//ADC_CTL_CH16 + case HEATER_DRYER_CURRENT_2: + temp = ADC_GetReading(ADC_DRYER_CURRENT_2);//ADC_CTL_CH16 R = 100;//100 Ohm //Expected 4A break; // case DRYER_CURRENT_3: -// temp = ADC_GetReading(CHAN_DRYER_CURRENT_3);//Not in use +// temp = ADC_GetReading(ADC_DRYER_CURRENT_3);//Not in use // break; default: return ERROR; diff --git a/Software/Embedded_SW/Embedded/Drivers/ADC_Sampling/ADC.h b/Software/Embedded_SW/Embedded/Drivers/ADC_Sampling/ADC.h index bacbe0a0d..7f2601fb1 100644 --- a/Software/Embedded_SW/Embedded/Drivers/ADC_Sampling/ADC.h +++ b/Software/Embedded_SW/Embedded/Drivers/ADC_Sampling/ADC.h @@ -12,7 +12,32 @@ // ADC copied data //***************************************************************************** -#define MAX_ADC_DEVICES 20 +typedef enum +{ + ADC_AIR_PRESSURE_1 ,//0 + ADC_AIR_PRESSURE_2 ,//1 + ADC_DISPENSE_PRESSURE_1 ,//2 + ADC_DISPENSE_PRESSURE_2 ,//3 + ADC_DISPENSE_PRESSURE_3 ,//4 + ADC_DISPENSE_PRESSURE_4 ,//5 + ADC_DISPENSE_PRESSURE_5 ,//6 + ADC_DISPENSE_PRESSURE_6 ,//7 + ADC_DISPENSE_PRESSURE_7 ,//8 + ADC_DISPENSE_PRESSURE_8 ,//9 + ADC_VOCSENS ,//10 + ADC_SPARE1 ,//11 + ADC_SPARE2 ,//12 + ADC_LEFT_DANCER_1 ,//13 + ADC_LEFT_DANCER_2 ,//14 + ADC_RIGHT_DANCER ,//15 + ADC_DRYER_CURRENT_2 ,//16 + ADC_DRYER_CURRENT_1 ,//17 + ADC_DRYER_CURRENT_3 ,//18 + ADC_FPGA_3V3 ,//19 + ADC_MAX_ADC_DEVICES ,//20 +}ADC_TYPE; + +//#define MAX_ADC_DEVICES 20 #define MAX_DISPENSERS //#define MAX_ADC_DEVICES NUM_ADC_CHANNELS @@ -26,7 +51,7 @@ void ADCAcquireInit(void); uint32_t ADC_TriggerCollection(void); -uint32_t ADC_GetReading(int DataItemId); +uint32_t ADC_GetReading(ADC_TYPE DataItemId); void ADCAcquireStart(ProcessCallback _callback, uint32_t _period); diff --git a/Software/Embedded_SW/Embedded/Drivers/FPGA/FPGA.c b/Software/Embedded_SW/Embedded/Drivers/FPGA/FPGA.c index 0b98891c5..aff2e7cd1 100644 --- a/Software/Embedded_SW/Embedded/Drivers/FPGA/FPGA.c +++ b/Software/Embedded_SW/Embedded/Drivers/FPGA/FPGA.c @@ -18,21 +18,23 @@ unsigned short GPO_01_Reg; +extern F3_GPO_01_REG F3_GPO_01_Reg; + int FPGA_Test() { - GP_Out_01 Gpo_01; - Gpo_01.bits.F3_LUBRICANT_VALVE = 1; - Gpo_01.bits.F3_GPO_LED3 = 1; - Gpo_01.bits.F3_GPO_LED2 = 0; - Gpo_01.bits.F3_GPO_LED1 = 1; - Gpo_01.bits.F3_GPO_EXTWINDER_SSR11_CTRL = 1; - Gpo_01.bits.F3_GPO_BUZZER = 0; - Gpo_01.bits.F3_SPARE2_ROTENC_CLK = 1; - Gpo_01.bits.F3_SPARE1_ROTENC_CLK = 1; - Gpo_01.bits.RESERVE = 0xF5; - GPO_01_Reg = Gpo_01.ushort; + F3_GPO_01_Reg.bits.F3_LUBRICANT_VALVE = 1; + F3_GPO_01_Reg.bits.F3_GPO_LED3 = 1; + F3_GPO_01_Reg.bits.F3_GPO_LED2 = 0; + F3_GPO_01_Reg.bits.F3_GPO_LED1 = 1; + F3_GPO_01_Reg.bits.F3_GPO_EXTWINDER_SSR11_CTRL = 1; + F3_GPO_01_Reg.bits.F3_GPO_BUZZER = 0; + F3_GPO_01_Reg.bits.F3_SPARE2_ROTENC_CLK = 1; + F3_GPO_01_Reg.bits.F3_SPARE1_ROTENC_CLK = 1; + F3_GPO_01_Reg.bits.RESERVE = 0xF5; + + GPO_01_Reg = F3_GPO_01_Reg.ushort; return 0; } @@ -202,14 +204,14 @@ uint8_t Read_Fans_Tacho() #ifndef EVALUATION_BOARD // The big Fan in the drawer - Fans_Speed_RPM[DRAWER_B] = Calculate_Tacho_Fan_Speed(29166666, 0X02, F1_Prescaler1_reg5, F1_Tacho_reg0); - Fans_Speed_RPM[DRAWER_S0] = Calculate_Tacho_Fan_Speed(29166666, 0X02, F1_Prescaler1_reg5, F1_Tacho_reg1); - Fans_Speed_RPM[DRAWER_S1] = Calculate_Tacho_Fan_Speed(29166666, 0X02, F1_Prescaler1_reg5, F1_Tacho_reg2); - Fans_Speed_RPM[DRAWER_S2] = Calculate_Tacho_Fan_Speed(29166666, 0X02, F1_Prescaler1_reg5, F1_Tacho_reg3); - Fans_Speed_RPM[DRAWER_S3] = Calculate_Tacho_Fan_Speed(29166666, 0X02, F1_Prescaler1_reg5, F1_Tacho_reg4); - Fans_Speed_RPM[SYSTEM_0] = Calculate_Tacho_Fan_Speed(29166666, 0X02, F1_Prescaler1_reg5, F1_Tacho_reg5); - Fans_Speed_RPM[SYSTEM_1] = Calculate_Tacho_Fan_Speed(29166666, 0X02, F1_Prescaler1_reg5, F1_Tacho_reg6); - Fans_Speed_RPM[SYSTEM_2] = Calculate_Tacho_Fan_Speed(29166666, 0X02, F1_Prescaler1_reg5, F1_Tacho_reg7); + Fans_Speed_RPM[DRAWER_B] = Calculate_Tacho_Fan_Speed(FPGA_Freq, 0X02, F1_Prescaler1_reg5, F1_Tacho_reg0); + Fans_Speed_RPM[DRAWER_S0] = Calculate_Tacho_Fan_Speed(FPGA_Freq, 0X02, F1_Prescaler1_reg5, F1_Tacho_reg1); + Fans_Speed_RPM[DRAWER_S1] = Calculate_Tacho_Fan_Speed(FPGA_Freq, 0X02, F1_Prescaler1_reg5, F1_Tacho_reg2); + Fans_Speed_RPM[DRAWER_S2] = Calculate_Tacho_Fan_Speed(FPGA_Freq, 0X02, F1_Prescaler1_reg5, F1_Tacho_reg3); + Fans_Speed_RPM[DRAWER_S3] = Calculate_Tacho_Fan_Speed(FPGA_Freq, 0X02, F1_Prescaler1_reg5, F1_Tacho_reg4); + Fans_Speed_RPM[SYSTEM_0] = Calculate_Tacho_Fan_Speed(FPGA_Freq, 0X02, F1_Prescaler1_reg5, F1_Tacho_reg5); + Fans_Speed_RPM[SYSTEM_1] = Calculate_Tacho_Fan_Speed(FPGA_Freq, 0X02, F1_Prescaler1_reg5, F1_Tacho_reg6); + Fans_Speed_RPM[SYSTEM_2] = Calculate_Tacho_Fan_Speed(FPGA_Freq, 0X02, F1_Prescaler1_reg5, F1_Tacho_reg7); if( Fans_Speed_RPM[DRAWER_B] < 1000 ) // need to work around 3000 RPM Fans_Status.bit.DRAWER_BIG = ERROR;// not working / Low Speed @@ -342,7 +344,7 @@ uint32_t Read_Dryer_Fan_Tacho() uint32_t Drayer_Fan_Speed_RPM = 0; - Drayer_Fan_Speed_RPM = Calculate_Tacho_Fan_Speed(29166666, 12, F1_Prescaler1_reg5, F1_Tacho_reg8); + Drayer_Fan_Speed_RPM = Calculate_Tacho_Fan_Speed(FPGA_Freq, 12, F1_Prescaler1_reg5, F1_Tacho_reg8); return Drayer_Fan_Speed_RPM; @@ -398,3 +400,29 @@ void Machine_Idle_Breathing_Led() //if (Ten_msTick) } } +///////////////////////////////////////// Speed_Sensor_TypeII //////////////////////////////////////////////// +void Set_Speed_Sensor_TypeII_Registers(uint32_t Counter, uint32_t Prescaler) +{ + /* Counter - Increase the number to higher resolution * + * Prescaler - Deccrease the number to higher resolution*/ + F1_Prescaler1_reg6 = Prescaler; + F1_gpo_cnt_A_reg = Counter; +} + +uint32_t Read_Speed_Sensor_TypeII()//must be delay between Set_Speed_Sensor_TypeII_Registers to Read_Speed_Sensor_TypeII +{ + + uint32_t Speed_Hz, temp, temp1; + + temp = F1_Tacho_reg9; + temp1 = FPGA_Freq; + temp1*=F1_gpo_cnt_A_reg; + temp1/=temp; + temp1/=F1_Prescaler1_reg6; + Speed_Hz = temp1; + + #warning change the speed from Hz to Cm/Sec + + return Speed_Hz; +} +///////////////////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/Software/Embedded_SW/Embedded/Drivers/FPGA/FPGA.h b/Software/Embedded_SW/Embedded/Drivers/FPGA/FPGA.h index 1c2bbfb1a..0e5cdb66a 100644 --- a/Software/Embedded_SW/Embedded/Drivers/FPGA/FPGA.h +++ b/Software/Embedded_SW/Embedded/Drivers/FPGA/FPGA.h @@ -16,6 +16,7 @@ void Machine_Idle_Breathing_Led(); uint32_t Read_Dryer_Fan_Tacho(); - +void Set_Speed_Sensor_TypeII_Registers(uint32_t Counter, uint32_t Prescaler); +uint32_t Read_Speed_Sensor_TypeII(); #endif //FPGA_H diff --git a/Software/Embedded_SW/Embedded/Drivers/FPGA/FPGA_Comm.h b/Software/Embedded_SW/Embedded/Drivers/FPGA/FPGA_Comm.h index 752773c0d..614f2affa 100644 --- a/Software/Embedded_SW/Embedded/Drivers/FPGA/FPGA_Comm.h +++ b/Software/Embedded_SW/Embedded/Drivers/FPGA/FPGA_Comm.h @@ -147,9 +147,9 @@ #define F1_LDANCER1_ROTENC_DATA_p_TX (*((volatile short *)(FPGA1_BASE | 0x1CE))) //This register triggers a TX transmission //FPGA VER 050219 -#define F1_GPO_02_bus (*((volatile short *)(FPGA3_BASE | 0x1D0))) //General purpose GPIO register -#define F1_Tacho_reg8 (*((volatile short *)(FPGA3_BASE | 0x1E0))) //This Register stores the Tacho counter -#define F1_Tacho_reg9 (*((volatile short *)(FPGA3_BASE | 0x1E2))) //This Register stores the Tacho counter A to A +#define F1_GPO_02_bus (*((volatile short *)(FPGA1_BASE | 0x1D0))) //General purpose GPIO register +#define F1_Tacho_reg8 (*((volatile short *)(FPGA1_BASE | 0x1E0))) //This Register stores the Tacho counter +#define F1_Tacho_reg9 (*((volatile short *)(FPGA1_BASE | 0x1E2))) //This Register stores the Tacho counter A to A // //SPI_MOTO_RLOADING_A1 #define F1_MOTO_RLOADING_A1_TX_00 (*((volatile short *)(FPGA1_BASE | 0x200))) //The second register to be shifted out of the spi. The msb bit of this register is shifted out first. @@ -282,6 +282,10 @@ #define F1_Tacho_reg6 (*((volatile short *)(FPGA1_BASE | 0x3CC))) //This Register stores the Tacho counter #define F1_Tacho_reg7 (*((volatile short *)(FPGA1_BASE | 0x3CE))) //This Register stores the Tacho counter +//read SSR10 +#define F1_CTRL_bus1_reg (*((volatile short *)(FPGA1_BASE | 0x3A0))) //This Register stores the ssr with n_heater_wd_expire value - read of the value of F1_GPO_DILUTORPUMP_SSR10_CTRL + + //GPO #define F1_gpo_01 (*((volatile short *)(FPGA1_BASE | 0x3D2))) //Gpo Register Miscellaneous output register, 16bits @@ -372,6 +376,9 @@ //Watchdog #define F2_Watchdog_reg (*((volatile short *)(FPGA2_BASE | 0x140)))//Watchdog enable bit, watchdog value +//read SSR1 - SSR9 +#define F2_CTRL_bus1_reg (*((volatile short *)(FPGA2_BASE | 0x170))) //This Register stores the ssr with n_heater_wd_expire value - read of the value of SSR1 - SSR9 + //SSI #define F2_DISPENSER_ROTENC_DATA_p_1_RX_lsb (*((volatile short *)(FPGA2_BASE | 0x180))) //The 16 Lsb bits of the shifted in data. #define F2_DISPENSER_ROTENC_DATA_p_1_RX_msb (*((volatile short *)(FPGA2_BASE | 0x182))) //16 bit MSB if nessesary @@ -705,8 +712,11 @@ #define F3_high_var_SPARE2_1 (*((volatile short *)(FPGA3_BASE | 0x3AA))) //Parameter for prescaler divisions - 8bit high duty cycle value for pmw #define F3_low_var_SPARE2_2 (*((volatile short *)(FPGA3_BASE | 0x3AC))) //Parameter for prescaler divisions - 8bit low duty cycle value for pmw #define F3_high_var_SPARE2_2 (*((volatile short *)(FPGA3_BASE | 0x3AE))) //Parameter for prescaler divisions - 8bit high duty cycle value for pmw -// +//read SSR11 +#define F3_CTRL_bus1_reg (*((volatile short *)(FPGA3_BASE | 0x3B0))) //This Register stores the ssr with n_heater_wd_expire value - read of the value of F3_GPO_EXTWINDER_SSR11_CTRL + +// #define F3_Prescaler1_reg9 (*((volatile short *)(FPGA3_BASE | 0x3C2))) //Variable for prescaler divisions -amount of prescaled clocks clk input of prescaler of signal debouncer of the limit switch. 14bits. The value inserted here is multiply by 8 before being set. #define F3_SW_RESET_reg (*((volatile short *)(FPGA3_BASE | 0x3D0))) //This register resets the MCU @@ -741,6 +751,19 @@ #define F3_LOw_Cart_Led3 F3_low_var_SPARE2_2 #define F3_High_Cart_Led3 F3_high_var_SPARE2_2 +//F3_GPI_02_Direct +typedef union +{ + struct + { + bool F3_GPI_TACTSW4 : 1; //0 + bool F3_GPI_TACTSW3 : 1; //1 + bool Thread_Jogging_Switch : 1; //2 (F3_GPI_TACTSW2) + bool Thread_Load_Switch : 1; //3 (F3_GPI_TACTSW1) + unsigned short F3_GPI_02_RESERVE : 12; //4-16 + }bits; + unsigned short ushort; +}F3_GPI_02; //1 Version1_Direct typedef union @@ -1075,7 +1098,7 @@ typedef union unsigned char RESERVE; // 8-15 }bits; unsigned short ushort; -}GP_Out_01; +}F3_GPO_01_REG; //F3_VALVE_OUT typedef union @@ -1281,7 +1304,7 @@ typedef union #define DYEINGH_SSR11_CTRL BIT4 //HeadHeaterZ6 -/* + //F2_CTRL typedef union { @@ -1299,15 +1322,15 @@ typedef union bool F2_GPO_DRYER_SSR2_CTRL : 1; //9 bool F2_GPO_DRYER_SSR1_CTRL : 1; //10 bool F2_GPO_PDOWN_RL1_CTRL : 1; //11 - bool RESERVE_BIT12 : 1; //12 - bool RESERVE_BIT13 : 1; //13 - bool RESERVE_BIT14 : 1; //14 - bool RESERVE_BIT15 : 1; //15 + bool F2_GPO_RESERVE_BIT12 : 1; //12 + bool F2_GPO_RESERVE_BIT13 : 1; //13 + bool F2_GPO_RESERVE_BIT14 : 1; //14 + bool F2_GPO_RESERVE_BIT15 : 1; //15 }bits; unsigned short ushort; -}F2_CTRL_SSR_REG; +}F2_CTRL_REG; + -*/ //-------------------------------------------------------------------------------- diff --git a/Software/Embedded_SW/Embedded/Drivers/FPGA/FPGA_GPIO/FPGA_GPIO.c b/Software/Embedded_SW/Embedded/Drivers/FPGA/FPGA_GPIO/FPGA_GPIO.c index 05ad6bf74..a268ad0d5 100644 --- a/Software/Embedded_SW/Embedded/Drivers/FPGA/FPGA_GPIO/FPGA_GPIO.c +++ b/Software/Embedded_SW/Embedded/Drivers/FPGA/FPGA_GPIO/FPGA_GPIO.c @@ -18,10 +18,14 @@ FPGA_GPI FPGA_Gpi; +extern F2_CTRL_REG F2_CTRL_Reg; + bool FPGA_Gpi_Buf[MAX_GPI] = {0}; extern bool Machine_Idle_Mode; +extern F3_GPO_01_REG F3_GPO_01_Reg; + void Read_FPGA_GPI_Rgisters() { uint32_t i; @@ -427,21 +431,24 @@ bool FPGA_Read_limit_Switches(FPGA_GPI_ENUM Limit_Switch) uint32_t ActivateDilutorPump() { - F2_CTRL |= CHILLER_SSR9_CTRL; + F2_CTRL_Reg.ushort |= CHILLER_SSR9_CTRL; + F2_CTRL = F2_CTRL_Reg.ushort; return OK; } uint32_t DeActivateDilutorPump() { - F2_CTRL &= ~CHILLER_SSR9_CTRL; + F2_CTRL_Reg.ushort &= ~CHILLER_SSR9_CTRL; + F2_CTRL = F2_CTRL_Reg.ushort; return OK; } //---------------------------------- void Power_Off()//Power Down { - F2_CTRL |= PDOWN_RL1_CTRL; + F2_CTRL_Reg.ushort |= PDOWN_RL1_CTRL; + F2_CTRL = F2_CTRL_Reg.ushort; } void Power_Reset()// Resets the MCU @@ -455,41 +462,75 @@ void Power_Reset()// Resets the MCU uint32_t ActivateChiller() { - F2_CTRL |= SPARE_SSR12_CTRL; + F2_CTRL_Reg.ushort |= SPARE_SSR12_CTRL; + F2_CTRL = F2_CTRL_Reg.ushort; return OK; } uint32_t DeActivateChiller() { - F2_CTRL &= ~SPARE_SSR12_CTRL; + F2_CTRL_Reg.ushort &= ~SPARE_SSR12_CTRL; + F2_CTRL = F2_CTRL_Reg.ushort; return OK; } uint32_t ActivateHeadMagnet() { Task_sleep(500); - F2_CTRL &= ~SPARE_SSR13_CTRL; + F2_CTRL_Reg.ushort &= ~SPARE_SSR13_CTRL; + F2_CTRL = F2_CTRL_Reg.ushort; + return OK; } uint32_t DeActivateHeadMagnet() { - F2_CTRL |= SPARE_SSR13_CTRL; + F2_CTRL_Reg.ushort |= SPARE_SSR13_CTRL; + F2_CTRL = F2_CTRL_Reg.ushort; Task_sleep(500); return OK; } uint32_t ReadHeadMagnetBit() { - return (F2_CTRL & BIT0); + return (F2_CTRL & BIT0);//SSR13 is not in the WD therefore it it possible to read the bit } uint32_t DeActivateAllSSR() { - F2_CTRL = 0; + F2_CTRL_Reg.ushort = 0; + F2_CTRL = F2_CTRL_Reg.ushort; return OK; } +bool Is_FPGA_WD_Occurred() +{ + if( (F1_Moto_Driver_NSTBYRST1 != 0xFFFF) || + (F1_Moto_Driver_NSTBYRST2 != 0xFFFF) || + (F2_Moto_Driver_NSTBYRST1 != 0xFFFF) || + (F3_Moto_Driver_NSTBYRST1 != 0xFFFF) ) + { + /* + To recover: + //1. Disable all FPGA's WD: + Control_WD(DISABLE,0); + //2. Enqable all FPGA's WD: + Control_WD(ENABLE,250); + //3. Call FPGA_SetMotorsInit: + FPGA_SetMotorsInit(); + //4. Init Motor's Drivers: + + //OR + + //Reset MCU (will reset also the FPGA): + Power_Reset(); + */ + return true; + } + else + return false; + +} uint32_t Control_WD(bool IsEnable, unsigned char SetTimer_Steps100mSec) // Control_WD(ENABLE, 30);//Enable the watchdog for 3 seconds /* @@ -501,24 +542,28 @@ uint32_t Control_WD(bool IsEnable, unsigned char SetTimer_Steps100mSec) // Contr * the control register will take the value it had before to be resetted. */ { + uint32_t status = OK; + #ifndef EVALUATION_BOARD short WD_Enable = 0x4000 | SetTimer_Steps100mSec; if (IsEnable == DISABLE) { - F1_Watchdog_reg = 0; - F2_Watchdog_reg = 0; - F3_Watchdog_reg = 0; + F1_Watchdog_reg = 0xFF;//changed from 0 to 0xFF because if the WD expired 0 won't disable the WD must set (0 <) number (< 0x4000) + F2_Watchdog_reg = 0xFF; + F3_Watchdog_reg = 0xFF; } else { + status |= Is_FPGA_WD_Occurred(); + F1_Watchdog_reg = WD_Enable; // Enable the watchdog F3_GPO_01_bus BIT4 DYEINGH_SSR11_CTRL HeadHeaterZ6 F2_Watchdog_reg = WD_Enable; // Enable the watchdog F2_CTRL + reset dispensers motor drivers F3_Watchdog_reg = WD_Enable; // Enable the watchdog F1_gpo_01 BIT2 DYEINGH_SSR10_CTRL HeadHeaterZ5 } #endif - return OK; + return status; } uint32_t ReadBreakSensor() @@ -689,19 +734,51 @@ uint8_t Buzzer(OPERATION_MODE Buzzer_Mode) switch(Buzzer_Mode) { case MODE_ON: - F3_GPO_01_bus |= BIT5; + //F3_GPO_01_bus |= BIT5; + F3_GPO_01_Reg.bits.F3_GPO_BUZZER = ON; break; case MODE_OFF: - F3_GPO_01_bus &= ~BIT5; + //F3_GPO_01_bus &= ~BIT5; + F3_GPO_01_Reg.bits.F3_GPO_BUZZER = OFF; break; default: Status = ERROR; break; } + F3_GPO_01_bus = F3_GPO_01_Reg.ushort; + return Status; } + +F3_GPI_02 F3_GPI_02_Reg; + +void Read_Buttons_Reg() +{ + F3_GPI_02_Reg.ushort = F3_GPI_02_Direct; +} + +bool Get_Thread_Jogging_Button() +{ + bool IsThreadJoggingPressed = false; + + if(F3_GPI_02_Reg.bits.Thread_Jogging_Switch == false) + IsThreadJoggingPressed = true; + + return IsThreadJoggingPressed; +} + +bool Get_Thread_Load_Button() +{ + bool IsThreadLoadPressed = false; + + if(F3_GPI_02_Reg.bits.Thread_Load_Switch == false) + IsThreadLoadPressed = true; + + return IsThreadLoadPressed; +} + bool Read_PWR_Button()//TODO move to GPIO folder { @@ -765,13 +842,13 @@ uint8_t Pannel_Leds(PANEL_BUTTON_OR_CRAT_ID Pannel_Led_Id, OPERATION_MODE LED_Mo Machine_Idle_Mode = false; break; case THREAD_JOGGING: - F3_low_var_LED2 = Low_Reg; - F3_high_var_LED2 = High_Reg; - break; - case THREAD_LOAD: F3_low_var_LED3 = Low_Reg; F3_high_var_LED3 = High_Reg; break; + case THREAD_LOAD: + F3_low_var_LED2 = Low_Reg; + F3_high_var_LED2 = High_Reg; + break; case CART_1: F3_LOw_Cart_Led1 = Low_Reg; F3_High_Cart_Led1 = High_Reg; diff --git a/Software/Embedded_SW/Embedded/Drivers/FPGA/FPGA_GPIO/FPGA_GPIO.h b/Software/Embedded_SW/Embedded/Drivers/FPGA/FPGA_GPIO/FPGA_GPIO.h index c98ba5941..409f75418 100644 --- a/Software/Embedded_SW/Embedded/Drivers/FPGA/FPGA_GPIO/FPGA_GPIO.h +++ b/Software/Embedded_SW/Embedded/Drivers/FPGA/FPGA_GPIO/FPGA_GPIO.h @@ -191,6 +191,10 @@ void Power_Reset(); uint8_t Buzzer(OPERATION_MODE Buzzer_Mode); bool Read_PWR_Button();//TODO move to GPIO folder +void Read_Buttons_Reg(); +bool Get_Thread_Jogging_Button(); +bool Get_Thread_Load_Button(); + uint32_t Control_WD(bool IsEnable, unsigned char SetTimer_Steps100mSec); uint32_t ActivateChiller(); diff --git a/Software/Embedded_SW/Embedded/Drivers/FPGA/FPGA_SPI_Comm.c b/Software/Embedded_SW/Embedded/Drivers/FPGA/FPGA_SPI_Comm.c index e8b46084c..26f6d5c56 100644 --- a/Software/Embedded_SW/Embedded/Drivers/FPGA/FPGA_SPI_Comm.c +++ b/Software/Embedded_SW/Embedded/Drivers/FPGA/FPGA_SPI_Comm.c @@ -3,9 +3,9 @@ #include #include #include +#include +#include #include "FPGA_SPI_Comm.h" -#include "drivers/FPGA/Moters_Driver/L6470.h" -#include "drivers/FPGA/Moters_Driver/PowerSTEP01.h" #include "Drivers/Motors/Motor.h" #include "modules/control/millisecTask.h" #include "modules/thread/thread.h" @@ -371,11 +371,13 @@ int MotorSendFPGARequest(TimerMotors_t MotorId,uint32_t Data, uint32_t Length) // if (MotorDataIndex[MotorId] == 99) MotorDataIndex[MotorId] = 0; //if((*FpgaMotMap[MotorId].NBUSY == NOTBUSY) && (*FpgaMotMap[MotorId].SPI_Busy == NOTBUSY)) { + ROM_IntMasterDisable(); Int2Short.uint = Data; *FpgaMotMap[MotorId].TX_01 = Int2Short.ushort.MSB; *FpgaMotMap[MotorId].TX_00 = Int2Short.ushort.LSB; //*FpgaMotMap[MotorId].WORDS = Length; + ROM_IntMasterEnable(); return OK; } @@ -794,7 +796,7 @@ void FPGA_SetMotMicroStep(TimerMotors_t _motorId)// for (i = 0; i < 8; i++) { - if (MotorsCfg[_motorId].microstep == MultiStep[i]) + if (MotorDriverRequest[_motorId].microstep == MultiStep[i]) { good = i; break; @@ -929,8 +931,73 @@ void FPGA_SetMotStop(TimerMotors_t _motorId) // FPGA_SPI_Transnit(_motorId); } +void FPGA_SetMotKvalHold(TimerMotors_t _motorId) +{ + uint32_t temp; + + temp = x_SET_PARAM | x_KVAL_HOLD; + temp = temp << 24; + + if((MotorDriverResponse[_motorId].DriverType == CurrentMotDriver) && (MotorDriverRequest[_motorId].KvalHold > 0x7F)) + MotorDriverRequest[_motorId].KvalHold = 0x7F; + + temp |= MotorDriverRequest[_motorId].KvalHold<<16; + Fpga_Spi[_motorId].TX_MOSI = temp; + Fpga_Spi[_motorId].AMT_OF_Words = 4; + FPGA_SPI_Transnit(_motorId); +} +void FPGA_SetMotKvalRun(TimerMotors_t _motorId) +{ + uint32_t temp; + + temp = x_SET_PARAM | x_KVAL_RUN; + temp = temp << 24; + + if((MotorDriverResponse[_motorId].DriverType == CurrentMotDriver) && (MotorDriverRequest[_motorId].KvalRun > 0x7F)) + MotorDriverRequest[_motorId].KvalRun = 0x7F; + + temp |= MotorDriverRequest[_motorId].KvalRun<<16; + + Fpga_Spi[_motorId].TX_MOSI = temp; + Fpga_Spi[_motorId].AMT_OF_Words = 4; + FPGA_SPI_Transnit(_motorId); +} + +void FPGA_SetMotKvalAcc(TimerMotors_t _motorId) +{ + uint32_t temp; + + temp = x_SET_PARAM | x_KVAL_ACC; + temp = temp << 24; + + if((MotorDriverResponse[_motorId].DriverType == CurrentMotDriver) && (MotorDriverRequest[_motorId].KvalAcc > 0x7F)) + MotorDriverRequest[_motorId].KvalAcc = 0x7F; + + temp |= MotorDriverRequest[_motorId].KvalAcc<<16; + + Fpga_Spi[_motorId].TX_MOSI = temp; + Fpga_Spi[_motorId].AMT_OF_Words = 4; + FPGA_SPI_Transnit(_motorId); +} + +void FPGA_SetMotKvalDec(TimerMotors_t _motorId) +{ + uint32_t temp; + + temp = x_SET_PARAM | x_KVAL_DEC; + temp = temp << 24; + + if((MotorDriverResponse[_motorId].DriverType == CurrentMotDriver) && (MotorDriverRequest[_motorId].KvalDec > 0x7F)) + MotorDriverRequest[_motorId].KvalDec = 0x7F; + + temp |= MotorDriverRequest[_motorId].KvalDec<<16; + + Fpga_Spi[_motorId].TX_MOSI = temp; + Fpga_Spi[_motorId].AMT_OF_Words = 4; + FPGA_SPI_Transnit(_motorId); +} /////////////////////////////////////////////////////////////////////////////// /* diff --git a/Software/Embedded_SW/Embedded/Drivers/FPGA/FPGA_SPI_Comm.h b/Software/Embedded_SW/Embedded/Drivers/FPGA/FPGA_SPI_Comm.h index cc9d85cca..e2937e597 100644 --- a/Software/Embedded_SW/Embedded/Drivers/FPGA/FPGA_SPI_Comm.h +++ b/Software/Embedded_SW/Embedded/Drivers/FPGA/FPGA_SPI_Comm.h @@ -27,6 +27,11 @@ void FPGA_SetMotPosition(TimerMotors_t _motorId); void FPGA_SetMotSpeed(TimerMotors_t _motorId); void FPGA_SetMotSpeedDirect(TimerMotors_t _motorId); +void FPGA_SetMotKvalHold(TimerMotors_t _motorId); +void FPGA_SetMotKvalRun(TimerMotors_t _motorId); +void FPGA_SetMotKvalAcc(TimerMotors_t _motorId); +void FPGA_SetMotKvalDec(TimerMotors_t _motorId); + void FPGA_SetMotorsInit(); uint32_t FPGA_MotorConfig(TimerMotors_t _motorId, MotorDriverConfigStruc *MotorConfig); diff --git a/Software/Embedded_SW/Embedded/Drivers/FPGA/Full_Vme/ispvme/ispvm_ui.c b/Software/Embedded_SW/Embedded/Drivers/FPGA/Full_Vme/ispvme/ispvm_ui.c index c216b9aad..0286d53a7 100644 --- a/Software/Embedded_SW/Embedded/Drivers/FPGA/Full_Vme/ispvme/ispvm_ui.c +++ b/Software/Embedded_SW/Embedded/Drivers/FPGA/Full_Vme/ispvme/ispvm_ui.c @@ -39,6 +39,7 @@ ***************************************************************/ +#include "Include.h" #include #include #include @@ -53,6 +54,8 @@ FILE * g_pVMEFile = NULL; +uint32_t vme_index = 0; + /*************************************************************** * * Functions declared in this ispvm_ui.c module @@ -212,7 +215,11 @@ unsigned char GetByte() } - /*************************************************************** + else + { + vme_index++; + } + /*************************************************************** * * Calculate the 32-bit CRC if the expected CRC exist. * diff --git a/Software/Embedded_SW/Embedded/Drivers/FPGA/Full_Vme/ispvme/ivm_core.c b/Software/Embedded_SW/Embedded/Drivers/FPGA/Full_Vme/ispvme/ivm_core.c index 62a2b3b0e..32de190ac 100644 --- a/Software/Embedded_SW/Embedded/Drivers/FPGA/Full_Vme/ispvme/ivm_core.c +++ b/Software/Embedded_SW/Embedded/Drivers/FPGA/Full_Vme/ispvme/ivm_core.c @@ -23,6 +23,7 @@ * ***************************************************************/ +#include "Include.h" #include #include #include "vmopcode.h" diff --git a/Software/Embedded_SW/Embedded/Drivers/FPGA/Full_Vme/ispvme/vmopcode.h b/Software/Embedded_SW/Embedded/Drivers/FPGA/Full_Vme/ispvme/vmopcode.h index cdd05fd12..c3873d968 100644 --- a/Software/Embedded_SW/Embedded/Drivers/FPGA/Full_Vme/ispvme/vmopcode.h +++ b/Software/Embedded_SW/Embedded/Drivers/FPGA/Full_Vme/ispvme/vmopcode.h @@ -206,3 +206,6 @@ typedef struct { unsigned short usNegativeIndex; unsigned char ucUpdate; } LVDSPair; + +extern uint32_t vme_index; + diff --git a/Software/Embedded_SW/Embedded/Drivers/FPGA/Moters_Driver/L6470.c b/Software/Embedded_SW/Embedded/Drivers/FPGA/Moters_Driver/L6470.c deleted file mode 100644 index cd0b09b93..000000000 --- a/Software/Embedded_SW/Embedded/Drivers/FPGA/Moters_Driver/L6470.c +++ /dev/null @@ -1,705 +0,0 @@ -/* -* cL6470.cpp -* -* Created: 6/22/2016 8:41:00 PM -* Author: Atif -*/ -//#include "graphics_adapter.h" -//#include "Embedded/include.h" -#include -#include -#include -#include "drivers/SPI/SPI_Comm.h" -#include "inc/hw_memmap.h" - - - - - -////////////// -//#include "stdafx.h" -#include "L6470.h" -//#include "FPGA_Comm.h" -// To use time library of C -#include - -//int volatile * const MOSI_Reg = (int *)MOSI_BASE; -//int volatile * const MISO_Reg = (int *)MISO_BASE; -//int volatile * const CS_Reg = (int *)CS_BASE; -//int volatile * const CLK_Reg = (int *)CLK_BASE; -//int volatile * const BUSY_Reg = (int *)BUSY_BASE; -//int volatile * const RESET_Reg = (int *)RESET_BASE; -//char volatile * const TX_Reg = (char *)TX_BASE; -//char volatile * const RX_Reg = (char *)RX_BASE; - - - - -//void cL6470(int MOSI, int MISO, int CS, int CLK, int BUSY, int RESET) -//{ -// _Set_MISO(MISO); -// _Set_MOSI(MOSI); -// _Set_CS(CS); -// _Set_CLK(CLK); -// _Set_BUSY(BUSY); -// _Set_RESET(RESET); -// -//} -/* -void delay(int number_of_seconds) -{ - // Converting time into milli_seconds - int milli_seconds = 1000 * number_of_seconds; - - // Stroing start time - clock_t start_time = clock(); - - // looping till required time is not acheived - while (clock() < start_time + milli_seconds); -} -*/ - -/* -void init() -{ - //pinMode(_CS, OUTPUT); - //digitalWrite(_CS, HIGH); - L6470_CS = HIGH; - //pinMode(_MOSI, OUTPUT); - //pinMode(_MISO, INPUT); - //pinMode(_CLK, OUTPUT); - //pinMode(_BUSY, INPUT); - //pinMode(_RESET, OUTPUT); - - //digitalWrite(_RESET, HIGH); - L6470_RESET = HIGH; - //AVI : TODO add deley - delay(1); - //digitalWrite(_RESET, LOW); - L6470_RESET = LOW; - delay(1); - //digitalWrite(_RESET, HIGH); - L6470_RESET = HIGH; - delay(1); - - //SPI.begin(); - //SPI.setBitOrder(MSBFIRST); - //SPI.setClockDivider(SPI_CLOCK_DIV16); // or 2, 8, 16, 32, 64 - //SPI.setDataMode(SPI_MODE3); -} -*/ - -void SetParam(byte param, unsigned long value) -{ - Data_To_Transfer(x_SET_PARAM | param); - ParamHandler(param, value); -} - - -unsigned long GetParam(byte param) -{ - Data_To_Transfer(x_GET_PARAM | param); - return ParamHandler(param, 0); -} - -// Enable or disable the low-speed optimization option. If enabling, -// the other 12 bits of -void SetLSPDOpt(boolean enable) -{ - Data_To_Transfer(x_SET_PARAM | x_MIN_SPEED); - - if (enable) - Param(0x1000, 13); - else - Param(0, 13); -} - -// RUN sets the motor spinning in a direction (defined by the constants -// FWD and REV). Maximum speed and minimum speed are defined -// by the MAX_SPEED and MIN_SPEED registers; exceeding the FS_SPD value -// will switch the device into full-step mode. -// The SpdCalc() function is provided to convert steps/s values into -// appropriate integer values for this function. -void Run(byte dir, unsigned long spd) -{ - Data_To_Transfer(x_RUN | dir); - if (spd > 0xFFFFF) spd = 0xFFFFF; - Data_To_Transfer((byte)((spd >> 16)&0xFF)); - Data_To_Transfer((byte)((spd >> 8)&0xFF)); - Data_To_Transfer((byte)((spd)&0xFF)); -} -byte Write_Byte(uint8_t WByte); -void Run_tx_test(byte dir, unsigned long spd) -{ - uint32_t temp = 0; - uint32_t rx = 0; - - temp = Write_Byte(x_RUN | dir); - rx |= (temp & 0xFF) << 24; - - temp = Write_Byte((spd >> 16)&0xFF); - rx |= (temp & 0xFF) << 16; - - temp = Write_Byte((spd >> 8)&0xFF); - rx |= (temp & 0xFF) << 8; - - temp = Write_Byte((spd)&0xFF); - rx |= temp & 0xFF; - - //return rx; -} - -// STEP_CLOCK puts the device in external step clocking mode. When active, -// pin 25, STCK, becomes the step clock for the device, and steps it in -// the direction (set by the FWD and REV constants) imposed by the call -// of this function. Motion commands (RUN, MOVE, etc) will cause the device -// to exit step clocking mode. -void Step_Clock(byte dir) -{ - Data_To_Transfer(x_STEP_CLOCK | dir); -} - -// MOVE will send the motor n_step steps (size based on step mode) in the -// direction imposed by dir (FWD or REV constants may be used). The motor -// will accelerate according the acceleration and deceleration curves, and -// will run at MAX_SPEED. Stepping mode will adhere to FS_SPD value, as well. -void Move(byte dir, unsigned long n_step) -{ - Data_To_Transfer(x_MOVE | dir); - if (n_step > 0x3FFFFF) n_step = 0x3FFFFF; - Data_To_Transfer((byte)(n_step >> 16)); - Data_To_Transfer((byte)(n_step >> 8)); - Data_To_Transfer((byte)(n_step)); -} - -// GOTO operates much like MOVE, except it produces absolute motion instead -// of relative motion. The motor will be moved to the indicated position -// in the shortest possible fashion. -void GoTo(unsigned long pos) -{ - - Data_To_Transfer(x_GOTO); - if (pos > 0x3FFFFF) pos = 0x3FFFFF; - Data_To_Transfer((byte)(pos >> 16)); - Data_To_Transfer((byte)(pos >> 8)); - Data_To_Transfer((byte)(pos)); -} - -// Same as GOTO, but with user constrained rotational direction. -void GoTo_DIR(byte dir, unsigned long pos) -{ - - Data_To_Transfer(x_GOTO_DIR); - if (pos > 0x3FFFFF) pos = 0x3FFFFF; - Data_To_Transfer((byte)(pos >> 16)); - Data_To_Transfer((byte)(pos >> 8)); - Data_To_Transfer((byte)(pos)); -} - -// GoUntil will set the motor running with direction dir (REV or -// FWD) until a falling edge is detected on the SW pin. Depending -// on bit SW_MODE in CONFIG, either a hard stop or a soft stop is -// performed at the falling edge, and depending on the value of -// act (either RESET or COPY) the value in the ABS_POS register is -// either RESET to 0 or COPY-ed into the MARK register. -void GoUntil(byte act, byte dir, unsigned long spd) -{ - Data_To_Transfer(x_GO_UNTIL | act | dir); - if (spd > 0x3FFFFF) spd = 0x3FFFFF; - Data_To_Transfer((byte)(spd >> 16)); - Data_To_Transfer((byte)(spd >> 8)); - Data_To_Transfer((byte)(spd)); -} - -// Similar in nature to GoUntil, ReleaseSW produces motion at the -// higher of two speeds: the value in MIN_SPEED or 5 steps/s. -// The motor continues to run at this speed until a rising edge -// is detected on the switch input, then a hard stop is performed -// and the ABS_POS register is either COPY-ed into MARK or RESET to -// 0, depending on whether RESET or COPY was passed to the function -// for act. -void ReleaseSW(byte act, byte dir) -{ - Data_To_Transfer(x_RELEASE_SW | act | dir); -} - -// GoHome is equivalent to GoTo(0), but requires less time to send. -// Note that no direction is provided; motion occurs through shortest -// path. If a direction is required, use GoTo_DIR(). -void GoHome() -{ - Data_To_Transfer(x_GO_HOME); -} - -// GoMark is equivalent to GoTo(MARK), but requires less time to send. -// Note that no direction is provided; motion occurs through shortest -// path. If a direction is required, use GoTo_DIR(). -void GoMark() -{ - Data_To_Transfer(x_GO_MARK); -} - -// Sets the ABS_POS register to 0, effectively declaring the current -// position to be "HOME". -void ResetPos() -{ - byte value = x_RESET_POS; - Data_To_Transfer(value); -} - -// Reset device to power up conditions. Equivalent to toggling the STBY -// pin or cycling power. -void ResetDev() -{ - byte value = x_RESET_DEVICE; - Data_To_Transfer(value); -} - -// Bring the motor to a halt using the deceleration curve. -void SoftStop() -{ - byte value = x_SOFT_STOP; - Data_To_Transfer(value); -} - -// Stop the motor with infinite deceleration. -void HardStop() -{ - byte value = x_HARD_STOP; - Data_To_Transfer(value); -} - -// Decelerate the motor and put the bridges in Hi-Z state. -void SoftHiZ() -{ - byte value = x_SOFT_HIZ; - Data_To_Transfer(value); -} - -// Put the bridges in Hi-Z state immediately with no deceleration. -void HardHiZ() -{ - byte value = x_HARD_HIZ; - Data_To_Transfer(value); -} - -// Fetch and return the 16-bit value in the STATUS register. Resets -// any warning flags and exits any error states. Using GetParam() -// to read STATUS does not clear these values. -int GetStatus() -{ - int temp = 0; - Data_To_Transfer(x_GET_STATUS); - temp = Data_To_Transfer(0) << 8; - temp |= Data_To_Transfer(0); - return temp; -} - - - - -unsigned long AccCalc(float stepsPerSecPerSec) -{ - float temp = (float)(stepsPerSecPerSec * 0.137438); - if ( ((unsigned long) ( (long)(temp) )) > 0x00000FFF ) - return 0x00000FFF; - else return (unsigned long) (long)(temp); -} - -// The calculation for DEC is the same as for ACC. Value is 0x08A on boot. -// This is a 12-bit value, so we need to make sure the value is at or below 0xFFF. -unsigned long DecCalc(float stepsPerSecPerSec) -{ - float temp = (float)(stepsPerSecPerSec * 0.137438); - if ((unsigned long) (long)(temp) > 0x00000FFF) return 0x00000FFF; - else return (unsigned long) (long)(temp); -} - -// The value in the MAX_SPD register is [(steps/s)*(tick)]/(2^-18) where tick is -// 250ns (datasheet value)- 0x041 on boot. -// Multiply desired steps/s by .065536 to get an appropriate value for this register -// This is a 10-bit value, so we need to make sure it remains at or below 0x3FF -unsigned long MaxSpdCalc(float stepsPerSec) -{ - float temp = (float)(stepsPerSec * .065536); - if ((unsigned long) (long)(temp) > 0x000003FF) return 0x000003FF; - else return (unsigned long) (long)(temp); -} - -// The value in the MIN_SPD register is [(steps/s)*(tick)]/(2^-24) where tick is -// 250ns (datasheet value)- 0x000 on boot. -// Multiply desired steps/s by 4.1943 to get an appropriate value for this register -// This is a 12-bit value, so we need to make sure the value is at or below 0xFFF. -unsigned long MinSpdCalc(float stepsPerSec) -{ - float temp = (float)(stepsPerSec * 4.1943); - if ((unsigned long) (long)(temp) > 0x00000FFF) return 0x00000FFF; - else return (unsigned long) (long)(temp); -} - -// The value in the FS_SPD register is ([(steps/s)*(tick)]/(2^-18))-0.5 where tick is -// 250ns (datasheet value)- 0x027 on boot. -// Multiply desired steps/s by .065536 and subtract .5 to get an appropriate value for this register -// This is a 10-bit value, so we need to make sure the value is at or below 0x3FF. -unsigned long FSCalc(float stepsPerSec) -{ - float temp = (float)((stepsPerSec * .065536) - .5); - if ((unsigned long) (long)(temp) > 0x000003FF) return 0x000003FF; - else return (unsigned long) (long)(temp); -} - -// The value in the INT_SPD register is [(steps/s)*(tick)]/(2^-24) where tick is -// 250ns (datasheet value)- 0x408 on boot. -// Multiply desired steps/s by 4.1943 to get an appropriate value for this register -// This is a 14-bit value, so we need to make sure the value is at or below 0x3FFF. -unsigned long IntSpdCalc(float stepsPerSec) -{ - float temp = (float)(stepsPerSec * 4.1943); - if ((unsigned long) (long)(temp) > 0x00003FFF) return 0x00003FFF; - else return (unsigned long) (long)(temp); -} - -// When issuing RUN command, the 20-bit speed is [(steps/s)*(tick)]/(2^-28) where tick is -// 250ns (datasheet value). -// Multiply desired steps/s by 67.106 to get an appropriate value for this register -// This is a 20-bit value, so we need to make sure the value is at or below 0xFFFFF. -uint32_t SpdCalc(float stepsPerSec)// for run request -{ -// float temp = (float)(stepsPerSec * 67.106); -// if ((unsigned long) (long)(temp) > 0x000FFFFF) return 0x000FFFFF; -// else return (unsigned long)temp; - - uint32_t temp = 67108 * stepsPerSec; - uint32_t stepspertick = temp/1000 ; - if(stepspertick > 0xFFFFF) - stepspertick = 0xFFFFF; - return stepspertick; -} -float CurrentSpdCalc(uint32_t stepspertick)// for Speed response -{ -// float temp = (float)(stepspertick); -// float stepsPerSec = (float)(temp / 67.106); -// if(stepsPerSec>15625) stepsPerSec = 15625; - float temp = (float)(stepspertick *1000); - float stepsPerSec = (float)(temp/67108.0); - if(stepsPerSec>15625.0) stepsPerSec = 15625.0; // The available range is from 0 to 15625 step/s - - return stepsPerSec; -} - - - -// This simple function shifts a byte out over SPI and receives a byte over -// SPI. Unusually for SPI devices, the x requires a toggling of the -// CS (slaveSelect) pin after each byte sent. That makes this function -// a bit more reasonable, because we can include more functionality in it. -byte Data_To_Transfer(byte data) -{ - - //while(SSIBusy(SSI2_BASE)){}; - //while(Check_SPI_Busy() == BUSY){}; - - byte data_out = 0; - /* - //digitalWrite(_CS, LOW); - L6470_CS = LOW; - //data_out = SPI.transfer(data); - L6470_TX = data; - data_out = L6470_RX; - - //digitalWrite(_CS, HIGH); - L6470_CS = HIGH; - return data_out; - */ - - data_out = Transfer_tx(data/*, &data_out*/ ); - return data_out; -} - - -// the register will be automatically zero. -// When disabling, the value will have to be explicitly written by -// the user with a SetParam() call. See the datasheet for further -// information about low-speed optimization.// Much of the functionality between "get parameter" and "set parameter" is -// very similar, so we deal with that by putting all of it in one function -// here to save memory space and simplify the program. -unsigned long ParamHandler(byte param, unsigned long value) -{ - unsigned long ret_val = 0; // This is a temp for the value to return. - // This switch structure handles the appropriate action for each register. - // This is necessary since not all registers are of the same length, either - // bit-wise or byte-wise, so we want to make sure we mask out any spurious - // bits and do the right number of transfers. That is handled by the x_Param() - // function, in most cases, but for 1-byte or smaller transfers, we call - // Data_To_Transfer() directly. - switch (param) - { - // ABS_POS is the current absolute offset from home. It is a 22 bit number expressed - // in two's complement. At power up, this value is 0. It cannot be written when - // the motor is running, but at any other time, it can be updated to change the - // interpreted position of the motor. - case x_ABS_POS: - ret_val = Param(value, 22); - break; - // EL_POS is the current electrical position in the step generation cycle. It can - // be set when the motor is not in motion. Value is 0 on power up. - case x_EL_POS: - ret_val = Param(value, 9); - break; - // MARK is a second position other than 0 that the motor can be told to go to. As - // with ABS_POS, it is 22-bit two's complement. Value is 0 on power up. - case x_MARK: - ret_val = Param(value, 22); - break; - // SPEED contains information about the current speed. It is read-only. It does - // NOT provide direction information. - case x_SPEED: - ret_val = Param(0, 32); - break; - // ACC and DEC set the acceleration and deceleration rates. Set ACC to 0xFFF - // to get infinite acceleration/decelaeration- there is no way to get infinite - // deceleration w/o infinite acceleration (except the HARD STOP command). - // Cannot be written while motor is running. Both default to 0x08A on power up. - // AccCalc() and DecCalc() functions exist to convert steps/s/s values into - // 12-bit values for these two registers. - case x_ACC: - ret_val = Param(value, 12); - break; - case x_DEC: - ret_val = Param(value, 12); - break; - // MAX_SPEED is just what it says- any command which attempts to set the speed - // of the motor above this value will simply cause the motor to turn at this - // speed. Value is 0x041 on power up. - // MaxSpdCalc() function exists to convert steps/s value into a 10-bit value - // for this register. - case x_MAX_SPEED: - ret_val = Param(value, 10); - break; - // MIN_SPEED controls two things- the activation of the low-speed optimization - // feature and the lowest speed the motor will be allowed to operate at. LSPD_OPT - // is the 13th bit, and when it is set, the minimum allowed speed is automatically - // set to zero. This value is 0 on startup. - // MinSpdCalc() function exists to convert steps/s value into a 12-bit value for this - // register. SetLSPDOpt() function exists to enable/disable the optimization feature. - case x_MIN_SPEED: - ret_val = Param(value, 12); - break; - // FS_SPD register contains a threshold value above which microstepping is disabled - // and the x operates in full-step mode. Defaults to 0x027 on power up. - // FSCalc() function exists to convert steps/s value into 10-bit integer for this - // register. - case x_FS_SPD: - ret_val = Param(value, 10); - break; - // KVAL is the maximum voltage of the PWM outputs. These 8-bit values are ratiometric - // representations: 255 for full output voltage, 128 for half, etc. Default is 0x29. - // The implications of different KVAL settings is too complex to dig into here, but - // it will usually work to max the value for RUN, ACC, and DEC. Maxing the value for - // HOLD may result in excessive power dissipation when the motor is not running. - case x_KVAL_HOLD: - ret_val = Data_To_Transfer((byte)value); - break; - case x_KVAL_RUN: - ret_val = Data_To_Transfer((byte)value); - break; - case x_KVAL_ACC: - ret_val = Data_To_Transfer((byte)value); - break; - case x_KVAL_DEC: - ret_val = Data_To_Transfer((byte)value); - break; - // INT_SPD, ST_SLP, FN_SLP_ACC and FN_SLP_DEC are all related to the back EMF - // compensation functionality. Please see the datasheet for details of this - // function- it is too complex to discuss here. Default values seem to work - // well enough. - case x_INT_SPD: - ret_val = Param(value, 14); - break; - case x_ST_SLP: - ret_val = Data_To_Transfer((byte)value); - break; - case x_FN_SLP_ACC: - ret_val = Data_To_Transfer((byte)value); - break; - case x_FN_SLP_DEC: - ret_val = Data_To_Transfer((byte)value); - break; - // K_THERM is motor winding thermal drift compensation. Please see the datasheet - // for full details on operation- the default value should be okay for most users. - case x_K_THERM: - ret_val = Data_To_Transfer((byte)value & 0x0F); - break; - // ADC_OUT is a read-only register containing the result of the ADC measurements. - // This is less useful than it sounds; see the datasheet for more information. - case x_ADC_OUT: - ret_val = Data_To_Transfer(0); - break; - // Set the overcurrent threshold. Ranges from 375mA to 6A in steps of 375mA. - // A set of defined constants is provided for the user's convenience. Default - // value is 3.375A- 0x08. This is a 4-bit value. - case x_OCD_TH: - ret_val = Data_To_Transfer((byte)value & 0x0F); - break; - // Stall current threshold. Defaults to 0x40, or 2.03A. Value is from 31.25mA to - // 4A in 31.25mA steps. This is a 7-bit value. - case x_STALL_TH: - ret_val = Data_To_Transfer((byte)value & 0x7F); - break; - // STEP_MODE controls the microstepping settings, as well as the generation of an - // output signal from the x. Bits 2:0 control the number of microsteps per - // step the part will generate. Bit 7 controls whether the BUSY/SYNC pin outputs - // a BUSY signal or a step synchronization signal. Bits 6:4 control the frequency - // of the output signal relative to the full-step frequency; see datasheet for - // that relationship as it is too complex to reproduce here. - // Most likely, only the microsteps per step value will be needed; there is a set - // of constants provided for ease of use of these values. - case x_STEP_MODE: - ret_val = Data_To_Transfer((byte)value); - break; - // ALARM_EN controls which alarms will cause the FLAG pin to fall. A set of constants - // is provided to make this easy to interpret. By default, ALL alarms will trigger the - // FLAG pin. - case x_ALARM_EN: - ret_val = Data_To_Transfer((byte)value); - break; - // CONFIG contains some assorted configuration bits and fields. A fairly comprehensive - // set of reasonably self-explanatory constants is provided, but users should refer - // to the datasheet before modifying the contents of this register to be certain they - // understand the implications of their modifications. Value on boot is 0x2E88; this - // can be a useful way to verify proper start up and operation of the x chip. - case x_CONFIG: - ret_val = Param(value, 16); - break; - // STATUS contains read-only information about the current condition of the chip. A - // comprehensive set of constants for masking and testing this register is provided, but - // users should refer to the datasheet to ensure that they fully understand each one of - // the bits in the register. - case x_STATUS: // STATUS is a read-only register - ret_val = Param(0, 16); - break; - default: - ret_val = Data_To_Transfer((byte)(value)); - break; - } - return ret_val; -} - -// Generalization of the subsections of the register read/write functionality. -// We want the end user to just write the value without worrying about length, -// so we pass a bit length parameter from the calling function. -unsigned long Param(unsigned long value, byte bit_len) -{ - unsigned long ret_val = 0; // We'll return this to generalize this function - // for both read and write of registers. - byte byte_len = bit_len / 8; // How many BYTES do we have? - if (bit_len % 8 > 0) byte_len++; // Make sure not to lose any partial byte values. - // Let's make sure our value has no spurious bits set, and if the value was too - // high, max it out. - unsigned long mask = 0xffffffff >> (32 - bit_len); - if (value > mask) - value = mask; - // The following three if statements handle the various possible byte length - // transfers- it'll be no less than 1 but no more than 3 bytes of data. - // Data_To_Transfer() sends a byte out through SPI and returns a byte received - // over SPI- when calling it, we typecast a shifted version of the masked - // value, then we shift the received value back by the same amount and - // store it until return time. - if (byte_len == 3) { - ret_val |= Data_To_Transfer((byte)(value >> 16)) << 16; - //Serial.println(ret_val, HEX); - } - if (byte_len >= 2) { - ret_val |= Data_To_Transfer((byte)(value >> 8)) << 8; - //Serial.println(ret_val, HEX); - } - if (byte_len >= 1) { - //Serial.print("Value = "); - //Serial.println(value); - //Serial.print("ret_val = "); - //Serial.println(ret_val); - - ret_val |= Data_To_Transfer((byte)value); - - //Serial.print("ret_val = "); - //Serial.println(ret_val); - - //Serial.println(ret_val, HEX); - } - // Return the received values. Mask off any unnecessary bits, just for - // the sake of thoroughness- we don't EXPECT to see anything outside - // the bit length range but better to be safe than sorry. - return (ret_val & mask); -} - -// This simple function shifts a byte out over SPI and receives a byte over -// SPI. Unusually for SPI devices, the x requires a toggling of the -// CS (slaveSelect) pin after each byte sent. That makes this function -// a bit more reasonable, because we can include more functionality in it. - -// -//void Set_MOSI(int MOSI) -// -//{ -// _MOSI = MOSI; -//} -// -//void Set_MISO(int MISO) -// -//{ -// _MISO = MISO; -//} -// -//void Set_CS(int CS) -// -//{ -// _CS = CS; -//} -// -//void Set_CLK(int CLK) -// -//{ -// _CLK = CLK; -//} -// -//void Set_BUSY(int BUSY) -// -//{ -// _BUSY = BUSY; -//} -// -//void Set_RESET(int RESET) -// -//{ -// _RESET = RESET; -//} -// -//int Get_MOSI() -//{ -// return MOSI; -//} -// -//int Get_MISO() -//{ -// return MISO; -//} -// -//int Get_CS() -//{ -// return CS; -//} -//int Get_CLK() -//{ -// return CLK; -//} -// -//int Get_BUSY() -//{ -// return BUSY; -//} -//int Get_RESET() -//{ -// return RESET; -//} - - diff --git a/Software/Embedded_SW/Embedded/Drivers/FPGA/Moters_Driver/L6470.h b/Software/Embedded_SW/Embedded/Drivers/FPGA/Moters_Driver/L6470.h deleted file mode 100644 index 745a7f753..000000000 --- a/Software/Embedded_SW/Embedded/Drivers/FPGA/Moters_Driver/L6470.h +++ /dev/null @@ -1,341 +0,0 @@ -/* -* cL6470.h -* -* Created: 6/22/2016 8:40:34 PM -* Author: Atif -*/ - - -#ifndef CL6470_H_ -#define CL6470_H_ - -//#include -//#include - -// - -// - -// constant definitions for overcurrent thresholds. Write these values to -// register x_OCD_TH to set the level at which an overcurrent even occurs. -#define x_OCD_TH_375mA 0x00 -#define x_OCD_TH_750mA 0x01 -#define x_OCD_TH_1125mA 0x02 -#define x_OCD_TH_1500mA 0x03 -#define x_OCD_TH_1875mA 0x04 -#define x_OCD_TH_2250mA 0x05 -#define x_OCD_TH_2625mA 0x06 -#define x_OCD_TH_3000mA 0x07 -#define x_OCD_TH_3375mA 0x08 -#define x_OCD_TH_3750mA 0x09 -#define x_OCD_TH_4125mA 0x0A -#define x_OCD_TH_4500mA 0x0B -#define x_OCD_TH_4875mA 0x0C -#define x_OCD_TH_5250mA 0x0D -#define x_OCD_TH_5625mA 0x0E -#define x_OCD_TH_6000mA 0x0F - -// STEP_MODE option values. -// First comes the "microsteps per step" options... -#define x_STEP_MODE_STEP_SEL 0x07 // Mask for these bits only. -#define x_STEP_SEL_1 0x00 -#define x_STEP_SEL_1_2 0x01 -#define x_STEP_SEL_1_4 0x02 -#define x_STEP_SEL_1_8 0x03 -#define x_STEP_SEL_1_16 0x04 -#define x_STEP_SEL_1_32 0x05 -#define x_STEP_SEL_1_64 0x06 -#define x_STEP_SEL_1_128 0x07 - -// ...next, define the SYNC_EN bit. When set, the BUSYN pin will instead -// output a clock related to the full-step frequency as defined by the -// SYNC_SEL bits below. -#define x_STEP_MODE_SYNC_EN 0x80 // Mask for this bit -#define x_SYNC_EN 0x80 - -// ...last, define the SYNC_SEL modes. The clock output is defined by -// the full-step frequency and the value in these bits- see the datasheet -// for a matrix describing that relationship (page 46). -#define x_STEP_MODE_SYNC_SEL 0x70 -#define x_SYNC_SEL_1_2 0x00 -#define x_SYNC_SEL_1 0x10 -#define x_SYNC_SEL_2 0x20 -#define x_SYNC_SEL_4 0x30 -#define x_SYNC_SEL_8 0x40 -#define x_SYNC_SEL_16 0x50 -#define x_SYNC_SEL_32 0x60 -#define x_SYNC_SEL_64 0x70 - -// Bit names for the ALARM_EN register. -// Each of these bits defines one potential alarm condition. -// When one of these conditions occurs and the respective bit in ALARM_EN is set, -// the FLAG pin will go low. The register must be queried to determine which event -// caused the alarm. -#define x_ALARM_EN_OVERCURRENT 0x01 -#define x_ALARM_EN_THERMAL_SHUTDOWN 0x02 -#define x_ALARM_EN_THERMAL_WARNING 0x04 -#define x_ALARM_EN_UNDER_VOLTAGE 0x08 -#define x_ALARM_EN_STALL_DET_A 0x10 -#define x_ALARM_EN_STALL_DET_B 0x20 -#define x_ALARM_EN_SW_TURN_ON 0x40 -#define x_ALARM_EN_WRONG_NPERF_CMD 0x80 - -// CONFIG register renames. - -// Oscillator options. -// The x needs to know what the clock frequency is because it uses that for some -// calculations during operation. -#define x_CONFIG_OSC_SEL 0x000F // Mask for this bit field. -#define x_CONFIG_INT_16MHZ 0x0000 // Internal 16MHz, no output -#define x_CONFIG_INT_16MHZ_OSCOUT_2MHZ 0x0008 // Default; internal 16MHz, 2MHz output -#define x_CONFIG_INT_16MHZ_OSCOUT_4MHZ 0x0009 // Internal 16MHz, 4MHz output -#define x_CONFIG_INT_16MHZ_OSCOUT_8MHZ 0x000A // Internal 16MHz, 8MHz output -#define x_CONFIG_INT_16MHZ_OSCOUT_16MHZ 0x000B // Internal 16MHz, 16MHz output -#define x_CONFIG_EXT_8MHZ_XTAL_DRIVE 0x0004 // External 8MHz crystal -#define x_CONFIG_EXT_16MHZ_XTAL_DRIVE 0x0005 // External 16MHz crystal -#define x_CONFIG_EXT_24MHZ_XTAL_DRIVE 0x0006 // External 24MHz crystal -#define x_CONFIG_EXT_32MHZ_XTAL_DRIVE 0x0007 // External 32MHz crystal -#define x_CONFIG_EXT_8MHZ_OSCOUT_INVERT 0x000C // External 8MHz crystal, output inverted -#define x_CONFIG_EXT_16MHZ_OSCOUT_INVERT 0x000D // External 16MHz crystal, output inverted -#define x_CONFIG_EXT_24MHZ_OSCOUT_INVERT 0x000E // External 24MHz crystal, output inverted -#define x_CONFIG_EXT_32MHZ_OSCOUT_INVERT 0x000F // External 32MHz crystal, output inverted - -// Configure the functionality of the external switch input -#define x_CONFIG_SW_MODE 0x0010 // Mask for this bit. -#define x_CONFIG_SW_HARD_STOP 0x0000 // Default; hard stop motor on switch. -#define x_CONFIG_SW_USER 0x0010 // Tie to the GoUntil and ReleaseSW -// commands to provide jog function. -// See page 25 of datasheet. - -// Configure the motor voltage compensation mode (see page 34 of datasheet) -#define x_CONFIG_EN_VSCOMP 0x0020 // Mask for this bit. -#define x_CONFIG_VS_COMP_DISABLE 0x0000 // Disable motor voltage compensation. -#define x_CONFIG_VS_COMP_ENABLE 0x0020 // Enable motor voltage compensation. - -// Configure overcurrent detection event handling -#define x_CONFIG_OC_SD 0x0080 // Mask for this bit. -#define x_CONFIG_OC_SD_DISABLE 0x0000 // Bridges do NOT shutdown on OC detect -#define x_CONFIG_OC_SD_ENABLE 0x0080 // Bridges shutdown on OC detect - -// Configure the slew rate of the power bridge output -#define x_CONFIG_POW_SR 0x0300 // Mask for this bit field. -#define x_CONFIG_SR_180V_us 0x0000 // 180V/us -#define x_CONFIG_SR_290V_us 0x0200 // 290V/us -#define x_CONFIG_SR_530V_us 0x0300 // 530V/us - -// Integer divisors for PWM sinewave generation -// See page 32 of the datasheet for more information on this. -#define x_CONFIG_F_PWM_DEC 0x1C00 // mask for this bit field -#define x_CONFIG_PWM_MUL_0_625 (0x00)<<10 -#define x_CONFIG_PWM_MUL_0_75 (0x01)<<10 -#define x_CONFIG_PWM_MUL_0_875 (0x02)<<10 -#define x_CONFIG_PWM_MUL_1 (0x03)<<10 -#define x_CONFIG_PWM_MUL_1_25 (0x04)<<10 -#define x_CONFIG_PWM_MUL_1_5 (0x05)<<10 -#define x_CONFIG_PWM_MUL_1_75 (0x06)<<10 -#define x_CONFIG_PWM_MUL_2 (0x07)<<10 - -// Multiplier for the PWM sinewave frequency -#define x_CONFIG_F_PWM_INT 0xE000 // mask for this bit field. -#define x_CONFIG_PWM_DIV_1 (0x00)<<13 -#define x_CONFIG_PWM_DIV_2 (0x01)<<13 -#define x_CONFIG_PWM_DIV_3 (0x02)<<13 -#define x_CONFIG_PWM_DIV_4 (0x03)<<13 -#define x_CONFIG_PWM_DIV_5 (0x04)<<13 -#define x_CONFIG_PWM_DIV_6 (0x05)<<13 -#define x_CONFIG_PWM_DIV_7 (0x06)<<13 - -// Status register bit renames- read-only bits conferring information about the -// device to the user. -#define x_STATUS_HIZ 0x0001 // high when bridges are in HiZ mode -#define x_STATUS_BUSY 0x0002 // mirrors BUSY pin -#define x_STATUS_SW_F 0x0004 // low when switch open, high when closed -#define x_STATUS_SW_EVN 0x0008 // active high, set on switch falling edge, -// cleared by reading STATUS -#define x_STATUS_DIR 0x0010 // Indicates current motor direction. -// High is FWD, Low is REV. -#define x_STATUS_NOTPERF_CMD 0x0080 // Last command not performed. -#define x_STATUS_WRONG_CMD 0x0100 // Last command not valid. -#define x_STATUS_UVLO 0x0200 // Undervoltage lockout is active -#define x_STATUS_TH_WRN 0x0400 // Thermal warning -#define x_STATUS_TH_SD 0x0800 // Thermal shutdown -#define x_STATUS_OCD 0x1000 // Overcurrent detected -#define x_STATUS_STEP_LOSS_A 0x2000 // Stall detected on A bridge -#define x_STATUS_STEP_LOSS_B 0x4000 // Stall detected on B bridge -#define x_STATUS_SCK_MOD 0x8000 // Step clock mode is active - -// Status register motor status field -#define x_STATUS_MOT_STATUS 0x0060 // field mask -#define x_STATUS_MOT_STATUS_STOPPED (0x0000)<<13 // Motor stopped -#define x_STATUS_MOT_STATUS_ACCELERATION (0x0001)<<13 // Motor accelerating -#define x_STATUS_MOT_STATUS_DECELERATION (0x0002)<<13 // Motor decelerating -#define x_STATUS_MOT_STATUS_CONST_SPD (0x0003)<<13 // Motor at constant speed - -// Register address redefines. -// See the x_Param_Handler() function for more info about these. -#define x_ABS_POS 0x01 -#define x_EL_POS 0x02 -#define x_MARK 0x03 -#define x_SPEED 0x04 -#define x_ACC 0x05 -#define x_DEC 0x06 -#define x_MAX_SPEED 0x07 -#define x_MIN_SPEED 0x08 -#define x_FS_SPD 0x15 -#define x_KVAL_HOLD 0x09 -#define x_KVAL_RUN 0x0A -#define x_KVAL_ACC 0x0B -#define x_KVAL_DEC 0x0C -#define x_INT_SPD 0x0D -#define x_ST_SLP 0x0E -#define x_FN_SLP_ACC 0x0F -#define x_FN_SLP_DEC 0x10 -#define x_K_THERM 0x11 -#define x_ADC_OUT 0x12 -#define x_OCD_TH 0x13 -#define x_STALL_TH 0x14 -#define x_STEP_MODE 0x16 -#define x_ALARM_EN 0x17 -#define x_CONFIG 0x18 -#define x_STATUS 0x19 - -//x commands -#define x_NOP 0x00 -#define x_SET_PARAM 0x00 -#define x_GET_PARAM 0x20 -#define x_RUN 0x50 -#define x_STEP_CLOCK 0x58 -#define x_MOVE 0x40 -#define x_GOTO 0x60 -#define x_GOTO_DIR 0x68 -#define x_GO_UNTIL 0x82 -#define x_RELEASE_SW 0x92 -#define x_GO_HOME 0x70 -#define x_GO_MARK 0x78 -#define x_RESET_POS 0xD8 -#define x_RESET_DEVICE 0xC0 -#define x_SOFT_STOP 0xB0 -#define x_HARD_STOP 0xB8 -#define x_SOFT_HIZ 0xA0 -#define x_HARD_HIZ 0xA8 -#define x_GET_STATUS 0xD0 // use Get_and_Clear_Status - -/* x direction options */ -#define FWD 0x01 -#define REV 0x00 - -/* x action options */ -#define ACTION_RESET 0x00 -#define ACTION_COPY 0x01 - - - -//class cL6470 { -//public: - -//Default constuctot -//cL6470(); - -//Overload Constructor -//@param int MOSI, int MISO, int CS, int CLK, int BUSY, int RESET -//cL6470(int, int, int, int, int, int); - -#include "../../../DataDef.h" - -void init(); -unsigned long GetParam(byte); -byte Data_To_Transfer(byte); -unsigned long ParamHandler(byte, unsigned long); -void SetParam(byte, unsigned long); -unsigned long Param(unsigned long, byte); -int GetStatus(); -uint32_t SpdCalc(float); -unsigned long IntSpdCalc(float); -unsigned long FSCalc(float); -unsigned long MinSpdCalc(float); -unsigned long MaxSpdCalc(float); -unsigned long DecCalc(float); -unsigned long AccCalc(float); -void SetLSPDOpt(boolean); -void Run(byte, unsigned long); -void Step_Clock(byte); -void Move(byte, unsigned long); -void GoTo(unsigned long); -void GoTo_DIR(byte, unsigned long); -void GoUntil(byte, byte, unsigned long); -void ReleaseSW(byte, byte); -void GoHome(); -void GoMark(); -void ResetPos(); -void ResetDev(); -void SoftStop(); -void HardStop(); -void SoftHiZ(); -void HardHiZ(); -float CurrentSpdCalc(uint32_t stepspertick);// for Speed response -void delay(int number_of_seconds); -void Run_tx_test(byte dir, unsigned long spd); -////TODO update the addresses -//#define MOSI_BASE 0x00000001 // -//#define MISO_BASE 0x00000002 // -//#define CS_BASE 0x00000003 // -//#define CLK_BASE 0x00000004 // -//#define BUSY_BASE 0x00000005 // -//#define RESET_BASE 0x00000006 // -//#define TX_BASE 0x00000006 // -//#define RX_BASE 0x00000007 // - - -//extern int volatile * const MOSI_Reg; -//extern int volatile * const MISO_Reg; -//extern int volatile * const CS_Reg; -//extern int volatile * const CLK_Reg; -//extern int volatile * const BUSY_Reg; -//extern int volatile * const RESET_Reg; -//extern char volatile * const TX_Reg; -//extern char volatile * const RX_Reg; - -//*MOSI = value; /* write to port */ -//value = *MOSI; /* read from port */ - - - -/////////////// - - -////@param int MOSI -//void Set_MOSI(int); -////@param int MISO -//void Set_MISO(int); -////@param int CS -//void Set_CS(int); -////@param int CLK -//void Set_CLK(int); -////@param int BUSY -//void Set_BUSY(int); -////@param int RESET -//void Set_RESET(int); - - - -//int Get_MOSI(); -//int Get_MISO(); -//int Get_CS(); -//int Get_CLK(); -//int Get_BUSY(); -//int Get_RESET(); - - -//private: -// Member Variable - -//int MOSI = 0; -//int MISO = 0; -//int CS = 0; -//int CLK = 0; -//int BUSY = 0; -//int RESET = 0; -//}; - - -#endif /* CL6470_H_ */ diff --git a/Software/Embedded_SW/Embedded/Drivers/FPGA/Moters_Driver/PowerSTEP01.h b/Software/Embedded_SW/Embedded/Drivers/FPGA/Moters_Driver/PowerSTEP01.h deleted file mode 100644 index bf1fe91d5..000000000 --- a/Software/Embedded_SW/Embedded/Drivers/FPGA/Moters_Driver/PowerSTEP01.h +++ /dev/null @@ -1,168 +0,0 @@ -/* - * PowerSTEP01.h - * //Based on: - * //https://os.mbed.com/teams/ST/code/X_NUCLEO_IHM03A1/file/2fbfe0cd8d4d/Components/powerstep01/powerstep01.h/ - * - * Created on: Mar 5, 2019 - * Author: avi - */ - -#ifndef DRIVERS_FPGA_MOTERS_DRIVER_POWERSTEP01_H_ -#define DRIVERS_FPGA_MOTERS_DRIVER_POWERSTEP01_H_ - - -//powerSTEP01 -#define x_POWERSTEP01_GATECFG1 0x18 //Gate driver configuration 11 bit -#define x_POWERSTEP01_GATECFG2 0x19 //Gate driver configuration 8 bit -#define x_POWERSTEP01_STATUS 0x1B //x_GET_STATUS is the same as in L6470 -#define x_POWERSTEP01_CONFIG 0x1A - -#define x_KVAL_TVAL_HOLD 0x09 -#define x_KVAL_TVAL_RUN 0x0A -#define x_KVAL_TVAL_ACC 0x0B -#define x_KVAL_TVAL_DEC 0x0C -#define x_ST_SLP_T_FAST 0x0E -#define x_FN_SLP_ACC_TON_MIN 0x0F -#define x_FN_SLP_DEC_TOFF_MIN 0x10 - -///Shift of TCC field in GATECFG1 register -#define POWERSTEP01_TCC_SHIFT (0) -///Shift of IGATE field in GATECFG1 register -#define POWERSTEP01_IGATE_SHIFT (5) -///Shift of TBOOST field in GATECFG1 register -#define POWERSTEP01_TBOOST_SHIFT (8) - -///Shift of TBLANK field in GATECFG2 register -#define POWERSTEP01_TBLANK_SHIFT (5) -///Shift of TDT field in GATECFG2 register -#define POWERSTEP01_TDT_SHIFT (0) - -/// masks for GATECFG1 register of PowerStep01 -typedef enum { - POWERSTEP01_GATECFG1_TCC_MASK = ((uint16_t)0x001F), - POWERSTEP01_GATECFG1_IGATE_MASK = ((uint16_t)0x00E0), - POWERSTEP01_GATECFG1_TBOOST_MASK = ((uint16_t)0x0700), - POWERSTEP01_GATECFG1_WD_EN = ((uint16_t)0x0800) -} powerstep01_GateCfg1Masks_t; - -/// Control current Time (field TCC of GATECFG1 register of PowerStep01) -typedef enum { - POWERSTEP01_TCC_125ns = (((uint8_t)0x00)< +#include +#include +#include +#include "drivers/SPI/SPI_Comm.h" +#include "inc/hw_memmap.h" + + + + + +////////////// +//#include "stdafx.h" +#include + +//int volatile * const MOSI_Reg = (int *)MOSI_BASE; +//int volatile * const MISO_Reg = (int *)MISO_BASE; +//int volatile * const CS_Reg = (int *)CS_BASE; +//int volatile * const CLK_Reg = (int *)CLK_BASE; +//int volatile * const BUSY_Reg = (int *)BUSY_BASE; +//int volatile * const RESET_Reg = (int *)RESET_BASE; +//char volatile * const TX_Reg = (char *)TX_BASE; +//char volatile * const RX_Reg = (char *)RX_BASE; + + + + +//void cL6470(int MOSI, int MISO, int CS, int CLK, int BUSY, int RESET) +//{ +// _Set_MISO(MISO); +// _Set_MOSI(MOSI); +// _Set_CS(CS); +// _Set_CLK(CLK); +// _Set_BUSY(BUSY); +// _Set_RESET(RESET); +// +//} +/* +void delay(int number_of_seconds) +{ + // Converting time into milli_seconds + int milli_seconds = 1000 * number_of_seconds; + + // Stroing start time + clock_t start_time = clock(); + + // looping till required time is not acheived + while (clock() < start_time + milli_seconds); +} +*/ + +/* +void init() +{ + //pinMode(_CS, OUTPUT); + //digitalWrite(_CS, HIGH); + L6470_CS = HIGH; + //pinMode(_MOSI, OUTPUT); + //pinMode(_MISO, INPUT); + //pinMode(_CLK, OUTPUT); + //pinMode(_BUSY, INPUT); + //pinMode(_RESET, OUTPUT); + + //digitalWrite(_RESET, HIGH); + L6470_RESET = HIGH; + //AVI : TODO add deley + delay(1); + //digitalWrite(_RESET, LOW); + L6470_RESET = LOW; + delay(1); + //digitalWrite(_RESET, HIGH); + L6470_RESET = HIGH; + delay(1); + + //SPI.begin(); + //SPI.setBitOrder(MSBFIRST); + //SPI.setClockDivider(SPI_CLOCK_DIV16); // or 2, 8, 16, 32, 64 + //SPI.setDataMode(SPI_MODE3); +} +*/ + +void SetParam(byte param, unsigned long value) +{ + Data_To_Transfer(x_SET_PARAM | param); + ParamHandler(param, value); +} + + +unsigned long GetParam(byte param) +{ + Data_To_Transfer(x_GET_PARAM | param); + return ParamHandler(param, 0); +} + +// Enable or disable the low-speed optimization option. If enabling, +// the other 12 bits of +void SetLSPDOpt(boolean enable) +{ + Data_To_Transfer(x_SET_PARAM | x_MIN_SPEED); + + if (enable) + Param(0x1000, 13); + else + Param(0, 13); +} + +// RUN sets the motor spinning in a direction (defined by the constants +// FWD and REV). Maximum speed and minimum speed are defined +// by the MAX_SPEED and MIN_SPEED registers; exceeding the FS_SPD value +// will switch the device into full-step mode. +// The SpdCalc() function is provided to convert steps/s values into +// appropriate integer values for this function. +void Run(byte dir, unsigned long spd) +{ + Data_To_Transfer(x_RUN | dir); + if (spd > 0xFFFFF) spd = 0xFFFFF; + Data_To_Transfer((byte)((spd >> 16)&0xFF)); + Data_To_Transfer((byte)((spd >> 8)&0xFF)); + Data_To_Transfer((byte)((spd)&0xFF)); +} +byte Write_Byte(uint8_t WByte); +void Run_tx_test(byte dir, unsigned long spd) +{ + uint32_t temp = 0; + uint32_t rx = 0; + + temp = Write_Byte(x_RUN | dir); + rx |= (temp & 0xFF) << 24; + + temp = Write_Byte((spd >> 16)&0xFF); + rx |= (temp & 0xFF) << 16; + + temp = Write_Byte((spd >> 8)&0xFF); + rx |= (temp & 0xFF) << 8; + + temp = Write_Byte((spd)&0xFF); + rx |= temp & 0xFF; + + //return rx; +} + +// STEP_CLOCK puts the device in external step clocking mode. When active, +// pin 25, STCK, becomes the step clock for the device, and steps it in +// the direction (set by the FWD and REV constants) imposed by the call +// of this function. Motion commands (RUN, MOVE, etc) will cause the device +// to exit step clocking mode. +void Step_Clock(byte dir) +{ + Data_To_Transfer(x_STEP_CLOCK | dir); +} + +// MOVE will send the motor n_step steps (size based on step mode) in the +// direction imposed by dir (FWD or REV constants may be used). The motor +// will accelerate according the acceleration and deceleration curves, and +// will run at MAX_SPEED. Stepping mode will adhere to FS_SPD value, as well. +void Move(byte dir, unsigned long n_step) +{ + Data_To_Transfer(x_MOVE | dir); + if (n_step > 0x3FFFFF) n_step = 0x3FFFFF; + Data_To_Transfer((byte)(n_step >> 16)); + Data_To_Transfer((byte)(n_step >> 8)); + Data_To_Transfer((byte)(n_step)); +} + +// GOTO operates much like MOVE, except it produces absolute motion instead +// of relative motion. The motor will be moved to the indicated position +// in the shortest possible fashion. +void GoTo(unsigned long pos) +{ + + Data_To_Transfer(x_GOTO); + if (pos > 0x3FFFFF) pos = 0x3FFFFF; + Data_To_Transfer((byte)(pos >> 16)); + Data_To_Transfer((byte)(pos >> 8)); + Data_To_Transfer((byte)(pos)); +} + +// Same as GOTO, but with user constrained rotational direction. +void GoTo_DIR(byte dir, unsigned long pos) +{ + + Data_To_Transfer(x_GOTO_DIR); + if (pos > 0x3FFFFF) pos = 0x3FFFFF; + Data_To_Transfer((byte)(pos >> 16)); + Data_To_Transfer((byte)(pos >> 8)); + Data_To_Transfer((byte)(pos)); +} + +// GoUntil will set the motor running with direction dir (REV or +// FWD) until a falling edge is detected on the SW pin. Depending +// on bit SW_MODE in CONFIG, either a hard stop or a soft stop is +// performed at the falling edge, and depending on the value of +// act (either RESET or COPY) the value in the ABS_POS register is +// either RESET to 0 or COPY-ed into the MARK register. +void GoUntil(byte act, byte dir, unsigned long spd) +{ + Data_To_Transfer(x_GO_UNTIL | act | dir); + if (spd > 0x3FFFFF) spd = 0x3FFFFF; + Data_To_Transfer((byte)(spd >> 16)); + Data_To_Transfer((byte)(spd >> 8)); + Data_To_Transfer((byte)(spd)); +} + +// Similar in nature to GoUntil, ReleaseSW produces motion at the +// higher of two speeds: the value in MIN_SPEED or 5 steps/s. +// The motor continues to run at this speed until a rising edge +// is detected on the switch input, then a hard stop is performed +// and the ABS_POS register is either COPY-ed into MARK or RESET to +// 0, depending on whether RESET or COPY was passed to the function +// for act. +void ReleaseSW(byte act, byte dir) +{ + Data_To_Transfer(x_RELEASE_SW | act | dir); +} + +// GoHome is equivalent to GoTo(0), but requires less time to send. +// Note that no direction is provided; motion occurs through shortest +// path. If a direction is required, use GoTo_DIR(). +void GoHome() +{ + Data_To_Transfer(x_GO_HOME); +} + +// GoMark is equivalent to GoTo(MARK), but requires less time to send. +// Note that no direction is provided; motion occurs through shortest +// path. If a direction is required, use GoTo_DIR(). +void GoMark() +{ + Data_To_Transfer(x_GO_MARK); +} + +// Sets the ABS_POS register to 0, effectively declaring the current +// position to be "HOME". +void ResetPos() +{ + byte value = x_RESET_POS; + Data_To_Transfer(value); +} + +// Reset device to power up conditions. Equivalent to toggling the STBY +// pin or cycling power. +void ResetDev() +{ + byte value = x_RESET_DEVICE; + Data_To_Transfer(value); +} + +// Bring the motor to a halt using the deceleration curve. +void SoftStop() +{ + byte value = x_SOFT_STOP; + Data_To_Transfer(value); +} + +// Stop the motor with infinite deceleration. +void HardStop() +{ + byte value = x_HARD_STOP; + Data_To_Transfer(value); +} + +// Decelerate the motor and put the bridges in Hi-Z state. +void SoftHiZ() +{ + byte value = x_SOFT_HIZ; + Data_To_Transfer(value); +} + +// Put the bridges in Hi-Z state immediately with no deceleration. +void HardHiZ() +{ + byte value = x_HARD_HIZ; + Data_To_Transfer(value); +} + +// Fetch and return the 16-bit value in the STATUS register. Resets +// any warning flags and exits any error states. Using GetParam() +// to read STATUS does not clear these values. +int GetStatus() +{ + int temp = 0; + Data_To_Transfer(x_GET_STATUS); + temp = Data_To_Transfer(0) << 8; + temp |= Data_To_Transfer(0); + return temp; +} + + + + +unsigned long AccCalc(float stepsPerSecPerSec) +{ + float temp = (float)(stepsPerSecPerSec * 0.137438); + if ( ((unsigned long) ( (long)(temp) )) > 0x00000FFF ) + return 0x00000FFF; + else return (unsigned long) (long)(temp); +} + +// The calculation for DEC is the same as for ACC. Value is 0x08A on boot. +// This is a 12-bit value, so we need to make sure the value is at or below 0xFFF. +unsigned long DecCalc(float stepsPerSecPerSec) +{ + float temp = (float)(stepsPerSecPerSec * 0.137438); + if ((unsigned long) (long)(temp) > 0x00000FFF) return 0x00000FFF; + else return (unsigned long) (long)(temp); +} + +// The value in the MAX_SPD register is [(steps/s)*(tick)]/(2^-18) where tick is +// 250ns (datasheet value)- 0x041 on boot. +// Multiply desired steps/s by .065536 to get an appropriate value for this register +// This is a 10-bit value, so we need to make sure it remains at or below 0x3FF +unsigned long MaxSpdCalc(float stepsPerSec) +{ + float temp = (float)(stepsPerSec * .065536); + if ((unsigned long) (long)(temp) > 0x000003FF) return 0x000003FF; + else return (unsigned long) (long)(temp); +} + +// The value in the MIN_SPD register is [(steps/s)*(tick)]/(2^-24) where tick is +// 250ns (datasheet value)- 0x000 on boot. +// Multiply desired steps/s by 4.1943 to get an appropriate value for this register +// This is a 12-bit value, so we need to make sure the value is at or below 0xFFF. +unsigned long MinSpdCalc(float stepsPerSec) +{ + float temp = (float)(stepsPerSec * 4.1943); + if ((unsigned long) (long)(temp) > 0x00000FFF) return 0x00000FFF; + else return (unsigned long) (long)(temp); +} + +// The value in the FS_SPD register is ([(steps/s)*(tick)]/(2^-18))-0.5 where tick is +// 250ns (datasheet value)- 0x027 on boot. +// Multiply desired steps/s by .065536 and subtract .5 to get an appropriate value for this register +// This is a 10-bit value, so we need to make sure the value is at or below 0x3FF. +unsigned long FSCalc(float stepsPerSec) +{ + float temp = (float)((stepsPerSec * .065536) - .5); + if ((unsigned long) (long)(temp) > 0x000003FF) return 0x000003FF; + else return (unsigned long) (long)(temp); +} + +// The value in the INT_SPD register is [(steps/s)*(tick)]/(2^-24) where tick is +// 250ns (datasheet value)- 0x408 on boot. +// Multiply desired steps/s by 4.1943 to get an appropriate value for this register +// This is a 14-bit value, so we need to make sure the value is at or below 0x3FFF. +unsigned long IntSpdCalc(float stepsPerSec) +{ + float temp = (float)(stepsPerSec * 4.1943); + if ((unsigned long) (long)(temp) > 0x00003FFF) return 0x00003FFF; + else return (unsigned long) (long)(temp); +} + +// When issuing RUN command, the 20-bit speed is [(steps/s)*(tick)]/(2^-28) where tick is +// 250ns (datasheet value). +// Multiply desired steps/s by 67.106 to get an appropriate value for this register +// This is a 20-bit value, so we need to make sure the value is at or below 0xFFFFF. +uint32_t SpdCalc(float stepsPerSec)// for run request +{ +// float temp = (float)(stepsPerSec * 67.106); +// if ((unsigned long) (long)(temp) > 0x000FFFFF) return 0x000FFFFF; +// else return (unsigned long)temp; + + uint32_t temp = 67108 * stepsPerSec; + uint32_t stepspertick = temp/1000 ; + if(stepspertick > 0xFFFFF) + stepspertick = 0xFFFFF; + return stepspertick; +} +float CurrentSpdCalc(uint32_t stepspertick)// for Speed response +{ +// float temp = (float)(stepspertick); +// float stepsPerSec = (float)(temp / 67.106); +// if(stepsPerSec>15625) stepsPerSec = 15625; + float temp = (float)(stepspertick *1000); + float stepsPerSec = (float)(temp/67108.0); + if(stepsPerSec>15625.0) stepsPerSec = 15625.0; // The available range is from 0 to 15625 step/s + + return stepsPerSec; +} + + + +// This simple function shifts a byte out over SPI and receives a byte over +// SPI. Unusually for SPI devices, the x requires a toggling of the +// CS (slaveSelect) pin after each byte sent. That makes this function +// a bit more reasonable, because we can include more functionality in it. +byte Data_To_Transfer(byte data) +{ + + //while(SSIBusy(SSI2_BASE)){}; + //while(Check_SPI_Busy() == BUSY){}; + + byte data_out = 0; + /* + //digitalWrite(_CS, LOW); + L6470_CS = LOW; + //data_out = SPI.transfer(data); + L6470_TX = data; + data_out = L6470_RX; + + //digitalWrite(_CS, HIGH); + L6470_CS = HIGH; + return data_out; + */ + + data_out = Transfer_tx(data/*, &data_out*/ ); + return data_out; +} + + +// the register will be automatically zero. +// When disabling, the value will have to be explicitly written by +// the user with a SetParam() call. See the datasheet for further +// information about low-speed optimization.// Much of the functionality between "get parameter" and "set parameter" is +// very similar, so we deal with that by putting all of it in one function +// here to save memory space and simplify the program. +unsigned long ParamHandler(byte param, unsigned long value) +{ + unsigned long ret_val = 0; // This is a temp for the value to return. + // This switch structure handles the appropriate action for each register. + // This is necessary since not all registers are of the same length, either + // bit-wise or byte-wise, so we want to make sure we mask out any spurious + // bits and do the right number of transfers. That is handled by the x_Param() + // function, in most cases, but for 1-byte or smaller transfers, we call + // Data_To_Transfer() directly. + switch (param) + { + // ABS_POS is the current absolute offset from home. It is a 22 bit number expressed + // in two's complement. At power up, this value is 0. It cannot be written when + // the motor is running, but at any other time, it can be updated to change the + // interpreted position of the motor. + case x_ABS_POS: + ret_val = Param(value, 22); + break; + // EL_POS is the current electrical position in the step generation cycle. It can + // be set when the motor is not in motion. Value is 0 on power up. + case x_EL_POS: + ret_val = Param(value, 9); + break; + // MARK is a second position other than 0 that the motor can be told to go to. As + // with ABS_POS, it is 22-bit two's complement. Value is 0 on power up. + case x_MARK: + ret_val = Param(value, 22); + break; + // SPEED contains information about the current speed. It is read-only. It does + // NOT provide direction information. + case x_SPEED: + ret_val = Param(0, 32); + break; + // ACC and DEC set the acceleration and deceleration rates. Set ACC to 0xFFF + // to get infinite acceleration/decelaeration- there is no way to get infinite + // deceleration w/o infinite acceleration (except the HARD STOP command). + // Cannot be written while motor is running. Both default to 0x08A on power up. + // AccCalc() and DecCalc() functions exist to convert steps/s/s values into + // 12-bit values for these two registers. + case x_ACC: + ret_val = Param(value, 12); + break; + case x_DEC: + ret_val = Param(value, 12); + break; + // MAX_SPEED is just what it says- any command which attempts to set the speed + // of the motor above this value will simply cause the motor to turn at this + // speed. Value is 0x041 on power up. + // MaxSpdCalc() function exists to convert steps/s value into a 10-bit value + // for this register. + case x_MAX_SPEED: + ret_val = Param(value, 10); + break; + // MIN_SPEED controls two things- the activation of the low-speed optimization + // feature and the lowest speed the motor will be allowed to operate at. LSPD_OPT + // is the 13th bit, and when it is set, the minimum allowed speed is automatically + // set to zero. This value is 0 on startup. + // MinSpdCalc() function exists to convert steps/s value into a 12-bit value for this + // register. SetLSPDOpt() function exists to enable/disable the optimization feature. + case x_MIN_SPEED: + ret_val = Param(value, 12); + break; + // FS_SPD register contains a threshold value above which microstepping is disabled + // and the x operates in full-step mode. Defaults to 0x027 on power up. + // FSCalc() function exists to convert steps/s value into 10-bit integer for this + // register. + case x_FS_SPD: + ret_val = Param(value, 10); + break; + // KVAL is the maximum voltage of the PWM outputs. These 8-bit values are ratiometric + // representations: 255 for full output voltage, 128 for half, etc. Default is 0x29. + // The implications of different KVAL settings is too complex to dig into here, but + // it will usually work to max the value for RUN, ACC, and DEC. Maxing the value for + // HOLD may result in excessive power dissipation when the motor is not running. + case x_KVAL_HOLD: + ret_val = Data_To_Transfer((byte)value); + break; + case x_KVAL_RUN: + ret_val = Data_To_Transfer((byte)value); + break; + case x_KVAL_ACC: + ret_val = Data_To_Transfer((byte)value); + break; + case x_KVAL_DEC: + ret_val = Data_To_Transfer((byte)value); + break; + // INT_SPD, ST_SLP, FN_SLP_ACC and FN_SLP_DEC are all related to the back EMF + // compensation functionality. Please see the datasheet for details of this + // function- it is too complex to discuss here. Default values seem to work + // well enough. + case x_INT_SPD: + ret_val = Param(value, 14); + break; + case x_ST_SLP: + ret_val = Data_To_Transfer((byte)value); + break; + case x_FN_SLP_ACC: + ret_val = Data_To_Transfer((byte)value); + break; + case x_FN_SLP_DEC: + ret_val = Data_To_Transfer((byte)value); + break; + // K_THERM is motor winding thermal drift compensation. Please see the datasheet + // for full details on operation- the default value should be okay for most users. + case x_K_THERM: + ret_val = Data_To_Transfer((byte)value & 0x0F); + break; + // ADC_OUT is a read-only register containing the result of the ADC measurements. + // This is less useful than it sounds; see the datasheet for more information. + case x_ADC_OUT: + ret_val = Data_To_Transfer(0); + break; + // Set the overcurrent threshold. Ranges from 375mA to 6A in steps of 375mA. + // A set of defined constants is provided for the user's convenience. Default + // value is 3.375A- 0x08. This is a 4-bit value. + case x_OCD_TH: + ret_val = Data_To_Transfer((byte)value & 0x0F); + break; + // Stall current threshold. Defaults to 0x40, or 2.03A. Value is from 31.25mA to + // 4A in 31.25mA steps. This is a 7-bit value. + case x_STALL_TH: + ret_val = Data_To_Transfer((byte)value & 0x7F); + break; + // STEP_MODE controls the microstepping settings, as well as the generation of an + // output signal from the x. Bits 2:0 control the number of microsteps per + // step the part will generate. Bit 7 controls whether the BUSY/SYNC pin outputs + // a BUSY signal or a step synchronization signal. Bits 6:4 control the frequency + // of the output signal relative to the full-step frequency; see datasheet for + // that relationship as it is too complex to reproduce here. + // Most likely, only the microsteps per step value will be needed; there is a set + // of constants provided for ease of use of these values. + case x_STEP_MODE: + ret_val = Data_To_Transfer((byte)value); + break; + // ALARM_EN controls which alarms will cause the FLAG pin to fall. A set of constants + // is provided to make this easy to interpret. By default, ALL alarms will trigger the + // FLAG pin. + case x_ALARM_EN: + ret_val = Data_To_Transfer((byte)value); + break; + // CONFIG contains some assorted configuration bits and fields. A fairly comprehensive + // set of reasonably self-explanatory constants is provided, but users should refer + // to the datasheet before modifying the contents of this register to be certain they + // understand the implications of their modifications. Value on boot is 0x2E88; this + // can be a useful way to verify proper start up and operation of the x chip. + case x_CONFIG: + ret_val = Param(value, 16); + break; + // STATUS contains read-only information about the current condition of the chip. A + // comprehensive set of constants for masking and testing this register is provided, but + // users should refer to the datasheet to ensure that they fully understand each one of + // the bits in the register. + case x_STATUS: // STATUS is a read-only register + ret_val = Param(0, 16); + break; + default: + ret_val = Data_To_Transfer((byte)(value)); + break; + } + return ret_val; +} + +// Generalization of the subsections of the register read/write functionality. +// We want the end user to just write the value without worrying about length, +// so we pass a bit length parameter from the calling function. +unsigned long Param(unsigned long value, byte bit_len) +{ + unsigned long ret_val = 0; // We'll return this to generalize this function + // for both read and write of registers. + byte byte_len = bit_len / 8; // How many BYTES do we have? + if (bit_len % 8 > 0) byte_len++; // Make sure not to lose any partial byte values. + // Let's make sure our value has no spurious bits set, and if the value was too + // high, max it out. + unsigned long mask = 0xffffffff >> (32 - bit_len); + if (value > mask) + value = mask; + // The following three if statements handle the various possible byte length + // transfers- it'll be no less than 1 but no more than 3 bytes of data. + // Data_To_Transfer() sends a byte out through SPI and returns a byte received + // over SPI- when calling it, we typecast a shifted version of the masked + // value, then we shift the received value back by the same amount and + // store it until return time. + if (byte_len == 3) { + ret_val |= Data_To_Transfer((byte)(value >> 16)) << 16; + //Serial.println(ret_val, HEX); + } + if (byte_len >= 2) { + ret_val |= Data_To_Transfer((byte)(value >> 8)) << 8; + //Serial.println(ret_val, HEX); + } + if (byte_len >= 1) { + //Serial.print("Value = "); + //Serial.println(value); + //Serial.print("ret_val = "); + //Serial.println(ret_val); + + ret_val |= Data_To_Transfer((byte)value); + + //Serial.print("ret_val = "); + //Serial.println(ret_val); + + //Serial.println(ret_val, HEX); + } + // Return the received values. Mask off any unnecessary bits, just for + // the sake of thoroughness- we don't EXPECT to see anything outside + // the bit length range but better to be safe than sorry. + return (ret_val & mask); +} + +// This simple function shifts a byte out over SPI and receives a byte over +// SPI. Unusually for SPI devices, the x requires a toggling of the +// CS (slaveSelect) pin after each byte sent. That makes this function +// a bit more reasonable, because we can include more functionality in it. + +// +//void Set_MOSI(int MOSI) +// +//{ +// _MOSI = MOSI; +//} +// +//void Set_MISO(int MISO) +// +//{ +// _MISO = MISO; +//} +// +//void Set_CS(int CS) +// +//{ +// _CS = CS; +//} +// +//void Set_CLK(int CLK) +// +//{ +// _CLK = CLK; +//} +// +//void Set_BUSY(int BUSY) +// +//{ +// _BUSY = BUSY; +//} +// +//void Set_RESET(int RESET) +// +//{ +// _RESET = RESET; +//} +// +//int Get_MOSI() +//{ +// return MOSI; +//} +// +//int Get_MISO() +//{ +// return MISO; +//} +// +//int Get_CS() +//{ +// return CS; +//} +//int Get_CLK() +//{ +// return CLK; +//} +// +//int Get_BUSY() +//{ +// return BUSY; +//} +//int Get_RESET() +//{ +// return RESET; +//} + + diff --git a/Software/Embedded_SW/Embedded/Drivers/FPGA/Motors_Driver/L6470.h b/Software/Embedded_SW/Embedded/Drivers/FPGA/Motors_Driver/L6470.h new file mode 100644 index 000000000..745a7f753 --- /dev/null +++ b/Software/Embedded_SW/Embedded/Drivers/FPGA/Motors_Driver/L6470.h @@ -0,0 +1,341 @@ +/* +* cL6470.h +* +* Created: 6/22/2016 8:40:34 PM +* Author: Atif +*/ + + +#ifndef CL6470_H_ +#define CL6470_H_ + +//#include +//#include + +// + +// + +// constant definitions for overcurrent thresholds. Write these values to +// register x_OCD_TH to set the level at which an overcurrent even occurs. +#define x_OCD_TH_375mA 0x00 +#define x_OCD_TH_750mA 0x01 +#define x_OCD_TH_1125mA 0x02 +#define x_OCD_TH_1500mA 0x03 +#define x_OCD_TH_1875mA 0x04 +#define x_OCD_TH_2250mA 0x05 +#define x_OCD_TH_2625mA 0x06 +#define x_OCD_TH_3000mA 0x07 +#define x_OCD_TH_3375mA 0x08 +#define x_OCD_TH_3750mA 0x09 +#define x_OCD_TH_4125mA 0x0A +#define x_OCD_TH_4500mA 0x0B +#define x_OCD_TH_4875mA 0x0C +#define x_OCD_TH_5250mA 0x0D +#define x_OCD_TH_5625mA 0x0E +#define x_OCD_TH_6000mA 0x0F + +// STEP_MODE option values. +// First comes the "microsteps per step" options... +#define x_STEP_MODE_STEP_SEL 0x07 // Mask for these bits only. +#define x_STEP_SEL_1 0x00 +#define x_STEP_SEL_1_2 0x01 +#define x_STEP_SEL_1_4 0x02 +#define x_STEP_SEL_1_8 0x03 +#define x_STEP_SEL_1_16 0x04 +#define x_STEP_SEL_1_32 0x05 +#define x_STEP_SEL_1_64 0x06 +#define x_STEP_SEL_1_128 0x07 + +// ...next, define the SYNC_EN bit. When set, the BUSYN pin will instead +// output a clock related to the full-step frequency as defined by the +// SYNC_SEL bits below. +#define x_STEP_MODE_SYNC_EN 0x80 // Mask for this bit +#define x_SYNC_EN 0x80 + +// ...last, define the SYNC_SEL modes. The clock output is defined by +// the full-step frequency and the value in these bits- see the datasheet +// for a matrix describing that relationship (page 46). +#define x_STEP_MODE_SYNC_SEL 0x70 +#define x_SYNC_SEL_1_2 0x00 +#define x_SYNC_SEL_1 0x10 +#define x_SYNC_SEL_2 0x20 +#define x_SYNC_SEL_4 0x30 +#define x_SYNC_SEL_8 0x40 +#define x_SYNC_SEL_16 0x50 +#define x_SYNC_SEL_32 0x60 +#define x_SYNC_SEL_64 0x70 + +// Bit names for the ALARM_EN register. +// Each of these bits defines one potential alarm condition. +// When one of these conditions occurs and the respective bit in ALARM_EN is set, +// the FLAG pin will go low. The register must be queried to determine which event +// caused the alarm. +#define x_ALARM_EN_OVERCURRENT 0x01 +#define x_ALARM_EN_THERMAL_SHUTDOWN 0x02 +#define x_ALARM_EN_THERMAL_WARNING 0x04 +#define x_ALARM_EN_UNDER_VOLTAGE 0x08 +#define x_ALARM_EN_STALL_DET_A 0x10 +#define x_ALARM_EN_STALL_DET_B 0x20 +#define x_ALARM_EN_SW_TURN_ON 0x40 +#define x_ALARM_EN_WRONG_NPERF_CMD 0x80 + +// CONFIG register renames. + +// Oscillator options. +// The x needs to know what the clock frequency is because it uses that for some +// calculations during operation. +#define x_CONFIG_OSC_SEL 0x000F // Mask for this bit field. +#define x_CONFIG_INT_16MHZ 0x0000 // Internal 16MHz, no output +#define x_CONFIG_INT_16MHZ_OSCOUT_2MHZ 0x0008 // Default; internal 16MHz, 2MHz output +#define x_CONFIG_INT_16MHZ_OSCOUT_4MHZ 0x0009 // Internal 16MHz, 4MHz output +#define x_CONFIG_INT_16MHZ_OSCOUT_8MHZ 0x000A // Internal 16MHz, 8MHz output +#define x_CONFIG_INT_16MHZ_OSCOUT_16MHZ 0x000B // Internal 16MHz, 16MHz output +#define x_CONFIG_EXT_8MHZ_XTAL_DRIVE 0x0004 // External 8MHz crystal +#define x_CONFIG_EXT_16MHZ_XTAL_DRIVE 0x0005 // External 16MHz crystal +#define x_CONFIG_EXT_24MHZ_XTAL_DRIVE 0x0006 // External 24MHz crystal +#define x_CONFIG_EXT_32MHZ_XTAL_DRIVE 0x0007 // External 32MHz crystal +#define x_CONFIG_EXT_8MHZ_OSCOUT_INVERT 0x000C // External 8MHz crystal, output inverted +#define x_CONFIG_EXT_16MHZ_OSCOUT_INVERT 0x000D // External 16MHz crystal, output inverted +#define x_CONFIG_EXT_24MHZ_OSCOUT_INVERT 0x000E // External 24MHz crystal, output inverted +#define x_CONFIG_EXT_32MHZ_OSCOUT_INVERT 0x000F // External 32MHz crystal, output inverted + +// Configure the functionality of the external switch input +#define x_CONFIG_SW_MODE 0x0010 // Mask for this bit. +#define x_CONFIG_SW_HARD_STOP 0x0000 // Default; hard stop motor on switch. +#define x_CONFIG_SW_USER 0x0010 // Tie to the GoUntil and ReleaseSW +// commands to provide jog function. +// See page 25 of datasheet. + +// Configure the motor voltage compensation mode (see page 34 of datasheet) +#define x_CONFIG_EN_VSCOMP 0x0020 // Mask for this bit. +#define x_CONFIG_VS_COMP_DISABLE 0x0000 // Disable motor voltage compensation. +#define x_CONFIG_VS_COMP_ENABLE 0x0020 // Enable motor voltage compensation. + +// Configure overcurrent detection event handling +#define x_CONFIG_OC_SD 0x0080 // Mask for this bit. +#define x_CONFIG_OC_SD_DISABLE 0x0000 // Bridges do NOT shutdown on OC detect +#define x_CONFIG_OC_SD_ENABLE 0x0080 // Bridges shutdown on OC detect + +// Configure the slew rate of the power bridge output +#define x_CONFIG_POW_SR 0x0300 // Mask for this bit field. +#define x_CONFIG_SR_180V_us 0x0000 // 180V/us +#define x_CONFIG_SR_290V_us 0x0200 // 290V/us +#define x_CONFIG_SR_530V_us 0x0300 // 530V/us + +// Integer divisors for PWM sinewave generation +// See page 32 of the datasheet for more information on this. +#define x_CONFIG_F_PWM_DEC 0x1C00 // mask for this bit field +#define x_CONFIG_PWM_MUL_0_625 (0x00)<<10 +#define x_CONFIG_PWM_MUL_0_75 (0x01)<<10 +#define x_CONFIG_PWM_MUL_0_875 (0x02)<<10 +#define x_CONFIG_PWM_MUL_1 (0x03)<<10 +#define x_CONFIG_PWM_MUL_1_25 (0x04)<<10 +#define x_CONFIG_PWM_MUL_1_5 (0x05)<<10 +#define x_CONFIG_PWM_MUL_1_75 (0x06)<<10 +#define x_CONFIG_PWM_MUL_2 (0x07)<<10 + +// Multiplier for the PWM sinewave frequency +#define x_CONFIG_F_PWM_INT 0xE000 // mask for this bit field. +#define x_CONFIG_PWM_DIV_1 (0x00)<<13 +#define x_CONFIG_PWM_DIV_2 (0x01)<<13 +#define x_CONFIG_PWM_DIV_3 (0x02)<<13 +#define x_CONFIG_PWM_DIV_4 (0x03)<<13 +#define x_CONFIG_PWM_DIV_5 (0x04)<<13 +#define x_CONFIG_PWM_DIV_6 (0x05)<<13 +#define x_CONFIG_PWM_DIV_7 (0x06)<<13 + +// Status register bit renames- read-only bits conferring information about the +// device to the user. +#define x_STATUS_HIZ 0x0001 // high when bridges are in HiZ mode +#define x_STATUS_BUSY 0x0002 // mirrors BUSY pin +#define x_STATUS_SW_F 0x0004 // low when switch open, high when closed +#define x_STATUS_SW_EVN 0x0008 // active high, set on switch falling edge, +// cleared by reading STATUS +#define x_STATUS_DIR 0x0010 // Indicates current motor direction. +// High is FWD, Low is REV. +#define x_STATUS_NOTPERF_CMD 0x0080 // Last command not performed. +#define x_STATUS_WRONG_CMD 0x0100 // Last command not valid. +#define x_STATUS_UVLO 0x0200 // Undervoltage lockout is active +#define x_STATUS_TH_WRN 0x0400 // Thermal warning +#define x_STATUS_TH_SD 0x0800 // Thermal shutdown +#define x_STATUS_OCD 0x1000 // Overcurrent detected +#define x_STATUS_STEP_LOSS_A 0x2000 // Stall detected on A bridge +#define x_STATUS_STEP_LOSS_B 0x4000 // Stall detected on B bridge +#define x_STATUS_SCK_MOD 0x8000 // Step clock mode is active + +// Status register motor status field +#define x_STATUS_MOT_STATUS 0x0060 // field mask +#define x_STATUS_MOT_STATUS_STOPPED (0x0000)<<13 // Motor stopped +#define x_STATUS_MOT_STATUS_ACCELERATION (0x0001)<<13 // Motor accelerating +#define x_STATUS_MOT_STATUS_DECELERATION (0x0002)<<13 // Motor decelerating +#define x_STATUS_MOT_STATUS_CONST_SPD (0x0003)<<13 // Motor at constant speed + +// Register address redefines. +// See the x_Param_Handler() function for more info about these. +#define x_ABS_POS 0x01 +#define x_EL_POS 0x02 +#define x_MARK 0x03 +#define x_SPEED 0x04 +#define x_ACC 0x05 +#define x_DEC 0x06 +#define x_MAX_SPEED 0x07 +#define x_MIN_SPEED 0x08 +#define x_FS_SPD 0x15 +#define x_KVAL_HOLD 0x09 +#define x_KVAL_RUN 0x0A +#define x_KVAL_ACC 0x0B +#define x_KVAL_DEC 0x0C +#define x_INT_SPD 0x0D +#define x_ST_SLP 0x0E +#define x_FN_SLP_ACC 0x0F +#define x_FN_SLP_DEC 0x10 +#define x_K_THERM 0x11 +#define x_ADC_OUT 0x12 +#define x_OCD_TH 0x13 +#define x_STALL_TH 0x14 +#define x_STEP_MODE 0x16 +#define x_ALARM_EN 0x17 +#define x_CONFIG 0x18 +#define x_STATUS 0x19 + +//x commands +#define x_NOP 0x00 +#define x_SET_PARAM 0x00 +#define x_GET_PARAM 0x20 +#define x_RUN 0x50 +#define x_STEP_CLOCK 0x58 +#define x_MOVE 0x40 +#define x_GOTO 0x60 +#define x_GOTO_DIR 0x68 +#define x_GO_UNTIL 0x82 +#define x_RELEASE_SW 0x92 +#define x_GO_HOME 0x70 +#define x_GO_MARK 0x78 +#define x_RESET_POS 0xD8 +#define x_RESET_DEVICE 0xC0 +#define x_SOFT_STOP 0xB0 +#define x_HARD_STOP 0xB8 +#define x_SOFT_HIZ 0xA0 +#define x_HARD_HIZ 0xA8 +#define x_GET_STATUS 0xD0 // use Get_and_Clear_Status + +/* x direction options */ +#define FWD 0x01 +#define REV 0x00 + +/* x action options */ +#define ACTION_RESET 0x00 +#define ACTION_COPY 0x01 + + + +//class cL6470 { +//public: + +//Default constuctot +//cL6470(); + +//Overload Constructor +//@param int MOSI, int MISO, int CS, int CLK, int BUSY, int RESET +//cL6470(int, int, int, int, int, int); + +#include "../../../DataDef.h" + +void init(); +unsigned long GetParam(byte); +byte Data_To_Transfer(byte); +unsigned long ParamHandler(byte, unsigned long); +void SetParam(byte, unsigned long); +unsigned long Param(unsigned long, byte); +int GetStatus(); +uint32_t SpdCalc(float); +unsigned long IntSpdCalc(float); +unsigned long FSCalc(float); +unsigned long MinSpdCalc(float); +unsigned long MaxSpdCalc(float); +unsigned long DecCalc(float); +unsigned long AccCalc(float); +void SetLSPDOpt(boolean); +void Run(byte, unsigned long); +void Step_Clock(byte); +void Move(byte, unsigned long); +void GoTo(unsigned long); +void GoTo_DIR(byte, unsigned long); +void GoUntil(byte, byte, unsigned long); +void ReleaseSW(byte, byte); +void GoHome(); +void GoMark(); +void ResetPos(); +void ResetDev(); +void SoftStop(); +void HardStop(); +void SoftHiZ(); +void HardHiZ(); +float CurrentSpdCalc(uint32_t stepspertick);// for Speed response +void delay(int number_of_seconds); +void Run_tx_test(byte dir, unsigned long spd); +////TODO update the addresses +//#define MOSI_BASE 0x00000001 // +//#define MISO_BASE 0x00000002 // +//#define CS_BASE 0x00000003 // +//#define CLK_BASE 0x00000004 // +//#define BUSY_BASE 0x00000005 // +//#define RESET_BASE 0x00000006 // +//#define TX_BASE 0x00000006 // +//#define RX_BASE 0x00000007 // + + +//extern int volatile * const MOSI_Reg; +//extern int volatile * const MISO_Reg; +//extern int volatile * const CS_Reg; +//extern int volatile * const CLK_Reg; +//extern int volatile * const BUSY_Reg; +//extern int volatile * const RESET_Reg; +//extern char volatile * const TX_Reg; +//extern char volatile * const RX_Reg; + +//*MOSI = value; /* write to port */ +//value = *MOSI; /* read from port */ + + + +/////////////// + + +////@param int MOSI +//void Set_MOSI(int); +////@param int MISO +//void Set_MISO(int); +////@param int CS +//void Set_CS(int); +////@param int CLK +//void Set_CLK(int); +////@param int BUSY +//void Set_BUSY(int); +////@param int RESET +//void Set_RESET(int); + + + +//int Get_MOSI(); +//int Get_MISO(); +//int Get_CS(); +//int Get_CLK(); +//int Get_BUSY(); +//int Get_RESET(); + + +//private: +// Member Variable + +//int MOSI = 0; +//int MISO = 0; +//int CS = 0; +//int CLK = 0; +//int BUSY = 0; +//int RESET = 0; +//}; + + +#endif /* CL6470_H_ */ diff --git a/Software/Embedded_SW/Embedded/Drivers/FPGA/Motors_Driver/PowerSTEP01.h b/Software/Embedded_SW/Embedded/Drivers/FPGA/Motors_Driver/PowerSTEP01.h new file mode 100644 index 000000000..ab99cc340 --- /dev/null +++ b/Software/Embedded_SW/Embedded/Drivers/FPGA/Motors_Driver/PowerSTEP01.h @@ -0,0 +1,168 @@ +/* + * PowerSTEP01.h + * //Based on: + * //https://os.mbed.com/teams/ST/code/X_NUCLEO_IHM03A1/file/2fbfe0cd8d4d/Components/powerstep01/powerstep01.h/ + * + * Created on: Mar 5, 2019 + * Author: avi + */ + +#ifndef DRIVERS_FPGA_MOTORS_DRIVER_POWERSTEP01_H_ +#define DRIVERS_FPGA_MOTORS_DRIVER_POWERSTEP01_H_ + + +//powerSTEP01 +#define x_POWERSTEP01_GATECFG1 0x18 //Gate driver configuration 11 bit +#define x_POWERSTEP01_GATECFG2 0x19 //Gate driver configuration 8 bit +#define x_POWERSTEP01_STATUS 0x1B //x_GET_STATUS is the same as in L6470 +#define x_POWERSTEP01_CONFIG 0x1A + +#define x_KVAL_TVAL_HOLD 0x09 +#define x_KVAL_TVAL_RUN 0x0A +#define x_KVAL_TVAL_ACC 0x0B +#define x_KVAL_TVAL_DEC 0x0C +#define x_ST_SLP_T_FAST 0x0E +#define x_FN_SLP_ACC_TON_MIN 0x0F +#define x_FN_SLP_DEC_TOFF_MIN 0x10 + +///Shift of TCC field in GATECFG1 register +#define POWERSTEP01_TCC_SHIFT (0) +///Shift of IGATE field in GATECFG1 register +#define POWERSTEP01_IGATE_SHIFT (5) +///Shift of TBOOST field in GATECFG1 register +#define POWERSTEP01_TBOOST_SHIFT (8) + +///Shift of TBLANK field in GATECFG2 register +#define POWERSTEP01_TBLANK_SHIFT (5) +///Shift of TDT field in GATECFG2 register +#define POWERSTEP01_TDT_SHIFT (0) + +/// masks for GATECFG1 register of PowerStep01 +typedef enum { + POWERSTEP01_GATECFG1_TCC_MASK = ((uint16_t)0x001F), + POWERSTEP01_GATECFG1_IGATE_MASK = ((uint16_t)0x00E0), + POWERSTEP01_GATECFG1_TBOOST_MASK = ((uint16_t)0x0700), + POWERSTEP01_GATECFG1_WD_EN = ((uint16_t)0x0800) +} powerstep01_GateCfg1Masks_t; + +/// Control current Time (field TCC of GATECFG1 register of PowerStep01) +typedef enum { + POWERSTEP01_TCC_125ns = (((uint8_t)0x00)<Config[Dispenser_ID].Uchar = TCA9534_All_INPUT; - //Set all GPIO to Input - Regs->Config[Dispenser_ID].Uchar = TCA9534_All_INPUT; + Write_Buf[0] = TCA9534_CONFIG_REG; + Write_Buf[1] = Regs->Config[Dispenser_ID].Uchar; - Write_Buf[0] = TCA9534_CONFIG_REG; - Write_Buf[1] = Regs->Config[Dispenser_ID].Uchar; + status |= I2C_Write(I2C_ID_DISP_MUX, TCA9534_ADDRESS, Write_Buf, 2); + } - status |= I2C_Write(I2C_ID_DISP_MUX, TCA9534_ADDRESS, Write_Buf, 2); + Regs->Input[Dispenser_ID].bit.DISP_UP = No_Safety_Event; + Regs->Input[Dispenser_ID].bit.DISP_DOWN = No_Safety_Event; + Regs->Input[Dispenser_ID].bit.RELAY_ON = No_Safety_Event; + Regs->Input[Dispenser_ID].bit.OVER_PRESS = No_Safety_Event; return status; @@ -40,15 +48,16 @@ uint8_t TCA9534SetReadInputReg(uint8_t Dispenser_ID)//2 set before read { uint8_t status = PASSED; - uint8_t Write_Buf[1]; - - status |= Select_Dispenser_Mux_Channel(Dispenser_ID); - - Write_Buf[0] = TCA9534_INPUT_REG; + if(Dispenser_struct[Dispenser_ID].Type == DISP_TYPE_EEPROM128KB) + { + uint8_t Write_Buf[1]; - status |= I2C_Write(I2C_ID_DISP_MUX, TCA9534_ADDRESS, Write_Buf, 1); + status |= Select_Dispenser_Mux_Channel(Dispenser_ID); + Write_Buf[0] = TCA9534_INPUT_REG; + status |= I2C_Write(I2C_ID_DISP_MUX, TCA9534_ADDRESS, Write_Buf, 1); + } return status; } @@ -56,10 +65,16 @@ uint8_t TCA9534ReadInputReg(uint8_t Dispenser_ID, TCA9534Regs* Regs)//3 read { uint8_t status = PASSED; - status |= Select_Dispenser_Mux_Channel(Dispenser_ID); + uint8_t Read_Buf[1]; - status |= I2C_Read(I2C_ID_DISP_MUX, TCA9534_ADDRESS + 1, Regs->Input[Dispenser_ID].Uchar, 1); + if(Dispenser_struct[Dispenser_ID].Type == DISP_TYPE_EEPROM128KB) + { + status |= Select_Dispenser_Mux_Channel(Dispenser_ID); + status |= I2C_Read(I2C_ID_DISP_MUX, TCA9534_ADDRESS + 1, Read_Buf, 1); + + Regs->Input[Dispenser_ID].Uchar = Read_Buf[0]; + } return status; } @@ -69,103 +84,106 @@ uint8_t TCA9534TestByPassTestRelay(uint8_t Dispenser_ID, TCA9534Regs* Regs)//Set { uint8_t status = PASSED; - uint8_t Write_Buf[2]; + if(Dispenser_struct[Dispenser_ID].Type == DISP_TYPE_EEPROM128KB) + { - //set Mux to the current dispenser Channel - status |= Select_Dispenser_Mux_Channel(Dispenser_ID); + uint8_t Write_Buf[2]; - //Read the Realay_on pin - TCA9534SetReadInputReg(Dispenser_ID); - TCA9534ReadInputReg(Dispenser_ID, Regs); - if(Regs->Config[Dispenser_ID].bit.RELAY_ON != HIGH) - { - status |= FAILED; - } + //set Mux to the current dispenser Channel + status |= Select_Dispenser_Mux_Channel(Dispenser_ID); - //Set RELAY_TEST to output: - Regs->Config[Dispenser_ID].bit.RELAY_TEST = TCA9534_OUTPUT; - Write_Buf[0] = TCA9534_CONFIG_REG; - Write_Buf[1] = Regs->Config[Dispenser_ID].Uchar; - status |= I2C_Write(I2C_ID_DISP_MUX, TCA9534_ADDRESS, Write_Buf, 2); + //Read the Realay_on pin + TCA9534SetReadInputReg(Dispenser_ID); + TCA9534ReadInputReg(Dispenser_ID, Regs); + if(Regs->Config[Dispenser_ID].bit.RELAY_ON != HIGH) + { + status |= FAILED; + } + //Set RELAY_TEST to output: + Regs->Config[Dispenser_ID].bit.RELAY_TEST = TCA9534_OUTPUT; + Write_Buf[0] = TCA9534_CONFIG_REG; + Write_Buf[1] = Regs->Config[Dispenser_ID].Uchar; + status |= I2C_Write(I2C_ID_DISP_MUX, TCA9534_ADDRESS, Write_Buf, 2); - //Set the test pin to LOW - Regs->Output[Dispenser_ID].bit.RELAY_TEST = LOW; - Write_Buf[0] = TCA9534_OUTPUT_REG; - Write_Buf[1] = Regs->Output[Dispenser_ID].Uchar; - status |= I2C_Write(I2C_ID_DISP_MUX, TCA9534_ADDRESS, Write_Buf, 2); - //deley - delayms(5); + //Set the test pin to LOW + Regs->Output[Dispenser_ID].bit.RELAY_TEST = LOW; + Write_Buf[0] = TCA9534_OUTPUT_REG; + Write_Buf[1] = Regs->Output[Dispenser_ID].Uchar; + status |= I2C_Write(I2C_ID_DISP_MUX, TCA9534_ADDRESS, Write_Buf, 2); - //Read the Realay_on pin - TCA9534SetReadInputReg(Dispenser_ID); - TCA9534ReadInputReg(Dispenser_ID, Regs); - if(Regs->Config[Dispenser_ID].bit.RELAY_ON != LOW) - { - status |= FAILED; - } + //deley + delayms(5); - //---------------------- test ByPass ---------------------- - //Set BYPASS to output: - Regs->Config[Dispenser_ID].bit.BYPASS = TCA9534_OUTPUT; - Write_Buf[0] = TCA9534_CONFIG_REG; - Write_Buf[1] = Regs->Config[Dispenser_ID].Uchar; - status |= I2C_Write(I2C_ID_DISP_MUX, TCA9534_ADDRESS, Write_Buf, 2); - - //Set the BYPASS pin to LOW - Regs->Output[Dispenser_ID].bit.BYPASS = LOW; - Write_Buf[0] = TCA9534_OUTPUT_REG; - Write_Buf[1] = Regs->Output[Dispenser_ID].Uchar; - status |= I2C_Write(I2C_ID_DISP_MUX, TCA9534_ADDRESS, Write_Buf, 2); - - //deley - delayms(Relay_Operate_time); - - //Read the Realay_on pin - TCA9534SetReadInputReg(Dispenser_ID); - TCA9534ReadInputReg(Dispenser_ID, Regs); - if(Regs->Config[Dispenser_ID].bit.RELAY_ON != HIGH) - { - status |= FAILED; - } + //Read the Realay_on pin + TCA9534SetReadInputReg(Dispenser_ID); + TCA9534ReadInputReg(Dispenser_ID, Regs); + if(Regs->Config[Dispenser_ID].bit.RELAY_ON != LOW) + { + status |= FAILED; + } - //Set BYPASS to input: - Regs->Config[Dispenser_ID].bit.BYPASS = TCA9534_INPUT; - Write_Buf[0] = TCA9534_CONFIG_REG; - Write_Buf[1] = Regs->Config[Dispenser_ID].Uchar; - status |= I2C_Write(I2C_ID_DISP_MUX, TCA9534_ADDRESS, Write_Buf, 2); + //---------------------- test ByPass ---------------------- + //Set BYPASS to output: + Regs->Config[Dispenser_ID].bit.BYPASS = TCA9534_OUTPUT; + Write_Buf[0] = TCA9534_CONFIG_REG; + Write_Buf[1] = Regs->Config[Dispenser_ID].Uchar; + status |= I2C_Write(I2C_ID_DISP_MUX, TCA9534_ADDRESS, Write_Buf, 2); - //deley - delayms(Relay_Operate_time); + //Set the BYPASS pin to LOW + Regs->Output[Dispenser_ID].bit.BYPASS = LOW; + Write_Buf[0] = TCA9534_OUTPUT_REG; + Write_Buf[1] = Regs->Output[Dispenser_ID].Uchar; + status |= I2C_Write(I2C_ID_DISP_MUX, TCA9534_ADDRESS, Write_Buf, 2); - //Read the Realay_on pin - TCA9534SetReadInputReg(Dispenser_ID); - TCA9534ReadInputReg(Dispenser_ID, Regs); - if(Regs->Config[Dispenser_ID].bit.RELAY_ON != LOW) - { - status |= FAILED; - } + //deley + delayms(Relay_Operate_time); - //--------------------------------------------------------- + //Read the Realay_on pin + TCA9534SetReadInputReg(Dispenser_ID); + TCA9534ReadInputReg(Dispenser_ID, Regs); + if(Regs->Config[Dispenser_ID].bit.RELAY_ON != HIGH) + { + status |= FAILED; + } - //Set RELAY_TEST to input: - Regs->Config[Dispenser_ID].bit.RELAY_TEST = TCA9534_INPUT; - Write_Buf[0] = TCA9534_CONFIG_REG; - Write_Buf[1] = Regs->Config[Dispenser_ID].Uchar; - status |= I2C_Write(I2C_ID_DISP_MUX, TCA9534_ADDRESS, Write_Buf, 2); + //Set BYPASS to input: + Regs->Config[Dispenser_ID].bit.BYPASS = TCA9534_INPUT; + Write_Buf[0] = TCA9534_CONFIG_REG; + Write_Buf[1] = Regs->Config[Dispenser_ID].Uchar; + status |= I2C_Write(I2C_ID_DISP_MUX, TCA9534_ADDRESS, Write_Buf, 2); - //deley - delayms(Relay_Operate_time); + //deley + delayms(Relay_Operate_time); - //Read the Realay_on pin - TCA9534SetReadInputReg(Dispenser_ID); - TCA9534ReadInputReg(Dispenser_ID, Regs); - if(Regs->Config[Dispenser_ID].bit.RELAY_ON != HIGH) - { - status |= FAILED; - } + //Read the Realay_on pin + TCA9534SetReadInputReg(Dispenser_ID); + TCA9534ReadInputReg(Dispenser_ID, Regs); + if(Regs->Config[Dispenser_ID].bit.RELAY_ON != LOW) + { + status |= FAILED; + } + + //--------------------------------------------------------- + + //Set RELAY_TEST to input: + Regs->Config[Dispenser_ID].bit.RELAY_TEST = TCA9534_INPUT; + Write_Buf[0] = TCA9534_CONFIG_REG; + Write_Buf[1] = Regs->Config[Dispenser_ID].Uchar; + status |= I2C_Write(I2C_ID_DISP_MUX, TCA9534_ADDRESS, Write_Buf, 2); + //deley + delayms(Relay_Operate_time); + + //Read the Realay_on pin + TCA9534SetReadInputReg(Dispenser_ID); + TCA9534ReadInputReg(Dispenser_ID, Regs); + if(Regs->Config[Dispenser_ID].bit.RELAY_ON != HIGH) + { + status |= FAILED; + } + } return status; } @@ -174,33 +192,37 @@ uint8_t TCA9534TestRelay(uint8_t Dispenser_ID, TCA9534Regs* Regs, bool EnableTes { uint8_t status = PASSED; - uint8_t Write_Buf[2]; - - //set Mux to the current dispenser Channel - status |= Select_Dispenser_Mux_Channel(Dispenser_ID); - - if(EnableTestRelay) + if(Dispenser_struct[Dispenser_ID].Type == DISP_TYPE_EEPROM128KB) { - //Set RELAY_TEST to output: - Regs->Config[Dispenser_ID].bit.RELAY_TEST = TCA9534_OUTPUT; - Write_Buf[0] = TCA9534_CONFIG_REG; - Write_Buf[1] = Regs->Config[Dispenser_ID].Uchar; - status |= I2C_Write(I2C_ID_DISP_MUX, TCA9534_ADDRESS, Write_Buf, 2); - - //Set the RELAY_TEST pin to LOW - Regs->Output[Dispenser_ID].bit.RELAY_TEST = LOW; - Write_Buf[0] = TCA9534_OUTPUT_REG; - Write_Buf[1] = Regs->Output[Dispenser_ID].Uchar; - status |= I2C_Write(I2C_ID_DISP_MUX, TCA9534_ADDRESS, Write_Buf, 2); + uint8_t Write_Buf[2]; + + //set Mux to the current dispenser Channel + status |= Select_Dispenser_Mux_Channel(Dispenser_ID); + + if(EnableTestRelay) + { + //Set RELAY_TEST to output: + Regs->Config[Dispenser_ID].bit.RELAY_TEST = TCA9534_OUTPUT; + Write_Buf[0] = TCA9534_CONFIG_REG; + Write_Buf[1] = Regs->Config[Dispenser_ID].Uchar; + status |= I2C_Write(I2C_ID_DISP_MUX, TCA9534_ADDRESS, Write_Buf, 2); + + //Set the RELAY_TEST pin to LOW + Regs->Output[Dispenser_ID].bit.RELAY_TEST = LOW; + Write_Buf[0] = TCA9534_OUTPUT_REG; + Write_Buf[1] = Regs->Output[Dispenser_ID].Uchar; + status |= I2C_Write(I2C_ID_DISP_MUX, TCA9534_ADDRESS, Write_Buf, 2); + } + /*else + { + //Set RELAY_TEST to input: + Regs->Config[Dispenser_ID].bit.RELAY_TEST = TCA9534_INPUT; + Write_Buf[0] = TCA9534_CONFIG_REG; + Write_Buf[1] = Regs->Config[Dispenser_ID].Uchar; + status |= I2C_Write(I2C_ID_DISP_MUX, TCA9534_ADDRESS, Write_Buf, 2); + }*/ } - - //Set RELAY_TEST to input: - Regs->Config[Dispenser_ID].bit.RELAY_TEST = TCA9534_INPUT; - Write_Buf[0] = TCA9534_CONFIG_REG; - Write_Buf[1] = Regs->Config[Dispenser_ID].Uchar; - status |= I2C_Write(I2C_ID_DISP_MUX, TCA9534_ADDRESS, Write_Buf, 2); - return status; } @@ -209,33 +231,38 @@ uint8_t TCA9534ByPass(uint8_t Dispenser_ID, TCA9534Regs* Regs, bool EnableByPass { uint8_t status = PASSED; - uint8_t Write_Buf[2]; - - //set Mux to the current dispenser Channel - status |= Select_Dispenser_Mux_Channel(Dispenser_ID); - - if(EnableByPass) + if(Dispenser_struct[Dispenser_ID].Type == DISP_TYPE_EEPROM128KB) { - //Set BYPASS to output: - Regs->Config[Dispenser_ID].bit.BYPASS = TCA9534_OUTPUT; - Write_Buf[0] = TCA9534_CONFIG_REG; - Write_Buf[1] = Regs->Config[Dispenser_ID].Uchar; - status |= I2C_Write(I2C_ID_DISP_MUX, TCA9534_ADDRESS, Write_Buf, 2); + uint8_t Write_Buf[2]; + + //set Mux to the current dispenser Channel + status |= Select_Dispenser_Mux_Channel(Dispenser_ID); + + if(EnableByPass) + { + //Set BYPASS to output: + Regs->Config[Dispenser_ID].bit.BYPASS = TCA9534_OUTPUT; + Write_Buf[0] = TCA9534_CONFIG_REG; + Write_Buf[1] = Regs->Config[Dispenser_ID].Uchar; + status |= I2C_Write(I2C_ID_DISP_MUX, TCA9534_ADDRESS, Write_Buf, 2); + + //Set the BYPASS pin to LOW + Regs->Output[Dispenser_ID].bit.BYPASS = LOW; + Write_Buf[0] = TCA9534_OUTPUT_REG; + Write_Buf[1] = Regs->Output[Dispenser_ID].Uchar; + status |= I2C_Write(I2C_ID_DISP_MUX, TCA9534_ADDRESS, Write_Buf, 2); + } + /*else + { + //Set BYPASS to input: + Regs->Config[Dispenser_ID].bit.BYPASS = TCA9534_INPUT; + Write_Buf[0] = TCA9534_CONFIG_REG; + Write_Buf[1] = Regs->Config[Dispenser_ID].Uchar; + status |= I2C_Write(I2C_ID_DISP_MUX, TCA9534_ADDRESS, Write_Buf, 2); + }*/ - //Set the BYPASS pin to LOW - Regs->Output[Dispenser_ID].bit.BYPASS = LOW; - Write_Buf[0] = TCA9534_OUTPUT_REG; - Write_Buf[1] = Regs->Output[Dispenser_ID].Uchar; - status |= I2C_Write(I2C_ID_DISP_MUX, TCA9534_ADDRESS, Write_Buf, 2); } - - //Set BYPASS to input: - Regs->Config[Dispenser_ID].bit.BYPASS = TCA9534_INPUT; - Write_Buf[0] = TCA9534_CONFIG_REG; - Write_Buf[1] = Regs->Config[Dispenser_ID].Uchar; - status |= I2C_Write(I2C_ID_DISP_MUX, TCA9534_ADDRESS, Write_Buf, 2); - return status; } @@ -269,15 +296,18 @@ uint8_t test_IO() for(i=0;i<8;i++) { - status |= TCA9534Init(i, &Regs); - status |= TCA9534SetReadInputReg(i); - status |= TCA9534ReadInputReg(i, &Regs); - status |= TCA9534TestRelay(i, &Regs, ENABLE); - status |= TCA9534ByPass(i, &Regs, ENABLE); - Read_Notification_Disp_UP(i, &Regs); - Read_Notification_Disp_Down(i, &Regs); - Read_Notification_Realy_On(i, &Regs); - Read_Notification_Over_Press(i, &Regs); + if(Dispenser_struct[i].Type == DISP_TYPE_EEPROM128KB) + { + status |= TCA9534Init(i, &Regs); + status |= TCA9534SetReadInputReg(i); + status |= TCA9534ReadInputReg(i, &Regs); + status |= TCA9534TestRelay(i, &Regs, ENABLE); + status |= TCA9534ByPass(i, &Regs, ENABLE); + //Read_Notification_Disp_UP(i, &Regs); + //Read_Notification_Disp_Down(i, &Regs); + //Read_Notification_Realy_On(i, &Regs); + //Read_Notification_Over_Press(i, &Regs); + } } return status; diff --git a/Software/Embedded_SW/Embedded/Drivers/Motors/Motor.c b/Software/Embedded_SW/Embedded/Drivers/Motors/Motor.c index aa633483c..106e60316 100644 --- a/Software/Embedded_SW/Embedded/Drivers/Motors/Motor.c +++ b/Software/Embedded_SW/Embedded/Drivers/Motors/Motor.c @@ -12,6 +12,7 @@ *************************************************************************************************/ #include +#include #include "include.h" #include "motor.h" #include "Modules/thread/thread.h" @@ -25,9 +26,6 @@ #include "drivers/FPGA/FPGA_SPI_Comm.h" #include "drivers/FPGA/FPGA_Comm.h" #include "drivers/FPGA/FPGA_GPIO/FPGA_GPIO.h" -#include "drivers/FPGA/Moters_Driver/L6470.h" - -///////////////////////// #include "driverlib/ssi.h" extern unsigned long Run_Value ; @@ -346,13 +344,42 @@ uint32_t MotorSetMaxSpeed(TimerMotors_t _motorId, uint32_t MaxSpeed) uint32_t MotorSetMicroStep(TimerMotors_t _motorId, uint32_t microstep) { - MotorsCfg[_motorId].microstep = microstep; + MotorDriverRequest[_motorId].microstep = microstep; FPGA_SetMotMicroStep(_motorId); return OK; } +uint32_t MotorSetKvalHold(TimerMotors_t _motorId, uint8_t Value) +{ + MotorDriverRequest[_motorId].KvalHold = Value; + FPGA_SetMotKvalHold(_motorId); + + return OK; +} +uint32_t MotorSetKvalRun(TimerMotors_t _motorId, uint8_t Value) +{ + MotorDriverRequest[_motorId].KvalRun = Value; + FPGA_SetMotKvalRun(_motorId); + + return OK; +} + +uint32_t MotorSetKvalAcc(TimerMotors_t _motorId, uint8_t Value) +{ + MotorDriverRequest[_motorId].KvalAcc = Value; + FPGA_SetMotKvalAcc(_motorId); + + return OK; +} +uint32_t MotorSetKvalDec(TimerMotors_t _motorId, uint8_t Value) +{ + MotorDriverRequest[_motorId].KvalDec = Value; + FPGA_SetMotKvalDec(_motorId); + + return OK; +} uint32_t MotorMove(TimerMotors_t _motorId,bool direction, uint32_t Steps) { diff --git a/Software/Embedded_SW/Embedded/Drivers/Motors/Motor.h b/Software/Embedded_SW/Embedded/Drivers/Motors/Motor.h index 7599c10db..3b9eba3d8 100644 --- a/Software/Embedded_SW/Embedded/Drivers/Motors/Motor.h +++ b/Software/Embedded_SW/Embedded/Drivers/Motors/Motor.h @@ -86,6 +86,11 @@ typedef struct uint32_t Speed; uint32_t Position; uint8_t Stop; + uint8_t KvalHold; + uint8_t KvalRun; + uint8_t KvalAcc; + uint8_t KvalDec; + int32_t microstep; }MotorDriverRequestStruct; typedef struct @@ -182,6 +187,11 @@ uint32_t MotorSetSpeedWithCallback (TimerMotors_t _motorId, uint32_t _freq, call uint32_t SetMotHome(TimerMotors_t _motorId); +uint32_t MotorSetKvalHold(TimerMotors_t _motorId, uint8_t Value); +uint32_t MotorSetKvalRun(TimerMotors_t _motorId, uint8_t Value); +uint32_t MotorSetKvalAcc(TimerMotors_t _motorId, uint8_t Value); +uint32_t MotorSetKvalDec(TimerMotors_t _motorId, uint8_t Value); + void MotorActionsInit(void); uint32_t MotorGetStatus(TimerMotors_t _motorId); @@ -201,6 +211,7 @@ uint32_t MotorMovetoBreakSensor (TimerMotors_t _motorId,bool direction, uint32_t uint32_t MotorMovetoDancerPosition (TimerMotors_t _motorId,bool direction, uint32_t Freq,uint32_t DancerId,bool dancervaluedirection, callback_fptr callback,uint32_t timeout); uint32_t MotorAbortMovetoLimitSwitch (TimerMotors_t _motorId); uint32_t MotorMoveToStopper (TimerMotors_t _motorId,bool direction, uint32_t Speed, callback_fptr callback,uint32_t backlash,uint32_t timeout); +uint32_t MotorMovetoEncoderPosition (TimerMotors_t MotorId, callback_fptr callback,uint32_t timeout); uint32_t MotorGoTo(TimerMotors_t _motorIdn, uint32_t Steps); #endif /* DRIVERS_MOTOR_H_ */ diff --git a/Software/Embedded_SW/Embedded/Drivers/Motors/MotorActions.c b/Software/Embedded_SW/Embedded/Drivers/Motors/MotorActions.c index a9cb3b01e..bf96335e1 100644 --- a/Software/Embedded_SW/Embedded/Drivers/Motors/MotorActions.c +++ b/Software/Embedded_SW/Embedded/Drivers/Motors/MotorActions.c @@ -12,6 +12,7 @@ *************************************************************************************************/ #include +#include #include "include.h" #include "motor.h" #include "Modules/thread/thread.h" @@ -25,7 +26,6 @@ #include "drivers/FPGA/FPGA_SPI_Comm.h" #include "drivers/FPGA/FPGA_Comm.h" #include "drivers/FPGA/FPGA_GPIO/FPGA_GPIO.h" -#include "drivers/FPGA/Moters_Driver/L6470.h" #include "drivers/SSI_Comm/Dancer/Dancer.h" ///////////////////////// @@ -50,8 +50,8 @@ uint32_t MotorTimeLimit[NUM_OF_MOTORS]; uint32_t MotorControlId[NUM_OF_MOTORS]; uint32_t StoredMotorPosition[NUM_OF_MOTORS]; FPGA_GPI_ENUM Motor_Id_to_LS_IdDown[NUM_OF_MOTORS] = { // limit switch for normal homing into working mode - GPI_LS_DH_CLEAN_RIGHT , //MOTO_DH_CLEANHEAD = 0, - GPI_LS_DH_CLEAN_LEFT, //MOTO_DH_CLEANMECH = 1, + GPI_LS_DH_CLEAN_LEFT , //MOTO_DH_CLEANHEAD = 0, Shlomo Correct setting for machine 7 25/3 + GPI_LS_DH_CLEAN_RIGHT, //MOTO_DH_CLEANMECH = 1, Shlomo Correct setting for machine 7 25/3 GPI_LS_DH_LID_CLOSED, //MOTO_DH_LID = 2, MAX_GPI, //MOTO_DRYER_DRIVING = 3, GPI_LS_DRYER_LID_CLOSED, //MOTO_DRYER_LID = 4, @@ -77,8 +77,8 @@ FPGA_GPI_ENUM Motor_Id_to_LS_IdDown[NUM_OF_MOTORS] = { // limit switch for n GPI_LS_RLOADMOTOR_DOWN, //MOTO_RLOADING = 24, }; FPGA_GPI_ENUM Motor_Id_to_LS_IdUp[NUM_OF_MOTORS] = { // limit switch for normal homing out of working mode - GPI_LS_DH_CLEAN_RIGHT , //MOTO_DH_CLEANHEAD = 0, - GPI_LS_DH_CLEAN_LEFT, //MOTO_DH_CLEANMECH = 1, + GPI_LS_DH_CLEAN_LEFT , //MOTO_DH_CLEANHEAD = 0, Shlomo Correct setting for machine 7 25/3 + GPI_LS_DH_CLEAN_RIGHT, //MOTO_DH_CLEANMECH = 1, Shlomo Correct setting for machine 7 25/3 GPI_LS_DH_LID_OPEN, //MOTO_DH_LID = 2, MAX_GPI, //MOTO_DRYER_DRIVING = 3, GPI_LS_DRYER_LID_OPEN, //MOTO_DRYER_LID = 4, @@ -98,7 +98,7 @@ FPGA_GPI_ENUM Motor_Id_to_LS_IdUp[NUM_OF_MOTORS] = { // limit switch for nor MAX_GPI, //MOTO_LDRIVING = 18, GPI_LS_LLOADMOTOR_UP, //MOTO_LLOADING = 19, GPI_LS_LPIVOT_UP, //MOTO_LPIVOT1 = 20, - GPI_LS_RDANCER_UP, //MOTO_RDANCER = 21, + GPI_LS_RDANCER_LONG, //MOTO_RDANCER = 21, MAX_GPI, //MOTO_RDRIVING = 22, GPI_LS_RLOADRAM_UP, //MOTO_RLOADARM = 23, GPI_LS_RLOADMOTOR_UP, //MOTO_RLOADING = 24, @@ -166,6 +166,7 @@ uint32_t MotorMoveWithCallback (TimerMotors_t MotorId,bool direction, uint32_t S return MotorControlId[MotorId]; } uint32_t DryerBackLash = 0; +uint32_t DrierZeroPosition = 0; bool DrierBackLashDirection = false; int CallbackCalls=0; bool FirstCall = false; @@ -193,25 +194,29 @@ uint32_t MotorVerifiedCallBackFunction(uint32_t IfIndex, uint32_t ArmPosition) / } Report("Move_To_Stopper_Callback",__FILE__,__LINE__,MotorPosition,RpMessage,StoredMotorPosition[MotorId],0); - //if (((abs(MotorPosition - StoredMotorPosition[MotorId])<=60)||(MotorGetDirection(MotorId)!=(1-DrierBackLashDirection)))&&(CallbackCalls>=10)) /*Motor did not move in the last time lag*/ - if (abs(MotorPosition - StoredMotorPosition[MotorId])<=10) - { - //stop this control loop - REPORT_MSG(MotorPosition,"MotorVerifiedCallBackFunction stopped"); - SafeRemoveControlCallback(MotorControlId[MotorId], MotorControlCallback[MotorId] ); - MotorControlCallback[MotorId] = 0; - MotorControlId[MotorId] = 0xFF; - MotorStop(MotorId,Hard_Hiz ); - Task_sleep(5); - MotorMove(MotorId,DrierBackLashDirection,DryerBackLash ); - Task_sleep(5); + Read_Dryer_ENC_Position(); //trigger the next call - //call the module callback - if (MotorCallback[MotorId]) - MotorCallback[MotorId](MotorId,ArmPosition); + //if (((abs(MotorPosition - StoredMotorPosition[MotorId])<=60)||(MotorGetDirection(MotorId)!=(1-DrierBackLashDirection)))&&(CallbackCalls>=10)) /*Motor did not move in the last time lag*/ + if (abs(MotorPosition - StoredMotorPosition[MotorId])<=10) + { + //stop this control loop + REPORT_MSG(MotorPosition,"MotorVerifiedCallBackFunction stopped"); + SafeRemoveControlCallback(MotorControlId[MotorId], MotorControlCallback[MotorId] ); + MotorControlCallback[MotorId] = 0; + MotorControlId[MotorId] = 0xFF; + MotorStop(MotorId,Hard_Hiz ); + Task_sleep(5); + MotorMove(MotorId,DrierBackLashDirection,DryerBackLash ); + Task_sleep(5); + DrierZeroPosition = Read_Dryer_ENC_Position(); //trigger the next call + Report("MotorVerifiedCallBackFunction",__FILE__,__LINE__,DrierZeroPosition,RpWarning,0,0); - } - else StoredMotorPosition[MotorId] = MotorPosition; + //call the module callback + if (MotorCallback[MotorId]) + MotorCallback[MotorId](MotorId,ArmPosition); + + } + else StoredMotorPosition[MotorId] = MotorPosition; return OK; } @@ -236,10 +241,87 @@ uint32_t MotorMoveToStopper (TimerMotors_t MotorId,bool direction, uint32_t Spee StoredMotorPosition[MotorId] = MotorGetPosition(MotorId); REPORT_MSG(StoredMotorPosition[MotorId],"MotorMoveToStopper initial position"); MotorSetSpeed (MotorId, Speed); - MotorControlId[MotorId] = AddControlCallback( MotorVerifiedCallBackFunction, /*eTenMillisecond*/50, Read_Dryer_ENC_Position,(IfTypeMotors*0x100+MotorId), MotorId, 0 ); + MotorControlId[MotorId] = AddControlCallback( MotorVerifiedCallBackFunction, 20,Control_Read_Dryer_Position,(IfTypeMotors*0x100+MotorId), MotorId, 0 ); MotorControlCallback[MotorId] = MotorVerifiedCallBackFunction; return MotorControlId[MotorId]; } +uint32_t MotorMoveToDrierPositionCallBackFunction(uint32_t IfIndex, uint32_t ReadValue) //TODO +{ + TimerMotors_t MotorId; + if (IfIndex>>8 != IfTypeMotors) + { + LOG_ERROR (IfIndex, "Wrong Interface type"); + return 0xFFFFFFFF; + } + MotorId = (TimerMotors_t)(IfIndex&0xFF); + + if (MotorControlId[MotorId] == 0xFF) + return ERROR; + Report("MotorMoveToDrierPositionCallBackFunction",__FILE__,__LINE__,DrierZeroPosition,RpWarning,ReadValue,0); + + if (DrierZeroPosition == ReadValue) //thread running identified + { + //stop this control loop + SafeRemoveControlCallback(MotorControlId[MotorId], MotorControlCallback[MotorId] ); + MotorControlCallback[MotorId] = 0; + MotorControlId[MotorId] = 0xFF; + MotorStop(MotorId,Hard_Hiz); //TODO in run time limit switch just reverse direction + + //possibly: start regular control (speed etc) + //uint32_t ControlId = AddControlCallback(ControlCBFunction Callback, eOneMillisecond, (IfTypeMotors*0x100+MotorId), deviceId, Parameter ); + + //call the module callback + if (MotorCallback[MotorId]) + MotorCallback[MotorId](MotorId,ReadValue); + } + return OK; +} +uint32_t MotorMovetoEncoderPosition (TimerMotors_t MotorId, callback_fptr callback,uint32_t timeout) +{ + assert (callback); + uint32_t currentposition = 0; + bool direction; + //assert (isValid(deviceId)); + + //call driver action to device id with the parameter + MotorCallback[MotorId] = callback; + + //decide the required direction and speed + Read_Dryer_ENC_Position(); + MotorStop(MotorId,Hard_Hiz ); + + Task_sleep(5); + Read_Dryer_ENC_Position(); + Task_sleep(5); + currentposition = Control_Read_Dryer_Position(0,0,0); + Report("MotorMovetoEncoderPosition",__FILE__,__LINE__,DrierZeroPosition,RpWarning,currentposition,0); + + if (currentposition > DrierZeroPosition) + { + direction = false; + } + else + { + if (currentposition == DrierZeroPosition) + { + if (callback) + callback(MotorId,0); + return OK; + } + else + { + direction = true; + } + } + + MotorSetDirection( MotorId, direction); + MotorSetSpeed (MotorId, 5); + MotorControlId[MotorId] = AddControlCallback( MotorMoveToDrierPositionCallBackFunction, eOneMillisecond,Control_Read_Dryer_Position,(IfTypeMotors*0x100+MotorId), MotorId, 0 ); + MotorControlCallback[MotorId] = MotorMoveToDrierPositionCallBackFunction; + return MotorControlId[MotorId]; + +} + uint32_t MotorSetSpeedWithCallback (TimerMotors_t MotorId, uint32_t _freq, callback_fptr callback) //TODO { assert (callback); @@ -304,6 +386,8 @@ uint32_t MotorSetSpeedCallBackFunction(uint32_t IfIndex, uint32_t BusyFlag) //TO } return OK; } +bool CloseMagnet = false; +bool HoldRightDancer = false; uint32_t MotorMoveToLimitSwitchCallBackFunction(uint32_t IfIndex, uint32_t LimitSwitch) //TODO { TimerMotors_t MotorId; @@ -324,11 +408,12 @@ uint32_t MotorMoveToLimitSwitchCallBackFunction(uint32_t IfIndex, uint32_t Limit SafeRemoveControlCallback(MotorControlId[MotorId], MotorControlCallback[MotorId] ); MotorControlCallback[MotorId] = 0; MotorControlId[MotorId] = 0xFF; - /*if (MotorId == HARDWARE_MOTOR_TYPE__MOTO_RDANCER) + if ((MotorId == HARDWARE_MOTOR_TYPE__MOTO_RDANCER)&&(HoldRightDancer == true)) { + HoldRightDancer = false; MotorStop(MotorId,Soft_Stop); //TODO in run time limit switch just reverse direction } - else*/ + else { MotorStop(MotorId,Hard_Hiz); //TODO in run time limit switch just reverse direction } @@ -336,8 +421,13 @@ uint32_t MotorMoveToLimitSwitchCallBackFunction(uint32_t IfIndex, uint32_t Limit //possibly: start regular control (speed etc) //uint32_t ControlId = AddControlCallback(ControlCBFunction Callback, eOneMillisecond, (IfTypeMotors*0x100+MotorId), deviceId, Parameter ); if (MotorId == HARDWARE_MOTOR_TYPE__MOTO_DH_LID) - ActivateHeadMagnet(); - + { + if (CloseMagnet == true) + { + ActivateHeadMagnet(); + CloseMagnet=false; + } + } //call the module callback if (MotorCallback[MotorId]) MotorCallback[MotorId](MotorId,LimitSwitch); @@ -360,7 +450,20 @@ uint32_t MotorMovetoLimitSwitch (TimerMotors_t MotorId,bool direction, uint32_t //call driver action to device id with the parameter //SetMotorSpeed (deviceId, parameter); if (MotorId == HARDWARE_MOTOR_TYPE__MOTO_DH_LID) + { DeActivateHeadMagnet(); + if (direction == MotorsCfg[HARDWARE_MOTOR_TYPE__MOTO_DH_LID].directionthreadwize) + { + CloseMagnet = true; + } + } + if (MotorId == HARDWARE_MOTOR_TYPE__MOTO_RDANCER) + { + if (direction != MotorsCfg[HARDWARE_MOTOR_TYPE__MOTO_RDANCER].directionthreadwize) + { + HoldRightDancer = true; + } + } MotorTimeout[MotorId] = 0; MotorTimeLag[MotorId] = eTenMillisecond; @@ -483,6 +586,7 @@ uint32_t MotorMoveToDancerPositionCallBackFunction(uint32_t IfIndex, uint32_t Re } return OK; } + uint32_t MotorMovetoDancerPosition (TimerMotors_t MotorId,bool direction, uint32_t Freq,uint32_t dancerid,bool dancervaluedirection, callback_fptr callback,uint32_t timeout) { if (MotorControlId[MotorId] != 0xFF) diff --git a/Software/Embedded_SW/Embedded/Drivers/SPI/SPI_Comm.c b/Software/Embedded_SW/Embedded/Drivers/SPI/SPI_Comm.c index 858fc01cb..43174ec89 100644 --- a/Software/Embedded_SW/Embedded/Drivers/SPI/SPI_Comm.c +++ b/Software/Embedded_SW/Embedded/Drivers/SPI/SPI_Comm.c @@ -13,8 +13,6 @@ #include "utils/uartstdio.h" //#include "graphics_adapter.h" -#include "drivers/FPGA/Moters_Driver/L6470.h" -#include "drivers/FPGA/Moters_Driver/PowerSTEP01.h" #include "PMR/Hardware/HardwareMotor.pb-c.h" //#include "drivers/FPGA/FPGA_Comm.h" @@ -22,6 +20,8 @@ #include #include #include +#include +#include #include "drivers/Motors/Motor.h" void temp_init_spi2(); diff --git a/Software/Embedded_SW/Embedded/Drivers/SSI_Comm/Dancer/Dancer.c b/Software/Embedded_SW/Embedded/Drivers/SSI_Comm/Dancer/Dancer.c index 6c692ed10..de2ceb698 100644 --- a/Software/Embedded_SW/Embedded/Drivers/SSI_Comm/Dancer/Dancer.c +++ b/Software/Embedded_SW/Embedded/Drivers/SSI_Comm/Dancer/Dancer.c @@ -84,6 +84,11 @@ uint32_t Read_Dryer_ENC_Position () FPGA_SSI_Dryer_ENC_Transnit(); return Dryer_ENC.Position; } +uint32_t Control_Read_Dryer_Position(HardwareDancerType DancerId, uint32_t Parameter1) +{ + return Dryer_ENC.Position; + //return SSI_enc.Position; +} void Loop_SSI() { diff --git a/Software/Embedded_SW/Embedded/Drivers/SSI_Comm/Dancer/Dancer.h b/Software/Embedded_SW/Embedded/Drivers/SSI_Comm/Dancer/Dancer.h index bc03b3e9e..7a843b1c1 100644 --- a/Software/Embedded_SW/Embedded/Drivers/SSI_Comm/Dancer/Dancer.h +++ b/Software/Embedded_SW/Embedded/Drivers/SSI_Comm/Dancer/Dancer.h @@ -12,6 +12,7 @@ uint32_t Read_Dancer_Position (HardwareDancerType DancerId); uint32_t Control_Read_Dancer_Position(HardwareDancerType DancerId, uint32_t Parameter1, uint32_t Parameter2); uint32_t Read_Dryer_ENC_Position (); +uint32_t Control_Read_Dryer_Position(uint32_t DryerID, uint32_t Parameter1, uint32_t Parameter2); void Loop_SSI(); diff --git a/Software/Embedded_SW/Embedded/Drivers/Valves/Valve.c b/Software/Embedded_SW/Embedded/Drivers/Valves/Valve.c index 3b1d53758..c546dc30a 100644 --- a/Software/Embedded_SW/Embedded/Drivers/Valves/Valve.c +++ b/Software/Embedded_SW/Embedded/Drivers/Valves/Valve.c @@ -21,9 +21,11 @@ #include "Modules/Control/Control.h" VALVE_GPO_REG Valve_GPO_Reg; -F1_GPO_REG F1_GPO_Reg; +extern F1_GPO_REG F1_GPO_Reg; DISPENSER_VALVE_GPO_REG Dispenser_Valve_GPO_Reg; +extern F3_GPO_01_REG F3_GPO_01_Reg; + Valves_t IDS_Id_to_AirValve[MAX_IDS_UNITS] = {VALVE_2W_MID_AIR_1,VALVE_2W_MID_AIR_2,VALVE_2W_MID_AIR_3,VALVE_2W_MID_AIR_4,VALVE_2W_MID_AIR_5,VALVE_2W_MID_AIR_6,VALVE_2W_MID_AIR_7,VALVE_2W_MID_AIR_8}; Valves_t IDS_Id_to_CartrideValve[MAX_IDS_UNITS] = {VALVE_2W_CART_MID_1,VALVE_2W_CART_MID_2,VALVE_2W_CART_MID_3,VALVE_2W_CART_MID_4,VALVE_2W_CART_MID_5,VALVE_2W_CART_MID_6,VALVE_2W_CART_MID_7,VALVE_2W_CART_MID_8}; @@ -385,13 +387,18 @@ uint8_t Lubricant_2Way_Valve(bool Direction) if(Direction == OPEN) { - F3_GPO_01_bus |= BIT0; + //F3_GPO_01_bus |= BIT0; + F3_GPO_01_Reg.bits.F3_LUBRICANT_VALVE = OPEN; } else //Direction = CLOSE { - F3_GPO_01_bus &= ~(BIT0); + //F3_GPO_01_bus &= ~(BIT0); + F3_GPO_01_Reg.bits.F3_LUBRICANT_VALVE = CLOSE; } + + F3_GPO_01_bus = F3_GPO_01_Reg.ushort; + return Status; } diff --git a/Software/Embedded_SW/Embedded/Drivers/flash_ram/FlashProgram.c b/Software/Embedded_SW/Embedded/Drivers/flash_ram/FlashProgram.c index 637c91e7d..ac1cff75e 100644 --- a/Software/Embedded_SW/Embedded/Drivers/flash_ram/FlashProgram.c +++ b/Software/Embedded_SW/Embedded/Drivers/flash_ram/FlashProgram.c @@ -33,7 +33,7 @@ uint32_t ReadAppAndProgram(uint32_t ui32FlashStart,uint32_t ui32FileSize,void* b uint32_t ui32ProgAddr; uint32_t ui32BufferAddr; volatile uint32_t ui32Idx; - uint32_t ui32FlashEnd; + //uint32_t ui32FlashEnd; // @@ -41,7 +41,7 @@ uint32_t ReadAppAndProgram(uint32_t ui32FlashStart,uint32_t ui32FileSize,void* b // If reserved space is configured, then the ending address is reduced // by the amount of the reserved block. // - ui32FlashEnd = ui32FlashStart + ui32FileSize; + //ui32FlashEnd = ui32FlashStart + ui32FileSize; // @@ -68,7 +68,7 @@ uint32_t ReadAppAndProgram(uint32_t ui32FlashStart,uint32_t ui32FileSize,void* b // stick updater). // ui32ProgAddr = ui32FlashStart; - ui32BufferAddr = buffer; + ui32BufferAddr = (uint32_t)buffer; ui32Remaining = ui32FileSize; while(ui32Remaining) { diff --git a/Software/Embedded_SW/Embedded/Main.c b/Software/Embedded_SW/Embedded/Main.c index fc3d09402..046f8291e 100644 --- a/Software/Embedded_SW/Embedded/Main.c +++ b/Software/Embedded_SW/Embedded/Main.c @@ -46,7 +46,7 @@ #include "StateMachines/Printing/PrintingSTM.h" #include "StateMachines/Initialization/InitSequence.h" - +#include "StateMachines/Initialization/PowerIdle.h" #include #include "drivers/SPI/SPI_Comm.h" #include "drivers/Uart_Comm/Uart.h" @@ -65,7 +65,8 @@ #include "drivers/Flash_Memory/FATFS/ff.h" #include "drivers/Flash_Memory/FATFS/Control_File_System.h" - +#include "Modules/General/buttons.h" +#include "Modules/Waste/Waste.h" //#define WATCHDOG //***************************************************************************** // @@ -87,6 +88,12 @@ static volatile uint32_t g_ui32Flags; bool Machine_Idle_Mode = false; + +F2_CTRL_REG F2_CTRL_Reg; +F1_GPO_REG F1_GPO_Reg; + +F3_GPO_01_REG F3_GPO_01_Reg; + //MessageContainer createContainer(MessageType type, char* token, protobuf_c_boolean completed, void* response, size_t (*packPtr)(void*, uint8_t*), size_t (*sizePtr)(void*)); uint32_t MainDummyFunction(uint32_t IfIndex, uint32_t ReadValue) { @@ -188,6 +195,9 @@ int main(void) ControlStart(); Heaters_Init(); MotorsInit(); +//Shai WHS_HW_test(); // for WHS sensor test +// WHS_init(); +// Buttons_Init(); //IDS_ModuleInit(); Valve_Set(VALVE_MIXCHIP_WASTECH, Mixer_Waste); @@ -215,6 +225,9 @@ int main(void) // //test_avi(); //example for shai + Set_Speed_Sensor_TypeII_Registers(2,2);//set default values + //Read_Speed_Sensor_TypeII();//must be delay between Set_Speed_Sensor_TypeII_Registers to Read_Speed_Sensor_TypeII + //Test_ADS120_Internal_Temperature_Sensor(0); #ifndef EVALUATION_BOARD @@ -232,7 +245,7 @@ int main(void) // HWControlId = AddControlCallback( MainHWInitCallBackFunction, 2* eOneSecond/*eHundredMillisecond*/, MainDummyFunction,0,0, 0 ); Start_InitSequence(); - + PowerIdleInit(); BIOS_start(); diff --git a/Software/Embedded_SW/Embedded/Modules/AlarmHandling/AlarmHandling.c b/Software/Embedded_SW/Embedded/Modules/AlarmHandling/AlarmHandling.c index 94c7614d1..81c4a230b 100644 --- a/Software/Embedded_SW/Embedded/Modules/AlarmHandling/AlarmHandling.c +++ b/Software/Embedded_SW/Embedded/Modules/AlarmHandling/AlarmHandling.c @@ -11,6 +11,7 @@ #include "AlarmHandling.h" #include +#include #include #include @@ -25,6 +26,7 @@ #include "drivers/FPGA/FPGA.h" #include "PMR/Hardware/HardwareDancerType.pb-c.h" #include "drivers/I2C_Communication/ADC_MUX/ADC_MUX.h" +#include "drivers/I2C_Communication/Dispenser_Card/IO_Ports/Dispenser_IO.h" #include "modules/thread/thread_ex.h" #include "modules/heaters/heaters_ex.h" @@ -46,7 +48,6 @@ #include "StateMachines/Printing/PrintingSTM.h" -#include "drivers/FPGA/Moters_Driver/L6470.h" #include "drivers/Motors/Motor.h" #include "drivers/Heater/TemperatureSensor.h" #include "drivers/Flash_ram/FlashProgram.h" @@ -59,6 +60,7 @@ bool AlarmHandlingActive = false; uint32_t AlarmHandlingControlId = 0xFF; uint32_t AlarmHandlingTick = 0; +bool CheckHardLimitAlarms = false,CheckCurrentAlarms = false,CheckTamperAlarms = false; uint8_t alarm_response_buffer[500]; /******************** Functions ********************************************/ @@ -84,7 +86,7 @@ typedef struct AlarmHandlingMessage{ }AlarmHandlingMessageStruc; #define MAX_SYSTEM_ALARMS 300+1 -typedef enum +/*typedef enum { TemperatureAlarm, LimitSwitchAlarm, @@ -93,13 +95,16 @@ typedef enum MotorAlarm, CoversAlarm, DoNotPollAlarm, -}AlarmSource; -#define OVER_VALUE true; -#define UNDER_VALUE false; + HardLimitAlarm, + TachoAlarm, + FluidLevelAlarm, +}AlarmSource;*/ +#define OVER_VALUE true +#define UNDER_VALUE false typedef struct { uint16_t Frequency; //1/10/100/1000 - AlarmSource AlarmSource; + AlarmSourceType AlarmSource; uint16_t DeviceId; uint8_t ModuleDeviceId; uint16_t AlarmValue; @@ -126,183 +131,213 @@ AlarmStatusItem AlarmState[MAX_SYSTEM_ALARMS]; */ AlarmHandlingItemStruc *AlarmItem; const AlarmHandlingItemStruc HardCodedAlarmItem[MAX_SYSTEM_ALARMS]={ - {eHundredMillisecond,LimitSwitchAlarm,LimitSwitchAlarmEmpty_1,0,false,true,DEBUG_LOG_CATEGORY__Error,0xFF,0,EVENT_TYPE__DISPENSER_1_EMPTY,"Dispenser 1 Empty"}, - {eHundredMillisecond,LimitSwitchAlarm,LimitSwitchAlarmEmpty_2,1,false,true,DEBUG_LOG_CATEGORY__Error,0xFF,0,EVENT_TYPE__DISPENSER_2_EMPTY,"Dispenser 2 Empty"}, - {eHundredMillisecond,LimitSwitchAlarm,LimitSwitchAlarmEmpty_3,2,false,true,DEBUG_LOG_CATEGORY__Error,0xFF,0,EVENT_TYPE__DISPENSER_3_EMPTY,"Dispenser 3 Empty"}, - {eHundredMillisecond,LimitSwitchAlarm,LimitSwitchAlarmEmpty_4,3,false,true,DEBUG_LOG_CATEGORY__Error,0xFF,0,EVENT_TYPE__DISPENSER_4_EMPTY,"Dispenser 4 Empty"}, - {eHundredMillisecond,LimitSwitchAlarm,LimitSwitchAlarmEmpty_5,4,false,true,DEBUG_LOG_CATEGORY__Error,0xFF,0,EVENT_TYPE__DISPENSER_5_EMPTY,"Dispenser 5 Empty"}, - {eHundredMillisecond,LimitSwitchAlarm,LimitSwitchAlarmEmpty_6,5,false,true,DEBUG_LOG_CATEGORY__Error,0xFF,0,EVENT_TYPE__DISPENSER_6_EMPTY,"Dispenser 6 Empty"}, - {eHundredMillisecond,LimitSwitchAlarm,LimitSwitchAlarmEmpty_7,6,false,true,DEBUG_LOG_CATEGORY__Error,0xFF,0,EVENT_TYPE__DISPENSER_7_EMPTY,"Dispenser 7 Empty"}, - {eHundredMillisecond,LimitSwitchAlarm,LimitSwitchAlarmEmpty_8,7,false,true,DEBUG_LOG_CATEGORY__Error,0xFF,0,EVENT_TYPE__DISPENSER_8_EMPTY,"Dispenser 8 Empty"}, - {eOneSecond,PressureAlarm,0,0,5,true,DEBUG_LOG_CATEGORY__Error,0xFF,5,EVENT_TYPE__DISPENSER_1_OVERPRESSURE,"Dispenser 1 Over Pressure"}, - {eOneSecond,PressureAlarm,1,1,5,true,DEBUG_LOG_CATEGORY__Error,0xFF,5,EVENT_TYPE__DISPENSER_2_OVERPRESSURE,"Dispenser 2 Over Pressure"}, - {eOneSecond,PressureAlarm,2,2,5,true,DEBUG_LOG_CATEGORY__Error,0xFF,5,EVENT_TYPE__DISPENSER_3_OVERPRESSURE,"Dispenser 3 Over Pressure"}, - {eOneSecond,PressureAlarm,3,3,5,true,DEBUG_LOG_CATEGORY__Error,0xFF,5,EVENT_TYPE__DISPENSER_4_OVERPRESSURE,"Dispenser 4 Over Pressure"}, - {eOneSecond,PressureAlarm,4,4,5,true,DEBUG_LOG_CATEGORY__Error,0xFF,5,EVENT_TYPE__DISPENSER_5_OVERPRESSURE,"Dispenser 5 Over Pressure"}, - {eOneSecond,PressureAlarm,5,5,5,true,DEBUG_LOG_CATEGORY__Error,0xFF,5,EVENT_TYPE__DISPENSER_6_OVERPRESSURE,"Dispenser 6 Over Pressure"}, - {eOneSecond,PressureAlarm,6,6,5,true,DEBUG_LOG_CATEGORY__Error,0xFF,5,EVENT_TYPE__DISPENSER_7_OVERPRESSURE,"Dispenser 7 Over Pressure"}, - {eOneSecond,PressureAlarm,7,7,5,true,DEBUG_LOG_CATEGORY__Error,0xFF,5,EVENT_TYPE__DISPENSER_8_OVERPRESSURE,"Dispenser 8 Over Pressure"}, - {eOneSecond,MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_DRYER_DRIVING,HARDWARE_MOTOR_TYPE__MOTO_DRYER_DRIVING,x_STATUS_OCD,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__DRYER_MOTOR_OVERCURRENT,"MotorDryerOverCurrent"}, - {eOneSecond,MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_RDRIVING, HARDWARE_MOTOR_TYPE__MOTO_RDRIVING, x_STATUS_OCD,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__FEEDER_MOTOR_OVERCURRENT,"MotorFeederOverCurrent"}, - {eOneSecond,MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_SCREW, HARDWARE_MOTOR_TYPE__MOTO_SCREW, x_STATUS_OCD,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__SCREW_MOTOR_OVERCURRENT,"MotorScrewOverCurrent"}, - {eOneSecond,MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_WINDER, HARDWARE_MOTOR_TYPE__MOTO_WINDER, x_STATUS_OCD,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__WINDER_MOTOR_OVERCURRENT,"MotorWinderOverCurrent"}, - {eOneSecond,MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_LDRIVING, HARDWARE_MOTOR_TYPE__MOTO_LDRIVING, x_STATUS_OCD,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__PULLER_MOTOR_OVERCURRENT,"MotorPoolerOverCurrent"}, - {eOneSecond,MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_1, HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_1, x_STATUS_OCD,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__DISPENSER_1_MOTOR_OVERCURRENT,"MotorDispenser1OverCurrent"}, - {eOneSecond,MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_2, HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_2, x_STATUS_OCD,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__DISPENSER_2_MOTOR_OVERCURRENT,"MotorDispenser2OverCurrent"}, - {eOneSecond,MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_3, HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_3, x_STATUS_OCD,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__DISPENSER_3_MOTOR_OVERCURRENT,"MotorDispenser3OverCurrent"}, - {eOneSecond,MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_4, HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_4, x_STATUS_OCD,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__DISPENSER_4_MOTOR_OVERCURRENT,"MotorDispenser4OverCurrent"}, - {eOneSecond,MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_5, HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_5, x_STATUS_OCD,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__DISPENSER_5_MOTOR_OVERCURRENT,"MotorDispenser5OverCurrent"}, - {eOneSecond,MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_6, HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_6, x_STATUS_OCD,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__DISPENSER_6_MOTOR_OVERCURRENT,"MotorDispenser6OverCurrent"}, - {eOneSecond,MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_7, HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_7, x_STATUS_OCD,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__DISPENSER_7_MOTOR_OVERCURRENT,"MotorDispenser7OverCurrent"}, - {eOneSecond,MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_8, HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_8, x_STATUS_OCD,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__DISPENSER_8_MOTOR_OVERCURRENT,"MotorDispenser8OverCurrent"}, - {eOneSecond,MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_DRYER_DRIVING,HARDWARE_MOTOR_TYPE__MOTO_DRYER_DRIVING,x_STATUS_TH_SD,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__DRYER_MOTOR_OVERTEMPERATURE,"MotorDryerOverTemperature"}, - {eOneSecond,MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_RDRIVING, HARDWARE_MOTOR_TYPE__MOTO_RDRIVING, x_STATUS_TH_SD,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__FEEDER_MOTOR_OVERTEMPERATURE,"MotorFeederOverTemperature"}, - {eOneSecond,MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_SCREW, HARDWARE_MOTOR_TYPE__MOTO_SCREW, x_STATUS_TH_SD,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__SCREW_MOTOR_OVERTEMPERATURE,"MotorScrewOverTemperature"}, - {eOneSecond,MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_WINDER, HARDWARE_MOTOR_TYPE__MOTO_WINDER, x_STATUS_TH_SD,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__WINDER_MOTOR_OVERTEMPERATURE,"MotorWinderOverTemperature"}, - {eOneSecond,MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_LDRIVING, HARDWARE_MOTOR_TYPE__MOTO_LDRIVING, x_STATUS_TH_SD,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__PULLER_MOTOR_OVERTEMPERATURE,"MotorPoolerOverTemperature"}, - {eOneSecond,MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_1, HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_1, x_STATUS_TH_SD,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__DISPENSER_1_MOTOR_OVERTEMPERATURE,"MotorDispenser1OverTemperature"}, - {eOneSecond,MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_2, HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_2, x_STATUS_TH_SD,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__DISPENSER_2_MOTOR_OVERTEMPERATURE,"MotorDispenser2OverTemperature"}, - {eOneSecond,MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_3, HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_3, x_STATUS_TH_SD,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__DISPENSER_3_MOTOR_OVERTEMPERATURE,"MotorDispenser3OverTemperature"}, - {eOneSecond,MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_4, HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_4, x_STATUS_TH_SD,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__DISPENSER_4_MOTOR_OVERTEMPERATURE,"MotorDispenser4OverTemperature"}, - {eOneSecond,MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_5, HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_5, x_STATUS_TH_SD,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__DISPENSER_5_MOTOR_OVERTEMPERATURE,"MotorDispenser5OverTemperature"}, - {eOneSecond,MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_6, HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_6, x_STATUS_TH_SD,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__DISPENSER_6_MOTOR_OVERTEMPERATURE,"MotorDispenser6OverTemperature"}, - {eOneSecond,MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_7, HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_7, x_STATUS_TH_SD,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__DISPENSER_7_MOTOR_OVERTEMPERATURE,"MotorDispenser7OverTemperature"}, - {eOneSecond,MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_8, HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_8, x_STATUS_TH_SD,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__DISPENSER_8_MOTOR_OVERTEMPERATURE,"MotorDispenser8OverTemperature"}, - {eOneSecond,MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_DRYER_DRIVING,HARDWARE_MOTOR_TYPE__MOTO_DRYER_DRIVING,x_STATUS_UVLO,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__DRYER_MOTOR_UNDERVOLTAGE,"MotorDryerUnderVoltage"}, - {eOneSecond,MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_RDRIVING, HARDWARE_MOTOR_TYPE__MOTO_RDRIVING, x_STATUS_UVLO,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__FEEDER_MOTOR_UNDERVOLTAGE,"MotorFeederUnderVoltage"}, - {eOneSecond,MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_SCREW, HARDWARE_MOTOR_TYPE__MOTO_SCREW, x_STATUS_UVLO,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__SCREW_MOTOR_UNDERVOLTAGE,"MotorScrewUnderVoltage"}, - {eOneSecond,MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_WINDER, HARDWARE_MOTOR_TYPE__MOTO_WINDER, x_STATUS_UVLO,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__WINDER_MOTOR_UNDERVOLTAGE,"MotorWinderUnderVoltage"}, - {eOneSecond,MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_LDRIVING, HARDWARE_MOTOR_TYPE__MOTO_LDRIVING, x_STATUS_UVLO,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__PULLER_MOTOR_UNDERVOLTAGE,"MotorPoolerUnderVoltage"}, - {eOneSecond,MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_1, HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_1, x_STATUS_UVLO,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__DISPENSER_1_MOTOR_UNDERVOLTAGE,"MotorDispenser1UnderVoltage"}, - {eOneSecond,MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_2, HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_2, x_STATUS_UVLO,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__DISPENSER_2_MOTOR_UNDERVOLTAGE,"MotorDispenser2UnderVoltage"}, - {eOneSecond,MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_3, HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_3, x_STATUS_UVLO,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__DISPENSER_3_MOTOR_UNDERVOLTAGE,"MotorDispenser3UnderVoltage"}, - {eOneSecond,MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_4, HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_4, x_STATUS_UVLO,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__DISPENSER_4_MOTOR_UNDERVOLTAGE,"MotorDispenser4UnderVoltage"}, - {eOneSecond,MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_5, HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_5, x_STATUS_UVLO,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__DISPENSER_5_MOTOR_UNDERVOLTAGE,"MotorDispenser5UnderVoltage"}, - {eOneSecond,MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_6, HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_6, x_STATUS_UVLO,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__DISPENSER_6_MOTOR_UNDERVOLTAGE,"MotorDispenser6UnderVoltage"}, - {eOneSecond,MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_7, HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_7, x_STATUS_UVLO,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__DISPENSER_7_MOTOR_UNDERVOLTAGE,"MotorDispenser7UnderVoltage"}, - {eOneSecond,MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_8, HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_8, x_STATUS_UVLO,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__DISPENSER_8_MOTOR_UNDERVOLTAGE,"MotorDispenser8UnderVoltage"}, - {eOneSecond,MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_DRYER_DRIVING,HARDWARE_MOTOR_TYPE__MOTO_DRYER_DRIVING,x_STATUS_STEP_LOSS_A,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__DRYER_MOTOR_STALL,"MotorDryerStall"}, - {eOneSecond,MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_RDRIVING, HARDWARE_MOTOR_TYPE__MOTO_RDRIVING, x_STATUS_STEP_LOSS_A,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__FEEDER_MOTOR_STALL,"MotorFeederStall"}, - {eOneSecond,MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_SCREW, HARDWARE_MOTOR_TYPE__MOTO_SCREW, x_STATUS_STEP_LOSS_A,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__SCREW_MOTOR_STALL,"MotorScrewStall"}, - {eOneSecond,MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_WINDER, HARDWARE_MOTOR_TYPE__MOTO_WINDER, x_STATUS_STEP_LOSS_A,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__WINDER_MOTOR_STALL,"MotorWinderStall"}, - {eOneSecond,MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_LDRIVING, HARDWARE_MOTOR_TYPE__MOTO_LDRIVING, x_STATUS_STEP_LOSS_A,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__PULLER_MOTOR_STALL,"MotorPoolerStall"}, - {eOneSecond,MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_1, HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_1, x_STATUS_STEP_LOSS_A,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__DISPENSER_1_MOTOR_STALL,"MotorDispenser1Stall"}, - {eOneSecond,MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_2, HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_2, x_STATUS_STEP_LOSS_A,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__DISPENSER_2_MOTOR_STALL,"MotorDispenser2Stall"}, - {eOneSecond,MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_3, HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_3, x_STATUS_STEP_LOSS_A,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__DISPENSER_3_MOTOR_STALL,"MotorDispenser3Stall"}, - {eOneSecond,MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_4, HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_4, x_STATUS_STEP_LOSS_A,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__DISPENSER_4_MOTOR_STALL,"MotorDispenser4Stall"}, - {eOneSecond,MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_5, HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_5, x_STATUS_STEP_LOSS_A,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__DISPENSER_5_MOTOR_STALL,"MotorDispenser5Stall"}, - {eOneSecond,MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_6, HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_6, x_STATUS_STEP_LOSS_A,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__DISPENSER_6_MOTOR_STALL,"MotorDispenser6Stall"}, - {eOneSecond,MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_7, HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_7, x_STATUS_STEP_LOSS_A,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__DISPENSER_7_MOTOR_STALL,"MotorDispenser7Stall"}, - {eOneSecond,MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_8, HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_8, x_STATUS_STEP_LOSS_A,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__DISPENSER_8_MOTOR_STALL,"MotorDispenser8Stall"}, - {eHundredMillisecond,TemperatureAlarm,MIXER_PT100, HARDWARE_PID_CONTROL_TYPE__MixerHeater ,270,true,DEBUG_LOG_CATEGORY__Error,0xFF,0,EVENT_TYPE__MIXER_OVERTEMPERATURE,"Mixer Over Temperature"}, - {eHundredMillisecond,TemperatureAlarm,TEMP_SENSE_ANALOG_DYEINGH_TEMP1,HARDWARE_PID_CONTROL_TYPE__HeadHeaterZ1 ,270,true,DEBUG_LOG_CATEGORY__Error,0xFF,0,EVENT_TYPE__DYEING_HEAD_ZONE_1_OVERTEMPERATURE,"DyeingHead1 Over Temperature"}, - {eHundredMillisecond,TemperatureAlarm,TEMP_SENSE_ANALOG_DYEINGH_TEMP2,HARDWARE_PID_CONTROL_TYPE__HeadHeaterZ2 ,270,true,DEBUG_LOG_CATEGORY__Error,0xFF,0,EVENT_TYPE__DYEING_HEAD_ZONE_2_OVERTEMPERATURE,"DyeingHead2 Over Temperature"}, - {eHundredMillisecond,TemperatureAlarm,TEMP_SENSE_ANALOG_DYEINGH_TEMP3,HARDWARE_PID_CONTROL_TYPE__HeadHeaterZ3 ,270,true,DEBUG_LOG_CATEGORY__Error,0xFF,0,EVENT_TYPE__DYEING_HEAD_ZONE_3_OVERTEMPERATURE,"DyeingHead3 Over Temperature"}, - {eHundredMillisecond,TemperatureAlarm,TEMP_SENSE_ANALOG_DYEINGH_TEMP4,HARDWARE_PID_CONTROL_TYPE__HeadHeaterZ4 ,270,true,DEBUG_LOG_CATEGORY__Error,0xFF,0,EVENT_TYPE__DYEING_HEAD_ZONE_4_OVERTEMPERATURE,"DyeingHead4 Over Temperature"}, - {eHundredMillisecond,TemperatureAlarm,TEMP_SENSE_ANALOG_DYEINGH_TEMP5,HARDWARE_PID_CONTROL_TYPE__HeadHeaterZ5 ,270,true,DEBUG_LOG_CATEGORY__Error,0xFF,0,EVENT_TYPE__DYEING_HEAD_ZONE_5_OVERTEMPERATURE,"DyeingHead5 Over Temperature"}, - {eHundredMillisecond,TemperatureAlarm,HEAD6_PT100, HARDWARE_PID_CONTROL_TYPE__HeadHeaterZ6 ,270,true,DEBUG_LOG_CATEGORY__Error,0xFF,0,EVENT_TYPE__DYEING_HEAD_ZONE_6_OVERTEMPERATURE,"DyeingHead6 Over Temperature"}, - {eHundredMillisecond,TemperatureAlarm,TEMP_SENSE_ANALOG_DRYER_TEMP1, HARDWARE_PID_CONTROL_TYPE__DryerAirTemperature,270,true,DEBUG_LOG_CATEGORY__Error,0xFF,0,EVENT_TYPE__DRYER_ZONE_1_OVERTEMPERATURE,"Dryer Over Temperature"}, - - /*{eHundredMillisecond,CoversAlarm,FrontDoor1 ,1,false,true,DEBUG_LOG_CATEGORY__Error, 0xFF,5,EVENT_TYPE__FRONT_COVER_1_OPEN,"Front door #1 Open"}, - {eHundredMillisecond,CoversAlarm,FrontDoor2 ,1,false,true,DEBUG_LOG_CATEGORY__Error, 0xFF,5,EVENT_TYPE__FRONT_COVER_2_OPEN,"Front door #2 Open"}, - {eHundredMillisecond,CoversAlarm,FrontDoor3 ,1,false,true,DEBUG_LOG_CATEGORY__Error, 0xFF,5,EVENT_TYPE__FRONT_COVER_3_OPEN,"Front door #3 Open"}, - {eHundredMillisecond,CoversAlarm,FrontDoor4 ,1,false,true,DEBUG_LOG_CATEGORY__Error, 0xFF,5,EVENT_TYPE__FRONT_COVER_4_OPEN,"Front door #4 Open"}, - {eHundredMillisecond,CoversAlarm,RearDoor ,1,false,true,DEBUG_LOG_CATEGORY__Error, 0xFF,5,EVENT_TYPE__REAR_COVER_OPEN,"Rear door Open"}, - {eHundredMillisecond,CoversAlarm,CartridgesDoor,1,false,true,DEBUG_LOG_CATEGORY__Warning,0xFF,5,EVENT_TYPE__CARTRIDGES_COVER_OPEN,"Cartridges door Open"},*/ - - {eOneSecond,TemperatureAlarm,MIXER_PT100, HARDWARE_PID_CONTROL_TYPE__MixerHeater ,9,false,DEBUG_LOG_CATEGORY__Error,0xFF,0,EVENT_TYPE__MIXER_UNDERTEMPERATURE_A,"Mixer PT100 Not Heating"}, - {eOneSecond,TemperatureAlarm,TEMP_SENSE_ANALOG_DYEINGH_TEMP1,HARDWARE_PID_CONTROL_TYPE__HeadHeaterZ1 ,9,false,DEBUG_LOG_CATEGORY__Error,0xFF,0,EVENT_TYPE__DYEING_HEAD_ZONE_1_UNDERTEMPERATURE_A,"DyeingHead 1 PT100 Not Heating"}, - {eOneSecond,TemperatureAlarm,TEMP_SENSE_ANALOG_DYEINGH_TEMP2,HARDWARE_PID_CONTROL_TYPE__HeadHeaterZ2 ,9,false,DEBUG_LOG_CATEGORY__Error,0xFF,0,EVENT_TYPE__DYEING_HEAD_ZONE_2_UNDERTEMPERATURE_A,"DyeingHead 2 PT100 Not Heating"}, - {eOneSecond,TemperatureAlarm,TEMP_SENSE_ANALOG_DYEINGH_TEMP3,HARDWARE_PID_CONTROL_TYPE__HeadHeaterZ3 ,9,false,DEBUG_LOG_CATEGORY__Error,0xFF,0,EVENT_TYPE__DYEING_HEAD_ZONE_3_UNDERTEMPERATURE_A,"DyeingHead 3 PT100 Not Heating"}, - {eOneSecond,TemperatureAlarm,TEMP_SENSE_ANALOG_DYEINGH_TEMP4,HARDWARE_PID_CONTROL_TYPE__HeadHeaterZ4 ,9,false,DEBUG_LOG_CATEGORY__Error,0xFF,0,EVENT_TYPE__DYEING_HEAD_ZONE_4_UNDERTEMPERATURE_A,"DyeingHead 4 PT100 Not Heating"}, - {eOneSecond,TemperatureAlarm,TEMP_SENSE_ANALOG_DYEINGH_TEMP5,HARDWARE_PID_CONTROL_TYPE__HeadHeaterZ5 ,9,false,DEBUG_LOG_CATEGORY__Error,0xFF,0,EVENT_TYPE__DYEING_HEAD_ZONE_5_UNDERTEMPERATURE_A,"DyeingHead 5 PT100 Not Heating"}, - {eOneSecond,TemperatureAlarm,HEAD6_PT100, HARDWARE_PID_CONTROL_TYPE__HeadHeaterZ6 ,9,false,DEBUG_LOG_CATEGORY__Error,0xFF,0,EVENT_TYPE__DYEING_HEAD_ZONE_6_UNDERTEMPERATURE_A,"DyeingHead 6 PT100 Not Heating"}, - {eOneSecond,TemperatureAlarm,TEMP_SENSE_ANALOG_DRYER_TEMP1, HARDWARE_PID_CONTROL_TYPE__DryerAirTemperature,9,false,DEBUG_LOG_CATEGORY__Error,0xFF,0,EVENT_TYPE__DRYER_ZONE_1_UNDERTEMPERATURE_A,"Dryer PT100 Not Heating"}, - {eOneSecond,TemperatureAlarm,MIXER_PT100, HARDWARE_PID_CONTROL_TYPE__MixerHeater ,9,false,DEBUG_LOG_CATEGORY__Error,0xFF,0,EVENT_TYPE__MIXER_UNDERTEMPERATURE_B,"Mixer PT100 Heating Failure"}, - {eOneSecond,TemperatureAlarm,TEMP_SENSE_ANALOG_DYEINGH_TEMP1,HARDWARE_PID_CONTROL_TYPE__HeadHeaterZ1 ,9,false,DEBUG_LOG_CATEGORY__Error,0xFF,0,EVENT_TYPE__DYEING_HEAD_ZONE_1_UNDERTEMPERATURE_B,"DyeingHead 1 PT100 Heating Failure"}, - {eOneSecond,TemperatureAlarm,TEMP_SENSE_ANALOG_DYEINGH_TEMP2,HARDWARE_PID_CONTROL_TYPE__HeadHeaterZ2 ,9,false,DEBUG_LOG_CATEGORY__Error,0xFF,0,EVENT_TYPE__DYEING_HEAD_ZONE_2_UNDERTEMPERATURE_B,"DyeingHead 2 PT100 Heating Failure"}, - {eOneSecond,TemperatureAlarm,TEMP_SENSE_ANALOG_DYEINGH_TEMP3,HARDWARE_PID_CONTROL_TYPE__HeadHeaterZ3 ,9,false,DEBUG_LOG_CATEGORY__Error,0xFF,0,EVENT_TYPE__DYEING_HEAD_ZONE_3_UNDERTEMPERATURE_B,"DyeingHead 3 PT100 Heating Failure"}, - {eOneSecond,TemperatureAlarm,TEMP_SENSE_ANALOG_DYEINGH_TEMP4,HARDWARE_PID_CONTROL_TYPE__HeadHeaterZ4 ,9,false,DEBUG_LOG_CATEGORY__Error,0xFF,0,EVENT_TYPE__DYEING_HEAD_ZONE_4_UNDERTEMPERATURE_B,"DyeingHead 4 PT100 Heating Failure"}, - {eOneSecond,TemperatureAlarm,TEMP_SENSE_ANALOG_DYEINGH_TEMP5,HARDWARE_PID_CONTROL_TYPE__HeadHeaterZ5 ,9,false,DEBUG_LOG_CATEGORY__Error,0xFF,0,EVENT_TYPE__DYEING_HEAD_ZONE_5_UNDERTEMPERATURE_B,"DyeingHead 5 PT100 Heating Failure"}, - {eOneSecond,TemperatureAlarm,HEAD6_PT100, HARDWARE_PID_CONTROL_TYPE__HeadHeaterZ6 ,9,false,DEBUG_LOG_CATEGORY__Error,0xFF,0,EVENT_TYPE__DYEING_HEAD_ZONE_6_UNDERTEMPERATURE_B,"DyeingHead 6 PT100 Heating Failure"}, - {eOneSecond,TemperatureAlarm,TEMP_SENSE_ANALOG_DRYER_TEMP1, HARDWARE_PID_CONTROL_TYPE__DryerAirTemperature,9,false,DEBUG_LOG_CATEGORY__Error,0xFF,0,EVENT_TYPE__DRYER_ZONE_1_UNDERTEMPERATURE_B,"Dryer PT100 Heating Failure"}, - { eOneSecond, MotorAlarm, HARDWARE_MOTOR_TYPE__MOTO_RLOADING , HARDWARE_MOTOR_TYPE__MOTO_RLOADING , x_STATUS_OCD , FALSE , DEBUG_LOG_CATEGORY__Error , 0xFF , 2 , EVENT_TYPE__RIGHT_LOADER_MOTOR_OVERCURRENT ," MotorRightLoaderOverCurrent " }, /* 3004 */ - { eOneSecond, MotorAlarm, HARDWARE_MOTOR_TYPE__MOTO_LLOADING , HARDWARE_MOTOR_TYPE__MOTO_LLOADING , x_STATUS_OCD , FALSE , DEBUG_LOG_CATEGORY__Error , 0xFF , 2 , EVENT_TYPE__LEFT_LOADER_MOTOR_OVERCURRENT ," MotorLeftLoaderOverCurrent " }, /* 3006 */ - { eOneSecond, MotorAlarm, HARDWARE_MOTOR_TYPE__MOTO_DRYER_LOADARM , HARDWARE_MOTOR_TYPE__MOTO_DRYER_LOADARM , x_STATUS_OCD , FALSE , DEBUG_LOG_CATEGORY__Error , 0xFF , 2 , EVENT_TYPE__LOADING_ARM_MOTOR_OVERCURRENT ," MotorLoadindARMOverCurrent " }, /* 3009 */ - { eOneSecond, MotorAlarm, HARDWARE_MOTOR_TYPE__MOTO_LDANCER2 , HARDWARE_MOTOR_TYPE__MOTO_LDANCER2 , x_STATUS_OCD , FALSE , DEBUG_LOG_CATEGORY__Error , 0xFF , 2 , EVENT_TYPE__WINDER_MOTOR_OVERCURRENT /*EVENT_TYPE__WINDER_DANCER_MOTOR_OVERCURRENT*/ ," MotorWinderDancerOverCurrent " }, /* 3036 */ - { eOneSecond, MotorAlarm, HARDWARE_MOTOR_TYPE__MOTO_LDANCER1 , HARDWARE_MOTOR_TYPE__MOTO_LDANCER1 , x_STATUS_OCD , FALSE , DEBUG_LOG_CATEGORY__Error , 0xFF , 2 , EVENT_TYPE__PULLER_MOTOR_OVERCURRENT /*EVENT_TYPE__PULLER_DANCER_MOTOR_OVERCURRENT*/ ," MotorPullerDancerOverCurrent " }, /* 3037 */ - { eOneSecond, MotorAlarm, HARDWARE_MOTOR_TYPE__MOTO_RDANCER , HARDWARE_MOTOR_TYPE__MOTO_RDANCER , x_STATUS_OCD , FALSE , DEBUG_LOG_CATEGORY__Error , 0xFF , 2 , EVENT_TYPE__FEEDER_MOTOR_OVERCURRENT /*EVENT_TYPE__FEEDER_DANCER_MOTOR_OVERCURRENT*/ ," MotorFeederDancerOverCurrent " }, /* 3038 */ - { eOneSecond, MotorAlarm, HARDWARE_MOTOR_TYPE__MOTO_DRYER_LID , HARDWARE_MOTOR_TYPE__MOTO_DRYER_LID , x_STATUS_OCD , FALSE , DEBUG_LOG_CATEGORY__Error , 0xFF , 2 , EVENT_TYPE__DRYER_MOTOR_OVERCURRENT /*EVENT_TYPE__DRYER_LID_MOTOR_OVERCURRENT*/ ," MotorDryerLidOverCurrent " }, /* 4017 */ - { eOneSecond, MotorAlarm, HARDWARE_MOTOR_TYPE__MOTO_DH_LID , HARDWARE_MOTOR_TYPE__MOTO_DH_LID , x_STATUS_OCD , FALSE , DEBUG_LOG_CATEGORY__Error , 0xFF , 2 , EVENT_TYPE__DYEING_HEAD_COVER_MOTOR_OVERCURRENT ," MotorDyeingHeadCoverOverCurrent " }, /* 5031 */ - { eOneSecond, MotorAlarm, HARDWARE_MOTOR_TYPE__MOTO_DH_CLEANMECH , HARDWARE_MOTOR_TYPE__MOTO_DH_CLEANMECH , x_STATUS_OCD , FALSE , DEBUG_LOG_CATEGORY__Error , 0xFF , 2 , EVENT_TYPE__DYEING_HEAD_CLEANING_MECHANISM_MOTOR_OVERCURRENT ," MotorDyeingHeadCleaningMechanismOverCurrent "}, /* 5035 */ - { eOneSecond, MotorAlarm, HARDWARE_MOTOR_TYPE__MOTO_DH_CLEANHEAD , HARDWARE_MOTOR_TYPE__MOTO_DH_CLEANHEAD , x_STATUS_OCD , FALSE , DEBUG_LOG_CATEGORY__Error , 0xFF , 2 , EVENT_TYPE__DYEING_HEAD_CLEANING_HEAD_MOTOR_OVERCURRENT ," MotorDyeingHeadCleaningHeadOverCurrent " }, /* 5039 */ - - { eOneSecond, MotorAlarm, HARDWARE_MOTOR_TYPE__MOTO_RLOADING , HARDWARE_MOTOR_TYPE__MOTO_RLOADING , x_STATUS_TH_SD , FALSE , DEBUG_LOG_CATEGORY__Error , 0xFF , 2 , EVENT_TYPE__RIGHT_LOADER_MOTOR_OVERTEMPERATURE ," MotorRightLoaderOverTemperature " }, /* 3011 */ - { eOneSecond, MotorAlarm, HARDWARE_MOTOR_TYPE__MOTO_LLOADING , HARDWARE_MOTOR_TYPE__MOTO_LLOADING , x_STATUS_TH_SD , FALSE , DEBUG_LOG_CATEGORY__Error , 0xFF , 2 , EVENT_TYPE__LEFT_LOADER_MOTOR_OVERTEMPERATURE ," MotorLeftLoaderOverTemperature " }, /* 3013 */ - { eOneSecond, MotorAlarm, HARDWARE_MOTOR_TYPE__MOTO_DRYER_LOADARM , HARDWARE_MOTOR_TYPE__MOTO_DRYER_LOADARM , x_STATUS_TH_SD , FALSE , DEBUG_LOG_CATEGORY__Error , 0xFF , 2 , EVENT_TYPE__LOADING_ARM_MOTOR_OVERTEMPERATURE ," MotorLoadArmOverTemperature " }, /* 3016 */ - { eOneSecond, MotorAlarm, HARDWARE_MOTOR_TYPE__MOTO_LDANCER2 , HARDWARE_MOTOR_TYPE__MOTO_LDANCER2 , x_STATUS_TH_SD , FALSE , DEBUG_LOG_CATEGORY__Error , 0xFF , 2 , EVENT_TYPE__WINDER_DANCER_MOTOR_OVERTEMPERATURE ," MotorWinderDancerOverTemperature " }, /* 3039 */ - { eOneSecond, MotorAlarm, HARDWARE_MOTOR_TYPE__MOTO_LDANCER1 , HARDWARE_MOTOR_TYPE__MOTO_LDANCER1 , x_STATUS_TH_SD , FALSE , DEBUG_LOG_CATEGORY__Error , 0xFF , 2 , EVENT_TYPE__PULLER_DANCER_MOTOR_OVERTEMPERATURE ," MotorPullerDancerOverTemperature " }, /* 3040 */ - { eOneSecond, MotorAlarm, HARDWARE_MOTOR_TYPE__MOTO_RDANCER , HARDWARE_MOTOR_TYPE__MOTO_RDANCER , x_STATUS_TH_SD , FALSE , DEBUG_LOG_CATEGORY__Error , 0xFF , 2 , EVENT_TYPE__FEEDER_DANCER_MOTOR_OVERTEMPERATURE ," MotorFeederDancerOverTemperature " }, /* 3041 */ - { eOneSecond, MotorAlarm, HARDWARE_MOTOR_TYPE__MOTO_DRYER_LID , HARDWARE_MOTOR_TYPE__MOTO_DRYER_LID , x_STATUS_TH_SD , FALSE , DEBUG_LOG_CATEGORY__Error , 0xFF , 2 , EVENT_TYPE__DRYER_LID_MOTOR_OVERTEMPERATURE ," MotorDryerLidOverTemperature " }, /* 4018 */ - { eOneSecond, MotorAlarm, HARDWARE_MOTOR_TYPE__MOTO_DH_LID , HARDWARE_MOTOR_TYPE__MOTO_DH_LID , x_STATUS_TH_SD , FALSE , DEBUG_LOG_CATEGORY__Error , 0xFF , 2 , EVENT_TYPE__DYEING_HEAD_COVER_MOTOR_OVERTEMPERATURE ," MotorDyeingHeadCoverOverTemperature " }, /* 5032 */ - { eOneSecond, MotorAlarm, HARDWARE_MOTOR_TYPE__MOTO_DH_CLEANMECH , HARDWARE_MOTOR_TYPE__MOTO_DH_CLEANMECH , x_STATUS_TH_SD , FALSE , DEBUG_LOG_CATEGORY__Error , 0xFF , 2 , EVENT_TYPE__DYEING_HEAD_CLEANING_MECHANISM_MOTOR_OVERTEMPERATURE ," MotorDyeingHeadCleaningOverTemperature " }, /* 5036 */ - { eOneSecond, MotorAlarm, HARDWARE_MOTOR_TYPE__MOTO_DH_CLEANHEAD , HARDWARE_MOTOR_TYPE__MOTO_DH_CLEANHEAD , x_STATUS_TH_SD , FALSE , DEBUG_LOG_CATEGORY__Error , 0xFF , 2 , EVENT_TYPE__DYEING_HEAD_CLEANING_HEAD_MOTOR_OVERTEMPERATURE ," MotorDyeingHeadCleaningHeadOverTemperature "}, /* 5040 */ - - { eOneSecond, MotorAlarm, HARDWARE_MOTOR_TYPE__MOTO_RLOADING , HARDWARE_MOTOR_TYPE__MOTO_RLOADING ,x_STATUS_STEP_LOSS_A , FALSE , DEBUG_LOG_CATEGORY__Error , 0xFF , 2 , EVENT_TYPE__LOADING_ARM_MOTOR_STALL ," MotorLoadingARMStall " }, /* 3018 */ - { eOneSecond, MotorAlarm, HARDWARE_MOTOR_TYPE__MOTO_LLOADING , HARDWARE_MOTOR_TYPE__MOTO_LLOADING ,x_STATUS_STEP_LOSS_A , FALSE , DEBUG_LOG_CATEGORY__Error , 0xFF , 2 , EVENT_TYPE__WINDER_DANCER_MOTOR_STALL ," MotorWinderDancesStall " }, /* 3020 */ - { eOneSecond, MotorAlarm, HARDWARE_MOTOR_TYPE__MOTO_DRYER_LOADARM , HARDWARE_MOTOR_TYPE__MOTO_DRYER_LOADARM ,x_STATUS_STEP_LOSS_A , FALSE , DEBUG_LOG_CATEGORY__Error , 0xFF , 2 , EVENT_TYPE__LOADING_ARM_MOTOR_STALL ," MotorLoadingARMStall " }, /* 3023 */ - { eOneSecond, MotorAlarm, HARDWARE_MOTOR_TYPE__MOTO_LDANCER2 , HARDWARE_MOTOR_TYPE__MOTO_LDANCER2 ,x_STATUS_STEP_LOSS_A , FALSE , DEBUG_LOG_CATEGORY__Error , 0xFF , 2 , EVENT_TYPE__WINDER_DANCER_MOTOR_STALL ," MotorWinderDancesStall " }, /* 3042 */ - { eOneSecond, MotorAlarm, HARDWARE_MOTOR_TYPE__MOTO_LDANCER1 , HARDWARE_MOTOR_TYPE__MOTO_LDANCER1 ,x_STATUS_STEP_LOSS_A , FALSE , DEBUG_LOG_CATEGORY__Error , 0xFF , 2 , EVENT_TYPE__PULLER_DANCER_MOTOR_STALL ," MotorPullerDancerStall " }, /* 3043 */ - { eOneSecond, MotorAlarm, HARDWARE_MOTOR_TYPE__MOTO_RDANCER , HARDWARE_MOTOR_TYPE__MOTO_RDANCER ,x_STATUS_STEP_LOSS_A , FALSE , DEBUG_LOG_CATEGORY__Error , 0xFF , 2 , EVENT_TYPE__FEEDER_DANCER_MOTOR_STALL ," MotorFeederDancerStall " }, /* 3044 */ - { eOneSecond, MotorAlarm, HARDWARE_MOTOR_TYPE__MOTO_DRYER_LID , HARDWARE_MOTOR_TYPE__MOTO_DRYER_LID ,x_STATUS_STEP_LOSS_A , FALSE , DEBUG_LOG_CATEGORY__Error , 0xFF , 2 , EVENT_TYPE__DRYER_LID_MOTOR_STALL ," MotorDryerLidStall " }, /* 4019 */ - { eOneSecond, MotorAlarm, HARDWARE_MOTOR_TYPE__MOTO_DH_LID , HARDWARE_MOTOR_TYPE__MOTO_DH_LID ,x_STATUS_STEP_LOSS_A , FALSE , DEBUG_LOG_CATEGORY__Error , 0xFF , 2 , EVENT_TYPE__DYEING_HEAD_COVER_MOTOR_STALL ," MotorDyeingHeadCoverStall " }, /* 5033 */ - { eOneSecond, MotorAlarm, HARDWARE_MOTOR_TYPE__MOTO_DH_CLEANMECH , HARDWARE_MOTOR_TYPE__MOTO_DH_CLEANMECH ,x_STATUS_STEP_LOSS_A , FALSE , DEBUG_LOG_CATEGORY__Error , 0xFF , 2 , EVENT_TYPE__DYEING_HEAD_CLEANING_MECHANISM_MOTOR_STALL ," MotorDyeingHeadCleaningMechanismStall " }, /* 5037 */ - { eOneSecond, MotorAlarm, HARDWARE_MOTOR_TYPE__MOTO_DH_CLEANHEAD , HARDWARE_MOTOR_TYPE__MOTO_DH_CLEANHEAD ,x_STATUS_STEP_LOSS_A , FALSE , DEBUG_LOG_CATEGORY__Error , 0xFF , 2 , EVENT_TYPE__DYEING_HEAD_CLEANING_HEAD_MOTOR_STALL ," MotorDryeingHeadCleaningStall " }, /* 5041 */ - - { eOneSecond, MotorAlarm, HARDWARE_MOTOR_TYPE__MOTO_RLOADING , HARDWARE_MOTOR_TYPE__MOTO_RLOADING , x_STATUS_UVLO , FALSE , DEBUG_LOG_CATEGORY__Error , 0xFF , 2 , EVENT_TYPE__RIGHT_LOADER_MOTOR_UNDERVOLTAGE ," MotorRightLoaderUnderVoltage " }, /* 3025 */ - { eOneSecond, MotorAlarm, HARDWARE_MOTOR_TYPE__MOTO_LLOADING , HARDWARE_MOTOR_TYPE__MOTO_LLOADING , x_STATUS_UVLO , FALSE , DEBUG_LOG_CATEGORY__Error , 0xFF , 2 , EVENT_TYPE__LEFT_LOADER_MOTOR_UNDERVOLTAGE ," MotorLeftLoaderUnderVoltage " }, /* 3027 */ - { eOneSecond, MotorAlarm, HARDWARE_MOTOR_TYPE__MOTO_DRYER_LOADARM , HARDWARE_MOTOR_TYPE__MOTO_DRYER_LOADARM , x_STATUS_UVLO , FALSE , DEBUG_LOG_CATEGORY__Error , 0xFF , 2 , EVENT_TYPE__LOADING_ARM_MOTOR_UNDERVOLTAGE ," MotorLoaderARMUnderVoltage " }, /* 3030 */ - { eOneSecond, MotorAlarm, HARDWARE_MOTOR_TYPE__MOTO_LDANCER2 , HARDWARE_MOTOR_TYPE__MOTO_LDANCER2 , x_STATUS_UVLO , FALSE , DEBUG_LOG_CATEGORY__Error , 0xFF , 2 , EVENT_TYPE__WINDER_DANCER_MOTOR_UNDERVOLTAGE ," MotorWinderDancerUnderVoltage " }, /* 3045 */ - { eOneSecond, MotorAlarm, HARDWARE_MOTOR_TYPE__MOTO_LDANCER1 , HARDWARE_MOTOR_TYPE__MOTO_LDANCER1 , x_STATUS_UVLO , FALSE , DEBUG_LOG_CATEGORY__Error , 0xFF , 2 , EVENT_TYPE__PULLER_DANCER_MOTOR_UNDERVOLTAGE ," MotorPullerDancerUnderVoltage " }, /* 3046 */ - { eOneSecond, MotorAlarm, HARDWARE_MOTOR_TYPE__MOTO_RDANCER , HARDWARE_MOTOR_TYPE__MOTO_RDANCER , x_STATUS_UVLO , FALSE , DEBUG_LOG_CATEGORY__Error , 0xFF , 2 , EVENT_TYPE__FEEDER_DANCER_MOTOR_UNDERVOLTAGE ," MotorFeederDancerUnderVoltage " }, /* 3047 */ - { eOneSecond, MotorAlarm, HARDWARE_MOTOR_TYPE__MOTO_DRYER_LID , HARDWARE_MOTOR_TYPE__MOTO_DRYER_LID , x_STATUS_UVLO , FALSE , DEBUG_LOG_CATEGORY__Error , 0xFF , 2 , EVENT_TYPE__DRYER_LID_MOTOR_UNDERVOLTAGE ," MotorDryerLidUnderVoltage " }, /* 4020 */ - { eOneSecond, MotorAlarm, HARDWARE_MOTOR_TYPE__MOTO_DH_LID , HARDWARE_MOTOR_TYPE__MOTO_DH_LID , x_STATUS_UVLO , FALSE , DEBUG_LOG_CATEGORY__Error , 0xFF , 2 , EVENT_TYPE__DYEING_HEAD_COVER_MOTOR_UNDERVOLTAGE ," MotorDyeingHeadCoverUnderVoltage " }, /* 5034 */ - { eOneSecond, MotorAlarm, HARDWARE_MOTOR_TYPE__MOTO_DH_CLEANMECH , HARDWARE_MOTOR_TYPE__MOTO_DH_CLEANMECH , x_STATUS_UVLO , FALSE , DEBUG_LOG_CATEGORY__Error , 0xFF , 2 , EVENT_TYPE__DYEING_HEAD_CLEANING_MECHANISM_MOTOR_UNDERVOLTAGE ," MotorDyeingHeadCleaningUnderVoltage " }, /* 5038 */ - { eOneSecond, MotorAlarm, HARDWARE_MOTOR_TYPE__MOTO_DH_CLEANHEAD , HARDWARE_MOTOR_TYPE__MOTO_DH_CLEANHEAD , x_STATUS_UVLO , FALSE , DEBUG_LOG_CATEGORY__Error , 0xFF , 2 , EVENT_TYPE__DYEING_HEAD_CLEANING_HEAD_MOTOR_UNDERVOLTAGE ," MotorDyeingHeadCleaningHeadUnderVoltage " }, /* 5042 */ - -// { eOneSecond, CurrentAlarm, HEAD_ZONE_1 , HEAD_ZONE_1 , 312 , FALSE , DEBUG_LOG_CATEGORY__Warning , 0xFF , 2 , EVENT_TYPE__DYEING_HEAD_ZONE_1_CURRENT_OUT_OF_RANGE ," Head Zone 1 Heater Current Out Of Range " }, /* 5018 */ -// { eOneSecond, CurrentAlarm, HEAD_ZONE_2 , HEAD_ZONE_2 , 187 , FALSE , DEBUG_LOG_CATEGORY__Warning , 0xFF , 2 , EVENT_TYPE__DYEING_HEAD_ZONE_2_CURRENT_OUT_OF_RANGE ," Head Zone 2 Heater Current Out Of Range " }, /* 5019 */ -// { eOneSecond, CurrentAlarm, HEAD_ZONE_3 , HEAD_ZONE_3 , 187 , FALSE , DEBUG_LOG_CATEGORY__Warning , 0xFF , 2 , EVENT_TYPE__DYEING_HEAD_ZONE_3_CURRENT_OUT_OF_RANGE ," Head Zone 3 Heater Current Out Of Range " }, /* 5020 */ -// { eOneSecond, CurrentAlarm, HEAD_ZONE_4 , HEAD_ZONE_4 , 312 , FALSE , DEBUG_LOG_CATEGORY__Warning , 0xFF , 2 , EVENT_TYPE__DYEING_HEAD_ZONE_4_CURRENT_OUT_OF_RANGE ," Head Zone 4 Heater Current Out Of Range " }, /* 5021 */ -// { eOneSecond, CurrentAlarm, HEAD_ZONE_5_6 , HEAD_ZONE_5_6 , 312 , FALSE , DEBUG_LOG_CATEGORY__Warning , 0xFF , 2 , EVENT_TYPE__DYEING_HEAD_ZONE_5_6_CURRENT_OUT_OF_RANGE ," Head Zone 5-6 Heater Current Out Of Range " }, /* 5022 */ -// { eOneSecond, CurrentAlarm, MIXCHIP , MIXCHIP , 187 , FALSE , DEBUG_LOG_CATEGORY__Warning , 0xFF , 2 , EVENT_TYPE__MIXER_CURRENT_OUT_OF_RANGE ," Mixer Heater Current Out Of Range " }, /* 6004 */ -// { eOneSecond, CurrentAlarm, DRYER_CURRENT_1, DRYER_CURRENT_1, 1 , FALSE , DEBUG_LOG_CATEGORY__Warning , 0xFF , 2 , EVENT_TYPE__DRYER_HEATERS_ZONE_1_CURRENT_OUT_OF_RANGE ," Drier Heater 1 Current Out Of Range " }, /* 6004 */ -// { eOneSecond, CurrentAlarm, DRYER_CURRENT_2, DRYER_CURRENT_2, 1 , FALSE , DEBUG_LOG_CATEGORY__Warning , 0xFF , 2 , EVENT_TYPE__DRYER_HEATERS_ZONE_2_CURRENT_OUT_OF_RANGE ," Drier Heater 2 Current Out Of Range " }, /* 6004 */ -// {eOneSecond,DoNotPollAlarm,0,0,0,0,DEBUG_LOG_CATEGORY__Safety,0xFF,0,EVENT_TYPE__DYEING_HEAD_THERMAL_CUTOFF,"Dyeing head Thermal Cut-Off"}, - - {eOneSecond,DoNotPollAlarm,0,0,0,0,DEBUG_LOG_CATEGORY__Warning,0xFF,0,EVENT_TYPE__THREAD_BREAK,"Thread Break"}, - {eOneSecond,DoNotPollAlarm,0,0,0,0,DEBUG_LOG_CATEGORY__Warning,0xFF,0,EVENT_TYPE__THREAD_TENSION_CONTROL_FAILURE_FEEDER_DANCER,"Thread Feeder Tension Control Failure"}, - {eOneSecond,DoNotPollAlarm,0,0,0,0,DEBUG_LOG_CATEGORY__Warning,0xFF,0,EVENT_TYPE__THREAD_TENSION_CONTROL_FAILURE_PULLER_DANCER,"Thread Puller Tension Control Failure"}, - {eOneSecond,DoNotPollAlarm,0,0,0,0,DEBUG_LOG_CATEGORY__Warning,0xFF,0,EVENT_TYPE__THREAD_TENSION_CONTROL_FAILURE_WINDER_DANCER,"Thread Winder Tension Control Failure"}, - {eOneSecond,DoNotPollAlarm,0,0,0,0,DEBUG_LOG_CATEGORY__Warning,0xFF,0,EVENT_TYPE__WINDER_CONE_DOES_NOT_EXIST,"No cone in winder"}, - - {eOneSecond,DoNotPollAlarm,0,0,0,0,DEBUG_LOG_CATEGORY__Safety,0xFF,0,EVENT_TYPE__DISPENSER_1_OVERPRESSURE,"Dispenser 1 OverPressure"}, - {eOneSecond,DoNotPollAlarm,0,0,0,0,DEBUG_LOG_CATEGORY__Safety,0xFF,0,EVENT_TYPE__DISPENSER_2_OVERPRESSURE,"Dispenser 2 OverPressure"}, - {eOneSecond,DoNotPollAlarm,0,0,0,0,DEBUG_LOG_CATEGORY__Safety,0xFF,0,EVENT_TYPE__DISPENSER_3_OVERPRESSURE,"Dispenser 3 OverPressure"}, - {eOneSecond,DoNotPollAlarm,0,0,0,0,DEBUG_LOG_CATEGORY__Safety,0xFF,0,EVENT_TYPE__DISPENSER_4_OVERPRESSURE,"Dispenser 4 OverPressure"}, - {eOneSecond,DoNotPollAlarm,0,0,0,0,DEBUG_LOG_CATEGORY__Safety,0xFF,0,EVENT_TYPE__DISPENSER_5_OVERPRESSURE,"Dispenser 5 OverPressure"}, - {eOneSecond,DoNotPollAlarm,0,0,0,0,DEBUG_LOG_CATEGORY__Safety,0xFF,0,EVENT_TYPE__DISPENSER_6_OVERPRESSURE,"Dispenser 6 OverPressure"}, - {eOneSecond,DoNotPollAlarm,0,0,0,0,DEBUG_LOG_CATEGORY__Safety,0xFF,0,EVENT_TYPE__DISPENSER_7_OVERPRESSURE,"Dispenser 7 OverPressure"}, - {eOneSecond,DoNotPollAlarm,0,0,0,0,DEBUG_LOG_CATEGORY__Safety,0xFF,0,EVENT_TYPE__DISPENSER_8_OVERPRESSURE,"Dispenser 8 OverPressure"}, - - {eOneSecond,DoNotPollAlarm,0,0,0,0,DEBUG_LOG_CATEGORY__Safety,0xFF,0,EVENT_TYPE__DRYER_DOOR_OPEN,"Dryer Door is open"}, - {eOneSecond,DoNotPollAlarm,0,0,0,0,DEBUG_LOG_CATEGORY__Safety,0xFF,0,EVENT_TYPE__NO_AIR_PRESSURE,"No suction in the waste handling system"}, - {eOneSecond,DoNotPollAlarm,0,0,0,0,DEBUG_LOG_CATEGORY__Safety,0xFF,0,EVENT_TYPE__AIR_FILTER_NOT_INSTALLED,"Air filter missing"}, + {eHundredMillisecond,ALARM_SOURCE_TYPE__LimitSwitchAlarm,LimitSwitchAlarmEmpty_1,0,false,true,DEBUG_LOG_CATEGORY__Error,0xFF,0,EVENT_TYPE__DISPENSER_1_EMPTY,"Dispenser 1 Empty"}, + {eHundredMillisecond,ALARM_SOURCE_TYPE__LimitSwitchAlarm,LimitSwitchAlarmEmpty_2,1,false,true,DEBUG_LOG_CATEGORY__Error,0xFF,0,EVENT_TYPE__DISPENSER_2_EMPTY,"Dispenser 2 Empty"}, + {eHundredMillisecond,ALARM_SOURCE_TYPE__LimitSwitchAlarm,LimitSwitchAlarmEmpty_3,2,false,true,DEBUG_LOG_CATEGORY__Error,0xFF,0,EVENT_TYPE__DISPENSER_3_EMPTY,"Dispenser 3 Empty"}, + {eHundredMillisecond,ALARM_SOURCE_TYPE__LimitSwitchAlarm,LimitSwitchAlarmEmpty_4,3,false,true,DEBUG_LOG_CATEGORY__Error,0xFF,0,EVENT_TYPE__DISPENSER_4_EMPTY,"Dispenser 4 Empty"}, + {eHundredMillisecond,ALARM_SOURCE_TYPE__LimitSwitchAlarm,LimitSwitchAlarmEmpty_5,4,false,true,DEBUG_LOG_CATEGORY__Error,0xFF,0,EVENT_TYPE__DISPENSER_5_EMPTY,"Dispenser 5 Empty"}, + {eHundredMillisecond,ALARM_SOURCE_TYPE__LimitSwitchAlarm,LimitSwitchAlarmEmpty_6,5,false,true,DEBUG_LOG_CATEGORY__Error,0xFF,0,EVENT_TYPE__DISPENSER_6_EMPTY,"Dispenser 6 Empty"}, + {eHundredMillisecond,ALARM_SOURCE_TYPE__LimitSwitchAlarm,LimitSwitchAlarmEmpty_7,6,false,true,DEBUG_LOG_CATEGORY__Error,0xFF,0,EVENT_TYPE__DISPENSER_7_EMPTY,"Dispenser 7 Empty"}, + {eHundredMillisecond,ALARM_SOURCE_TYPE__LimitSwitchAlarm,LimitSwitchAlarmEmpty_8,7,false,true,DEBUG_LOG_CATEGORY__Error,0xFF,0,EVENT_TYPE__DISPENSER_8_EMPTY,"Dispenser 8 Empty"}, + + {eOneSecond,ALARM_SOURCE_TYPE__HardLimitAlarm,0,0,true,true,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__DISPENSER_1_UPPER_HARD_LIMIT,"Dispenser 1 is at the upper limit"}, + {eOneSecond,ALARM_SOURCE_TYPE__HardLimitAlarm,1,1,true,true,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__DISPENSER_2_UPPER_HARD_LIMIT,"Dispenser 2 is at the upper limit"}, + {eOneSecond,ALARM_SOURCE_TYPE__HardLimitAlarm,2,2,true,true,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__DISPENSER_3_UPPER_HARD_LIMIT,"Dispenser 3 is at the upper limit"}, + {eOneSecond,ALARM_SOURCE_TYPE__HardLimitAlarm,3,3,true,true,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__DISPENSER_4_UPPER_HARD_LIMIT,"Dispenser 4 is at the upper limit"}, + {eOneSecond,ALARM_SOURCE_TYPE__HardLimitAlarm,4,4,true,true,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__DISPENSER_5_UPPER_HARD_LIMIT,"Dispenser 5 is at the upper limit"}, + {eOneSecond,ALARM_SOURCE_TYPE__HardLimitAlarm,5,5,true,true,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__DISPENSER_6_UPPER_HARD_LIMIT,"Dispenser 6 is at the upper limit"}, + {eOneSecond,ALARM_SOURCE_TYPE__HardLimitAlarm,6,6,true,true,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__DISPENSER_7_UPPER_HARD_LIMIT,"Dispenser 7 is at the upper limit"}, + {eOneSecond,ALARM_SOURCE_TYPE__HardLimitAlarm,7,7,true,true,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__DISPENSER_8_UPPER_HARD_LIMIT,"Dispenser 8 is at the upper limit"}, + {eOneSecond,ALARM_SOURCE_TYPE__HardLimitAlarm,0,0,true,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__DISPENSER_1_LOWER_HARD_LIMIT,"Dispenser 1 is at the lower limit"}, + {eOneSecond,ALARM_SOURCE_TYPE__HardLimitAlarm,1,1,true,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__DISPENSER_2_LOWER_HARD_LIMIT,"Dispenser 2 is at the lower limit"}, + {eOneSecond,ALARM_SOURCE_TYPE__HardLimitAlarm,2,2,true,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__DISPENSER_3_LOWER_HARD_LIMIT,"Dispenser 3 is at the lower limit"}, + {eOneSecond,ALARM_SOURCE_TYPE__HardLimitAlarm,3,3,true,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__DISPENSER_4_LOWER_HARD_LIMIT,"Dispenser 4 is at the lower limit"}, + {eOneSecond,ALARM_SOURCE_TYPE__HardLimitAlarm,4,4,true,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__DISPENSER_5_LOWER_HARD_LIMIT,"Dispenser 5 is at the lower limit"}, + {eOneSecond,ALARM_SOURCE_TYPE__HardLimitAlarm,5,5,true,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__DISPENSER_6_LOWER_HARD_LIMIT,"Dispenser 6 is at the lower limit"}, + {eOneSecond,ALARM_SOURCE_TYPE__HardLimitAlarm,6,6,true,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__DISPENSER_7_LOWER_HARD_LIMIT,"Dispenser 7 is at the lower limit"}, + {eOneSecond,ALARM_SOURCE_TYPE__HardLimitAlarm,7,7,true,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__DISPENSER_8_LOWER_HARD_LIMIT,"Dispenser 8 is at the lower limit"}, + + {eOneSecond,ALARM_SOURCE_TYPE__PressureAlarm,0,0,5,true,DEBUG_LOG_CATEGORY__Error,0xFF,5,EVENT_TYPE__DISPENSER_1_HIGH_PRESSURE,"Dispenser 1 High Pressure"}, + {eOneSecond,ALARM_SOURCE_TYPE__PressureAlarm,1,1,5,true,DEBUG_LOG_CATEGORY__Error,0xFF,5,EVENT_TYPE__DISPENSER_2_HIGH_PRESSURE,"Dispenser 2 High Pressure"}, + {eOneSecond,ALARM_SOURCE_TYPE__PressureAlarm,2,2,5,true,DEBUG_LOG_CATEGORY__Error,0xFF,5,EVENT_TYPE__DISPENSER_3_HIGH_PRESSURE,"Dispenser 3 High Pressure"}, + {eOneSecond,ALARM_SOURCE_TYPE__PressureAlarm,3,3,5,true,DEBUG_LOG_CATEGORY__Error,0xFF,5,EVENT_TYPE__DISPENSER_4_HIGH_PRESSURE,"Dispenser 4 High Pressure"}, + {eOneSecond,ALARM_SOURCE_TYPE__PressureAlarm,4,4,5,true,DEBUG_LOG_CATEGORY__Error,0xFF,5,EVENT_TYPE__DISPENSER_5_HIGH_PRESSURE,"Dispenser 5 High Pressure"}, + {eOneSecond,ALARM_SOURCE_TYPE__PressureAlarm,5,5,5,true,DEBUG_LOG_CATEGORY__Error,0xFF,5,EVENT_TYPE__DISPENSER_6_HIGH_PRESSURE,"Dispenser 6 High Pressure"}, + {eOneSecond,ALARM_SOURCE_TYPE__PressureAlarm,6,6,5,true,DEBUG_LOG_CATEGORY__Error,0xFF,5,EVENT_TYPE__DISPENSER_7_HIGH_PRESSURE,"Dispenser 7 High Pressure"}, + {eOneSecond,ALARM_SOURCE_TYPE__PressureAlarm,7,7,5,true,DEBUG_LOG_CATEGORY__Error,0xFF,5,EVENT_TYPE__DISPENSER_8_HIGH_PRESSURE,"Dispenser 8 High Pressure"}, + + {eOneSecond,ALARM_SOURCE_TYPE__DoNotPollAlarm,0,0,0,0,DEBUG_LOG_CATEGORY__Critical,0xFF,0,EVENT_TYPE__DISPENSER_1_OVERPRESSURE,"Dispenser 1 Over Pressure"}, + {eOneSecond,ALARM_SOURCE_TYPE__DoNotPollAlarm,0,0,0,0,DEBUG_LOG_CATEGORY__Critical,0xFF,0,EVENT_TYPE__DISPENSER_2_OVERPRESSURE,"Dispenser 2 Over Pressure"}, + {eOneSecond,ALARM_SOURCE_TYPE__DoNotPollAlarm,0,0,0,0,DEBUG_LOG_CATEGORY__Critical,0xFF,0,EVENT_TYPE__DISPENSER_3_OVERPRESSURE,"Dispenser 3 Over Pressure"}, + {eOneSecond,ALARM_SOURCE_TYPE__DoNotPollAlarm,0,0,0,0,DEBUG_LOG_CATEGORY__Critical,0xFF,0,EVENT_TYPE__DISPENSER_4_OVERPRESSURE,"Dispenser 4 Over Pressure"}, + {eOneSecond,ALARM_SOURCE_TYPE__DoNotPollAlarm,0,0,0,0,DEBUG_LOG_CATEGORY__Critical,0xFF,0,EVENT_TYPE__DISPENSER_5_OVERPRESSURE,"Dispenser 5 Over Pressure"}, + {eOneSecond,ALARM_SOURCE_TYPE__DoNotPollAlarm,0,0,0,0,DEBUG_LOG_CATEGORY__Critical,0xFF,0,EVENT_TYPE__DISPENSER_6_OVERPRESSURE,"Dispenser 6 Over Pressure"}, + {eOneSecond,ALARM_SOURCE_TYPE__DoNotPollAlarm,0,0,0,0,DEBUG_LOG_CATEGORY__Critical,0xFF,0,EVENT_TYPE__DISPENSER_7_OVERPRESSURE,"Dispenser 7 Over Pressure"}, + {eOneSecond,ALARM_SOURCE_TYPE__DoNotPollAlarm,0,0,0,0,DEBUG_LOG_CATEGORY__Critical,0xFF,0,EVENT_TYPE__DISPENSER_8_OVERPRESSURE,"Dispenser 8 Over Pressure"}, + + {eOneSecond,ALARM_SOURCE_TYPE__MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_DRYER_DRIVING,HARDWARE_MOTOR_TYPE__MOTO_DRYER_DRIVING,x_STATUS_OCD,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__DRYER_MOTOR_OVERCURRENT,"Motor Drier Over Current"}, + {eOneSecond,ALARM_SOURCE_TYPE__MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_RDRIVING, HARDWARE_MOTOR_TYPE__MOTO_RDRIVING, x_STATUS_OCD,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__FEEDER_MOTOR_OVERCURRENT,"Motor Feeder Over Current"}, + {eOneSecond,ALARM_SOURCE_TYPE__MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_SCREW, HARDWARE_MOTOR_TYPE__MOTO_SCREW, x_STATUS_OCD,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__SCREW_MOTOR_OVERCURRENT,"Motor Screw Over Current"}, + {eOneSecond,ALARM_SOURCE_TYPE__MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_WINDER, HARDWARE_MOTOR_TYPE__MOTO_WINDER, x_STATUS_OCD,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__WINDER_MOTOR_OVERCURRENT,"Motor Winder Over Current"}, + {eOneSecond,ALARM_SOURCE_TYPE__MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_LDRIVING, HARDWARE_MOTOR_TYPE__MOTO_LDRIVING, x_STATUS_OCD,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__PULLER_MOTOR_OVERCURRENT,"Motor Puller Over Current"}, + {eOneSecond,ALARM_SOURCE_TYPE__MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_1, HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_1, x_STATUS_OCD,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__DISPENSER_1_MOTOR_OVERCURRENT,"Motor Dispenser1 Over Current"}, + {eOneSecond,ALARM_SOURCE_TYPE__MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_2, HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_2, x_STATUS_OCD,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__DISPENSER_2_MOTOR_OVERCURRENT,"Motor Dispenser2 Over Current"}, + {eOneSecond,ALARM_SOURCE_TYPE__MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_3, HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_3, x_STATUS_OCD,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__DISPENSER_3_MOTOR_OVERCURRENT,"Motor Dispenser3 Over Current"}, + {eOneSecond,ALARM_SOURCE_TYPE__MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_4, HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_4, x_STATUS_OCD,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__DISPENSER_4_MOTOR_OVERCURRENT,"Motor Dispenser4 Over Current"}, + {eOneSecond,ALARM_SOURCE_TYPE__MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_5, HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_5, x_STATUS_OCD,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__DISPENSER_5_MOTOR_OVERCURRENT,"Motor Dispenser5 Over Current"}, + {eOneSecond,ALARM_SOURCE_TYPE__MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_6, HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_6, x_STATUS_OCD,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__DISPENSER_6_MOTOR_OVERCURRENT,"Motor Dispenser6 Over Current"}, + {eOneSecond,ALARM_SOURCE_TYPE__MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_7, HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_7, x_STATUS_OCD,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__DISPENSER_7_MOTOR_OVERCURRENT,"Motor Dispenser7 Over Current"}, + {eOneSecond,ALARM_SOURCE_TYPE__MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_8, HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_8, x_STATUS_OCD,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__DISPENSER_8_MOTOR_OVERCURRENT,"Motor Dispenser8 Over Current"}, + {eOneSecond,ALARM_SOURCE_TYPE__MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_DRYER_DRIVING,HARDWARE_MOTOR_TYPE__MOTO_DRYER_DRIVING,x_STATUS_TH_SD,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__DRYER_MOTOR_OVERTEMPERATURE,"Motor Drier Over Temperature"}, + {eOneSecond,ALARM_SOURCE_TYPE__MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_RDRIVING, HARDWARE_MOTOR_TYPE__MOTO_RDRIVING, x_STATUS_TH_SD,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__FEEDER_MOTOR_OVERTEMPERATURE,"Motor Feeder Over Temperature"}, + {eOneSecond,ALARM_SOURCE_TYPE__MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_SCREW, HARDWARE_MOTOR_TYPE__MOTO_SCREW, x_STATUS_TH_SD,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__SCREW_MOTOR_OVERTEMPERATURE,"Motor Screw Over Temperature"}, + {eOneSecond,ALARM_SOURCE_TYPE__MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_WINDER, HARDWARE_MOTOR_TYPE__MOTO_WINDER, x_STATUS_TH_SD,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__WINDER_MOTOR_OVERTEMPERATURE,"Motor Winder Over Temperature"}, + {eOneSecond,ALARM_SOURCE_TYPE__MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_LDRIVING, HARDWARE_MOTOR_TYPE__MOTO_LDRIVING, x_STATUS_TH_SD,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__PULLER_MOTOR_OVERTEMPERATURE,"Motor Puller Over Temperature"}, + {eOneSecond,ALARM_SOURCE_TYPE__MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_1, HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_1, x_STATUS_TH_SD,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__DISPENSER_1_MOTOR_OVERTEMPERATURE,"Motor Dispenser1 Over Temperature"}, + {eOneSecond,ALARM_SOURCE_TYPE__MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_2, HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_2, x_STATUS_TH_SD,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__DISPENSER_2_MOTOR_OVERTEMPERATURE,"Motor Dispenser2 Over Temperature"}, + {eOneSecond,ALARM_SOURCE_TYPE__MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_3, HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_3, x_STATUS_TH_SD,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__DISPENSER_3_MOTOR_OVERTEMPERATURE,"Motor Dispenser3 Over Temperature"}, + {eOneSecond,ALARM_SOURCE_TYPE__MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_4, HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_4, x_STATUS_TH_SD,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__DISPENSER_4_MOTOR_OVERTEMPERATURE,"Motor Dispenser4 Over Temperature"}, + {eOneSecond,ALARM_SOURCE_TYPE__MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_5, HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_5, x_STATUS_TH_SD,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__DISPENSER_5_MOTOR_OVERTEMPERATURE,"Motor Dispenser5 Over Temperature"}, + {eOneSecond,ALARM_SOURCE_TYPE__MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_6, HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_6, x_STATUS_TH_SD,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__DISPENSER_6_MOTOR_OVERTEMPERATURE,"Motor Dispenser6 Over Temperature"}, + {eOneSecond,ALARM_SOURCE_TYPE__MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_7, HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_7, x_STATUS_TH_SD,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__DISPENSER_7_MOTOR_OVERTEMPERATURE,"Motor Dispenser7 Over Temperature"}, + {eOneSecond,ALARM_SOURCE_TYPE__MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_8, HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_8, x_STATUS_TH_SD,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__DISPENSER_8_MOTOR_OVERTEMPERATURE,"Motor Dispenser8 Over Temperature"}, + {eOneSecond,ALARM_SOURCE_TYPE__MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_DRYER_DRIVING,HARDWARE_MOTOR_TYPE__MOTO_DRYER_DRIVING,x_STATUS_UVLO,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__DRYER_MOTOR_UNDERVOLTAGE,"Motor Drier Under Voltage"}, + {eOneSecond,ALARM_SOURCE_TYPE__MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_RDRIVING, HARDWARE_MOTOR_TYPE__MOTO_RDRIVING, x_STATUS_UVLO,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__FEEDER_MOTOR_UNDERVOLTAGE,"Motor Feeder Under Voltage"}, + {eOneSecond,ALARM_SOURCE_TYPE__MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_SCREW, HARDWARE_MOTOR_TYPE__MOTO_SCREW, x_STATUS_UVLO,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__SCREW_MOTOR_UNDERVOLTAGE,"Motor Screw Under Voltage"}, + {eOneSecond,ALARM_SOURCE_TYPE__MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_WINDER, HARDWARE_MOTOR_TYPE__MOTO_WINDER, x_STATUS_UVLO,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__WINDER_MOTOR_UNDERVOLTAGE,"Motor Winder Under Voltage"}, + {eOneSecond,ALARM_SOURCE_TYPE__MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_LDRIVING, HARDWARE_MOTOR_TYPE__MOTO_LDRIVING, x_STATUS_UVLO,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__PULLER_MOTOR_UNDERVOLTAGE,"Motor Puller Under Voltage"}, + {eOneSecond,ALARM_SOURCE_TYPE__MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_1, HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_1, x_STATUS_UVLO,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__DISPENSER_1_MOTOR_UNDERVOLTAGE,"Motor Dispenser1 Under Voltage"}, + {eOneSecond,ALARM_SOURCE_TYPE__MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_2, HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_2, x_STATUS_UVLO,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__DISPENSER_2_MOTOR_UNDERVOLTAGE,"Motor Dispenser2 Under Voltage"}, + {eOneSecond,ALARM_SOURCE_TYPE__MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_3, HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_3, x_STATUS_UVLO,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__DISPENSER_3_MOTOR_UNDERVOLTAGE,"Motor Dispenser3 Under Voltage"}, + {eOneSecond,ALARM_SOURCE_TYPE__MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_4, HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_4, x_STATUS_UVLO,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__DISPENSER_4_MOTOR_UNDERVOLTAGE,"Motor Dispenser4 Under Voltage"}, + {eOneSecond,ALARM_SOURCE_TYPE__MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_5, HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_5, x_STATUS_UVLO,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__DISPENSER_5_MOTOR_UNDERVOLTAGE,"Motor Dispenser5 Under Voltage"}, + {eOneSecond,ALARM_SOURCE_TYPE__MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_6, HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_6, x_STATUS_UVLO,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__DISPENSER_6_MOTOR_UNDERVOLTAGE,"Motor Dispenser6 Under Voltage"}, + {eOneSecond,ALARM_SOURCE_TYPE__MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_7, HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_7, x_STATUS_UVLO,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__DISPENSER_7_MOTOR_UNDERVOLTAGE,"Motor Dispenser7 Under Voltage"}, + {eOneSecond,ALARM_SOURCE_TYPE__MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_8, HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_8, x_STATUS_UVLO,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__DISPENSER_8_MOTOR_UNDERVOLTAGE,"Motor Dispenser8 Under Voltage"}, + {eOneSecond,ALARM_SOURCE_TYPE__MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_DRYER_DRIVING,HARDWARE_MOTOR_TYPE__MOTO_DRYER_DRIVING,x_STATUS_STEP_LOSS_A,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__DRYER_MOTOR_STALL,"Motor Drier Stall"}, + {eOneSecond,ALARM_SOURCE_TYPE__MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_RDRIVING, HARDWARE_MOTOR_TYPE__MOTO_RDRIVING, x_STATUS_STEP_LOSS_A,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__FEEDER_MOTOR_STALL,"Motor Feeder Stall"}, + {eOneSecond,ALARM_SOURCE_TYPE__MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_SCREW, HARDWARE_MOTOR_TYPE__MOTO_SCREW, x_STATUS_STEP_LOSS_A,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__SCREW_MOTOR_STALL,"Motor Screw Stall"}, + {eOneSecond,ALARM_SOURCE_TYPE__MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_WINDER, HARDWARE_MOTOR_TYPE__MOTO_WINDER, x_STATUS_STEP_LOSS_A,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__WINDER_MOTOR_STALL,"Motor Winder Stall"}, + {eOneSecond,ALARM_SOURCE_TYPE__MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_LDRIVING, HARDWARE_MOTOR_TYPE__MOTO_LDRIVING, x_STATUS_STEP_LOSS_A,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__PULLER_MOTOR_STALL,"Motor Puller Stall"}, + {eOneSecond,ALARM_SOURCE_TYPE__MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_1, HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_1, x_STATUS_STEP_LOSS_A,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__DISPENSER_1_MOTOR_STALL,"Motor Dispenser1 Stall"}, + {eOneSecond,ALARM_SOURCE_TYPE__MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_2, HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_2, x_STATUS_STEP_LOSS_A,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__DISPENSER_2_MOTOR_STALL,"Motor Dispenser2 Stall"}, + {eOneSecond,ALARM_SOURCE_TYPE__MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_3, HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_3, x_STATUS_STEP_LOSS_A,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__DISPENSER_3_MOTOR_STALL,"Motor Dispenser3 Stall"}, + {eOneSecond,ALARM_SOURCE_TYPE__MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_4, HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_4, x_STATUS_STEP_LOSS_A,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__DISPENSER_4_MOTOR_STALL,"Motor Dispenser4 Stall"}, + {eOneSecond,ALARM_SOURCE_TYPE__MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_5, HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_5, x_STATUS_STEP_LOSS_A,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__DISPENSER_5_MOTOR_STALL,"Motor Dispenser5 Stall"}, + {eOneSecond,ALARM_SOURCE_TYPE__MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_6, HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_6, x_STATUS_STEP_LOSS_A,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__DISPENSER_6_MOTOR_STALL,"Motor Dispenser6 Stall"}, + {eOneSecond,ALARM_SOURCE_TYPE__MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_7, HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_7, x_STATUS_STEP_LOSS_A,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__DISPENSER_7_MOTOR_STALL,"Motor Dispenser7 Stall"}, + {eOneSecond,ALARM_SOURCE_TYPE__MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_8, HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_8, x_STATUS_STEP_LOSS_A,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,EVENT_TYPE__DISPENSER_8_MOTOR_STALL,"Motor Dispenser8 Stall"}, + {eHundredMillisecond,ALARM_SOURCE_TYPE__TemperatureAlarm,MIXER_PT100, HARDWARE_PID_CONTROL_TYPE__MixerHeater ,270,true,DEBUG_LOG_CATEGORY__Error,0xFF,0,EVENT_TYPE__MIXER_OVERTEMPERATURE,"Mixer Over Temperature"}, + {eHundredMillisecond,ALARM_SOURCE_TYPE__TemperatureAlarm,TEMP_SENSE_ANALOG_DYEINGH_TEMP1,HARDWARE_PID_CONTROL_TYPE__HeadHeaterZ1 ,270,true,DEBUG_LOG_CATEGORY__Error,0xFF,0,EVENT_TYPE__DYEING_HEAD_ZONE_1_OVERTEMPERATURE,"DyeingHead1 Over Temperature"}, + {eHundredMillisecond,ALARM_SOURCE_TYPE__TemperatureAlarm,TEMP_SENSE_ANALOG_DYEINGH_TEMP2,HARDWARE_PID_CONTROL_TYPE__HeadHeaterZ2 ,270,true,DEBUG_LOG_CATEGORY__Error,0xFF,0,EVENT_TYPE__DYEING_HEAD_ZONE_2_OVERTEMPERATURE,"DyeingHead2 Over Temperature"}, + {eHundredMillisecond,ALARM_SOURCE_TYPE__TemperatureAlarm,TEMP_SENSE_ANALOG_DYEINGH_TEMP3,HARDWARE_PID_CONTROL_TYPE__HeadHeaterZ3 ,270,true,DEBUG_LOG_CATEGORY__Error,0xFF,0,EVENT_TYPE__DYEING_HEAD_ZONE_3_OVERTEMPERATURE,"DyeingHead3 Over Temperature"}, + {eHundredMillisecond,ALARM_SOURCE_TYPE__TemperatureAlarm,TEMP_SENSE_ANALOG_DYEINGH_TEMP4,HARDWARE_PID_CONTROL_TYPE__HeadHeaterZ4 ,270,true,DEBUG_LOG_CATEGORY__Error,0xFF,0,EVENT_TYPE__DYEING_HEAD_ZONE_4_OVERTEMPERATURE,"DyeingHead4 Over Temperature"}, + {eHundredMillisecond,ALARM_SOURCE_TYPE__TemperatureAlarm,TEMP_SENSE_ANALOG_DYEINGH_TEMP5,HARDWARE_PID_CONTROL_TYPE__HeadHeaterZ5 ,270,true,DEBUG_LOG_CATEGORY__Error,0xFF,0,EVENT_TYPE__DYEING_HEAD_ZONE_5_OVERTEMPERATURE,"DyeingHead5 Over Temperature"}, + {eHundredMillisecond,ALARM_SOURCE_TYPE__TemperatureAlarm,HEAD6_PT100, HARDWARE_PID_CONTROL_TYPE__HeadHeaterZ6 ,270,true,DEBUG_LOG_CATEGORY__Error,0xFF,0,EVENT_TYPE__DYEING_HEAD_ZONE_6_OVERTEMPERATURE,"DyeingHead6 Over Temperature"}, + {eHundredMillisecond,ALARM_SOURCE_TYPE__TemperatureAlarm,TEMP_SENSE_ANALOG_DRYER_TEMP1, HARDWARE_PID_CONTROL_TYPE__DryerAirTemperature,270,true,DEBUG_LOG_CATEGORY__Error,0xFF,0,EVENT_TYPE__DRYER_ZONE_1_OVERTEMPERATURE,"Dryer Over Temperature"}, + + {eHundredMillisecond,ALARM_SOURCE_TYPE__CoversAlarm,FrontDoor1 ,1,false,true,DEBUG_LOG_CATEGORY__Error, 0xFF,5,EVENT_TYPE__FRONT_COVER_1_OPEN,"Front door #1 Open"}, + {eHundredMillisecond,ALARM_SOURCE_TYPE__CoversAlarm,FrontDoor2 ,1,false,true,DEBUG_LOG_CATEGORY__Error, 0xFF,5,EVENT_TYPE__FRONT_COVER_2_OPEN,"Front door #2 Open"}, + {eHundredMillisecond,ALARM_SOURCE_TYPE__CoversAlarm,FrontDoor3 ,1,false,true,DEBUG_LOG_CATEGORY__Error, 0xFF,5,EVENT_TYPE__FRONT_COVER_3_OPEN,"Front door #3 Open"}, + {eHundredMillisecond,ALARM_SOURCE_TYPE__CoversAlarm,FrontDoor4 ,1,false,true,DEBUG_LOG_CATEGORY__Error, 0xFF,5,EVENT_TYPE__FRONT_COVER_4_OPEN,"Front door #4 Open"}, + {eHundredMillisecond,ALARM_SOURCE_TYPE__CoversAlarm,RearDoor ,1,false,true,DEBUG_LOG_CATEGORY__Error, 0xFF,5,EVENT_TYPE__REAR_COVER_OPEN,"Rear door Open"}, + {eHundredMillisecond,ALARM_SOURCE_TYPE__CoversAlarm,CartridgesDoor,1,false,true,DEBUG_LOG_CATEGORY__Warning,0xFF,5,EVENT_TYPE__CARTRIDGES_COVER_OPEN,"Cartridges door Open"}, + + {eOneSecond,ALARM_SOURCE_TYPE__TemperatureAlarm,MIXER_PT100, HARDWARE_PID_CONTROL_TYPE__MixerHeater ,9,false,DEBUG_LOG_CATEGORY__Error,0xFF,0,EVENT_TYPE__MIXER_UNDERTEMPERATURE_A,"Mixer PT100 Not Heating"}, + {eOneSecond,ALARM_SOURCE_TYPE__TemperatureAlarm,TEMP_SENSE_ANALOG_DYEINGH_TEMP1,HARDWARE_PID_CONTROL_TYPE__HeadHeaterZ1 ,9,false,DEBUG_LOG_CATEGORY__Error,0xFF,0,EVENT_TYPE__DYEING_HEAD_ZONE_1_UNDERTEMPERATURE_A,"DyeingHead 1 PT100 Not Heating"}, + {eOneSecond,ALARM_SOURCE_TYPE__TemperatureAlarm,TEMP_SENSE_ANALOG_DYEINGH_TEMP2,HARDWARE_PID_CONTROL_TYPE__HeadHeaterZ2 ,9,false,DEBUG_LOG_CATEGORY__Error,0xFF,0,EVENT_TYPE__DYEING_HEAD_ZONE_2_UNDERTEMPERATURE_A,"DyeingHead 2 PT100 Not Heating"}, + {eOneSecond,ALARM_SOURCE_TYPE__TemperatureAlarm,TEMP_SENSE_ANALOG_DYEINGH_TEMP3,HARDWARE_PID_CONTROL_TYPE__HeadHeaterZ3 ,9,false,DEBUG_LOG_CATEGORY__Error,0xFF,0,EVENT_TYPE__DYEING_HEAD_ZONE_3_UNDERTEMPERATURE_A,"DyeingHead 3 PT100 Not Heating"}, + {eOneSecond,ALARM_SOURCE_TYPE__TemperatureAlarm,TEMP_SENSE_ANALOG_DYEINGH_TEMP4,HARDWARE_PID_CONTROL_TYPE__HeadHeaterZ4 ,9,false,DEBUG_LOG_CATEGORY__Error,0xFF,0,EVENT_TYPE__DYEING_HEAD_ZONE_4_UNDERTEMPERATURE_A,"DyeingHead 4 PT100 Not Heating"}, + {eOneSecond,ALARM_SOURCE_TYPE__TemperatureAlarm,TEMP_SENSE_ANALOG_DYEINGH_TEMP5,HARDWARE_PID_CONTROL_TYPE__HeadHeaterZ5 ,9,false,DEBUG_LOG_CATEGORY__Error,0xFF,0,EVENT_TYPE__DYEING_HEAD_ZONE_5_UNDERTEMPERATURE_A,"DyeingHead 5 PT100 Not Heating"}, + {eOneSecond,ALARM_SOURCE_TYPE__TemperatureAlarm,HEAD6_PT100, HARDWARE_PID_CONTROL_TYPE__HeadHeaterZ6 ,9,false,DEBUG_LOG_CATEGORY__Error,0xFF,0,EVENT_TYPE__DYEING_HEAD_ZONE_6_UNDERTEMPERATURE_A,"DyeingHead 6 PT100 Not Heating"}, + {eOneSecond,ALARM_SOURCE_TYPE__TemperatureAlarm,TEMP_SENSE_ANALOG_DRYER_TEMP1, HARDWARE_PID_CONTROL_TYPE__DryerAirTemperature,9,false,DEBUG_LOG_CATEGORY__Error,0xFF,0,EVENT_TYPE__DRYER_ZONE_1_UNDERTEMPERATURE_A,"Dryer PT100 Not Heating"}, + {eOneSecond,ALARM_SOURCE_TYPE__TemperatureAlarm,MIXER_PT100, HARDWARE_PID_CONTROL_TYPE__MixerHeater ,9,false,DEBUG_LOG_CATEGORY__Error,0xFF,0,EVENT_TYPE__MIXER_UNDERTEMPERATURE_B,"Mixer PT100 Heating Failure"}, + {eOneSecond,ALARM_SOURCE_TYPE__TemperatureAlarm,TEMP_SENSE_ANALOG_DYEINGH_TEMP1,HARDWARE_PID_CONTROL_TYPE__HeadHeaterZ1 ,9,false,DEBUG_LOG_CATEGORY__Error,0xFF,0,EVENT_TYPE__DYEING_HEAD_ZONE_1_UNDERTEMPERATURE_B,"DyeingHead 1 PT100 Heating Failure"}, + {eOneSecond,ALARM_SOURCE_TYPE__TemperatureAlarm,TEMP_SENSE_ANALOG_DYEINGH_TEMP2,HARDWARE_PID_CONTROL_TYPE__HeadHeaterZ2 ,9,false,DEBUG_LOG_CATEGORY__Error,0xFF,0,EVENT_TYPE__DYEING_HEAD_ZONE_2_UNDERTEMPERATURE_B,"DyeingHead 2 PT100 Heating Failure"}, + {eOneSecond,ALARM_SOURCE_TYPE__TemperatureAlarm,TEMP_SENSE_ANALOG_DYEINGH_TEMP3,HARDWARE_PID_CONTROL_TYPE__HeadHeaterZ3 ,9,false,DEBUG_LOG_CATEGORY__Error,0xFF,0,EVENT_TYPE__DYEING_HEAD_ZONE_3_UNDERTEMPERATURE_B,"DyeingHead 3 PT100 Heating Failure"}, + {eOneSecond,ALARM_SOURCE_TYPE__TemperatureAlarm,TEMP_SENSE_ANALOG_DYEINGH_TEMP4,HARDWARE_PID_CONTROL_TYPE__HeadHeaterZ4 ,9,false,DEBUG_LOG_CATEGORY__Error,0xFF,0,EVENT_TYPE__DYEING_HEAD_ZONE_4_UNDERTEMPERATURE_B,"DyeingHead 4 PT100 Heating Failure"}, + {eOneSecond,ALARM_SOURCE_TYPE__TemperatureAlarm,TEMP_SENSE_ANALOG_DYEINGH_TEMP5,HARDWARE_PID_CONTROL_TYPE__HeadHeaterZ5 ,9,false,DEBUG_LOG_CATEGORY__Error,0xFF,0,EVENT_TYPE__DYEING_HEAD_ZONE_5_UNDERTEMPERATURE_B,"DyeingHead 5 PT100 Heating Failure"}, + {eOneSecond,ALARM_SOURCE_TYPE__TemperatureAlarm,HEAD6_PT100, HARDWARE_PID_CONTROL_TYPE__HeadHeaterZ6 ,9,false,DEBUG_LOG_CATEGORY__Error,0xFF,0,EVENT_TYPE__DYEING_HEAD_ZONE_6_UNDERTEMPERATURE_B,"DyeingHead 6 PT100 Heating Failure"}, + {eOneSecond,ALARM_SOURCE_TYPE__TemperatureAlarm,TEMP_SENSE_ANALOG_DRYER_TEMP1, HARDWARE_PID_CONTROL_TYPE__DryerAirTemperature,9,false,DEBUG_LOG_CATEGORY__Error,0xFF,0,EVENT_TYPE__DRYER_ZONE_1_UNDERTEMPERATURE_B,"Dryer PT100 Heating Failure"}, + {eOneSecond, ALARM_SOURCE_TYPE__MotorAlarm, HARDWARE_MOTOR_TYPE__MOTO_RLOADING , HARDWARE_MOTOR_TYPE__MOTO_RLOADING , x_STATUS_OCD , FALSE , DEBUG_LOG_CATEGORY__Error , 0xFF , 2 , EVENT_TYPE__RIGHT_LOADER_MOTOR_OVERCURRENT ,"Motor RightLoader Over Current" }, /* 3004 */ + {eOneSecond, ALARM_SOURCE_TYPE__MotorAlarm, HARDWARE_MOTOR_TYPE__MOTO_LLOADING , HARDWARE_MOTOR_TYPE__MOTO_LLOADING , x_STATUS_OCD , FALSE , DEBUG_LOG_CATEGORY__Error , 0xFF , 2 , EVENT_TYPE__LEFT_LOADER_MOTOR_OVERCURRENT ,"Motor LeftLoader Over Current" }, /* 3006 */ + {eOneSecond, ALARM_SOURCE_TYPE__MotorAlarm, HARDWARE_MOTOR_TYPE__MOTO_DRYER_LOADARM , HARDWARE_MOTOR_TYPE__MOTO_DRYER_LOADARM , x_STATUS_OCD , FALSE , DEBUG_LOG_CATEGORY__Error , 0xFF , 2 , EVENT_TYPE__LOADING_ARM_MOTOR_OVERCURRENT ,"Motor LoadindARM Over Current" }, /* 3009 */ + {eOneSecond, ALARM_SOURCE_TYPE__MotorAlarm, HARDWARE_MOTOR_TYPE__MOTO_LDANCER2 , HARDWARE_MOTOR_TYPE__MOTO_LDANCER2 , x_STATUS_OCD , FALSE , DEBUG_LOG_CATEGORY__Error , 0xFF , 2 , EVENT_TYPE__WINDER_MOTOR_OVERCURRENT /*EVENT_TYPE__WINDER_DANCER_MOTOR_OVERCURRENT*/ ,"Motor WinderDancer Over Current" }, /* 3036 */ + {eOneSecond, ALARM_SOURCE_TYPE__MotorAlarm, HARDWARE_MOTOR_TYPE__MOTO_LDANCER1 , HARDWARE_MOTOR_TYPE__MOTO_LDANCER1 , x_STATUS_OCD , FALSE , DEBUG_LOG_CATEGORY__Error , 0xFF , 2 , EVENT_TYPE__PULLER_MOTOR_OVERCURRENT /*EVENT_TYPE__PULLER_DANCER_MOTOR_OVERCURRENT*/ ,"Motor PullerDancer Over Current" }, /* 3037 */ + {eOneSecond, ALARM_SOURCE_TYPE__MotorAlarm, HARDWARE_MOTOR_TYPE__MOTO_RDANCER , HARDWARE_MOTOR_TYPE__MOTO_RDANCER , x_STATUS_OCD , FALSE , DEBUG_LOG_CATEGORY__Error , 0xFF , 2 , EVENT_TYPE__FEEDER_MOTOR_OVERCURRENT /*EVENT_TYPE__FEEDER_DANCER_MOTOR_OVERCURRENT*/ ,"Motor FeederDancer Over Current" }, /* 3038 */ + {eOneSecond, ALARM_SOURCE_TYPE__MotorAlarm, HARDWARE_MOTOR_TYPE__MOTO_DRYER_LID , HARDWARE_MOTOR_TYPE__MOTO_DRYER_LID , x_STATUS_OCD , FALSE , DEBUG_LOG_CATEGORY__Error , 0xFF , 2 , EVENT_TYPE__DRYER_MOTOR_OVERCURRENT /*EVENT_TYPE__DRYER_LID_MOTOR_OVERCURRENT*/ ,"Motor DryerLid Over Current" }, /* 4017 */ + {eOneSecond, ALARM_SOURCE_TYPE__MotorAlarm, HARDWARE_MOTOR_TYPE__MOTO_DH_LID , HARDWARE_MOTOR_TYPE__MOTO_DH_LID , x_STATUS_OCD , FALSE , DEBUG_LOG_CATEGORY__Error , 0xFF , 2 , EVENT_TYPE__DYEING_HEAD_COVER_MOTOR_OVERCURRENT ,"Motor DyeingHeadCover Over Current" }, /* 5031 */ + {eOneSecond, ALARM_SOURCE_TYPE__MotorAlarm, HARDWARE_MOTOR_TYPE__MOTO_DH_CLEANMECH , HARDWARE_MOTOR_TYPE__MOTO_DH_CLEANMECH , x_STATUS_OCD , FALSE , DEBUG_LOG_CATEGORY__Error , 0xFF , 2 , EVENT_TYPE__DYEING_HEAD_CLEANING_MECHANISM_MOTOR_OVERCURRENT ,"Motor DyeingHeadCleaningMechanism Over Current"}, /* 5035 */ + {eOneSecond, ALARM_SOURCE_TYPE__MotorAlarm, HARDWARE_MOTOR_TYPE__MOTO_DH_CLEANHEAD , HARDWARE_MOTOR_TYPE__MOTO_DH_CLEANHEAD , x_STATUS_OCD , FALSE , DEBUG_LOG_CATEGORY__Error , 0xFF , 2 , EVENT_TYPE__DYEING_HEAD_CLEANING_HEAD_MOTOR_OVERCURRENT ,"Motor DyeingHeadCleaningHead Over Current" }, /* 5039 */ + + {eOneSecond, ALARM_SOURCE_TYPE__MotorAlarm, HARDWARE_MOTOR_TYPE__MOTO_RLOADING , HARDWARE_MOTOR_TYPE__MOTO_RLOADING , x_STATUS_TH_SD , FALSE , DEBUG_LOG_CATEGORY__Error , 0xFF , 2 , EVENT_TYPE__RIGHT_LOADER_MOTOR_OVERTEMPERATURE ,"Motor RightLoader Over Temperature" }, /* 3011 */ + {eOneSecond, ALARM_SOURCE_TYPE__MotorAlarm, HARDWARE_MOTOR_TYPE__MOTO_LLOADING , HARDWARE_MOTOR_TYPE__MOTO_LLOADING , x_STATUS_TH_SD , FALSE , DEBUG_LOG_CATEGORY__Error , 0xFF , 2 , EVENT_TYPE__LEFT_LOADER_MOTOR_OVERTEMPERATURE ,"Motor LeftLoader Over Temperature" }, /* 3013 */ + {eOneSecond, ALARM_SOURCE_TYPE__MotorAlarm, HARDWARE_MOTOR_TYPE__MOTO_DRYER_LOADARM , HARDWARE_MOTOR_TYPE__MOTO_DRYER_LOADARM , x_STATUS_TH_SD , FALSE , DEBUG_LOG_CATEGORY__Error , 0xFF , 2 , EVENT_TYPE__LOADING_ARM_MOTOR_OVERTEMPERATURE ,"Motor LoadArm Over Temperature" }, /* 3016 */ + {eOneSecond, ALARM_SOURCE_TYPE__MotorAlarm, HARDWARE_MOTOR_TYPE__MOTO_LDANCER2 , HARDWARE_MOTOR_TYPE__MOTO_LDANCER2 , x_STATUS_TH_SD , FALSE , DEBUG_LOG_CATEGORY__Error , 0xFF , 2 , EVENT_TYPE__WINDER_DANCER_MOTOR_OVERTEMPERATURE ,"Motor WinderDancer Over Temperature" }, /* 3039 */ + {eOneSecond, ALARM_SOURCE_TYPE__MotorAlarm, HARDWARE_MOTOR_TYPE__MOTO_LDANCER1 , HARDWARE_MOTOR_TYPE__MOTO_LDANCER1 , x_STATUS_TH_SD , FALSE , DEBUG_LOG_CATEGORY__Error , 0xFF , 2 , EVENT_TYPE__PULLER_DANCER_MOTOR_OVERTEMPERATURE ,"Motor PullerDancer Over Temperature" }, /* 3040 */ + {eOneSecond, ALARM_SOURCE_TYPE__MotorAlarm, HARDWARE_MOTOR_TYPE__MOTO_RDANCER , HARDWARE_MOTOR_TYPE__MOTO_RDANCER , x_STATUS_TH_SD , FALSE , DEBUG_LOG_CATEGORY__Error , 0xFF , 2 , EVENT_TYPE__FEEDER_DANCER_MOTOR_OVERTEMPERATURE ,"Motor FeederDancer Over Temperature" }, /* 3041 */ + {eOneSecond, ALARM_SOURCE_TYPE__MotorAlarm, HARDWARE_MOTOR_TYPE__MOTO_DRYER_LID , HARDWARE_MOTOR_TYPE__MOTO_DRYER_LID , x_STATUS_TH_SD , FALSE , DEBUG_LOG_CATEGORY__Error , 0xFF , 2 , EVENT_TYPE__DRYER_LID_MOTOR_OVERTEMPERATURE ,"Motor DryerLid Over Temperature" }, /* 4018 */ + {eOneSecond, ALARM_SOURCE_TYPE__MotorAlarm, HARDWARE_MOTOR_TYPE__MOTO_DH_LID , HARDWARE_MOTOR_TYPE__MOTO_DH_LID , x_STATUS_TH_SD , FALSE , DEBUG_LOG_CATEGORY__Error , 0xFF , 2 , EVENT_TYPE__DYEING_HEAD_COVER_MOTOR_OVERTEMPERATURE ,"Motor DyeingHeadCover Over Temperature" }, /* 5032 */ + {eOneSecond, ALARM_SOURCE_TYPE__MotorAlarm, HARDWARE_MOTOR_TYPE__MOTO_DH_CLEANMECH , HARDWARE_MOTOR_TYPE__MOTO_DH_CLEANMECH , x_STATUS_TH_SD , FALSE , DEBUG_LOG_CATEGORY__Error , 0xFF , 2 , EVENT_TYPE__DYEING_HEAD_CLEANING_MECHANISM_MOTOR_OVERTEMPERATURE ,"Motor DyeingHeadCleaning Over Temperature" }, /* 5036 */ + {eOneSecond, ALARM_SOURCE_TYPE__MotorAlarm, HARDWARE_MOTOR_TYPE__MOTO_DH_CLEANHEAD , HARDWARE_MOTOR_TYPE__MOTO_DH_CLEANHEAD , x_STATUS_TH_SD , FALSE , DEBUG_LOG_CATEGORY__Error , 0xFF , 2 , EVENT_TYPE__DYEING_HEAD_CLEANING_HEAD_MOTOR_OVERTEMPERATURE ,"Motor DyeingHeadCleaningHead Over Temperature"}, /* 5040 */ + + {eOneSecond, ALARM_SOURCE_TYPE__MotorAlarm, HARDWARE_MOTOR_TYPE__MOTO_RLOADING , HARDWARE_MOTOR_TYPE__MOTO_RLOADING ,x_STATUS_STEP_LOSS_A , FALSE , DEBUG_LOG_CATEGORY__Error , 0xFF , 2 , EVENT_TYPE__LOADING_ARM_MOTOR_STALL ,"Motor LoadingARM Stall " }, /* 3018 */ + {eOneSecond, ALARM_SOURCE_TYPE__MotorAlarm, HARDWARE_MOTOR_TYPE__MOTO_LLOADING , HARDWARE_MOTOR_TYPE__MOTO_LLOADING ,x_STATUS_STEP_LOSS_A , FALSE , DEBUG_LOG_CATEGORY__Error , 0xFF , 2 , EVENT_TYPE__WINDER_DANCER_MOTOR_STALL ,"Motor WinderDances Stall " }, /* 3020 */ + {eOneSecond, ALARM_SOURCE_TYPE__MotorAlarm, HARDWARE_MOTOR_TYPE__MOTO_DRYER_LOADARM , HARDWARE_MOTOR_TYPE__MOTO_DRYER_LOADARM ,x_STATUS_STEP_LOSS_A , FALSE , DEBUG_LOG_CATEGORY__Error , 0xFF , 2 , EVENT_TYPE__LOADING_ARM_MOTOR_STALL ,"Motor LoadingARM Stall " }, /* 3023 */ + {eOneSecond, ALARM_SOURCE_TYPE__MotorAlarm, HARDWARE_MOTOR_TYPE__MOTO_LDANCER2 , HARDWARE_MOTOR_TYPE__MOTO_LDANCER2 ,x_STATUS_STEP_LOSS_A , FALSE , DEBUG_LOG_CATEGORY__Error , 0xFF , 2 , EVENT_TYPE__WINDER_DANCER_MOTOR_STALL ,"Motor WinderDances Stall " }, /* 3042 */ + {eOneSecond, ALARM_SOURCE_TYPE__MotorAlarm, HARDWARE_MOTOR_TYPE__MOTO_LDANCER1 , HARDWARE_MOTOR_TYPE__MOTO_LDANCER1 ,x_STATUS_STEP_LOSS_A , FALSE , DEBUG_LOG_CATEGORY__Error , 0xFF , 2 , EVENT_TYPE__PULLER_DANCER_MOTOR_STALL ,"Motor PullerDancer Stall " }, /* 3043 */ + {eOneSecond, ALARM_SOURCE_TYPE__MotorAlarm, HARDWARE_MOTOR_TYPE__MOTO_RDANCER , HARDWARE_MOTOR_TYPE__MOTO_RDANCER ,x_STATUS_STEP_LOSS_A , FALSE , DEBUG_LOG_CATEGORY__Error , 0xFF , 2 , EVENT_TYPE__FEEDER_DANCER_MOTOR_STALL ,"Motor FeederDancer Stall " }, /* 3044 */ + {eOneSecond, ALARM_SOURCE_TYPE__MotorAlarm, HARDWARE_MOTOR_TYPE__MOTO_DRYER_LID , HARDWARE_MOTOR_TYPE__MOTO_DRYER_LID ,x_STATUS_STEP_LOSS_A , FALSE , DEBUG_LOG_CATEGORY__Error , 0xFF , 2 , EVENT_TYPE__DRYER_LID_MOTOR_STALL ,"Motor DryerLid Stall " }, /* 4019 */ + {eOneSecond, ALARM_SOURCE_TYPE__MotorAlarm, HARDWARE_MOTOR_TYPE__MOTO_DH_LID , HARDWARE_MOTOR_TYPE__MOTO_DH_LID ,x_STATUS_STEP_LOSS_A , FALSE , DEBUG_LOG_CATEGORY__Error , 0xFF , 2 , EVENT_TYPE__DYEING_HEAD_COVER_MOTOR_STALL ,"Motor DyeingHeadCover Stall " }, /* 5033 */ + {eOneSecond, ALARM_SOURCE_TYPE__MotorAlarm, HARDWARE_MOTOR_TYPE__MOTO_DH_CLEANMECH , HARDWARE_MOTOR_TYPE__MOTO_DH_CLEANMECH ,x_STATUS_STEP_LOSS_A , FALSE , DEBUG_LOG_CATEGORY__Error , 0xFF , 2 , EVENT_TYPE__DYEING_HEAD_CLEANING_MECHANISM_MOTOR_STALL ,"Motor DyeingHeadCleaningMechanism Stall " }, /* 5037 */ + {eOneSecond, ALARM_SOURCE_TYPE__MotorAlarm, HARDWARE_MOTOR_TYPE__MOTO_DH_CLEANHEAD , HARDWARE_MOTOR_TYPE__MOTO_DH_CLEANHEAD ,x_STATUS_STEP_LOSS_A , FALSE , DEBUG_LOG_CATEGORY__Error , 0xFF , 2 , EVENT_TYPE__DYEING_HEAD_CLEANING_HEAD_MOTOR_STALL ,"Motor DryeingHeadCleaning Stall " }, /* 5041 */ + + {eOneSecond, ALARM_SOURCE_TYPE__MotorAlarm, HARDWARE_MOTOR_TYPE__MOTO_RLOADING , HARDWARE_MOTOR_TYPE__MOTO_RLOADING , x_STATUS_UVLO , FALSE , DEBUG_LOG_CATEGORY__Error , 0xFF , 2 , EVENT_TYPE__RIGHT_LOADER_MOTOR_UNDERVOLTAGE ,"Motor RightLoader Under Voltage" }, /* 3025 */ + {eOneSecond, ALARM_SOURCE_TYPE__MotorAlarm, HARDWARE_MOTOR_TYPE__MOTO_LLOADING , HARDWARE_MOTOR_TYPE__MOTO_LLOADING , x_STATUS_UVLO , FALSE , DEBUG_LOG_CATEGORY__Error , 0xFF , 2 , EVENT_TYPE__LEFT_LOADER_MOTOR_UNDERVOLTAGE ,"Motor LeftLoader Under Voltage" }, /* 3027 */ + {eOneSecond, ALARM_SOURCE_TYPE__MotorAlarm, HARDWARE_MOTOR_TYPE__MOTO_DRYER_LOADARM , HARDWARE_MOTOR_TYPE__MOTO_DRYER_LOADARM , x_STATUS_UVLO , FALSE , DEBUG_LOG_CATEGORY__Error , 0xFF , 2 , EVENT_TYPE__LOADING_ARM_MOTOR_UNDERVOLTAGE ,"Motor LoaderARM Under Voltage" }, /* 3030 */ + {eOneSecond, ALARM_SOURCE_TYPE__MotorAlarm, HARDWARE_MOTOR_TYPE__MOTO_LDANCER2 , HARDWARE_MOTOR_TYPE__MOTO_LDANCER2 , x_STATUS_UVLO , FALSE , DEBUG_LOG_CATEGORY__Error , 0xFF , 2 , EVENT_TYPE__WINDER_DANCER_MOTOR_UNDERVOLTAGE ,"Motor WinderDancer Under Voltage" }, /* 3045 */ + {eOneSecond, ALARM_SOURCE_TYPE__MotorAlarm, HARDWARE_MOTOR_TYPE__MOTO_LDANCER1 , HARDWARE_MOTOR_TYPE__MOTO_LDANCER1 , x_STATUS_UVLO , FALSE , DEBUG_LOG_CATEGORY__Error , 0xFF , 2 , EVENT_TYPE__PULLER_DANCER_MOTOR_UNDERVOLTAGE ,"Motor PullerDancer Under Voltage" }, /* 3046 */ + {eOneSecond, ALARM_SOURCE_TYPE__MotorAlarm, HARDWARE_MOTOR_TYPE__MOTO_RDANCER , HARDWARE_MOTOR_TYPE__MOTO_RDANCER , x_STATUS_UVLO , FALSE , DEBUG_LOG_CATEGORY__Error , 0xFF , 2 , EVENT_TYPE__FEEDER_DANCER_MOTOR_UNDERVOLTAGE ,"Motor FeederDancer Under Voltage" }, /* 3047 */ + {eOneSecond, ALARM_SOURCE_TYPE__MotorAlarm, HARDWARE_MOTOR_TYPE__MOTO_DRYER_LID , HARDWARE_MOTOR_TYPE__MOTO_DRYER_LID , x_STATUS_UVLO , FALSE , DEBUG_LOG_CATEGORY__Error , 0xFF , 2 , EVENT_TYPE__DRYER_LID_MOTOR_UNDERVOLTAGE ,"Motor DryerLid Under Voltage" }, /* 4020 */ + {eOneSecond, ALARM_SOURCE_TYPE__MotorAlarm, HARDWARE_MOTOR_TYPE__MOTO_DH_LID , HARDWARE_MOTOR_TYPE__MOTO_DH_LID , x_STATUS_UVLO , FALSE , DEBUG_LOG_CATEGORY__Error , 0xFF , 2 , EVENT_TYPE__DYEING_HEAD_COVER_MOTOR_UNDERVOLTAGE ,"Motor DyeingHeadCover Under Voltage" }, /* 5034 */ + {eOneSecond, ALARM_SOURCE_TYPE__MotorAlarm, HARDWARE_MOTOR_TYPE__MOTO_DH_CLEANMECH , HARDWARE_MOTOR_TYPE__MOTO_DH_CLEANMECH , x_STATUS_UVLO , FALSE , DEBUG_LOG_CATEGORY__Error , 0xFF , 2 , EVENT_TYPE__DYEING_HEAD_CLEANING_MECHANISM_MOTOR_UNDERVOLTAGE ,"Motor DyeingHeadCleaning Under Voltage" }, /* 5038 */ + {eOneSecond, ALARM_SOURCE_TYPE__MotorAlarm, HARDWARE_MOTOR_TYPE__MOTO_DH_CLEANHEAD , HARDWARE_MOTOR_TYPE__MOTO_DH_CLEANHEAD , x_STATUS_UVLO , FALSE , DEBUG_LOG_CATEGORY__Error , 0xFF , 2 , EVENT_TYPE__DYEING_HEAD_CLEANING_HEAD_MOTOR_UNDERVOLTAGE ,"Motor DyeingHeadCleaningHead Under Voltage" }, /* 5042 */ + + {eOneSecond, ALARM_SOURCE_TYPE__CurrentAlarm, HEATER_HEAD_CURRENT_ZONE_1 , HEATER_HEAD_CURRENT_ZONE_1 , 125 , TRUE , DEBUG_LOG_CATEGORY__Warning , 0xFF , 2 , EVENT_TYPE__DYEING_HEAD_ZONE_1_CURRENT_OUT_OF_RANGE ," Head Zone 1 Heater Current Out Of Range" }, /* 5018 */ + {eOneSecond, ALARM_SOURCE_TYPE__CurrentAlarm, HEATER_HEAD_CURRENT_ZONE_2 , HEATER_HEAD_CURRENT_ZONE_2 , 187 , TRUE , DEBUG_LOG_CATEGORY__Warning , 0xFF , 2 , EVENT_TYPE__DYEING_HEAD_ZONE_2_CURRENT_OUT_OF_RANGE ," Head Zone 2 Heater Current Out Of Range" }, /* 5019 */ + {eOneSecond, ALARM_SOURCE_TYPE__CurrentAlarm, HEATER_HEAD_CURRENT_ZONE_3 , HEATER_HEAD_CURRENT_ZONE_3 , 187 , TRUE , DEBUG_LOG_CATEGORY__Warning , 0xFF , 2 , EVENT_TYPE__DYEING_HEAD_ZONE_3_CURRENT_OUT_OF_RANGE ," Head Zone 3 Heater Current Out Of Range" }, /* 5020 */ + {eOneSecond, ALARM_SOURCE_TYPE__CurrentAlarm, HEATER_HEAD_CURRENT_ZONE_4 , HEATER_HEAD_CURRENT_ZONE_4 , 312 , TRUE , DEBUG_LOG_CATEGORY__Warning , 0xFF , 2 , EVENT_TYPE__DYEING_HEAD_ZONE_4_CURRENT_OUT_OF_RANGE ," Head Zone 4 Heater Current Out Of Range" }, /* 5021 */ + {eOneSecond, ALARM_SOURCE_TYPE__CurrentAlarm, HEATER_HEAD_CURRENT_ZONE_5_6 , HEATER_HEAD_CURRENT_ZONE_5_6 , 500 , TRUE , DEBUG_LOG_CATEGORY__Warning , 0xFF , 2 , EVENT_TYPE__DYEING_HEAD_ZONE_5_6_CURRENT_OUT_OF_RANGE ," Head Zone 5-6 Heater Current Out Of Range" }, /* 5022 */ + {eOneSecond, ALARM_SOURCE_TYPE__CurrentAlarm, HEATER_MIXCHIP_CURRENT , HEATER_MIXCHIP_CURRENT , 187 , TRUE , DEBUG_LOG_CATEGORY__Warning , 0xFF , 2 , EVENT_TYPE__MIXER_CURRENT_OUT_OF_RANGE ," Mixer Heater Current Out Of Range" }, /* 6004 */ + {eOneSecond, ALARM_SOURCE_TYPE__CurrentAlarm, HEATER_DRYER_CURRENT_1, HEATER_DRYER_CURRENT_1, 800 , TRUE , DEBUG_LOG_CATEGORY__Warning , 0xFF , 2 , EVENT_TYPE__DRYER_HEATERS_ZONE_1_CURRENT_OUT_OF_RANGE ," Drier Heater 1 Current Out Of Range" }, /* 6004 */ + {eOneSecond, ALARM_SOURCE_TYPE__CurrentAlarm, HEATER_DRYER_CURRENT_2, HEATER_DRYER_CURRENT_2, 400 , TRUE , DEBUG_LOG_CATEGORY__Warning , 0xFF , 2 , EVENT_TYPE__DRYER_HEATERS_ZONE_2_CURRENT_OUT_OF_RANGE ," Drier Heater 2 Current Out Of Range" }, /* 6004 */ + + {eOneSecond, ALARM_SOURCE_TYPE__CurrentAlarm, HEATER_HEAD_CURRENT_ZONE_1 , HEATER_HEAD_CURRENT_ZONE_1 , 0 , FALSE , DEBUG_LOG_CATEGORY__Warning , 0xFF , 2 , EVENT_TYPE__DYEING_HEAD_ZONE_1_CURRENT_LOOP_BREAK ," Head Zone 1 Heater Current Loop Break" }, /* 5018 */ + {eOneSecond, ALARM_SOURCE_TYPE__CurrentAlarm, HEATER_HEAD_CURRENT_ZONE_2 , HEATER_HEAD_CURRENT_ZONE_2 , 0 , FALSE , DEBUG_LOG_CATEGORY__Warning , 0xFF , 2 , EVENT_TYPE__DYEING_HEAD_ZONE_2_CURRENT_LOOP_BREAK ," Head Zone 2 Heater Current Loop Break" }, /* 5019 */ + {eOneSecond, ALARM_SOURCE_TYPE__CurrentAlarm, HEATER_HEAD_CURRENT_ZONE_3 , HEATER_HEAD_CURRENT_ZONE_3 , 0 , FALSE , DEBUG_LOG_CATEGORY__Warning , 0xFF , 2 , EVENT_TYPE__DYEING_HEAD_ZONE_3_CURRENT_LOOP_BREAK ," Head Zone 3 Heater Current Loop Break" }, /* 5020 */ + {eOneSecond, ALARM_SOURCE_TYPE__CurrentAlarm, HEATER_HEAD_CURRENT_ZONE_4 , HEATER_HEAD_CURRENT_ZONE_4 , 0 , FALSE , DEBUG_LOG_CATEGORY__Warning , 0xFF , 2 , EVENT_TYPE__DYEING_HEAD_ZONE_4_CURRENT_LOOP_BREAK ," Head Zone 4 Heater Current Loop Break" }, /* 5021 */ + {eOneSecond, ALARM_SOURCE_TYPE__CurrentAlarm, HEATER_HEAD_CURRENT_ZONE_5_6 , HEATER_HEAD_CURRENT_ZONE_5_6 , 0 , FALSE , DEBUG_LOG_CATEGORY__Warning , 0xFF , 2 , EVENT_TYPE__DYEING_HEAD_ZONE_5_6_CURRENT_LOOP_BREAK ," Head Zone 5-6 Heater Current Loop Break" }, /* 5022 */ + {eOneSecond, ALARM_SOURCE_TYPE__CurrentAlarm, HEATER_MIXCHIP_CURRENT , HEATER_MIXCHIP_CURRENT , 0 , FALSE , DEBUG_LOG_CATEGORY__Warning , 0xFF , 2 , EVENT_TYPE__MIXER_CURRENT_LOOP_BREAK ," Mixer Heater Current Loop Break" }, /* 6004 */ + {eOneSecond, ALARM_SOURCE_TYPE__CurrentAlarm, HEATER_DRYER_CURRENT_1, HEATER_DRYER_CURRENT_1, 0 , FALSE , DEBUG_LOG_CATEGORY__Warning , 0xFF , 2 , EVENT_TYPE__DRYER_HEATERS_ZONE_1_CURRENT_LOOP_BREAK ," Drier Heater 1 Current Loop Break" }, /* 6004 */ + {eOneSecond, ALARM_SOURCE_TYPE__CurrentAlarm, HEATER_DRYER_CURRENT_2, HEATER_DRYER_CURRENT_2, 0 , FALSE , DEBUG_LOG_CATEGORY__Warning , 0xFF , 2 , EVENT_TYPE__DRYER_HEATERS_ZONE_2_CURRENT_LOOP_BREAK ," Drier Heater 2 Current Loop Break" }, /* 6004 */ + {eOneSecond,ALARM_SOURCE_TYPE__DoNotPollAlarm,0,0,0,0,DEBUG_LOG_CATEGORY__Critical,0xFF,0,EVENT_TYPE__DYEING_HEAD_THERMAL_CUTOFF,"Dyeing head Thermal Cut-Off"}, + + {eOneSecond,ALARM_SOURCE_TYPE__DoNotPollAlarm,0,0,0,0,DEBUG_LOG_CATEGORY__Warning,0xFF,0,EVENT_TYPE__THREAD_BREAK,"Thread Break"}, + {eOneSecond,ALARM_SOURCE_TYPE__DoNotPollAlarm,0,0,0,0,DEBUG_LOG_CATEGORY__Warning,0xFF,0,EVENT_TYPE__THREAD_TENSION_CONTROL_FAILURE_FEEDER_DANCER,"Thread Feeder Tension Control Failure"}, + {eOneSecond,ALARM_SOURCE_TYPE__DoNotPollAlarm,0,0,0,0,DEBUG_LOG_CATEGORY__Warning,0xFF,0,EVENT_TYPE__THREAD_TENSION_CONTROL_FAILURE_PULLER_DANCER,"Thread Puller Tension Control Failure"}, + {eOneSecond,ALARM_SOURCE_TYPE__DoNotPollAlarm,0,0,0,0,DEBUG_LOG_CATEGORY__Warning,0xFF,0,EVENT_TYPE__THREAD_TENSION_CONTROL_FAILURE_WINDER_DANCER,"Thread Winder Tension Control Failure"}, + {eOneSecond,ALARM_SOURCE_TYPE__DoNotPollAlarm,0,0,0,0,DEBUG_LOG_CATEGORY__Warning,0xFF,0,EVENT_TYPE__WINDER_CONE_DOES_NOT_EXIST,"No cone in winder"}, + + {eOneSecond,ALARM_SOURCE_TYPE__DoNotPollAlarm,0,0,0,0,DEBUG_LOG_CATEGORY__Critical,0xFF,0,EVENT_TYPE__DRYER_DOOR_OPEN,"Dryer Door is open"}, + {eOneSecond,ALARM_SOURCE_TYPE__DoNotPollAlarm,0,0,0,0,DEBUG_LOG_CATEGORY__Critical,0xFF,0,EVENT_TYPE__NO_AIR_PRESSURE,"No suction in the waste handling system"}, + {eOneSecond,ALARM_SOURCE_TYPE__DoNotPollAlarm,0,0,0,0,DEBUG_LOG_CATEGORY__Critical,0xFF,0,EVENT_TYPE__AIR_FILTER_NOT_INSTALLED,"Air filter missing"}, + {eOneSecond,ALARM_SOURCE_TYPE__DoNotPollAlarm,0,0,0,0,DEBUG_LOG_CATEGORY__Error,0xFF,0,EVENT_TYPE__WASTE_CONTAINER_EMPTYING_TIMEOUT,"Waste Container Emptying Timeout"}, + }; -char AlarmStorePath[25] = "0://SysInfo//AlarmPrm.cfg"; +char AlarmStorePath[25] ="0://SysInfo//AlarmPrm.cfg"; -bool DispenserInUse[MAX_SYSTEM_DISPENSERS] = {false,false,false,false,false,false,false,false}; +//bool DispenserInUse[MAX_SYSTEM_DISPENSERS] = {false,false,false,false,false,false,false,false}; bool EventsNotificationRequestAccepted = false; //read dispensers limit switches. 25 - send warning. up - stop job and send alarm //Cone missing @@ -337,21 +372,28 @@ void AlarmHandlingInit(void) return; } +void AlarmHandlingSetFlags(bool checkHardLimitAlarms,bool checkCurrentAlarms, bool checkTamperAlarms) +{ + CheckHardLimitAlarms = checkHardLimitAlarms; + CheckCurrentAlarms = checkCurrentAlarms; + CheckTamperAlarms = checkTamperAlarms; +} + JobEndReasonEnum getEndReason(uint32_t AlarmId) { switch (AlarmItem[AlarmId].AlarmSource) { - case TemperatureAlarm: + case ALARM_SOURCE_TYPE__TemperatureAlarm: return JOB_TEMPERATURE_ALARM; - case LimitSwitchAlarm: + case ALARM_SOURCE_TYPE__LimitSwitchAlarm: return JOB_LS_ALARM; - case PressureAlarm: + case ALARM_SOURCE_TYPE__PressureAlarm: return JOB_PRESSURE_ALARM; - case CurrentAlarm: + case ALARM_SOURCE_TYPE__CurrentAlarm: return JOB_CURRENT_ALARM; - case MotorAlarm: + case ALARM_SOURCE_TYPE__MotorAlarm: return JOB_MOTOR_ALARM; - case CoversAlarm: + case ALARM_SOURCE_TYPE__CoversAlarm: return JOB_TAMPER_ALARM; default: return JOB_OTHER_ALARM; @@ -363,12 +405,13 @@ uint32_t AlarmHandlingConsequentActions(uint32_t AlarmId, DebugLogCategory Sever //ProcessParameters ProcessParameterZero; switch (AlarmItem[AlarmId].AlarmSource) { - case TemperatureAlarm: + case ALARM_SOURCE_TYPE__TemperatureAlarm: //need to discover the heater Id and shut it down HeaterCommandRequestMessage(AlarmItem[AlarmId].ModuleDeviceId, HEATER_OFF, 0); break; - case LimitSwitchAlarm: - case PressureAlarm: + case ALARM_SOURCE_TYPE__LimitSwitchAlarm: + case ALARM_SOURCE_TYPE__HardLimitAlarm: + case ALARM_SOURCE_TYPE__PressureAlarm: if (Severity == DEBUG_LOG_CATEGORY__Info) { IDS_Dispenser_Alarm_Off(AlarmItem[AlarmId].ModuleDeviceId); @@ -378,9 +421,9 @@ uint32_t AlarmHandlingConsequentActions(uint32_t AlarmId, DebugLogCategory Sever IDS_Dispenser_Alarm_On (AlarmItem[AlarmId].ModuleDeviceId); } break; - case CurrentAlarm: + case ALARM_SOURCE_TYPE__CurrentAlarm: break; - case MotorAlarm: + case ALARM_SOURCE_TYPE__MotorAlarm: MotorStop(AlarmItem[AlarmId].ModuleDeviceId,Hard_Hiz); break; default: @@ -393,7 +436,6 @@ uint32_t AlarmHandlingConsequentActions(uint32_t AlarmId, DebugLogCategory Sever //raise flag fr next job break; case DEBUG_LOG_CATEGORY__Critical: - case DEBUG_LOG_CATEGORY__Safety: // watchdogCriticalAlarm = true; LOG_ERROR(AlarmId,"Critical Alarm - Watchdog activated to reset hardware"); @@ -417,35 +459,35 @@ uint32_t AlarmHandlingConsequentActions(uint32_t AlarmId, DebugLogCategory Sever } /*switch (AlarmItem[AlarmId].AlarmSource) { - case TemperatureAlarm: + case ALARM_SOURCE_TYPE__TemperatureAlarm: //need to discover the heater Id and shut it down // HeaterCommandRequestMessage( HARDWARE_PID_CONTROL_TYPE__MixerHeater, false, // ProcessParams->mixertemp); break; - case LimitSwitchAlarm: + case ALARM_SOURCE_TYPE__LimitSwitchAlarm: if ((AlarmItem[AlarmId].EventType>=EVENT_TYPE__Dispenser1Empty)&&(AlarmItem[AlarmId].EventType<=EVENT_TYPE__Dispenser8Empty)) { Disp_i = AlarmItem[AlarmId].EventType- EVENT_TYPE__Dispenser1Empty; MotorStop(HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_1+Disp_i,Hard_Hiz); if (JobIsActive()) { - if (DispenserInUse[Disp_i] == false) + if (DispenserUsedInJob[Disp_i] == false) AlarmItem[AlarmId].Severity = DEBUG_LOG_CATEGORY__Info; } } break; - case PressureAlarm: + case ALARM_SOURCE_TYPE__PressureAlarm: Disp_i = AlarmItem[AlarmId].EventType- EVENT_TYPE__Dispenser1Pressure; MotorStop(HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_1+Disp_i,Hard_Hiz); if (JobIsActive()) { - if (DispenserInUse[Disp_i] == false) + if (DispenserUsedInJob[Disp_i] == false) AlarmItem[AlarmId].Severity = DEBUG_LOG_CATEGORY__Info; } break; - case CurrentAlarm: + case ALARM_SOURCE_TYPE__CurrentAlarm: break; - case MotorAlarm: + case ALARM_SOURCE_TYPE__MotorAlarm: break; default: break; @@ -463,24 +505,26 @@ uint32_t AlarmHandlingConsequentActions(uint32_t AlarmId, DebugLogCategory Sever } JobEndReasonEnum AlarmHandlingPrepareJob(void *CurrentJob) { - JobTicket* JobTicket = CurrentJob; + //JobTicket* JobTicket = CurrentJob; EventType HeaterEventType[MAX_HEATERS_NUM*2] = {EVENT_TYPE__DRYER_ZONE_1_OVERTEMPERATURE,EVENT_TYPE__DRYER_ZONE_2_OVERTEMPERATURE,EVENT_TYPE__DRYER_ZONE_1_OVERTEMPERATURE,EVENT_TYPE__DYEING_HEAD_ZONE_1_OVERTEMPERATURE,EVENT_TYPE__DYEING_HEAD_ZONE_2_OVERTEMPERATURE, EVENT_TYPE__DYEING_HEAD_ZONE_3_OVERTEMPERATURE,EVENT_TYPE__DYEING_HEAD_ZONE_4_OVERTEMPERATURE,EVENT_TYPE__DYEING_HEAD_ZONE_5_OVERTEMPERATURE,EVENT_TYPE__DYEING_HEAD_ZONE_6_OVERTEMPERATURE, EVENT_TYPE__MIXER_OVERTEMPERATURE}; EventType HeaterEventTypeUnder[MAX_HEATERS_NUM*2] = {EVENT_TYPE__DRYER_ZONE_1_UNDERTEMPERATURE_B,EVENT_TYPE__DRYER_ZONE_2_UNDERTEMPERATURE_B,EVENT_TYPE__DRYER_ZONE_1_UNDERTEMPERATURE_B,EVENT_TYPE__DYEING_HEAD_ZONE_1_UNDERTEMPERATURE_B,EVENT_TYPE__DYEING_HEAD_ZONE_2_UNDERTEMPERATURE_B, EVENT_TYPE__DYEING_HEAD_ZONE_3_UNDERTEMPERATURE_B,EVENT_TYPE__DYEING_HEAD_ZONE_4_UNDERTEMPERATURE_B,EVENT_TYPE__DYEING_HEAD_ZONE_5_UNDERTEMPERATURE_B,EVENT_TYPE__DYEING_HEAD_ZONE_6_UNDERTEMPERATURE_B, EVENT_TYPE__MIXER_UNDERTEMPERATURE_B}; - int Segment_i,Brush_i,Dispenser_i,DispenserId,Alarm_i,Heater_i,AlarmId=0; + int Dispenser_i,Alarm_i,Heater_i,AlarmId=0; HeaterState HeaterState; - for (Dispenser_i = 0;Dispenser_i < MAX_SYSTEM_DISPENSERS;Dispenser_i++) - { - DispenserInUse[Dispenser_i] = false; - } + //for (Dispenser_i = 0;Dispenser_i < MAX_SYSTEM_DISPENSERS;Dispenser_i++) + //{ + // DispenserInUse[Dispenser_i] = false; + //} JobEndReasonEnum status = JOB_OK; - if (JobTicket->n_segments == 0) + IDS_MapDispenserUsedinJob(CurrentJob); + if (n_segments == 0) return OK; - for (Segment_i=0;Segment_in_segments;Segment_i++) + + /*for (Segment_i=0;Segment_in_segments;Segment_i++) { for (Brush_i=0;Brush_isegments[Segment_i]->n_brushstops;Brush_i++) { @@ -498,11 +542,12 @@ JobEndReasonEnum AlarmHandlingPrepareJob(void *CurrentJob) }//if dispensers }//for brush }//for segments + */ if (Configured[Module_IDS]) { for (Dispenser_i=0;Dispenser_ihas_type = true; AlarmState[Alarm_i].EventPtr->type = AlarmItem[Alarm_i].EventType; AlarmState[Alarm_i].EventPtr->message = AlarmItem[Alarm_i].EventName; + AlarmState[Alarm_i].Status = value; Report("Alarm ON ", __FILE__,__LINE__,AlarmItem[Alarm_i].EventType, RpMessage, value, Alarm_i); } } else { - Report("Alarm ON ", __FILE__,__LINE__,AlarmItem[Alarm_i].EventType, RpMessage, value, Alarm_i); + Report("Alarm OFF ", __FILE__,__LINE__,AlarmItem[Alarm_i].EventType, RpMessage, value, Alarm_i); + AlarmState[Alarm_i].Status = value; if (AlarmState[Alarm_i].EventPtr) my_free(AlarmState[Alarm_i].EventPtr); } @@ -678,7 +724,7 @@ uint32_t AlarmHandlingStop(void) uint32_t AlarmHandlingLoop(uint32_t tick) { int Alarm_i; - uint32_t value; + int32_t value; //int32_t ivalue; bool Status = false; for (Alarm_i = 0;Alarm_i < MAX_SYSTEM_ALARMS;Alarm_i++) @@ -688,7 +734,7 @@ uint32_t AlarmHandlingLoop(uint32_t tick) { switch (AlarmItem[Alarm_i].AlarmSource) { - /*case TemperatureAlarm: + /*case ALARM_SOURCE_TYPE__TemperatureAlarm: ivalue = TemperatureSensorRead((TEMPERATURE_SENSOR_ID_ENUM)AlarmItem[Alarm_i].DeviceId); if (AlarmItem[Alarm_i].AlarmDirection == true) { @@ -707,21 +753,45 @@ uint32_t AlarmHandlingLoop(uint32_t tick) } } break;*/ - case CoversAlarm: - value = Get_COVER_1_State(AlarmItem[Alarm_i].DeviceId); - if (value == AlarmItem[Alarm_i].AlarmValue) + case ALARM_SOURCE_TYPE__CoversAlarm: + if (CheckTamperAlarms) { - Status = true; + value = Get_COVER_1_State(AlarmItem[Alarm_i].DeviceId); + if (value == AlarmItem[Alarm_i].AlarmValue) + { + Status = true; + } + } + else + { + value = false; } break; - case LimitSwitchAlarm: + case ALARM_SOURCE_TYPE__LimitSwitchAlarm: value = IDS_CheckDispenserLimitSwitch((LimitSwitchAlarms)AlarmItem[Alarm_i].DeviceId); if (value == AlarmItem[Alarm_i].AlarmValue) { Status = true; } break; - case PressureAlarm: + case ALARM_SOURCE_TYPE__HardLimitAlarm: + if (CheckHardLimitAlarms) + { + if (AlarmItem[Alarm_i].AlarmDirection == true) + { + value = Read_Notification_Disp_UP(AlarmItem[Alarm_i].DeviceId,NULL); + } + else + { + value = Read_Notification_Disp_Down(AlarmItem[Alarm_i].DeviceId,NULL); + } + } + else + { + value = false; + } + break; + case ALARM_SOURCE_TYPE__PressureAlarm: value = GetDispenserPressure(AlarmItem[Alarm_i].DeviceId); if (AlarmItem[Alarm_i].AlarmDirection == true) { @@ -738,24 +808,31 @@ uint32_t AlarmHandlingLoop(uint32_t tick) } } break; - case CurrentAlarm: - value = Get_Heaters_Current_Integer(AlarmItem[Alarm_i].DeviceId); - if (AlarmItem[Alarm_i].AlarmDirection == true) + case ALARM_SOURCE_TYPE__CurrentAlarm: + if (CheckCurrentAlarms) { - if (value >= AlarmItem[Alarm_i].AlarmValue) + value = Get_Heaters_Current_Integer(AlarmItem[Alarm_i].DeviceId); + if (AlarmItem[Alarm_i].AlarmDirection == true) { - Status = true; + if ((value >= (AlarmItem[Alarm_i].AlarmValue*1.07))||(value <= (AlarmItem[Alarm_i].AlarmValue*0.80))) + { + Status = true; + } + } + else + { + if (value == 0) + { + Status = true; + } } } else { - if (value <= AlarmItem[Alarm_i].AlarmValue) - { - Status = true; - } + value = false; } break; - case MotorAlarm: + case ALARM_SOURCE_TYPE__MotorAlarm: if (isMotorConfigured((TimerMotors_t)AlarmItem[Alarm_i].DeviceId) == false) { Status = false; @@ -777,8 +854,25 @@ uint32_t AlarmHandlingLoop(uint32_t tick) } } break; - case TemperatureAlarm: - case DoNotPollAlarm: + case ALARM_SOURCE_TYPE__FluidLevelAlarm: + value = Get_MidTank_Int100_Sensor(AlarmItem[Alarm_i].DeviceId); + if (AlarmItem[Alarm_i].AlarmDirection == OVER_VALUE) + { + if (value*100 > AlarmItem[Alarm_i].AlarmValue) + { + Status = true; + } + } + else + { + if (value*100 < AlarmItem[Alarm_i].AlarmValue) + { + Status = true; + } + } + break; + case ALARM_SOURCE_TYPE__TemperatureAlarm: + case ALARM_SOURCE_TYPE__DoNotPollAlarm: Status = AlarmState[Alarm_i].Status; break; default: @@ -927,20 +1021,33 @@ void SendEventNotifications(void) response.n_events++; } } - response.events = (Event **)my_malloc(sizeof(Event*)*response.n_events); - if(response.events) + + if (response.n_events) { - for (i = 0;ivalue == true) + Control_Dryer_Fan(START,75);//use START or STOP, 0 - 100%(); + else + Control_Dryer_Fan(STOP,0);//use START or STOP, 0 - 100%(); + break; default: responseContainer.has_error = true; responseContainer.error = ERROR_CODE__GENERAL_ERROR; diff --git a/Software/Embedded_SW/Embedded/Modules/Diagnostics/Diagnostics.c b/Software/Embedded_SW/Embedded/Modules/Diagnostics/Diagnostics.c index 45db83b83..c936d842c 100644 --- a/Software/Embedded_SW/Embedded/Modules/Diagnostics/Diagnostics.c +++ b/Software/Embedded_SW/Embedded/Modules/Diagnostics/Diagnostics.c @@ -67,32 +67,32 @@ int DiagnosticCollectionLimit = 2; //number of data samples to collect before s int DiagnosticLimit =eHundredMillisecond; //frequency of data collection int DiagnosticFastLimit = eTenMillisecond; //frequency of data collection -//DigitalPin DigitalPinArray[1][DIAGNOSTICS_LIMIT]; -double dancer1angle[DIAGNOSTICS_LIMIT]; -double dancer2angle[DIAGNOSTICS_LIMIT]; -double dancer3angle[DIAGNOSTICS_LIMIT]; - -double feedermotorfrequency[DIAGNOSTICS_LIMIT]; -double dryermotor[DIAGNOSTICS_LIMIT]; -double pollermotor[DIAGNOSTICS_LIMIT]; -double windermotor[DIAGNOSTICS_LIMIT]; -double screwmotor[DIAGNOSTICS_LIMIT]; -double mixertemperature[DIAGNOSTICS_LIMIT]; -double headzone1temperature[DIAGNOSTICS_LIMIT]; -double headzone2temperature[DIAGNOSTICS_LIMIT]; -double headzone3temperature[DIAGNOSTICS_LIMIT]; -double headzone4temperature[DIAGNOSTICS_LIMIT]; -double headzone5temperature[DIAGNOSTICS_LIMIT]; -double headzone6temperature[DIAGNOSTICS_LIMIT]; -double dryerzone1temperature[DIAGNOSTICS_LIMIT]; -double dryerzone2temperature[DIAGNOSTICS_LIMIT]; -double dryerzone3temperature[DIAGNOSTICS_LIMIT]; - - -double dispensermotorfrequency[MAX_SYSTEM_DISPENSERS][DIAGNOSTICS_LIMIT]; -double dispenserspressure[MAX_SYSTEM_DISPENSERS][DIAGNOSTICS_LIMIT]; +//DigitalPin DigitalPinArray[1][DIAGNOSTICS_LIMIT+1]; +double dancer1angle[DIAGNOSTICS_LIMIT+1]; +double dancer2angle[DIAGNOSTICS_LIMIT+1]; +double dancer3angle[DIAGNOSTICS_LIMIT+1]; + +double feedermotorfrequency[DIAGNOSTICS_LIMIT+1]; +double dryermotor[DIAGNOSTICS_LIMIT+1]; +double pollermotor[DIAGNOSTICS_LIMIT+1]; +double windermotor[DIAGNOSTICS_LIMIT+1]; +double screwmotor[DIAGNOSTICS_LIMIT+1]; +double mixertemperature[DIAGNOSTICS_LIMIT+1]; +double headzone1temperature[DIAGNOSTICS_LIMIT+1]; +double headzone2temperature[DIAGNOSTICS_LIMIT+1]; +double headzone3temperature[DIAGNOSTICS_LIMIT+1]; +double headzone4temperature[DIAGNOSTICS_LIMIT+1]; +double headzone5temperature[DIAGNOSTICS_LIMIT+1]; +double headzone6temperature[DIAGNOSTICS_LIMIT+1]; +double dryerzone1temperature[DIAGNOSTICS_LIMIT+1]; +double dryerzone2temperature[DIAGNOSTICS_LIMIT+1]; +double dryerzone3temperature[DIAGNOSTICS_LIMIT+1]; + + +double dispensermotorfrequency[MAX_SYSTEM_DISPENSERS][DIAGNOSTICS_LIMIT+1]; +double dispenserspressure[MAX_SYSTEM_DISPENSERS][DIAGNOSTICS_LIMIT+1]; double MidTankpressure[MAX_SYSTEM_DISPENSERS][1]; -double HeatersCurrent[NUM_OF_HEATERS][1]; +double HeatersCurrent[NUM_OF_CURRENT_HEATERS][1]; DoubleArray DispenserFreq[MAX_SYSTEM_DISPENSERS]; DoubleArray DiagnosticsDispenserPressure[MAX_SYSTEM_DISPENSERS]; @@ -101,14 +101,14 @@ HeaterState **heatersstates; HeaterState HeaterInfo[HEATER_TYPE__MixerHeater+1]; DigitalInterfaceState **digitalinterfacestates; DigitalInterfaceState DigitalOutputState[MAX_HEATERS_NUM+2]; -/*double dispenser1motorfrequency[DIAGNOSTICS_LIMIT]; -double dispenser2motorfrequency[DIAGNOSTICS_LIMIT]; -double dispenser3motorfrequency[DIAGNOSTICS_LIMIT]; -double dispenser4motorfrequency[DIAGNOSTICS_LIMIT]; -double dispenser5motorfrequency[DIAGNOSTICS_LIMIT]; -double dispenser6motorfrequency[DIAGNOSTICS_LIMIT]; -double dispenser7motorfrequency[DIAGNOSTICS_LIMIT]; -double dispenser8motorfrequency[DIAGNOSTICS_LIMIT]; +/*double dispenser1motorfrequency[DIAGNOSTICS_LIMIT+1]; +double dispenser2motorfrequency[DIAGNOSTICS_LIMIT+1]; +double dispenser3motorfrequency[DIAGNOSTICS_LIMIT+1]; +double dispenser4motorfrequency[DIAGNOSTICS_LIMIT+1]; +double dispenser5motorfrequency[DIAGNOSTICS_LIMIT+1]; +double dispenser6motorfrequency[DIAGNOSTICS_LIMIT+1]; +double dispenser7motorfrequency[DIAGNOSTICS_LIMIT+1]; +double dispenser8motorfrequency[DIAGNOSTICS_LIMIT+1]; */ Task_Handle Diagnostics_Task_Handle; Mailbox_Handle DiagnosticsMsgQ = NULL; @@ -183,15 +183,15 @@ void SetDiagnosticCollectionLimit(int limit) } uint8_t HeaterCounterIndex[MAX_HEATERS_NUM]= {0,0,0,0,0,0,0,0,0,0}; -double HeaterTemperature[MAX_HEATERS_NUM][DIAGNOSTICS_LIMIT]; +double HeaterTemperature[MAX_HEATERS_NUM][DIAGNOSTICS_LIMIT+1]; uint8_t DancerCounterIndex[NUM_OF_DANCERS]= {0,0,0}; -double DancerValue[NUM_OF_DANCERS][DIAGNOSTICS_DANCER_LIMIT]; +double DancerValue[NUM_OF_DANCERS][DIAGNOSTICS_DANCER_LIMIT+1]; int8_t DancerErrorCounterIndex[NUM_OF_DANCERS]= {0,0,0}; -double DancerErrorValue[NUM_OF_DANCERS][DIAGNOSTICS_DANCER_LIMIT]; +double DancerErrorValue[NUM_OF_DANCERS][DIAGNOSTICS_DANCER_LIMIT+1]; uint8_t MotorCounterIndex[MAX_THREAD_MOTORS_NUM]= {0,0,0}; -double MotorValue[MAX_THREAD_MOTORS_NUM][DIAGNOSTICS_LIMIT]; +double MotorValue[MAX_THREAD_MOTORS_NUM][DIAGNOSTICS_LIMIT+1]; uint8_t SpeedCounterIndex= 0; -double SpeedValue[DIAGNOSTICS_DANCER_LIMIT]; +double SpeedValue[DIAGNOSTICS_DANCER_LIMIT+1]; void DiagnosticLoadMotor(int MotorId, int frequency) { @@ -348,7 +348,7 @@ void Diagnostic100msecCollection(void) dispenserspressure[i][DiagnosticsIndex] = GetDispenserPressure(i); //Read_MidTank_Pressure_Sensor MidTankpressure[i][0] = Get_MidTank_Pressure_Sensor(i); } - for (i=0;iAction = COUNTPB ; + REPORT_MSG(parameter," ------------ Start count PB Power ----------------- "); } break; case COUNTPB: // last OnOffPBstate was COUNTPB if (OnOffPB) { - if( pBtn->count > 5 ) //250ms + if( pBtn->count > 5 ) //5*50ms=250ms { pBtn->Action = SHORTPB ; + REPORT_MSG(parameter," ------------ Start count PB Power ----------------- "); } } else @@ -259,14 +257,14 @@ uint32_t ShortLongOffPB(uint8_t OnOffPB, button *pBtn) if (pBtn->count > 100) //5000ms { pBtn->Action = LONGPB ; - REPORT_MSG(parameter,"Long PB "); + REPORT_MSG(parameter," ------------ Long PB Power ----------------- "); StateMachine(pBtn); pBtn->count = 0; } } else { - REPORT_MSG(parameter,"Short PB "); + REPORT_MSG(parameter," ------------ Short PB Power ----------------- "); StateMachine(pBtn); pBtn->count = 0; pBtn->Action = OFFPB ; @@ -317,8 +315,9 @@ uint32_t StateMachine( button *pBtn) //short press(=0)/long press(=1) switch (pBtn->Action) { case LONGPB: //Power Down - pBtn->state = sttOFF; // todo - REPORT_MSG(parameter,"Power state is OFF "); + pBtn->state = sttOFF; + PowerDown();// todo + REPORT_MSG(parameter," ------------ Power state is OFF ----------------- "); break; // case SHORTPB: //idle ????? // setMachineStatus = IDLE; // ????/ @@ -335,8 +334,9 @@ uint32_t StateMachine( button *pBtn) //short press(=0)/long press(=1) // break; case SHORTPB: //powerup? // to do ? - pBtn->state = sttON; //todo - REPORT_MSG(parameter,"Power state is ON "); + pBtn->state = sttON; + PowerUp(); //todo + REPORT_MSG(parameter," ------------ Power state is ON ----------------- "); break; default: break; @@ -346,14 +346,16 @@ uint32_t StateMachine( button *pBtn) //short press(=0)/long press(=1) switch (pBtn->Action) { case LONGPB: //Power off from idle - pBtn->state = sttOFF; // todo + pBtn->state = sttOFF; + PowerDown(); // todo Pannel_Leds(POWER_ON_OFF,MODE_OFF); //AVI+ - TODO option MODE_ON to stop Breathing and the led will turn off in power down - REPORT_MSG(parameter,"Power state is OFF "); + REPORT_MSG(parameter," ------------ Power state is OFF ----------------- "); break; case SHORTPB: //Wake up from idle - pBtn->state = sttON;// to do ? + pBtn->state = sttON; + PowerUp(); // to do ? Pannel_Leds(POWER_ON_OFF,MODE_ON); //AVI+ - REPORT_MSG(parameter,"Power state is ON "); + REPORT_MSG(parameter," ------------ Power state is ON ----------------- "); break; default: break; @@ -384,7 +386,10 @@ return 0; uint32_t setJoggingEnableCondition( button *pBtn) { + uint8_t parameter = 3; + if (0 +// to do : what are the conditions for enable / disable // 1. // 2. // 3. @@ -392,15 +397,15 @@ uint32_t setJoggingEnableCondition( button *pBtn) ) { pBtn->state = sttDISABLE; - REPORT_MSG(pBtn->state,"Jogging : sttDISABLE "); - ThreadAbortJoggingFunc(); + REPORT_MSG(parameter," ------------ Jogging : sttDISABLE ----------------- "); + // ThreadAbortJoggingFunc(); } else { pBtn->state = sttENABLE; - REPORT_MSG(pBtn->state,"Jogging : sttENABLE "); - ThreadJoggingFunc(40); + REPORT_MSG(parameter," ------------ Jogging : sttENABLE ----------------- "); + //ThreadJoggingFunc(40); } return 0; @@ -421,9 +426,13 @@ return 0; uint32_t joggingMachine(uint8_t OnOffPB, button *pBtn) { + + uint8_t parameter = 4; + if (sttDISABLE == pBtn->state) { // jogging is disable + REPORT_MSG(parameter," ------------ Jogging is Disable ----------------- "); pBtn->color = colorOFF; Pannel_Leds(THREAD_JOGGING,MODE_OFF);//AVI+ } @@ -431,12 +440,14 @@ uint32_t joggingMachine(uint8_t OnOffPB, button *pBtn) { if (!OnOffPB) { + REPORT_MSG(parameter," ------------ stop Jogging ----------------- "); ThreadAbortJoggingFunc(); // to do!!!! pBtn->color = BLUE; Pannel_Leds(THREAD_JOGGING,MODE_ON);//AVI+ } else { + REPORT_MSG(parameter," ------------ start Jogging ----------------- "); pBtn->color = BLINK; ThreadJoggingFunc(40); } @@ -450,9 +461,11 @@ return 0; /*------ THREAD LOAD/UNLOAD ----------*/ -int LoadStatMachine( PBstat PBAction, button *pBtn) +uint32_t LoadStatMachine( button *pBtn) { + uint8_t parameter = 5; + REPORT_MSG(parameter," ------------ start loadong ----------------- "); switch (pBtn->state) { case sttRDY : diff --git a/Software/Embedded_SW/Embedded/Modules/General/buttons.h b/Software/Embedded_SW/Embedded/Modules/General/buttons.h index d0cea022c..adf975979 100644 --- a/Software/Embedded_SW/Embedded/Modules/General/buttons.h +++ b/Software/Embedded_SW/Embedded/Modules/General/buttons.h @@ -38,9 +38,9 @@ typedef struct Button { char bttn_name[10]; //option int bttn_status; // 0=release 1=press - /* enum */ PBstat Action; //offPB,shortPB,longPB,countPB,replongPB - /* enum */ PBcolor color; //off, blue, blink, bithing - /* enum */ PBmachinState state; //sttOFF, sttON, sttDISABLE, sttENABLE, sttIDLE, sttJOGGING + PBstat Action; // enum : offPB,shortPB,longPB,countPB,replongPB + PBcolor color; // enum : off, blue, blink, bithing + PBmachinState state; // enum : sttOFF, sttON, sttDISABLE, sttENABLE, sttIDLE, sttJOGGING uint32_t count; }button; diff --git a/Software/Embedded_SW/Embedded/Modules/General/process.c b/Software/Embedded_SW/Embedded/Modules/General/process.c index 458bb35f2..277891861 100644 --- a/Software/Embedded_SW/Embedded/Modules/General/process.c +++ b/Software/Embedded_SW/Embedded/Modules/General/process.c @@ -20,6 +20,7 @@ #include "modules/ids/ids_ex.h" #include "third_party/fatfs/src/ffconf.h" #include "Common/SWUpdate/FileSystem.h" +#include "StateMachines/Initialization/PowerIdle.h" @@ -210,6 +211,7 @@ void ProcessRequestFunc(MessageContainer* requestContainer) //REPORT_MSG (ProcessParams->dryerzone1temp,"Process Params Dryer"); + PowerIdleOutOfIdleState(); if (status == 0) status = HandleProcessParameters(ProcessParams); diff --git a/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_print.c b/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_print.c index 3f62fc3b6..8fe9e5c2e 100644 --- a/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_print.c +++ b/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_print.c @@ -90,7 +90,7 @@ uint32_t SecondDryerHeaterMaxTempControl = 0xFF; //old uint32_t HeaterId2PT100Id[MAX_HEATERS_NUM] = {DRYER_AIR_PT100,DRYER_MAIN_PT100,DRYER_SECONDARY_PT100,TEMP_SENSE_ANALOG_DYEINGH_TEMP1,TEMP_SENSE_ANALOG_DYEINGH_TEMP2,TEMP_SENSE_ANALOG_DYEINGH_TEMP3,TEMP_SENSE_ANALOG_DYEINGH_TEMP4,TEMP_SENSE_ANALOG_DYEINGH_TEMP5,TEMP_SENSE_ANALOG_MIXCHIP_TEMP,TEMP_SENSE_AN_ENCLOSURETEMP3}; uint32_t HeaterId2PT100Id[MAX_HEATERS_NUM] = {DRYER_AIR_PT100,DRYER_MAIN_PT100,DRYER_SECONDARY_PT100,TEMP_SENSE_ANALOG_DYEINGH_TEMP1,TEMP_SENSE_ANALOG_DYEINGH_TEMP2,TEMP_SENSE_ANALOG_DYEINGH_TEMP3,TEMP_SENSE_ANALOG_DYEINGH_TEMP4,TEMP_SENSE_ANALOG_DYEINGH_TEMP5,HEAD6_PT100,MIXER_PT100}; -HEATERS_CURRENT HeaterId2CurrentId[MAX_HEATERS_NUM] = {NUM_OF_HEATERS,DRYER_CURRENT_1,DRYER_CURRENT_2,HEAD_ZONE_1,HEAD_ZONE_2,HEAD_ZONE_3,HEAD_ZONE_4,HEAD_ZONE_5_6,HEAD_ZONE_5_6,MIXCHIP}; +HEATERS_CURRENT HeaterId2CurrentId[MAX_HEATERS_NUM] = {NUM_OF_CURRENT_HEATERS,HEATER_DRYER_CURRENT_1,HEATER_DRYER_CURRENT_2,HEATER_HEAD_CURRENT_ZONE_1,HEATER_HEAD_CURRENT_ZONE_2,HEATER_HEAD_CURRENT_ZONE_3,HEATER_HEAD_CURRENT_ZONE_4,HEATER_HEAD_CURRENT_ZONE_5_6,HEATER_HEAD_CURRENT_ZONE_5_6,HEATER_MIXCHIP_CURRENT}; uint32_t DryerInternalPT100Id = DRYER_AIR_PT100; bool HeatersRestart = false; @@ -385,7 +385,7 @@ uint32_t HeaterCommandRequestMessage(int HeaterId, bool OnOff, int Temperature) PrepareHeater(HeaterId,Temperature); //prepare the heaters control info //set the power balance handler (if not set yet) // if the heater is off (?) start it. - ActivateHeater(HeaterId); + //ActivateHeater(HeaterId); //set the heater operation mode to fast heating - depended on the current temperature // timers are prepared but not started yet!!! only when the system is hot. @@ -416,7 +416,7 @@ uint32_t HeaterCommandRequestMessage(int HeaterId, bool OnOff, int Temperature) } //usnprintf(ACheatstr, 254, "HeaterCommandRequestMessage(Id %d,OnOff %d,Temperature %d)",HeaterId, OnOff, Temperature); - Report("HeaterCommandRequestMessage",__FILE__,Temperature,HeaterId,RpWarning,HeaterState, 0); + //Report("HeaterCommandRequestMessage",__FILE__,Temperature,HeaterId,RpWarning,HeaterState, 0); //Report("HeatersSingleHeaterEnd ", __FILE__,__LINE__,HeaterId, RpMessage, 0, 0); return OK; @@ -433,7 +433,7 @@ void PrepareACHeater(int HeaterId,uint32_t Frequency, uint32_t SetTemperatue) ControlIdtoHeaterId [HeaterId] = AddControlCallback( HeaterControlCBFunction, Frequency/*eOneSecond*/,TemperatureSensorRead,(IfTypeHeaters*0x100+HeaterId),DryerInternalPT100Id,0); //HeaterPreviousRead[HeaterId] = TemperatureSensorRead(DryerInternalPT100Id); HeaterPreviousRead[HeaterId] = GetFilteredHeaterRead(HeaterId);// - Report("PrepareHeater Read", __FILE__,__LINE__,HeaterId, SetTemperatue, HeaterPreviousRead[HeaterId], 0); + //Report("PrepareHeater AC Read", __FILE__,HeaterId, SetTemperatue, RpWarning,HeaterPreviousRead[HeaterId], 0); HeaterPreviousRead[HARDWARE_PID_CONTROL_TYPE__DryerHeaterMain] = GetFilteredHeaterRead(HARDWARE_PID_CONTROL_TYPE__DryerHeaterMain);//TemperatureSensorRead(HeaterId2PT100Id[HARDWARE_PID_CONTROL_TYPE__DryerHeaterMain]); HeaterPreviousRead[HARDWARE_PID_CONTROL_TYPE__DryerHeaterSecondary] = GetFilteredHeaterRead(HARDWARE_PID_CONTROL_TYPE__DryerHeaterSecondary);// = TemperatureSensorRead(HeaterId2PT100Id[HARDWARE_PID_CONTROL_TYPE__DryerHeaterSecondary]); } @@ -497,7 +497,7 @@ int PrepareDCHeater(int HeaterId, uint32_t Frequency, uint32_t SetTemperatue) LOG_ERROR (HeaterId,"PT100 not working properly"); return ERROR; } - Report("PrepareHeater Read", __FILE__,__LINE__,HeaterId, SetTemperatue, HeaterPreviousRead[HeaterId], 0); + //Report("PrepareHeater Read", __FILE__,HeaterId, SetTemperatue, RpWarning,HeaterPreviousRead[HeaterId], 0); if (ControlIdtoMaxHeaterId [HeaterId] == 0xFF) ControlIdtoMaxHeaterId [HeaterId] = AddControlCallback( DcHeaterMaxTempCBFunction, eOneSecond,TemperatureSensorRead,(IfTypeHeaters*0x100+HeaterId),HeaterId2PT100Id[HeaterId],0); @@ -658,11 +658,11 @@ uint32_t HeaterMaxTempCBFunction(uint32_t IfIndex, uint32_t eadValue) { if (HeaterMaxTempFlag[index] == true) { - ActivateHeater(HARDWARE_PID_CONTROL_TYPE__DryerHeaterMain); + /* ActivateHeater(HARDWARE_PID_CONTROL_TYPE__DryerHeaterMain); if (HeaterReady[HARDWARE_PID_CONTROL_TYPE__DryerAirTemperature]==false) { ActivateHeater(HARDWARE_PID_CONTROL_TYPE__DryerHeaterSecondary); - } + }*/ // LOG_ERROR ((MinreadValue/100), "Heater Cooled Off max temperature, turned on"); } HeaterMaxTempFlag[HARDWARE_PID_CONTROL_TYPE__DryerHeaterMain] = false; @@ -699,6 +699,7 @@ uint32_t DcHeaterMaxTempCBFunction(uint32_t IfIndex, uint32_t eadValue) } } DeActivateHeater(index); + HeaterRecalculateHeaterParams(index, 0); HeaterMaxTempFlag[index] = true; //LOG_ERROR ((MinreadValue/100), "Heater Over the max temperature, turned off"); Report("Heater Over the max temperature, turned off",__FILE__,__LINE__,index,RpWarning,HeaterPreviousRead[index], HeaterControl[index].sensormaxvalue); @@ -778,10 +779,12 @@ uint32_t HeaterControlCBFunction(uint32_t IfIndex, uint32_t readValue) } if (abs(readValue - HeaterPreviousRead[index])>2000) { - Report("Temperature Spike",__FILE__,index,HeaterPreviousRead[index],RpWarning,readValue, index); + Report("AC Temperature Spike",__FILE__,index,HeaterPreviousRead[index],RpWarning,readValue, index); if (readValue > HeaterCmd[index].targettemperatue) { DeActivateHeater(index); + HeaterRecalculateSharedHeatersParams(HARDWARE_PID_CONTROL_TYPE__DryerHeaterMain,0); + HeaterRecalculateSharedHeatersParams(HARDWARE_PID_CONTROL_TYPE__DryerHeaterSecondary,0); } return ERROR; } @@ -795,6 +798,8 @@ uint32_t HeaterControlCBFunction(uint32_t IfIndex, uint32_t readValue) DeActivateHeater(HARDWARE_PID_CONTROL_TYPE__DryerHeaterSecondary); DeActivateHeater(HARDWARE_PID_CONTROL_TYPE__DryerHeaterMain); //Heaters OFF until coming into the proportional band + HeaterRecalculateSharedHeatersParams(HARDWARE_PID_CONTROL_TYPE__DryerHeaterMain,0); + HeaterRecalculateSharedHeatersParams(HARDWARE_PID_CONTROL_TYPE__DryerHeaterSecondary,0); return OK; } // if (readValue < ((HeaterCmd[index].targettemperatue * (100-HeaterControl[index].outputproportionalband))/100)) @@ -905,7 +910,7 @@ uint32_t DCHeaterControlCBFunction(uint32_t IfIndex, uint32_t readValue) } if (abs(readValue - HeaterPreviousRead[index])>2000) { - Report("Temperature Spike",__FILE__,__LINE__,HeaterPreviousRead[index],RpWarning,readValue, index); + Report("DC Temperature Spike",__FILE__,index,HeaterPreviousRead[index],RpWarning,readValue, index); if (readValue > HeaterCmd[index].targettemperatue) { DeActivateHeater(index); diff --git a/Software/Embedded_SW/Embedded/Modules/IDS/IDS.h b/Software/Embedded_SW/Embedded/Modules/IDS/IDS.h index d27fb7c56..80a55d63e 100644 --- a/Software/Embedded_SW/Embedded/Modules/IDS/IDS.h +++ b/Software/Embedded_SW/Embedded/Modules/IDS/IDS.h @@ -5,6 +5,7 @@ #include "drivers/motors/motor.h" #include "ids_ex.h" +extern uint32_t CurrentDispenserSpeed[MAX_SYSTEM_DISPENSERS]; extern uint32_t DispenserIdToMotorId[MAX_SYSTEM_DISPENSERS]; extern float DispenserPressure[MAX_SYSTEM_DISPENSERS]; uint32_t DispenserConfigMessage(HardwareDispenser * request); @@ -33,5 +34,9 @@ void IDS_Dispenser_RefillEnded (char DispenserId); void IDS_Dispenser_MovingDirection (char DispenserId, bool direction); uint32_t IDS_Dispenser_Build_Pressure(int DispenserId, callback_fptr callback); +uint32_t IDS_Cleaning_Move_Rockers (int LeftRockerSpeed,int RightRockerSpeed); +uint32_t IDS_Cleaning_Center_And_Stop_Rockers (int timeout,callback_fptr callback); +uint32_t IDS_Cleaning_Spray_Cleaning_Solution (int dispenserSpeed,callback_fptr callback); +uint32_t IDS_Cleaning_Stop_Cleaning_Solution (callback_fptr callback); #endif //MODULES_IDS_IDS_H_ diff --git a/Software/Embedded_SW/Embedded/Modules/IDS/IDS_Cleaning.c b/Software/Embedded_SW/Embedded/Modules/IDS/IDS_Cleaning.c new file mode 100644 index 000000000..02f25cb59 --- /dev/null +++ b/Software/Embedded_SW/Embedded/Modules/IDS/IDS_Cleaning.c @@ -0,0 +1,56 @@ +/* + * IDS_Cleaning.c + * + * Created on: 18 áîøõ 2019 + * Author: User + */ +#include "include.h" +#include "ids.h" +#include "ids_ex.h" +#include "../control/control.h" +#include "../control/pidalgo.h" +#include "../thread/thread.h" +#include "PMR/Hardware/Hardwaremotor.pb-c.h" +#include "PMR/Hardware/HardwareDispenser.pb-c.h" +#include "StateMachines/Printing/printingSTM.h" +#include "drivers/motors/motor.h" +#include "drivers/valves/valve.h" + +int SaveLeftRockerSpeed = 50, SaveRightRockerSpeed = 50; +#define CLEANING_DISPENSER_ID 6 +uint32_t IDS_Cleaning_Move_Rockers (int LeftRockerSpeed,int RightRockerSpeed) +{ + uint32_t status = OK; + SaveLeftRockerSpeed = LeftRockerSpeed; + SaveRightRockerSpeed = RightRockerSpeed; + status |= MotorSetDirection(HARDWARE_MOTOR_TYPE__MOTO_DH_CLEANHEAD,MotorsCfg[HARDWARE_MOTOR_TYPE__MOTO_DH_CLEANHEAD].directionthreadwize); + status |= MotorSetSpeed(HARDWARE_MOTOR_TYPE__MOTO_DH_CLEANHEAD, RightRockerSpeed); + status |= MotorSetDirection(HARDWARE_MOTOR_TYPE__MOTO_DH_CLEANMECH,MotorsCfg[HARDWARE_MOTOR_TYPE__MOTO_DH_CLEANMECH].directionthreadwize); + status |= MotorSetSpeed(HARDWARE_MOTOR_TYPE__MOTO_DH_CLEANMECH, LeftRockerSpeed); + + return status; +} +uint32_t IDS_Cleaning_Center_And_Stop_Rockers (int timeout,callback_fptr callback) +{ + uint32_t status = OK; + status |= MotorMovetoLimitSwitch (HARDWARE_MOTOR_TYPE__MOTO_DH_CLEANHEAD,MotorsCfg[HARDWARE_MOTOR_TYPE__MOTO_DH_CLEANHEAD].directionthreadwize, SaveRightRockerSpeed, Motor_Id_to_LS_IdUp[HARDWARE_MOTOR_TYPE__MOTO_DH_CLEANHEAD], callback,timeout); + status |= MotorMovetoLimitSwitch (HARDWARE_MOTOR_TYPE__MOTO_DH_CLEANMECH,MotorsCfg[HARDWARE_MOTOR_TYPE__MOTO_DH_CLEANMECH].directionthreadwize, SaveLeftRockerSpeed, Motor_Id_to_LS_IdUp[HARDWARE_MOTOR_TYPE__MOTO_DH_CLEANMECH], callback,timeout); + + return status; +} +uint32_t IDS_Cleaning_Spray_Cleaning_Solution (int dispenserSpeed,callback_fptr callback) +{ + uint32_t status = OK; + status = IDS_Dispenser_Start_Motor_and_Open_Valve(CLEANING_DISPENSER_ID, dispenserSpeed, callback); + + return status; + +} +uint32_t IDS_Cleaning_Stop_Cleaning_Solution (callback_fptr callback) +{ + uint32_t status = OK; + status = IDS_Dispenser_Close_Valve_And_Stop_Motor(CLEANING_DISPENSER_ID,callback); + + return status; + +} diff --git a/Software/Embedded_SW/Embedded/Modules/IDS/IDS_dispenser.c b/Software/Embedded_SW/Embedded/Modules/IDS/IDS_dispenser.c index acaf19744..b33b531a3 100644 --- a/Software/Embedded_SW/Embedded/Modules/IDS/IDS_dispenser.c +++ b/Software/Embedded_SW/Embedded/Modules/IDS/IDS_dispenser.c @@ -23,9 +23,9 @@ uint32_t CloseValveTimeout = 250; uint32_t OpenValveTimeout = 250; -#define DISPENSER_BUILD_PRESSURE_SPEED 500 +#define DISPENSER_BUILD_PRESSURE_SPEED 900 #define DISPENSER_BUILD_PRESSURE_LIMIT 1.5 -#define DISPENSER_BUILD_PRESSURE_TIMEOUT 20000 +#define DISPENSER_BUILD_PRESSURE_TIMEOUT 60000 #define DISPENSER_BUILD_PRESSURE_LAG 50 uint32_t DispenserPrepareSpeed = DISPENSER_BUILD_PRESSURE_SPEED; @@ -62,10 +62,15 @@ uint32_t IdsGetMotorSpeed(uint32_t DispenserId) uint32_t IDS_Dispenser_Build_Pressure_Callback(uint32_t DispenserId, uint32_t ReadValue) { + uint32_t status; DispenserPrepareTime[DispenserId]+=DispenserPrepareTimeLag; if ((GetDispenserPressure(DispenserId)>=DispenserPreparePressure)||(DispenserPrepareTime[DispenserId]>=DispenserPrepareTimeout)) { + if (DispenserPrepareTime[DispenserId]>=DispenserPrepareTimeout) + status = ERROR; + else + status = OK; if (SafeRemoveControlCallback(DispenserControlId[DispenserId], IDS_Dispenser_Build_Pressure_Callback )==OK) DispenserControlId[DispenserId] = 0xFF; else @@ -76,17 +81,18 @@ uint32_t IDS_Dispenser_Build_Pressure_Callback(uint32_t DispenserId, uint32_t Re if (DispenserCallback[DispenserId]) { - DispenserCallback[DispenserId](DispenserId,ReadValue); + + DispenserCallback[DispenserId](DispenserId,status); DispenserCallback[DispenserId] = 0; } } - return OK; + return status; } uint32_t IDS_Dispenser_Build_Pressure(int DispenserId, callback_fptr callback) { DispenserCallback[DispenserId] = callback; - //Report("Control3WayValvesWithCallback called ",__FILE__,__LINE__,(int)DispenserId,RpWarning,(int)0,0); + Report("IDS_Dispenser_Build_Pressure called ",__FILE__,__LINE__,(int)DispenserPrepareSpeed,RpWarning,DispenserPrepareTimeLag,0); Control3WayValvesWithCallback ((Valves_t)DispenserId, CloseValve, NULL); //direction: MidTank_Dispenser or Dispenser_Mixer if (DispenserControlId[DispenserId] != 0xFF) @@ -100,6 +106,7 @@ uint32_t IDS_Dispenser_Build_Pressure_Callback(uint32_t DispenserId, uint32_t Re //Report("Add control callback",__FILE__,__LINE__,(int)DispenserId,RpWarning,(int)DispenserControlId[DispenserId],0); DispenserPrepareTime[DispenserId]=0; TimerMotors_t HW_Motor_Id = DispenserIdToMotorId[DispenserId]; + MotorSetDirection(HW_Motor_Id,MotorsCfg[HW_Motor_Id].directionthreadwize); MotorSetSpeed(HW_Motor_Id, DispenserPrepareSpeed); CurrentDispenserSpeed[DispenserId] = DispenserPrepareSpeed; } @@ -231,13 +238,31 @@ void IDS_Dispenser_Content_Init (void) IDS_Dispenser_Data[i].has_nanolitterperpulse = true; } free (buffer); - dispenser_data__free_unpacked(NULL,StoredDispenserData); + dispenser_data__free_unpacked(StoredDispenserData,NULL); } return; //================================== } uint16_t seconds_counter = 0; +uint32_t IDS_Dispenser_Store_Data (void) +{ + FRESULT Status = FR_OK; + IDSDispenserData.n_dispenserinfo = MAX_SYSTEM_DISPENSERS; + IDSDispenserData.dispenserinfo = dispenserdata; + uint8_t* response_buffer = my_malloc(dispenser_data__get_packed_size(&IDSDispenserData)); + size_t response_size = 0; + if (response_buffer) + { + response_size = dispenser_data__pack(&IDSDispenserData, response_buffer); + Status = FileWrite(response_buffer,response_size,DispenserStorePath); + my_free(response_buffer); + } + else + return ERROR; + + return Status; +} void IDS_Dispenser_Content_Calculation (char DispenserId) { assert (DispenserId=600)//3600) { + seconds_counter = 0; if (IDS_Dispenser_Data[DispenserId].consumedinnanolitter) { REPORT_MSG(IDS_Dispenser_Data[DispenserId].consumedinnanolitter,"Saving Dispenser Data" ); } - seconds_counter = 0; - IDSDispenserData.n_dispenserinfo = MAX_SYSTEM_DISPENSERS; - IDSDispenserData.dispenserinfo = dispenserdata; - uint8_t* response_buffer = my_malloc(dispenser_data__get_packed_size(&IDSDispenserData)); - size_t response_size = 0; - if (response_buffer) - { - response_size = dispenser_data__pack(&IDSDispenserData, response_buffer); - } - - FileWrite(response_buffer,response_size,DispenserStorePath); - my_free(response_buffer); - //dispenser_data__free_unpacked(response_size,NULL); - + IDS_Dispenser_Store_Data(); } } } @@ -278,7 +291,7 @@ void IDS_Dispenser_Set_Flow_Params (char DispenserId,double nanolitterperpulse,c IDS_Dispenser_Data[DispenserId].nanolitterperpulse = nanolitterperpulse; IDS_Dispenser_Data[DispenserId].microsteps = microsteps; IDS_Dispenser_Data[DispenserId].direction = 1; - Report("IDS_Dispenser_Set_Flow_Params",__FILE__,DispenserId,(int)nanolitterperpulse,RpWarning,microsteps,0); + //Report("IDS_Dispenser_Set_Flow_Params",__FILE__,DispenserId,(int)nanolitterperpulse,RpWarning,microsteps,0); } void IDS_Dispenser_RefillStarted (char DispenserId) { @@ -287,7 +300,7 @@ void IDS_Dispenser_RefillStarted (char DispenserId) IDS_Dispenser_Data[DispenserId].nanolitterperpulse = assumedFlow; IDS_Dispenser_Data[DispenserId].microsteps = 1; IDS_Dispenser_Data[DispenserId].direction = 0; - Report("IDS_Dispenser_RefillStarted",__FILE__,__LINE__,(int)DispenserId,RpWarning,(int)(assumedFlow*100),0); + //Report("IDS_Dispenser_RefillStarted",__FILE__,__LINE__,(int)DispenserId,RpWarning,(int)(assumedFlow*100),0); } void IDS_Dispenser_RefillEnded (char DispenserId) { @@ -295,7 +308,7 @@ void IDS_Dispenser_RefillEnded (char DispenserId) IDS_Dispenser_Data[DispenserId].numberofrefills++; IDS_Dispenser_Data[DispenserId].direction = 1; IDS_Dispenser_Data[DispenserId].consumedinnanolitter = 0; - Report("IDS_Dispenser_RefillEnded",__FILE__,__LINE__,(int)DispenserId,RpWarning,(int)IDS_Dispenser_Data[DispenserId].numberofrefills,0); + //Report("IDS_Dispenser_RefillEnded",__FILE__,__LINE__,(int)DispenserId,RpWarning,(int)IDS_Dispenser_Data[DispenserId].numberofrefills,0); } void IDS_Dispenser_MovingDirection (char DispenserId, bool direction) { @@ -307,6 +320,6 @@ void IDS_Dispenser_MovingDirection (char DispenserId, bool direction) { IDS_Dispenser_Data[DispenserId].direction = 0; } - Report("IDS_Dispenser_MovingDirection",__FILE__,__LINE__,(int)DispenserId,RpWarning,(int)direction,0); + //Report("IDS_Dispenser_MovingDirection",__FILE__,__LINE__,(int)DispenserId,RpWarning,(int)direction,0); } diff --git a/Software/Embedded_SW/Embedded/Modules/IDS/IDS_ex.h b/Software/Embedded_SW/Embedded/Modules/IDS/IDS_ex.h index bf73ed7fa..9b2442698 100644 --- a/Software/Embedded_SW/Embedded/Modules/IDS/IDS_ex.h +++ b/Software/Embedded_SW/Embedded/Modules/IDS/IDS_ex.h @@ -29,15 +29,25 @@ typedef enum { LimitSwitchAlarmLow_8, //MOTO_DISPENSER_8 = 13, }LimitSwitchAlarms; +extern bool EnableLubrication; +extern bool EnableIntersegment; +extern double IntersegmentLength; + +extern bool DispenserUsedInJob[MAX_SYSTEM_DISPENSERS]; +bool IDS_MapDispenserUsedinJob(void *JobDetails); + void IDS_ModuleInit (void); void Calculateinit(void); void IDS_Dispenser_Content_Init (void); uint32_t IDSPrepareState(void *JobDetails); -uint32_t IDSPreSegmentState(void *JobDetails, int SegmentId); -uint32_t IDSSegmentState(void *JobDetails, int SegmentId); +uint32_t IDSPreSegmentState(void *SegmentDetails, int SegmentId); +uint32_t IDSSegmentState(void *SegmentDetails, int SegmentId); uint32_t IDSDistanceToSpoolState(void); -uint32_t IDSEndState(void *JobDetails); +uint32_t IDSEndState(void); + +uint32_t IDS_StartLubrication(void); +uint32_t IDS_StopLubrication(void); uint32_t IDS_DispenserPidRequestMessage(HardwarePidControl* request); uint32_t IDS_DispenserControlInit(); @@ -49,6 +59,7 @@ uint32_t IDS_Dispenser_Alarm_On (uint8_t deviceID); uint32_t IDS_Dispenser_Alarm_Off (uint8_t deviceID); uint32_t IDS_CheckDispenserLimitSwitch (LimitSwitchAlarms LS_Id); +uint32_t IDS_Dispenser_Build_Pressure(int DispenserId, callback_fptr callback); void IDS_Dispenser_SetTimeOutValues(uint32_t CloseTimeout, uint32_t OpenTimeout); void IDS_Dispenser_SetBackLashValues(double initialdispenserpressure, uint32_t initialdispensertimeout, uint32_t initialdispensertimelag); @@ -58,7 +69,9 @@ uint32_t IDS_Dispenser_Close_Valve_And_Stop_Motor(int DispenserId, callback_fptr uint32_t IDS_Dispenser_Start_Motor_and_Open_Valve(int DispenserId, int MotorSpeed, callback_fptr callback); void IDS_Dispenser_Content_Calculation (char DispenserId); +uint32_t IDS_Dispenser_Store_Data (void); +uint32_t IDS_MapDispenserUsedinFileJob(void *JobDetails); float CalculateDispenserPressure (int DispenserId); float GetDispenserPressure(int DispenserId); diff --git a/Software/Embedded_SW/Embedded/Modules/IDS/IDS_maint.c b/Software/Embedded_SW/Embedded/Modules/IDS/IDS_maint.c index db5d2738e..1bdf15b29 100644 --- a/Software/Embedded_SW/Embedded/Modules/IDS/IDS_maint.c +++ b/Software/Embedded_SW/Embedded/Modules/IDS/IDS_maint.c @@ -62,8 +62,8 @@ callback_fptr HomingRequestCallback[MAX_SYSTEM_DISPENSERS]={0,0,0,0,0,0,0,0}; bool HomingActive[MAX_SYSTEM_DISPENSERS] = {false,false,false,false,false,false,false,false}; uint32_t DispenserHomingControlId[MAX_SYSTEM_DISPENSERS] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; uint32_t DispenserHomingTime[MAX_SYSTEM_DISPENSERS] = {0,0,0,0,0,0,0,0}; -#define INITIAL_DISPENSER_PRESSURE 0.10 -#define INITIAL_DISPENSER_TIMEOUT_LIMIT 10000 +#define INITIAL_DISPENSER_PRESSURE 2.10 +#define INITIAL_DISPENSER_TIMEOUT_LIMIT 60000 #define INITIAL_DISPENSER_TIMEOUT 100 double InitialDispenserPressure = INITIAL_DISPENSER_PRESSURE; @@ -147,7 +147,7 @@ uint32_t IDS_HomeDispenser (uint32_t deviceID, uint32_t speed , callback_fptr ca //open dispenser valve dispenser to midtank direction Control3WayValvesWithCallback ((Valves_t)deviceID, MidTank_Dispenser, NULL); //direction: MidTank_Dispenser or Dispenser_Mixer //Valve_Set((Valves_t) request->index, MidTank_Dispenser); - MotorSetMicroStep(deviceID, 1); + MotorSetMicroStep(MotorId, 1); SysCtlDelay(180000); //open dry air valve in the dispenser Valve_Set(IDS_Id_to_AirValve[deviceID], Atm_MidTank_ON); @@ -168,6 +168,7 @@ uint32_t IDS_Dispenser_Alarm_On (uint8_t deviceID) Enable_MidTank_Pressure_Reading(deviceID); status |= MotorSetMicroStep(deviceID, MotorsCfg[deviceID].microstep); status |= MotorStop(deviceID, Hard_Hiz); + JobEndReason = JOB_OUT_OF_DYE; return status; } uint32_t IDS_Dispenser_Alarm_Off (uint8_t deviceID) @@ -192,7 +193,8 @@ uint32_t IDS_StopHomeDispenser (uint32_t deviceID) Disable_MidTank_Pressure_Reading(deviceID); Valve_Set(IDS_Id_to_AirValve[deviceID], Atm_MidTank_OFF); Control3WayValvesWithCallback ((Valves_t)deviceID, MidTank_Dispenser, NULL); //direction: MidTank_Dispenser or Dispenser_Mixer - MotorSetMicroStep(deviceID, MotorsCfg[deviceID].microstep); + + MotorSetMicroStep(MotorId, MotorsCfg[MotorId].microstep); return OK; } @@ -232,7 +234,7 @@ uint32_t IDS_EmptyDispenser (uint32_t deviceID, uint32_t speed , callback_fptr c //open dispenser valve dispenser to midtank direction Control3WayValvesWithCallback ((Valves_t)deviceID, Dispenser_Mixer, NULL); //direction: MidTank_Dispenser or Dispenser_Mixer //Valve_Set((Valves_t) request->index, Dispenser_Mixer); - MotorSetMicroStep(deviceID, 1); + MotorSetMicroStep(MotorId, 1); SysCtlDelay(180000); //open dry air valve in the dispenser //Valve_Set(IDS_Id_to_AirValve[deviceID], Atm_MidTank_ON); diff --git a/Software/Embedded_SW/Embedded/Modules/IDS/IDS_print.c b/Software/Embedded_SW/Embedded/Modules/IDS/IDS_print.c index 2be233962..2a8cac415 100644 --- a/Software/Embedded_SW/Embedded/Modules/IDS/IDS_print.c +++ b/Software/Embedded_SW/Embedded/Modules/IDS/IDS_print.c @@ -7,14 +7,23 @@ #include "ids.h" #include "ids_ex.h" #include "../control/control.h" +#include "../general/process.h" #include "../control/pidalgo.h" #include "../thread/thread.h" #include "PMR/Hardware/Hardwaremotor.pb-c.h" #include "PMR/Hardware/HardwareDispenser.pb-c.h" +#include "PMR/Printing/JobDescriptionFileBrushStop.pb-c.h" +#include "PMR/Printing/JobDescriptionFileSegment.pb-c.h" +#include "PMR/Printing/JobUploadStrategy.pb-c.h" +#include "PMR/Printing/JobSegment.pb-c.h" +#include "PMR/Printing/JobTicket.pb-c.h" #include "StateMachines/Printing/printingSTM.h" #include "drivers/motors/motor.h" #include "drivers/valves/valve.h" +#include "Common/SWUpdate/FileSystem.h" +#include "drivers/Flash_Memory/fatfs/ff.h" + #include "modules/heaters/heaters.h" #include "drivers/Flash_ram/FlashProgram.h" @@ -31,11 +40,13 @@ typedef struct PID_Config_Params m_params; }DispenserControlConfig_t; HardwarePidControl *DispensersControl;// = (HardwarePidControl *)GENHWCFG_MAP_IN_FLASH + 0x4000; - +#define LUBRICANT_DISPENSER 7 +#define CLEANER_DISPENSER 6 +#define MAX_DYE_DISPENSERS 6 int32_t DispenserSamples[MAX_SYSTEM_DISPENSERS][MAX_CONTROL_SAMPLES] = {0}; int DispenserSamplePointer[MAX_SYSTEM_DISPENSERS] = {0}; double DispenserNormalizedErrorCoEfficient[MAX_SYSTEM_DISPENSERS] = {0}; - +double lubricant_speed = 0.0; HardwarePidControlType ThreadDispenserIdToControlId[MAX_SYSTEM_DISPENSERS] = { HARDWARE_PID_CONTROL_TYPE__Dispenser1,HARDWARE_PID_CONTROL_TYPE__Dispenser2,HARDWARE_PID_CONTROL_TYPE__Dispenser3,HARDWARE_PID_CONTROL_TYPE__Dispenser4,HARDWARE_PID_CONTROL_TYPE__Dispenser5,HARDWARE_PID_CONTROL_TYPE__Dispenser6,HARDWARE_PID_CONTROL_TYPE__Dispenser7,HARDWARE_PID_CONTROL_TYPE__Dispenser8}; bool DispenserReady[MAX_SYSTEM_DISPENSERS] = {true}; @@ -43,7 +54,8 @@ bool IDS_Active = false; /******************** STRUCTURES AND ENUMs ********************************************/ uint32_t IDS_Valve_DistanceToSpoolReady(uint32_t deviceID, uint32_t ReadValue); uint32_t IDS_Valve_PresegmentReady(uint32_t deviceID, uint32_t ReadValue); -bool IDS_isDispenserUsedNextSegment(void *JobDetails,int DispenserId, int SegmentId); +uint32_t IDSBrushStopRestartCallback(uint32_t IfIndex, uint32_t readValue); +//bool IDS_isDispenserUsedNextSegment(void *JobDetails,int DispenserId, int SegmentId); /******************** GLOBAL PARAMETERS ********************************************/ DispenserControlConfig_t DispenserControlConfig[MAX_SYSTEM_DISPENSERS]; uint32_t ControlIdtoDispenserId [MAX_SYSTEM_DISPENSERS] = {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}; @@ -54,6 +66,18 @@ bool DispenserDistanceToSpoolReady[MAX_SYSTEM_DISPENSERS] = {true,true,t bool DispenserUsedInJob[MAX_SYSTEM_DISPENSERS] = {false,false,false,false,false,false,false,false}; bool DispensersAlarmState[ MAX_SYSTEM_DISPENSERS] = {false,false,false,false,false,false,false,false}; int JobBrushStopId = 0; +int lInterSegmentLength = 0; + int InterSegmentStepsLimit = 0,InterSegmentStepsCount = 0; + uint32_t InterSegmentStartSprayCleaner; + uint32_t InterSegmentStartRocking; + uint32_t InterSegmentCenterRockers; + uint32_t InterSegmentStartWFCFDispensers; + bool EnableCleaning = true; + + + uint32_t DispenserPreSegmentControlId = 0xFF; + uint32_t BrushStopControlId = 0xFF; + uint32_t PreSegmentControlId = 0xFF; uint32_t IDS_DispenserControlInit() { @@ -120,7 +144,7 @@ void DispenserPrepareReady(void) return; //not all configured Dispensers are ready } } - REPORT_MSG(Module_IDS,"DispenserPrepareReady"); + REPORT_MSG(Module_IDS,"All Dispensers Prepare Ready"); PrepareReady(Module_IDS,ModuleDone); } //******************************************************************************************************************** @@ -135,38 +159,306 @@ void DispenserPrepareReady(void) return OK; // all configured heaters are ready } - bool IDS_MapDispenserUsedinJob(void *JobDetails) +/* + void OpenJobFile(); +void CloseJobFile(); +JobDescriptionFileSegment *GetNextSegmentFromJobFile(); +void FreeSegmentFileData(JobDescriptionFileSegment *Segment); +JobDescriptionFileBrushStop *GetNextBrushStopFromJobFile(); +void FreeBrushStopFileData(JobDescriptionFileBrushStop *BrushStop); + + */ + /************************************************************************************************************************************/ + uint32_t IDS_MapDispenserUsedinFileJobshort(void *JobDetails) { JobTicket* JobTicket = JobDetails; - int Dispenser_i, Segment_i,Brush_i,DispenserId; + JobDescriptionFileBrushStop *BrushStop; + JobDescriptionFileSegment *Segment; + int Dispenser_i, Brush_i,DispenserId; + FRESULT Fresult = FR_OK; + uint32_t status = OK; for (Dispenser_i = 0;Dispenser_in_segments == 0) - return false; + if (EnableCleaning == true) + DispenserUsedInJob[CLEANER_DISPENSER] = true; + if (JobTicket->enablelubrication == true) + DispenserUsedInJob[LUBRICANT_DISPENSER] = true; - for (Segment_i=0;Segment_in_segments;Segment_i++) + Fresult = OpenJobFile(); + if (Fresult == FR_OK) + { + Segment = GetNextSegmentFromJobFile(); + while(Segment) { - for (Brush_i=0;Brush_isegments[Segment_i]->n_brushstops;Brush_i++) + if ((Segment->has_brushstopscount)&&(Segment->brushstopscount)) { - if (JobTicket->segments[Segment_i]->brushstops[Brush_i]->n_dispensers) + for (Brush_i=0;Brush_ibrushstopscount;Brush_i++) { - for (Dispenser_i = 0;Dispenser_i < JobTicket->segments[Segment_i]->brushstops[Brush_i]->n_dispensers;Dispenser_i++) + BrushStop = GetNextBrushStopFromJobFile(); + if (BrushStop) { - //prepare the SW structures - DispenserId = JobTicket->segments[Segment_i]->brushstops[Brush_i]->dispensers[Dispenser_i]->index; - if (JobTicket->segments[Segment_i]->brushstops[Brush_i]->dispensers[Dispenser_i]->nanolitterpersecond>0.0) + if (BrushStop->n_dispensers) + { + for (Dispenser_i = 0;Dispenser_i < BrushStop->n_dispensers;Dispenser_i++) + { + //prepare the SW structures + DispenserId = BrushStop->dispensers[Dispenser_i]->index; + if (BrushStop->dispensers[Dispenser_i]->nanolitterpersecond>0.0) + { + DispenserUsedInJob[DispenserId] = true; + /*if(DispenserId == LUBRICANT_DISPENSER) + { + lubricant_speed = JobTicket->segments[0]->brushstops[0]->dispensers[Dispenser_i]->nanolitterpersecond/ + JobTicket->segments[0]->brushstops[0]->dispensers[Dispenser_i]->nanoliterperpulse; + REPORT_MSG (lubricant_speed*100, "LUBRICANT_SPEED*100"); + }*/ + } + }//for dispenser + }//if dispensers + else { - DispenserUsedInJob[DispenserId] = true; + LOG_ERROR (BrushStop->index, "no dispensers in brushstop"); } - }//for dispenser - }//if dispensers - }//for brush - }//for segments + FreeBrushStopFileData(BrushStop); + BrushStop = NULL; + } + else + { + LOG_ERROR (BrushStop, "malloc error"); + status = ERROR; + } + }//for brushstops + }// if brush stop count + FreeSegmentFileData(Segment); + Segment = GetNextSegmentFromJobFile(); + } + FreeSegmentFileData(Segment); + CloseJobFile(); + } + return status; + + } + /************************************************************************************************************************************/ + uint32_t IDS_MapDispenserUsedinFileJob(void *JobDetails) + { + JobTicket* JobTicket = JobDetails; + uint8_t *SegmentPtr = 0, *BrushStopPtr = 0; + JobDescriptionFileBrushStop *BrushStop; + JobDescriptionFileSegment *Segment; + int Dispenser_i, Brush_i,DispenserId; + uint32_t Bytes = 0,readBytes = 0,ImmediateRead = 0,SegmentSize = 0,BrushStopSize = 0; + uint32_t status = OK; + FRESULT Fresult = FR_OK; + FIL *FileHandle = 0; //the system supports a single active file + +/* + Parsing the job description file. +The job description file simply contains an array of segments and their brush stops. +The job description file is meant to be read brush stop by brush stop while the job is in progress. +The following diagram represents a single job description file segment structure. +The process of reading the whole file is simply repeating that reading order. + +Each JobDescriptionFileSegment contains a “BrushStopsCount” field that should be used to determine how many brush stops are associated +with the current segment and how many times the process of reading brush stops should be repeated. +1. 32bit integer containing the next JobFileDescriptionSegment message byte count +2. JobDescriptionFileSegment message +3. 32bit integer containing the next JobDescriptionFileBrushStop message byte count +4. JobDescriptionFileBrushStop message + +1. Read segment message length. +2. Read segment message. +a. Read brush stop message length. +b. Read brush stop message. +c. Go to step 2.a x Segment.BrushStopsCount. +3. Go to step 1 until end of file. + */ + for (Dispenser_i = 0;Dispenser_ienablelubrication == true) + DispenserUsedInJob[LUBRICANT_DISPENSER] = true; + if (JobTicket->uploadstrategy == JOB_UPLOAD_STRATEGY__JobDescriptionFile) + { + FileHandle = my_malloc(sizeof(FIL)); + + Fresult = FileOpen(JobTicket->jobdescriptionfile, &Bytes, FileHandle); + if (Fresult == FR_OK) + { + while((readBytes < Bytes)&&(status == OK)) + { + Fresult = f_read(FileHandle,&SegmentSize,4,&ImmediateRead ); + if (Fresult == FR_OK) + { + readBytes += ImmediateRead; + SegmentPtr = my_malloc (SegmentSize); + if (SegmentPtr) + { + Fresult = f_read(FileHandle,SegmentPtr,SegmentSize,&ImmediateRead ); + if (Fresult == FR_OK) + { + readBytes += ImmediateRead; + n_segments++; + Segment = job_description_file_segment__unpack(NULL, SegmentSize, SegmentPtr); + if ((Segment->has_brushstopscount)&&(Segment->brushstopscount)) + { + REPORT_MSG (Segment->brushstopscount, "Segment->brushstopscount"); + for (Brush_i=0;Brush_ibrushstopscount;Brush_i++) + { + if (status == ERROR) + break; + Fresult = f_read(FileHandle,&BrushStopSize,4,&ImmediateRead ); + if (Fresult == FR_OK) + { + readBytes += ImmediateRead; + BrushStopPtr = my_malloc (BrushStopSize); + if (BrushStopPtr) + { + Fresult = f_read(FileHandle,BrushStopPtr,BrushStopSize,&ImmediateRead ); + if (Fresult == FR_OK) + { + readBytes += ImmediateRead; + BrushStop = job_description_file_brush_stop__unpack(NULL, BrushStopSize, BrushStopPtr); + REPORT_MSG (BrushStopSize, "BrushStop"); + if (BrushStop->n_dispensers) + { + for (Dispenser_i = 0;Dispenser_i < BrushStop->n_dispensers;Dispenser_i++) + { + //prepare the SW structures + DispenserId = BrushStop->dispensers[Dispenser_i]->index; + if (BrushStop->dispensers[Dispenser_i]->nanolitterpersecond>0.0) + { + DispenserUsedInJob[DispenserId] = true; + } + }//for dispenser + }//if dispensers + else + { + LOG_ERROR (BrushStop->index, "no dispensers in brushstop"); + } + job_description_file_brush_stop__free_unpacked (BrushStop,NULL); + BrushStop = NULL; + } //read brush stop data + else + { + LOG_ERROR (Fresult, "f_read error"); + status = ERROR; + } + my_free(BrushStopPtr); + BrushStopPtr = NULL; + }//brushstop malloc ok + else + { + LOG_ERROR (BrushStopPtr, "malloc error"); + status = ERROR; + } + }//brushstop size read ok + else + { + LOG_ERROR (Fresult, "f_read error"); + status = ERROR; + } + }//for brushstops + }// if brush stop count + else + { + LOG_ERROR (0, "no brushstops error"); + status = ERROR; + } + job_description_file_segment__free_unpacked(Segment,NULL); + Segment = NULL; + }// read segment data + my_free(SegmentPtr); + SegmentPtr = NULL; + Task_sleep(10); + }//segment malloc + else + { + LOG_ERROR (SegmentPtr, "malloc error"); + status = ERROR; + } + }//segment read size + else + { + LOG_ERROR (Fresult, "f_read error"); + status = ERROR; + } + }//while(readBytes < Bytes) + } + else + { + LOG_ERROR (Fresult, "FileOpen error"); + status = ERROR; + } + }//file job + + if (SegmentPtr) + my_free(SegmentPtr); + if (BrushStopPtr) + my_free(BrushStopPtr); + if (Segment != NULL) + job_description_file_segment__free_unpacked(Segment,NULL); + if (BrushStop != NULL) + job_description_file_brush_stop__free_unpacked (BrushStop,NULL); + Fresult = f_close(FileHandle); + REPORT_MSG (n_segments, "Finished checking the file"); + return status; + + } +/************************************************************************************************************************************/ + bool IDS_MapDispenserUsedinJob(void *JobDetails) + { + JobTicket* JobTicket = JobDetails; + int Dispenser_i, Segment_i,Brush_i,DispenserId; + + if (JobTicket->uploadstrategy == JOB_UPLOAD_STRATEGY__JobDescriptionFile) + { + return (IDS_MapDispenserUsedinFileJob(JobDetails)); + //return (IDS_MapDispenserUsedinFileJobshort(JobDetails)); + } + else + { + for (Dispenser_i = 0;Dispenser_isegments[Segment_i]->n_brushstops;Brush_i++) + { + if (JobTicket->segments[Segment_i]->brushstops[Brush_i]->n_dispensers) + { + for (Dispenser_i = 0;Dispenser_i < JobTicket->segments[Segment_i]->brushstops[Brush_i]->n_dispensers;Dispenser_i++) + { + //prepare the SW structures + DispenserId = JobTicket->segments[Segment_i]->brushstops[Brush_i]->dispensers[Dispenser_i]->index; + if (JobTicket->segments[Segment_i]->brushstops[Brush_i]->dispensers[Dispenser_i]->nanolitterpersecond>0.0) + { + DispenserUsedInJob[DispenserId] = true; + if(DispenserId == LUBRICANT_DISPENSER) + { + lubricant_speed = JobTicket->segments[0]->brushstops[0]->dispensers[Dispenser_i]->nanolitterpersecond/ + JobTicket->segments[0]->brushstops[0]->dispensers[Dispenser_i]->nanoliterperpulse; + REPORT_MSG (lubricant_speed*100, "LUBRICANT_SPEED*100"); + } + + } + }//for dispenser + }//if dispensers + }//for brush + }//for segments + } - return false; + return true; } @@ -205,50 +497,25 @@ void DispenserPrepareReady(void) //ValveCommand (Enable,MixerDirection); } //set 3 dancers to the profile positions - IDS_MapDispenserUsedinJob(JobDetails); + //IDS_MapDispenserUsedinJob(JobDetails); for (i = 0; i < MAX_SYSTEM_DISPENSERS; i++) { if (DispenserUsedInJob[i] == true) //we actually should check for all dispensers { + IDS_StopHomeDispenser(i); DispenserReady[i] = false; IDS_Dispenser_Build_Pressure(i, IDS_PrepareReady); REPORT_MSG(i,"Dispenser prepare called"); } else + { DispenserReady[i] = true; + IDS_HomeDispenser (i, 1000 , NULL); + } + } DispenserPrepareReady(); return OK; -} -bool IDS_isDispenserUsedNextSegment(void *JobDetails,int DispenserId, int SegmentId) -{ - JobTicket* JobTicket = JobDetails; - int Dispenser_i,n_dispensers; - if (JobTicket->n_segments == 0) - return false; - if (JobTicket->n_segments <= SegmentId) - return false; - if (JobTicket->segments[SegmentId]->brushstops[0]->n_dispensers) - { - n_dispensers = JobTicket->segments[SegmentId]->brushstops[0]->n_dispensers; - for (Dispenser_i = 0;Dispenser_i < n_dispensers;Dispenser_i++) - { - if (DispenserId == JobTicket->segments[SegmentId]->brushstops[0]->dispensers[Dispenser_i]->index) //dispenser is in use next segment - { - if (JobTicket->segments[SegmentId]->brushstops[0]->dispensers[Dispenser_i]->nanolitterpersecond>0) - { - return true; - } - else - { - return false; - } - } - } - } - - return false; - } //******************************************************************************************************************** uint32_t IDS_Valve_PresegmentValveReady(uint32_t deviceID, uint32_t ReadValue) @@ -275,16 +542,148 @@ bool IDS_isDispenserUsedNextSegment(void *JobDetails,int DispenserId, int Segmen return OK; //not all configured heaters are ready } } - REPORT_MSG(deviceID,"IDS_Valve_Presegment all Ready!!"); + REPORT_MSG(deviceID,"IDS Presegment Ready!!"); PreSegmentReady(Module_IDS,ModuleDone); return OK; // all configured heaters are ready } + //******************************************************************************************************************** -uint32_t IDSPreSegmentState(void *JobDetails, int SegmentId) + JobDescriptionFileBrushStop * FileBrushStop; + char IdsMessage[100]; + + uint32_t IDSPreSegmentStateCallbackRunner(uint32_t IfIndex, uint32_t ReadValue) + { + JobDispenser **Dispensers; + //set the speed only before the first segment, speed is constant accros job + int Dispenser_i,n_dispensers,DispenserId; + TimerMotors_t HW_Motor_Id; + double segmentfirst_speed; +/* + IDS Pre-Segment (Inter-Segment) activity +1. Cleaning +2. Build pressure toward the waste valve +The IDS pre-segment process will be performed before all segments, including the first one. +The dye dispensers will be in one of two states: +1. After being idle – with a high pressure, idle motor and closed valve (will be performed in job prepare or during the previous segment. For Ty time until pressure Pa is achieved) +2. At work – pushing dye to the mixer. +At pre-segment, TW seconds before its end, the active dispensers will start working in the next segment's speed: Ssegment* WFCF. +After TU milliseconds the valve will open. +At segment start, the waste valve will be redirected to the head and the dispensers' speed will be reduced to the next segment's speed +Cleaning: the cleaning process involves: starting the cleaning dispenser in speed Sclean, starting the head rockers motor(s) in speed S1 and S2, +and stopping the dispenser, centering the rockers Tending milliseconds before segment start. +Segment state: +1. Active dispensers are working. +2. Idle dispensers are filling, until TX+TY seconds before segment end. (TX=backlash time, TY=pressure prepare time). Then they reverse direction and start building pressure until segment end or until pressure PA (= prepare pressure) is achieved. +This means that for each Pre-segment we must calculate: TW,TU,Tending, +This means that for each segment we must calculate: Tx,Ty. + + */ +/*uint32_t InterSegmentStartSprayCleaner = 500; +uint32_t InterSegmentStartRocking = 1000; +uint32_t InterSegmentCenterRockers = 3000; +uint32_t InterSegmentStartWFCFDispensers = lInterSegmentLength-1500; +uint32_t IDS_Cleaning_Move_Rockers (int LeftRockerSpeed,int RightRockerSpeed); +uint32_t IDS_Cleaning_Center_And_Stop_Rockers (int timeout,callback_fptr callback); +uint32_t IDS_Cleaning_Spray_Cleaning_Solution (int dispenserSpeed,callback_fptr callback); +uint32_t IDS_Cleaning_Stop_Cleaning_Solution (callback_fptr callback); +*/ + //InterSegmentStepsLimit = lInterSegmentLength*10;//100 millisec steps + InterSegmentStepsCount+=100; + if (InterSegmentStepsCount == lInterSegmentLength) + { + //IDS_Valve_PresegmentReady(1,0); + Report("End of Pre-segment Handling",__FILE__,__LINE__,InterSegmentStepsCount,RpWarning,(int)lInterSegmentLength,0); + SafeRemoveControlCallback(DispenserPreSegmentControlId,IDSPreSegmentStateCallbackRunner); + } + if (EnableCleaning == true) + { + if (InterSegmentStartSprayCleaner == InterSegmentStepsCount) + { + Report("Start Spray Cleaner",__FILE__,__LINE__,InterSegmentStepsCount,RpWarning,(int)lInterSegmentLength,0); + //IDS_Cleaning_Spray_Cleaning_Solution (int dispenserSpeed,callback_fptr callback); + } + if (InterSegmentStartRocking == InterSegmentStepsCount) + { + Report("Start cleaning rockers",__FILE__,__LINE__,InterSegmentStepsCount,RpWarning,(int)lInterSegmentLength,0); + //IDS_Cleaning_Move_Rockers (int LeftRockerSpeed,int RightRockerSpeed); + } + if (InterSegmentCenterRockers == InterSegmentStepsCount) + { + Report("Stop spray and center rockers",__FILE__,__LINE__,InterSegmentStepsCount,RpWarning,(int)lInterSegmentLength,0); + //IDS_Cleaning_Stop_Cleaning_Solution (callback_fptr callback); + //IDS_Cleaning_Center_And_Stop_Rockers (int timeout,callback_fptr callback); + } + } + if (InterSegmentStartWFCFDispensers == InterSegmentStepsCount) + { + Report("start dispensers at rate * WFCF",__FILE__,__LINE__,InterSegmentStepsCount,RpWarning,(int)lInterSegmentLength,0); + if (FileBrushStop) + { + REPORT_MSG(FileBrushStop->index,"WFCFBrushStopRead Index"); + Dispensers = FileBrushStop->dispensers; + n_dispensers = FileBrushStop->n_dispensers; + if (n_dispensers) + { + for (Dispenser_i = 0; Dispenser_i < n_dispensers; Dispenser_i++) + { + DispenserId = Dispensers[Dispenser_i]->index; + HW_Motor_Id = DispenserIdToMotorId[DispenserId]; + if (MotorsCfg[HW_Motor_Id].hardwaremotortype + != DispenserIdToMotorId[DispenserId]) + continue; + + //(Speed*uStep*PPR)/((2*PI*Dispenser_Radius) + segmentfirst_speed = Dispensers[Dispenser_i]->nanolitterpersecond + / Dispensers[Dispenser_i]->nanoliterperpulse; + if (Dispensers[Dispenser_i]->dispenserstepdivision + != DISPENSER_STEP_DIVISION__Auto) + { + //MotorSetMicroStep(HW_Motor_Id, Dispensers[Dispenser_i]->dispenserstepdivision); + segmentfirst_speed /= + Dispensers[Dispenser_i]->dispenserstepdivision; //the dye supply is calculated based on a 1/8 microstep + IDS_Dispenser_Set_Flow_Params( + DispenserId, Dispensers[Dispenser_i]->nanoliterperpulse, + Dispensers[Dispenser_i]->dispenserstepdivision); + } + else + { + //segmentfirst_speed/=MotorsCfg[HW_Motor_Id].microstep; //the dye supply is calculated based on a 1/8 microstep + IDS_Dispenser_Set_Flow_Params( + DispenserId, Dispensers[Dispenser_i]->nanoliterperpulse, + MotorsCfg[HW_Motor_Id].microstep); + } + if ((int) segmentfirst_speed > 0) + { +#define WFCF 80 + segmentfirst_speed *= (100+WFCF); + segmentfirst_speed /= 100; + DispenserSegmentReady[DispenserId] = false; + //Control3WayValvesWithCallback (DispenserId, Dispenser_Mixer, NULL); //direction: MidTank_Dispenser or Dispenser_Mixer + IDS_Dispenser_Start_Motor_and_Open_Valve(DispenserId, + segmentfirst_speed, + NULL); usnprintf(IdsMessage, 80, + "WFCF Dispenser %d nl/sec %d nl/pulse %d speed %d", + DispenserId, + (int) Dispensers[Dispenser_i]->nanolitterpersecond, + (int) Dispensers[Dispenser_i]->nanoliterperpulse, + (int) segmentfirst_speed); + //REPORT_MSG(segmentfirst_speed,IdsMessage); + Report(IdsMessage, __FILE__, __LINE__, Dispenser_i, RpWarning, segmentfirst_speed, 0); + SendJobProgress(0.0, 0, false, IdsMessage); + } + } + } + } + //startDispensersAtSegmentSpeed*1=WFCFClenerSpray(speed); + } + return OK; + } +uint32_t IDSPreSegmentState(void *SegmentDetails, int SegmentId) { + JobSegment* Segment = SegmentDetails; + JobDispenser **Dispensers; //set the speed only before the first segment, speed is constant accros job - JobTicket* JobTicket = JobDetails; int Dispenser_i,n_dispensers,DispenserId; TimerMotors_t HW_Motor_Id; @@ -294,153 +693,270 @@ uint32_t IDSPreSegmentState(void *JobDetails, int SegmentId) /* wait for all dispensers to get to the required pressure * move the presegment ready when all dispensers are ready. */ - if (JobTicket->n_segments == 0) - return OK; - if (SegmentId>=JobTicket->n_segments) - { - LOG_ERROR(SegmentId,"Error Segment"); - return ERROR; - } - REPORT_MSG(SegmentId,"IDSPreSegmentState"); - if (JobBrushStopId>=JobTicket->segments[SegmentId]->n_brushstops) + if (JobBrushStopId>=Segment->n_brushstops) { - LOG_ERROR(JobBrushStopId,"Error JobBrushStopId"); + LOG_ERROR(Segment->n_brushstops,"Error JobBrushStopId"); + JobEndReason = JOB_OUT_OF_DYE; + PreSegmentReady(Module_IDS,ModuleFail); return ERROR; } - if (( JobTicket->enableintersegment == true)&&(JobTicket->intersegmentlength>0)) + + + if ((EnableIntersegment == true)&&(IntersegmentLength>0)) { Valve_Set(VALVE_MIXCHIP_WASTECH, Mixer_Waste); //if intersegment is defined throw the ink away + if (SegmentId>0) + { + lInterSegmentLength = ((IntersegmentLength*100)*1000/dyeingspeed); + lInterSegmentLength-=(lInterSegmentLength%100); //round to a 100 multiplication + InterSegmentStepsCount = 0; + DispenserPreSegmentControlId = AddControlCallback( IDSPreSegmentStateCallbackRunner, 100,TemplateDataReadCBFunction ,0, 0, 0 ); + if (DispenserPreSegmentControlId == 0xFF) + { + Report("Add control callback failed",__FILE__,__LINE__,(int)100,RpWarning,(int)0,0); + return ERROR; + } + Report("Add control callback ",__FILE__,__LINE__,(int)100,RpWarning,(int)IntersegmentLength,0); + if (EnableCleaning == true) + { + InterSegmentStartSprayCleaner = 500; + InterSegmentStartRocking = 1000; + InterSegmentCenterRockers = 3000; + } + InterSegmentStartWFCFDispensers = lInterSegmentLength-5000; + } } - if (JobTicket->segments[SegmentId]->brushstops[JobBrushStopId]->n_dispensers) + if (uploadstrategy == JOB_UPLOAD_STRATEGY__Default) + { + Dispensers = Segment->brushstops[JobBrushStopId]->dispensers; + n_dispensers = Segment->brushstops[JobBrushStopId]->n_dispensers; + } + else + { + if (BrushStopControlId != 0xFF) + { + RemoveControlCallback(BrushStopControlId,IDSBrushStopRestartCallback); + BrushStopControlId = 0xFF; + } + FileBrushStop = GetNextBrushStopFromJobFile(); + if (FileBrushStop) + { + REPORT_MSG(FileBrushStop->index,"BrushStopRead Index"); + Dispensers = FileBrushStop->dispensers; + n_dispensers = FileBrushStop->n_dispensers; + } + else + { + LOG_ERROR(FileBrushStop,"BrushStopReadError"); + JobEndReason = JOB_OUT_OF_DYE; + SegmentReady(Module_IDS,ModuleFail); + } + } + if (n_dispensers) { - n_dispensers = JobTicket->segments[SegmentId]->brushstops[JobBrushStopId]->n_dispensers; for (Dispenser_i = 0;Dispenser_i < n_dispensers;Dispenser_i++) { - DispenserId = JobTicket->segments[SegmentId]->brushstops[JobBrushStopId]->dispensers[Dispenser_i]->index; + DispenserId = Dispensers[Dispenser_i]->index; + DispenserPreSegmentReady[DispenserId] = false; + } + for (Dispenser_i = 0;Dispenser_i < n_dispensers;Dispenser_i++) + { + DispenserId = Dispensers[Dispenser_i]->index; HW_Motor_Id = DispenserIdToMotorId[DispenserId]; if (MotorsCfg[HW_Motor_Id].hardwaremotortype != DispenserIdToMotorId[DispenserId])//unconfigured dispenser { REPORT_MSG(DispenserId,"Dispenser PreSegment not configured"); + DispenserPreSegmentReady[DispenserId] = true; //27/03/19 check if job should be stopped continue; } - DispenserPreSegmentReady[DispenserId] = false; - REPORT_MSG(DispenserId,"IDS_Valve_Presegment start"); + //REPORT_MSG(DispenserId,"IDS_Valve_Presegment start"); IDS_Dispenser_Set_Flow_Params(DispenserId,0,0); - if (JobTicket->segments[SegmentId]->brushstops[JobBrushStopId]->dispensers[Dispenser_i]->dispenserstepdivision != DISPENSER_STEP_DIVISION__Auto) + if (Dispensers[Dispenser_i]->dispenserstepdivision != DISPENSER_STEP_DIVISION__Auto) { - MotorSetMicroStep(HW_Motor_Id, JobTicket->segments[SegmentId]->brushstops[JobBrushStopId]->dispensers[Dispenser_i]->dispenserstepdivision); + MotorSetMicroStep(HW_Motor_Id, Dispensers[Dispenser_i]->dispenserstepdivision); } else { MotorSetMicroStep(HW_Motor_Id, MotorsCfg[HW_Motor_Id].microstep); } + MotorStop(HW_Motor_Id,Hard_Hiz); //26/03/19 test without valves + CurrentDispenserSpeed[DispenserId] = 0; + IDS_Valve_PresegmentReady(DispenserId,0); //27/03/19 to be removed when the presegment handler will be added + //REPORT_MSG(DispenserId,"Dispenser stopped pre Segment"); + } + } + + return OK; +} +//******************************************************************************************************************** + +uint32_t SegmentNumOfBrushStops = 0; +double BrushStopTime = 0; + +void IDS_StartBrushStop(int n_dispensers, JobDispenser** Dispensers) +{ + int Dispenser_i,DispenserId; + TimerMotors_t HW_Motor_Id; + double segmentfirst_speed; + Report("IDS_StartBrushStop",__FILE__,__LINE__,(int)JobBrushStopId,RpWarning,(int)0,0); + + if (n_dispensers) + { + for (Dispenser_i = 0; Dispenser_i < n_dispensers; Dispenser_i++) + { + DispenserId = Dispensers[Dispenser_i]->index; + HW_Motor_Id = DispenserIdToMotorId[DispenserId]; + if (MotorsCfg[HW_Motor_Id].hardwaremotortype + != DispenserIdToMotorId[DispenserId]) + continue; - if (JobTicket->segments[SegmentId]->brushstops[0]->dispensers[Dispenser_i]->nanolitterpersecond==0) + //(Speed*uStep*PPR)/((2*PI*Dispenser_Radius) + segmentfirst_speed = Dispensers[Dispenser_i]->nanolitterpersecond + / Dispensers[Dispenser_i]->nanoliterperpulse; + if (Dispensers[Dispenser_i]->dispenserstepdivision + != DISPENSER_STEP_DIVISION__Auto) + { + //MotorSetMicroStep(HW_Motor_Id, Dispensers[Dispenser_i]->dispenserstepdivision); + segmentfirst_speed /= + Dispensers[Dispenser_i]->dispenserstepdivision; //the dye supply is calculated based on a 1/8 microstep + IDS_Dispenser_Set_Flow_Params( + DispenserId, Dispensers[Dispenser_i]->nanoliterperpulse, + Dispensers[Dispenser_i]->dispenserstepdivision); + } + else + { + //segmentfirst_speed/=MotorsCfg[HW_Motor_Id].microstep; //the dye supply is calculated based on a 1/8 microstep + IDS_Dispenser_Set_Flow_Params( + DispenserId, Dispensers[Dispenser_i]->nanoliterperpulse, + MotorsCfg[HW_Motor_Id].microstep); + } + if ((int) segmentfirst_speed > 0) { - //MotorStop(HW_Motor_Id,Hard_Hiz); - //Control3WayValvesWithCallback ((Valves_t)DispenserId, MidTank_Dispenser, IDS_Valve_PresegmentValveReady); //direction: MidTank_Dispenser or Dispenser_Mixer - IDS_Dispenser_Close_Valve_And_Stop_Motor(DispenserId,IDS_Valve_PresegmentValveReady); - REPORT_MSG(DispenserId,"Dispenser Not Used Next Segment"); + DispenserSegmentReady[DispenserId] = false; + //Control3WayValvesWithCallback (DispenserId, Dispenser_Mixer, NULL); //direction: MidTank_Dispenser or Dispenser_Mixer + /*IDS_Dispenser_Start_Motor_and_Open_Valve(DispenserId, + segmentfirst_speed, + NULL);*/ + Control3WayValvesWithCallback (DispenserId, Dispenser_Mixer, NULL); //direction: MidTank_Dispenser or Dispenser_Mixer + MotorSetSpeed(HW_Motor_Id, segmentfirst_speed); + CurrentDispenserSpeed[DispenserId] = segmentfirst_speed; + usnprintf(IdsMessage, 80, + "Dispenser %d nl/sec %d nl/pulse %d speed %d", + DispenserId, + (int) Dispensers[Dispenser_i]->nanolitterpersecond, + (int) Dispensers[Dispenser_i]->nanoliterperpulse, + (int) segmentfirst_speed); + //REPORT_MSG(segmentfirst_speed,IdsMessage); + Report(IdsMessage, __FILE__, __LINE__, Dispenser_i, RpWarning, segmentfirst_speed, 0); + SendJobProgress(0.0, 0, false, IdsMessage); } else { - if ((JobTicket->intersegmentlength)&&(SegmentId>0)) //there is an intersegment, stop all the dispensers. otherwise stop only dispensers that are not in use in the next segment. - { - //Control3WayValvesWithCallback ((Valves_t)DispenserId, MidTank_Dispenser, IDS_Valve_PresegmentValveReady); //direction: MidTank_Dispenser or Dispenser_Mixer - IDS_Dispenser_Close_Valve_And_Stop_Motor(DispenserId,IDS_Valve_PresegmentValveReady); - REPORT_MSG(DispenserId,"Dispenser Used Next Segment with intersegment"); - } - else - { - IDS_Valve_PresegmentReady(DispenserId,0); - } - REPORT_MSG(DispenserId,"Dispenser is Used Next Segment"); + DispenserSegmentReady[DispenserId] = true; + //IDS_Dispenser_Close_Valve_And_Stop_Motor(DispenserId,NULL);*/ + MotorStop(HW_Motor_Id, Hard_Hiz); + CurrentDispenserSpeed[DispenserId] = 0; + Report("inActive dispenser stopped", __FILE__, __LINE__, DispenserId, RpWarning, segmentfirst_speed, 0); } } } +} +uint32_t IDSBrushStopRestartCallback(uint32_t IfIndex, uint32_t readValue) +{ + JobDispenser **Dispensers = NULL; + int n_dispensers = 0; + JobSegment* Segment = (void *)IfIndex; + if (uploadstrategy == JOB_UPLOAD_STRATEGY__Default) + { + Dispensers = Segment->brushstops[JobBrushStopId]->dispensers; + n_dispensers = Segment->brushstops[JobBrushStopId]->n_dispensers; + } + else + { + if (FileBrushStop) + FreeBrushStopFileData(FileBrushStop); + FileBrushStop = GetNextBrushStopFromJobFile(); + if (FileBrushStop) + { + REPORT_MSG(FileBrushStop->index,"BrushStopRead Index"); + Dispensers = FileBrushStop->dispensers; + n_dispensers = FileBrushStop->n_dispensers; + } + else + { + LOG_ERROR(FileBrushStop,"BrushStopReadError"); + JobEndReason = JOB_OUT_OF_DYE; + SegmentReady(Module_IDS,ModuleFail); + } + } + if (n_dispensers) + { + IDS_StartBrushStop(n_dispensers, Dispensers); + } + JobBrushStopId++; + Report("brushstop",__FILE__,__LINE__,(int)JobBrushStopId,RpWarning,(int)SegmentNumOfBrushStops,0); + if (JobBrushStopId >= SegmentNumOfBrushStops) + { + Report("last brushstop",__FILE__,__LINE__,(int)JobBrushStopId,RpWarning,(int)SegmentNumOfBrushStops,0); + SafeRemoveControlCallback(BrushStopControlId,IDSBrushStopRestartCallback); + BrushStopControlId = 0Xff; + } return OK; } //******************************************************************************************************************** +uint32_t IDSSegmentState(void *SegmentDetails, int SegmentId) +{ + JobSegment* Segment = SegmentDetails; + JobDispenser **Dispensers; + int n_dispensers; - uint32_t IDS_Valve_SegmentReady(uint32_t deviceID, uint32_t ReadValue) - { - int i; - DispenserSegmentReady[deviceID] = true; - for (i=0;in_brushstops; + BrushStopTime = Segment->length/SegmentNumOfBrushStops; //brushstop in meters + BrushStopTime = ((BrushStopTime*100)/dyeingspeed);//brushstop in seconds + BrushStopTime *= 1000; //brushstop in millisecond + Report("IDSSegmentState",__FILE__,__LINE__,(int)BrushStopTime,RpWarning,(int)SegmentNumOfBrushStops,0); + if (uploadstrategy == JOB_UPLOAD_STRATEGY__Default) + { + Dispensers = Segment->brushstops[JobBrushStopId]->dispensers; + n_dispensers = Segment->brushstops[JobBrushStopId]->n_dispensers; + } + else { - if (DispenserSegmentReady[i] == false) + if (FileBrushStop) { - return OK; //not all configured heaters are ready + Dispensers = FileBrushStop->dispensers; + n_dispensers = FileBrushStop->n_dispensers; } - } - SegmentReady(Module_IDS,ModuleDone); - return OK; // all configured heaters are ready - } - - char IdsMessage[100]; -//******************************************************************************************************************** - uint32_t IDSSegmentState(void *JobDetails, int SegmentId) -{ - JobTicket* JobTicket = JobDetails; - int Dispenser_i,n_dispensers,DispenserId; - TimerMotors_t HW_Motor_Id; - double segmentfirst_speed; - int CurrentSegment = SegmentId; - - if (CurrentSegment>=JobTicket->n_segments) + else { - LOG_ERROR(CurrentSegment,"Error Segment"); - return ERROR; + LOG_ERROR(FileBrushStop,"BrushStopReadError"); } - if (JobBrushStopId>=JobTicket->segments[CurrentSegment]->n_brushstops) - { - LOG_ERROR(JobBrushStopId,"Error JobBrushStopId"); - return ERROR; } - Valve_Set(VALVE_MIXCHIP_WASTECH, Mixer_Head); - if (JobTicket->segments[CurrentSegment]->brushstops[JobBrushStopId]->n_dispensers) - { - n_dispensers = JobTicket->segments[CurrentSegment]->brushstops[JobBrushStopId]->n_dispensers; - for (Dispenser_i = 0;Dispenser_i < n_dispensers;Dispenser_i++) - { - DispenserId = JobTicket->segments[CurrentSegment]->brushstops[JobBrushStopId]->dispensers[Dispenser_i]->index; - HW_Motor_Id = DispenserIdToMotorId[DispenserId]; - if (MotorsCfg[HW_Motor_Id].hardwaremotortype != DispenserIdToMotorId[DispenserId])//unconfigured dispenser - continue; - //(Speed*uStep*PPR)/((2*PI*Dispenser_Radius) - segmentfirst_speed = JobTicket->segments[CurrentSegment]->brushstops[JobBrushStopId]->dispensers[Dispenser_i]->nanolitterpersecond/ - JobTicket->segments[CurrentSegment]->brushstops[JobBrushStopId]->dispensers[Dispenser_i]->nanoliterperpulse; - if (JobTicket->segments[CurrentSegment]->brushstops[JobBrushStopId]->dispensers[Dispenser_i]->dispenserstepdivision != DISPENSER_STEP_DIVISION__Auto) - { - //MotorSetMicroStep(HW_Motor_Id, JobTicket->segments[CurrentSegment]->brushstops[JobBrushStopId]->dispensers[Dispenser_i]->dispenserstepdivision); - segmentfirst_speed/=JobTicket->segments[CurrentSegment]->brushstops[JobBrushStopId]->dispensers[Dispenser_i]->dispenserstepdivision; //the dye supply is calculated based on a 1/8 microstep - IDS_Dispenser_Set_Flow_Params ( DispenserId, JobTicket->segments[CurrentSegment]->brushstops[JobBrushStopId]->dispensers[Dispenser_i]->nanoliterperpulse - , JobTicket->segments[CurrentSegment]->brushstops[JobBrushStopId]->dispensers[Dispenser_i]->dispenserstepdivision); - } - else - { - //segmentfirst_speed/=MotorsCfg[HW_Motor_Id].microstep; //the dye supply is calculated based on a 1/8 microstep - IDS_Dispenser_Set_Flow_Params ( DispenserId, JobTicket->segments[CurrentSegment]->brushstops[JobBrushStopId]->dispensers[Dispenser_i]->nanoliterperpulse - ,MotorsCfg[HW_Motor_Id].microstep); - } - if ((int)segmentfirst_speed > 0) - { - DispenserSegmentReady[DispenserId] = false; - //Control3WayValvesWithCallback (DispenserId, Dispenser_Mixer, NULL); //direction: MidTank_Dispenser or Dispenser_Mixer - IDS_Dispenser_Start_Motor_and_Open_Valve(DispenserId,segmentfirst_speed,NULL); - usnprintf(IdsMessage, 80, "Dispenser %d nl/sec %d nl/pulse %d speed %d",Dispenser_i,(int)JobTicket->segments[CurrentSegment]->brushstops[JobBrushStopId]->dispensers[Dispenser_i]->nanolitterpersecond, - (int)JobTicket->segments[CurrentSegment]->brushstops[JobBrushStopId]->dispensers[Dispenser_i]->nanoliterperpulse,(int)segmentfirst_speed); - //REPORT_MSG(segmentfirst_speed,IdsMessage); - Report(IdsMessage,__FILE__,__LINE__,Dispenser_i,RpWarning,segmentfirst_speed,0); - SendJobProgress(0.0,0,false, IdsMessage); + IDS_StartBrushStop(n_dispensers, Dispensers); + JobBrushStopId++; + if ((BrushStopTime)&&(SegmentNumOfBrushStops > 1)) + { + BrushStopControlId = AddControlCallback( IDSBrushStopRestartCallback, BrushStopTime,TemplateDataReadCBFunction ,SegmentDetails, 0, 0 ); + if (BrushStopControlId == 0xFF) + { + Report("Add control callback failed",__FILE__,__LINE__,(int)BrushStopTime,RpWarning,(int)0,0); + return ERROR; + } + Report("Add control callback ",__FILE__,__LINE__,(int)BrushStopTime,RpWarning,(int)n_dispensers,0); - } - } - } + } + else + { + if (FileBrushStop) + FreeBrushStopFileData(FileBrushStop); + FileBrushStop = NULL; + } return OK; } @@ -466,6 +982,7 @@ uint32_t IDSPreSegmentState(void *JobDetails, int SegmentId) return OK; //not all configured heaters are ready } } + REPORT_MSG(deviceID,"IDS_Valve_DistanceToSpoolReady End called"); DistanceToSpoolReady(Module_IDS,ModuleDone); return OK; // all configured heaters are ready } @@ -495,15 +1012,25 @@ uint32_t IDSPreSegmentState(void *JobDetails, int SegmentId) //TimerMotors_t HW_Motor_Id = DispenserIdToMotorId[deviceID]; //REPORT_MSG(deviceID,"Dispenser End called"); //MotorStop(HW_Motor_Id,Hard_Hiz); + IDS_HomeDispenser (deviceID, 1000 , NULL); + return OK; } //******************************************************************************************************************** - uint32_t IDSEndState(void *JobDetails) + uint32_t IDSEndState(void ) { int Dispenser_i; IDS_Active = false; Valve_Set(VALVE_MIXCHIP_WASTECH, Mixer_Waste); REPORT_MSG(0,"Dispenser End Start"); + if (BrushStopControlId != 0xFF) + { + RemoveControlCallback(BrushStopControlId,IDSBrushStopRestartCallback); + BrushStopControlId = 0xFF; + } + if (FileBrushStop) + FreeBrushStopFileData(FileBrushStop); + FileBrushStop = NULL; for ( Dispenser_i = 0;Dispenser_i < MAX_SYSTEM_DISPENSERS;Dispenser_i++) { if (DispenserUsedInJob[Dispenser_i] == true) @@ -522,3 +1049,18 @@ uint32_t IDSPreSegmentState(void *JobDetails, int SegmentId) return OK; } +uint32_t IDS_StartLubrication(void) +{ + IDS_Dispenser_Start_Motor_and_Open_Valve(LUBRICANT_DISPENSER,lubricant_speed,NULL); + Lubricant_2Way_Valve (START); + return OK; +} +uint32_t IDS_StopLubrication(void) +{ + if(DispenserUsedInJob[LUBRICANT_DISPENSER]) + { + IDS_Dispenser_Close_Valve_And_Stop_Motor(LUBRICANT_DISPENSER,IDS_Valve_EndValveReady); + Lubricant_2Way_Valve (STOP); + } + return OK; +} diff --git a/Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Progress.c b/Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Progress.c index 919e84582..d041b648e 100644 --- a/Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Progress.c +++ b/Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Progress.c @@ -7,6 +7,7 @@ #include "driverlib/gpio.h" #include "Drivers/USB_Communication/USBCDCD.h" +#include "StateMachines/Initialization/PowerOffSequence.h" //#include "graphics_adapter.h" @@ -20,7 +21,7 @@ void Stub_ProgressRequest(MessageContainer* requestContainer) ProgressResponse response = PROGRESS_RESPONSE__INIT; response.has_progress = true; - + PowerOffInit(); int i = 0; for (i = 0; i < request->amount; i++) { diff --git a/Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Stub_Dancer.c b/Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Stub_Dancer.c index 61c7afe74..6bfb3f322 100644 --- a/Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Stub_Dancer.c +++ b/Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Stub_Dancer.c @@ -8,6 +8,7 @@ #include #include +#include #include #include #include @@ -30,8 +31,6 @@ #include "drivers/FPGA/FPGA.h" #include "drivers/SPI/SPI_Comm.h" -#include "drivers/FPGA/Moters_Driver/L6470.h" - #include "driverlib/ssi.h" #include "drivers/SPI/SPI_Comm.h" #include "drivers/FPGA/FPGA_SSI_Comm.h" diff --git a/Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Stub_Dispenser.c b/Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Stub_Dispenser.c index eb1de19ad..f3efa3b67 100644 --- a/Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Stub_Dispenser.c +++ b/Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Stub_Dispenser.c @@ -36,19 +36,16 @@ void Stub_DispenserRequest(MessageContainer* requestContainer) TCA9534Regs Regs; - status |= TCA9534Init(request->dispenserid, &Regs); + //static bool first_time = true; - if(request->start == 1) - { - TCA9534ByPass(request->dispenserid, &Regs, ENABLE); + //if(first_time == true) + //if ((Regs.Config[request->dispenserid].bit.DISP_DOWN != TCA9534_INPUT) || (Regs.Config[request->dispenserid].bit.DISP_UP!= TCA9534_INPUT)) + //{ + status |= TCA9534Init(request->dispenserid, &Regs); + //first_time = false; + //} - } - else - TCA9534ByPass(request->dispenserid, &Regs, DISABLE); - - delayms(5); - - if(request->setdirection == 1) + if(request->setdirection == true) { TCA9534TestRelay(request->dispenserid, &Regs,ENABLE); } @@ -56,12 +53,28 @@ void Stub_DispenserRequest(MessageContainer* requestContainer) TCA9534TestRelay(request->dispenserid, &Regs,DISABLE); delayms(5); + + + if(request->start == true) + { + TCA9534ByPass(request->dispenserid, &Regs, ENABLE); + + } + else + TCA9534ByPass(request->dispenserid, &Regs, DISABLE); + + delayms(5); + + + /* if(request->setmicrostepdivision == 1) TCA9534TestByPassTestRelay(request->dispenserid, &Regs); delayms(5); if(request->setspeed == 1) test_IO(); delayms(5); + */ + //request->dispenserid //request->start //request->setdirection @@ -71,7 +84,7 @@ void Stub_DispenserRequest(MessageContainer* requestContainer) StubDispenserResponse response = STUB_DISPENSER_RESPONSE__INIT; - response.dispenserid = (uint32_t)((round)(CalculateDispenserPressure(0x00000004)));//CHAN_DISPENSE_PRESSURE_6); + //response.dispenserid = (uint32_t)((round)(CalculateDispenserPressure(0x00000004)));//CHAN_DISPENSE_PRESSURE_6); status |= TCA9534SetReadInputReg(request->dispenserid); diff --git a/Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Stub_IntADC.c b/Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Stub_IntADC.c index d9d35f363..f7e3b21f6 100644 --- a/Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Stub_IntADC.c +++ b/Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Stub_IntADC.c @@ -47,7 +47,7 @@ void Stub_IntADCReadRequest(MessageContainer* requestContainer) SysCtlDelay(100000); - data = ADC_GetReading(request->adc_device); + data = ADC_GetReading((ADC_TYPE)request->adc_device); status = PASSED; StubIntADCReadResponse response = STUB_INT_ADCREAD_RESPONSE__INIT; diff --git a/Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Stub_L6470.c b/Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Stub_L6470.c index 658205327..636889127 100644 --- a/Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Stub_L6470.c +++ b/Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Stub_L6470.c @@ -1,6 +1,7 @@ #include #include +#include #include #include #include @@ -19,8 +20,6 @@ //#include "drivers/FPGA/FPGA.h" #include "drivers/SPI/SPI_Comm.h" -#include "drivers/FPGA/Moters_Driver/L6470.h" - #include "driverlib/ssi.h" unsigned long Run_Value = 136902 ; diff --git a/Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Stub_Motor.c b/Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Stub_Motor.c index 65ede8fac..0854aba40 100644 --- a/Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Stub_Motor.c +++ b/Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Stub_Motor.c @@ -1,6 +1,7 @@ #include #include +#include #include #include #include @@ -37,8 +38,6 @@ #include "drivers/FPGA/FPGA.h" #include "drivers/SPI/SPI_Comm.h" -#include "drivers/FPGA/Moters_Driver/L6470.h" - #include "driverlib/ssi.h" #include "drivers/SPI/SPI_Comm.h" #include "Modules/Thread/Thread_ex.h" diff --git a/Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Stub_SpeedSensor.c b/Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Stub_SpeedSensor.c index eea594817..4e6c4cf84 100644 --- a/Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Stub_SpeedSensor.c +++ b/Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Stub_SpeedSensor.c @@ -9,6 +9,7 @@ #include #include +#include #include #include #include @@ -28,8 +29,6 @@ #include "drivers/FPGA/FPGA.h" #include "drivers/SPI/SPI_Comm.h" -#include "drivers/FPGA/Moters_Driver/L6470.h" - #include "driverlib/ssi.h" #include "drivers/SPI/SPI_Comm.h" #include "drivers/FPGA/FPGA_SSI_Comm.h" diff --git a/Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Stub_TempSensor.c b/Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Stub_TempSensor.c index f25a79b15..c320cca80 100644 --- a/Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Stub_TempSensor.c +++ b/Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Stub_TempSensor.c @@ -7,6 +7,7 @@ #include #include +#include #include #include #include @@ -29,8 +30,6 @@ #include "drivers/FPGA/FPGA.h" #include "drivers/SPI/SPI_Comm.h" -#include "drivers/FPGA/Moters_Driver/L6470.h" - #include "driverlib/ssi.h" #include "drivers/SPI/SPI_Comm.h" #include "drivers/FPGA/FPGA_SSI_Comm.h" diff --git a/Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Stub_Valve.c b/Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Stub_Valve.c index 1b6ed8989..c6ea742a7 100644 --- a/Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Stub_Valve.c +++ b/Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Stub_Valve.c @@ -32,8 +32,15 @@ void Stub_ValveRequest(MessageContainer* requestContainer) request->inkflow request->valveon */ - //Control3WayValvesWithCallback (request->valveid, request->valveon, NULL); - //Valve_Set(request->valveid, request->valveon); + + if(request->inkflow == 3) + { + Control3WayValvesWithCallback (request->valveid, request->valveon, NULL); + } + else + { + Valve_Set(request->valveid, request->valveon); + } StubValveResponse response = STUB_VALVE_RESPONSE__INIT; diff --git a/Software/Embedded_SW/Embedded/Modules/Thread/Thread.h b/Software/Embedded_SW/Embedded/Modules/Thread/Thread.h index 638611c8b..3e2a6aa40 100644 --- a/Software/Embedded_SW/Embedded/Modules/Thread/Thread.h +++ b/Software/Embedded_SW/Embedded/Modules/Thread/Thread.h @@ -64,6 +64,8 @@ extern int MotorSamplePointer[MAX_THREAD_MOTORS_NUM]; extern double NormalizedErrorCoEfficient[MAX_THREAD_MOTORS_NUM]; extern int DancerStopActivityLimit[MAX_THREAD_MOTORS_NUM]; extern MotorControlConfig_t MotorControlConfig[MAX_THREAD_MOTORS_NUM]; +extern int32_t MotorSpeedSamples[MAX_THREAD_MOTORS_NUM][MAX_CONTROL_SAMPLES]; +extern int MotorSpeedSamplePointer[MAX_THREAD_MOTORS_NUM]; uint32_t InternalWinderConfigMessage(HardwareWinder* request); diff --git a/Software/Embedded_SW/Embedded/Modules/Thread/ThreadLoad.c b/Software/Embedded_SW/Embedded/Modules/Thread/ThreadLoad.c index a82fe37e6..ab5075ab9 100644 --- a/Software/Embedded_SW/Embedded/Modules/Thread/ThreadLoad.c +++ b/Software/Embedded_SW/Embedded/Modules/Thread/ThreadLoad.c @@ -38,21 +38,21 @@ /* typedef enum { 0 THREAD_LOAD_INIT, - 1 THREAD_LOAD_REDUCE_HEAT, //HEATERS OFF, DRYER BLOWER OFF, BLOWER LOW, - 2 THREAD_LOAD_SET_LOAD_ARM_TO_START_POSITION,//USE NOTATION HOW MANY ROTATIONS IN THE DRYER, OR CHECK AGAINST STOPPER. MOVE SLOWLY - 3 THREAD_LOAD_CENTER_HEAD_ROCKERS, //puthead cleaning rockers to middle position - 4 THREAD_LOAD_OPEN_COVERS, //OPEN DYEING HEAD COVER AND DRYER LID + 1 THREAD_LOAD_REDUCE_HEAT, //HEATERS OFF, DRYER BLOWER OFF, BLOWER LOW, + 2 THREAD_LOAD_SET_LOAD_ARM_TO_START_POSITION, //USE NOTATION HOW MANY ROTATIONS IN THE DRYER, OR CHECK AGAINST STOPPER. MOVE SLOWLY + 3 THREAD_LOAD_CENTER_HEAD_ROCKERS, //puthead cleaning rockers to middle position + 4 THREAD_LOAD_OPEN_COVERS, //OPEN DYEING HEAD COVER AND DRYER LID 5 THREAD_LOAD_LIFT_DANCERS, - 6 THREAD_LOAD_LIFT_ROCKERS, //MACHINE IS READY. SEND MESSAGE, START TIMER TO CLOSE LIDS, WAIT FOR OPERATOR RESPONSE - 7 THREAD_LOAD_INITIAL_TENSION,//CHECK SPOOL PRESENCERUN WINDER UNTIL BREAK SENSOR IS IDENTIFIEING MOVEMENT FOR A SECOND + 6 THREAD_LOAD_LIFT_ROCKERS, //MACHINE IS READY. SEND MESSAGE, START TIMER TO CLOSE LIDS, WAIT FOR OPERATOR RESPONSE + 7 THREAD_LOAD_INITIAL_TENSION, //CHECK SPOOL PRESENCERUN WINDER UNTIL BREAK SENSOR IS IDENTIFIEING MOVEMENT FOR A SECOND 8 THREAD_LOAD_CLOSE_ROCKERS, - 9 THREAD_LOAD_CLOSE_DANCERS, //SEND DANCER MOTORS TO PRESET LOCATION, CHECK THAT THE DANCERS ARE ON THE THREAD + 9 THREAD_LOAD_CLOSE_DANCERS, //SEND DANCER MOTORS TO PRESET LOCATION, CHECK THAT THE DANCERS ARE ON THE THREAD 10 THREAD_LOAD_CLOSE_LIDS, 11 THREAD_LOAD_RESUME_HEATING, - 12 THREAD_LOAD_JOG_FEEDER_TO_MIDDLE_POINT,//JOG THE FEEDER MOTOR UNTIL THE FEEDER DANCER IS AT MIDDLE POSITION - 13 THREAD_LOAD_DRYER_LOADING, //START FEEDER PID, ROTATE LOADING ARM COUNTER THREAD DIRECTION X CIRCLES ACCORDING TO RML. FEEDER SPEED IS 40 - //KEEP NOTATION HOW MANY ROTATIONS IN THE DRYER - 14 THREAD_LOAD_JOG_THREAD, //JOG THREAD SHORTLY TO MAKE SURE SPOOL IS RUNNING. REPORT END OF LOADING + 12 THREAD_LOAD_JOG_FEEDER_TO_MIDDLE_POINT, //JOG THE FEEDER MOTOR UNTIL THE FEEDER DANCER IS AT MIDDLE POSITION + 13 THREAD_LOAD_DRYER_LOADING, //START FEEDER PID, ROTATE LOADING ARM COUNTER THREAD DIRECTION X CIRCLES ACCORDING TO RML. FEEDER SPEED IS 40 + //KEEP NOTATION HOW MANY ROTATIONS IN THE DRYER + 14 THREAD_LOAD_JOG_THREAD, //JOG THREAD SHORTLY TO MAKE SURE SPOOL IS RUNNING. REPORT END OF LOADING 15 THREAD_LOAD_END }THREAD_LOAD_STAGES_ENUM;*/ THREAD_LOAD_STAGES_ENUM LoadStages = THREAD_LOAD_INIT; @@ -78,6 +78,13 @@ //RUN MOTOR A FULL CYCLE //RUN A MOTOR NUMBER OF STEPS //RUN CONTROL FOR A SINGLE DANCER + bool ThreadLoadingActive(void) + { + if ((LoadStages > THREAD_LOAD_INIT)&&(LoadStages < THREAD_LOAD_END)) + return true; + else + return false; + } uint32_t Thread_Load_Init(void) { void* buffer = NULL; @@ -200,6 +207,7 @@ } uint8_t CallbackCounter = 0; uint8_t TimeoutsCounter = 0; + uint32_t Thread_Load_HomingCallback(uint32_t MotorId, uint32_t ReadValue) { Report("Thread Load State Machine Callback.",__FILE__,__LINE__,LoadStages,RpMessage,NumberOfDrierLoaderCycles,0); @@ -222,9 +230,16 @@ else { LoadStages++; - if (LoadStages != THREAD_LOAD_INITIAL_TENSION) //on this satge we should wait for user call + if (LoadStages == THREAD_LOAD_LIFT_ROCKERS) { - ThreadLoadStateMachine(LoadStages); + MotorSetMicroStep(HARDWARE_MOTOR_TYPE__MOTO_RLOADING, MotorsCfg[HARDWARE_MOTOR_TYPE__MOTO_RLOADING].microstep); + MotorSetMicroStep(HARDWARE_MOTOR_TYPE__MOTO_LLOADING, MotorsCfg[HARDWARE_MOTOR_TYPE__MOTO_LLOADING].microstep); + MotorSetKvalRun(HARDWARE_MOTOR_TYPE__MOTO_RLOADING, MotorsCfg[HARDWARE_MOTOR_TYPE__MOTO_RLOADING].microstep); + MotorSetKvalRun(HARDWARE_MOTOR_TYPE__MOTO_LLOADING, MotorsCfg[HARDWARE_MOTOR_TYPE__MOTO_LLOADING].microstep); + } + if (LoadStages != THREAD_LOAD_INITIAL_TENSION) //on this stage we should wait for user call + { + //ThreadLoadStateMachine(LoadStages); } } } @@ -237,9 +252,9 @@ { REPORT_MSG(LoadStages, "Thread Load State Machine step"); CallbackCounter++; - MotorMovetoLimitSwitch (HARDWARE_MOTOR_TYPE__MOTO_DH_CLEANHEAD,1-MotorsCfg[HARDWARE_MOTOR_TYPE__MOTO_DH_CLEANHEAD].directionthreadwize, 200, Motor_Id_to_LS_IdUp[HARDWARE_MOTOR_TYPE__MOTO_DH_CLEANHEAD], Thread_Load_HomingCallback,10000); + MotorMovetoLimitSwitch (HARDWARE_MOTOR_TYPE__MOTO_DH_CLEANHEAD,1-MotorsCfg[HARDWARE_MOTOR_TYPE__MOTO_DH_CLEANHEAD].directionthreadwize, 80, Motor_Id_to_LS_IdUp[HARDWARE_MOTOR_TYPE__MOTO_DH_CLEANHEAD], Thread_Load_HomingCallback,10000); CallbackCounter++; - MotorMovetoLimitSwitch (HARDWARE_MOTOR_TYPE__MOTO_DH_CLEANMECH,1-MotorsCfg[HARDWARE_MOTOR_TYPE__MOTO_DH_CLEANMECH].directionthreadwize, 200, Motor_Id_to_LS_IdUp[HARDWARE_MOTOR_TYPE__MOTO_DH_CLEANMECH], Thread_Load_HomingCallback,10000); + MotorMovetoLimitSwitch (HARDWARE_MOTOR_TYPE__MOTO_DH_CLEANMECH,1-MotorsCfg[HARDWARE_MOTOR_TYPE__MOTO_DH_CLEANMECH].directionthreadwize, 80, Motor_Id_to_LS_IdUp[HARDWARE_MOTOR_TYPE__MOTO_DH_CLEANMECH], Thread_Load_HomingCallback,10000); return OK; } uint32_t Thread_Load_Open_Covers(void) @@ -270,10 +285,15 @@ //Machine Is Ready. Send Message, Start Timer To Close Lids, Wait For Operator Response { REPORT_MSG(LoadStages, "Thread Load State Machine step"); + MotorSetMicroStep(HARDWARE_MOTOR_TYPE__MOTO_RLOADING, 1); + MotorSetMicroStep(HARDWARE_MOTOR_TYPE__MOTO_LLOADING, 1); + MotorSetKvalRun(HARDWARE_MOTOR_TYPE__MOTO_RLOADING, 35); + MotorSetKvalRun(HARDWARE_MOTOR_TYPE__MOTO_LLOADING, 35); + Task_sleep(10); CallbackCounter++; - MotorMovetoLimitSwitch (HARDWARE_MOTOR_TYPE__MOTO_RLOADING,MotorsCfg[HARDWARE_MOTOR_TYPE__MOTO_RLOADING].directionthreadwize, 300, Motor_Id_to_LS_IdUp[HARDWARE_MOTOR_TYPE__MOTO_RLOADING], Thread_Load_HomingCallback,12000); + MotorMovetoLimitSwitch (HARDWARE_MOTOR_TYPE__MOTO_RLOADING,MotorsCfg[HARDWARE_MOTOR_TYPE__MOTO_RLOADING].directionthreadwize, 50, Motor_Id_to_LS_IdUp[HARDWARE_MOTOR_TYPE__MOTO_RLOADING], Thread_Load_HomingCallback,25000); CallbackCounter++; - MotorMovetoLimitSwitch (HARDWARE_MOTOR_TYPE__MOTO_LLOADING,1-MotorsCfg[HARDWARE_MOTOR_TYPE__MOTO_LLOADING].directionthreadwize, 300, Motor_Id_to_LS_IdUp[HARDWARE_MOTOR_TYPE__MOTO_LLOADING], Thread_Load_HomingCallback,12000); + MotorMovetoLimitSwitch (HARDWARE_MOTOR_TYPE__MOTO_LLOADING,1-MotorsCfg[HARDWARE_MOTOR_TYPE__MOTO_LLOADING].directionthreadwize, 50, Motor_Id_to_LS_IdUp[HARDWARE_MOTOR_TYPE__MOTO_LLOADING], Thread_Load_HomingCallback,25000); return OK; } @@ -340,7 +360,7 @@ { Control_Dryer_Fan(START,75);//use START or STOP, 0 - 100% LoadStages++; - ThreadLoadStateMachine(LoadStages); + //ThreadLoadStateMachine(LoadStages); } return OK; } @@ -357,6 +377,7 @@ { Report("Thread Load State Machine Callback.",__FILE__,__LINE__,LoadStages,RpMessage,NumberOfDrierLoaderCycles,0); REPORT_MSG(MotorId, "Thread_Load_Dryer_Loading_Callback Motor Id"); + MotorMovetoEncoderPosition(HARDWARE_MOTOR_TYPE__MOTO_DRYER_LOADARM,0,0); if(ControlId != 0xFF) { MotorStop(ThreadMotorIdToMotorId[FEEDER_MOTOR],Hard_Hiz); @@ -371,7 +392,7 @@ LoadStages++; if (LoadStages != THREAD_LOAD_INITIAL_TENSION) //on this satge we should wait for user call { - ThreadLoadStateMachine(LoadStages); + //ThreadLoadStateMachine(LoadStages); } } } @@ -417,7 +438,7 @@ //Keep Notation How Many Rotations In The Dryer //LoadArmInfo.LoadArmBackLash = 0; - //LoadArmInfo.LoadArmRounds = 0xFF; + LoadArmInfo.LoadArmRounds = 0xFF; FileWrite(&LoadArmInfo, sizeof(LoadArmInfo),LoadArmPath); return OK; } @@ -428,7 +449,7 @@ ControlId = 0xFF; ThreadAbortJoggingFunc(); LoadStages++; - ThreadLoadStateMachine(LoadStages); + //ThreadLoadStateMachine(LoadStages); return OK; } uint32_t Thread_Load_Jog_Thread(void) diff --git a/Software/Embedded_SW/Embedded/Modules/Thread/Thread_Winder.c b/Software/Embedded_SW/Embedded/Modules/Thread/Thread_Winder.c index c598e0c55..1f7836ea5 100644 --- a/Software/Embedded_SW/Embedded/Modules/Thread/Thread_Winder.c +++ b/Software/Embedded_SW/Embedded/Modules/Thread/Thread_Winder.c @@ -40,6 +40,8 @@ void ScrewsStartControlTimer (void); bool Winder_ScrewHoming = false; bool ScrewCurrentDirection = false; //holds current screw direction uint32_t ScrewDirectionChangeCounter = 1; //holds the current number of runs of the screw - will be used to build the cone +//uint32_t ScrewChangeCounter = 0; +//uint32_t ScrewChangeLimit = 0; uint32_t CalculationDirectionChangeCounter = 1; //holds the current number of runs of the screw - will be used to build the cone uint16_t WinderMotorSpeed[MAX_WINDER_SPEED_CALCULATION]; uint16_t WinderMotorSpeedCounter = 0; @@ -75,7 +77,7 @@ uint32_t InternalWindingConfigMessage(JobSpool* request) InternalWinderCfg.spoolbackingrate = request->backingrate; InternalWinderCfg.startoffsetpulses = request->startoffsetpulses; InternalWinderCfg.SpoolBottomBackingRate = request->bottombackingrate; - InternalWinderCfg.NumberOfRotationPerPassage = request->rotationsperpassage; + InternalWinderCfg.NumberOfRotationPerPassage = 3.1415926*2;//request->rotationsperpassage; InternalWinderCfg.diameter = request->diameter; return status; @@ -135,8 +137,16 @@ uint32_t Winder_PrepareStage2(uint32_t deviceID, uint32_t ReadValue) //MotorSetMaxSpeed (HARDWARE_MOTOR_TYPE__MOTO_SCREW,InternalWinderCfg.segmentoffsetpulses); //REPORT_MSG(numOfSteps, "Winder_PrepareStage2"); REPORT_MSG(millisecondCounter/*MotorsCfg[HARDWARE_MOTOR_TYPE__MOTO_SCREW].maxfrequency*/, "Winder_PrepareStage2"); - - status |= MotorMoveWithCallback(HARDWARE_MOTOR_TYPE__MOTO_SCREW, (1-MotorsCfg[HARDWARE_MOTOR_TYPE__MOTO_SCREW].directionthreadwize),numOfSteps, Winder_ScrewAtOffsetCallback,1000); + if (ReadValue != LIMIT) + { + LOG_ERROR(ReadValue,"Screw failed to reach the limit switch!!"); + //returned with a timeout + Winder_ScrewAtOffsetCallback(0,0); + } + else + { + status |= MotorMoveWithCallback(HARDWARE_MOTOR_TYPE__MOTO_SCREW, (1-MotorsCfg[HARDWARE_MOTOR_TYPE__MOTO_SCREW].directionthreadwize),numOfSteps, Winder_ScrewAtOffsetCallback,1000); + } //set motor location 0 here return status; @@ -188,6 +198,8 @@ char ScrewStr[100]; //char TempScrewStr[100]; double WinderReferenceSpeed=0; int32_t TotalWinderSpeed=0; +bool Add100 = false; +double Rotations = 6.0; uint32_t Screw100msecDirectionChange(uint32_t deviceID, uint32_t BusyFlag) { //uint32_t Steps; @@ -196,13 +208,21 @@ uint32_t Screw100msecDirectionChange(uint32_t deviceID, uint32_t BusyFlag) double RotationsPerSecond; int32_t Averagewinderspeed = 0; - TotalWinderSpeed-=WinderMotorSpeed[WinderMotorSpeedCounter]; - WinderMotorSpeed[WinderMotorSpeedCounter] = CurrentControlledSpeed[WINDER_MOTOR]; - TotalWinderSpeed+=WinderMotorSpeed[WinderMotorSpeedCounter]; - if (WinderMotorSpeedCounter++>=MAX_WINDER_SPEED_CALCULATION) + //ScrewChangeCounter++; + //if ((ScrewChangeCounter>3)&&(ScrewChangeCounter<(ScrewChangeLimit-2))) //do not take the winder speed near the limits { - WinderMotorSpeedCounter=0; - WinderMotorSpeedRollOver=true; + TotalWinderSpeed-=WinderMotorSpeed[WinderMotorSpeedCounter]; + WinderMotorSpeed[WinderMotorSpeedCounter] = CurrentControlledSpeed[WINDER_MOTOR]; + TotalWinderSpeed+=WinderMotorSpeed[WinderMotorSpeedCounter]; + if (WinderMotorSpeedCounter++>=MAX_WINDER_SPEED_CALCULATION) + { + if (WinderMotorSpeedRollOver == false) + { + Add100 = true; + } + WinderMotorSpeedCounter=0; + WinderMotorSpeedRollOver=true; + } } if (ScrewDirectionChangeCounter == CalculationDirectionChangeCounter) @@ -213,6 +233,12 @@ uint32_t Screw100msecDirectionChange(uint32_t deviceID, uint32_t BusyFlag) if (ScrewCurrentDirection == 1-MotorsCfg[HARDWARE_MOTOR_TYPE__MOTO_SCREW].directionthreadwize) //next time going out { + if (Add100 == true) //once per job + { + ScrewNumberOfSteps += 100; + Add100 = false; + } + if ((CalculationDirectionChangeCounter/2)%InternalWinderCfg.spoolbackingrate == 0) { ScrewNumberOfSteps--; @@ -240,7 +266,9 @@ uint32_t Screw100msecDirectionChange(uint32_t deviceID, uint32_t BusyFlag) WinderReferenceSpeed = Averagewinderspeed; } - screw_horizontal_speed = ScrewNumberOfSteps / InternalWinderCfg.NumberOfRotationPerPassage; + screw_horizontal_speed = ScrewNumberOfSteps / Rotations;//InternalWinderCfg.NumberOfRotationPerPassage; + if (Rotations > 7.0) + Rotations = 6.0; RotationsPerSecond = WinderReferenceSpeed / (double)MotorsCfg[HARDWARE_MOTOR_TYPE__MOTO_WINDER].pulseperround; tempScrewSpeed = screw_horizontal_speed*RotationsPerSecond; //ROM_IntMasterDisable(); @@ -260,7 +288,7 @@ uint32_t Screw100msecDirectionChange(uint32_t deviceID, uint32_t BusyFlag) //Report(TempScrewStr,__FILE__,__LINE__,0,RpWarning,0, 0); //Report(ScrewStr,__FILE__,__LINE__,ScrewCurrentDirection,RpWarning,CalculationDirectionChangeCounter, 0); //REPORT_MSG(temp , "new winder speed"); - Report("new winder speed",__FILE__,__LINE__,temp,RpWarning,ScrewSpeed,0); +// Report("new winder speed",__FILE__,ScrewNumberOfSteps,temp,RpWarning,ScrewSpeed,0); } /********************************************************************************/ @@ -274,7 +302,7 @@ uint32_t WinderPresegmentReady(uint32_t deviceID, uint32_t ReadValue) return PreSegmentReady(Module_Winder,ModuleDone); } -uint32_t Winder_Presegment(void *JobDetails, uint32_t SegmentId) +uint32_t Winder_Presegment(void *SegmentDetails, uint32_t SegmentId) { //JobTicket* JobTicket = JobDetails; double screw_horizontal_speed = 0; @@ -316,6 +344,7 @@ uint32_t Winder_Presegment(void *JobDetails, uint32_t SegmentId) // * 4. start move of travel length // * 5. register motor nBusy callback. this callback will flip between move(traverse length, hardstop) and goto(0), with handline og the coneshape and adjusting maxspeed ScrewNumberOfSteps = InternalWinderCfg.segmentoffsetpulses;//*MotorsCfg[HARDWARE_MOTOR_TYPE__MOTO_SCREW].microstep; + ScrewNumberOfSteps -= 100; temp = SYS_CLK_FREQ; temp *= InternalWinderCfg.segmentoffsetpulses; temp /= ScrewSpeed; @@ -335,6 +364,7 @@ uint32_t Winder_Presegment(void *JobDetails, uint32_t SegmentId) WinderMotorSpeedCounter=0; TotalWinderSpeed = 0; WinderMotorSpeedRollOver=false; + Add100 = false; } PreSegmentReady(Module_Winder,ModuleDone); @@ -352,8 +382,8 @@ uint32_t Winder_End(void) CurrentControlledSpeed[SCREW_MOTOR] = 0; ScrewsStopControlTimer(); //move the cart to the edge so the spool can be easily replaced - MotorMovetoLimitSwitch (HARDWARE_MOTOR_TYPE__MOTO_SCREW,MotorsCfg[HARDWARE_MOTOR_TYPE__MOTO_SCREW].directionthreadwize, 1000, GPI_LS_SCREW_RIGHT, NULL,0); - + //MotorMovetoLimitSwitch (HARDWARE_MOTOR_TYPE__MOTO_SCREW,MotorsCfg[HARDWARE_MOTOR_TYPE__MOTO_SCREW].directionthreadwize, 1000, GPI_LS_SCREW_RIGHT, NULL,0); + MotorStop(HARDWARE_MOTOR_TYPE__MOTO_SCREW,Hard_Hiz); return OK; } void Winder_ScrewHomeLimitSwitchInterrupt(void) @@ -397,12 +427,14 @@ void ScrewsStartControlTimer (void) //ROM_TimerConfigure(Screw_timerBase, TIMER_CFG_PERIODIC); // 32 bits Timer TimerEnable(Screw_timerBase, TIMER_A); ROM_IntEnable(INT_TIMER3A); + //IntPrioritySet(Screw_timerBase, 0x40); ROM_TimerIntEnable(Screw_timerBase, TIMER_TIMA_TIMEOUT); ROM_TimerLoadSet(Screw_timerBase, TIMER_A,(int)1200000/*10 millisec*/ ); Report("ScrewsStartControlTimer direction,speed ", __FILE__,__LINE__,ScrewCurrentDirection, RpMessage, ScrewSpeed, 0); return; } +int random = 0; void ScrewTimerInterrupt(int ARG0) { ROM_TimerIntClear(Screw_timerBase, TIMER_TIMA_TIMEOUT); // Clear the timer interrupt @@ -410,9 +442,11 @@ void ScrewTimerInterrupt(int ARG0) if (SCREW_TimerActivated == true) { - MotorSetDirection (HARDWARE_MOTOR_TYPE__MOTO_SCREW, ScrewCurrentDirection); - MotorSetSpeedDirect(HARDWARE_MOTOR_TYPE__MOTO_SCREW,ScrewSpeed); ROM_TimerLoadSet(Screw_timerBase, TIMER_A,(int)ScrewRunningTime); + MotorSetDirection (HARDWARE_MOTOR_TYPE__MOTO_SCREW, ScrewCurrentDirection); + MotorSetSpeedDirect(HARDWARE_MOTOR_TYPE__MOTO_SCREW,ScrewSpeed+random); + // ScrewChangeCounter = 0; + // ScrewChangeLimit = ScrewRunningTime/12000000; ScrewDirectionChangeCounter++; } else @@ -420,6 +454,10 @@ void ScrewTimerInterrupt(int ARG0) TimerDisable(Screw_timerBase, TIMER_A); } ROM_IntMasterEnable(); + Rotations+=0.03; + /*random++; + if (random >= 2) + random = -1;*/ //Report("ScrewTimerInterrupt dir, duration, speed", __FILE__,ScrewCurrentDirection,ScrewRunningTime, RpMessage, ScrewSpeed, 0); // // Enable all interrupts. diff --git a/Software/Embedded_SW/Embedded/Modules/Thread/Thread_ex.h b/Software/Embedded_SW/Embedded/Modules/Thread/Thread_ex.h index cd71c73b1..d7ce917c0 100644 --- a/Software/Embedded_SW/Embedded/Modules/Thread/Thread_ex.h +++ b/Software/Embedded_SW/Embedded/Modules/Thread/Thread_ex.h @@ -31,10 +31,10 @@ uint32_t ThreadConfigBreakSensor(void *request); uint32_t ThreadGetMotorSpeed(threadMotorsEnum MotorId); double ThreadGetMotorCalculatedError(int DancerId); uint32_t ThreadPrepareState(void *JobDetails); -uint32_t ThreadPreSegmentState(void *JobDetails, uint32_t SegmentId); -uint32_t ThreadSegmentState(void *JobDetails, int SegmentId); +uint32_t ThreadPreSegmentState(void *SegmentDetails, uint32_t SegmentId); +uint32_t ThreadSegmentState(void *SegmentDetails, int SegmentId); uint32_t ThreadDistanceToSpoolState(void); -uint32_t ThreadEndState(void *JobDetails); +uint32_t ThreadEndState(); uint32_t ThreadInitialTestStub(); uint32_t StoreDancerConfigMessage(void); @@ -67,9 +67,11 @@ typedef enum THREAD_LOAD_END }THREAD_LOAD_STAGES_ENUM; uint32_t ThreadLoadStateMachine( THREAD_LOAD_STAGES_ENUM ReadValue); +bool ThreadLoadingActive(void); void ThreadLoadPollRequest(MessageContainer* requestContainer); void ThreadLoadRequest(MessageContainer* requestContainer); + #endif diff --git a/Software/Embedded_SW/Embedded/Modules/Thread/Thread_init.c b/Software/Embedded_SW/Embedded/Modules/Thread/Thread_init.c index a1e91f6fc..4454565c1 100644 --- a/Software/Embedded_SW/Embedded/Modules/Thread/Thread_init.c +++ b/Software/Embedded_SW/Embedded/Modules/Thread/Thread_init.c @@ -2,6 +2,7 @@ **************************************************************************************************************************/ #include +#include #include "include.h" #include "PMR/Hardware/UploadHardWareConfigurationRequest.pb-c.h" @@ -17,12 +18,13 @@ #include "drivers/Flash_Memory/fatfs/ff.h" #include "drivers/SSI_Comm/Dancer/Dancer.h" -#include "drivers/FPGA/Moters_Driver/PowerSTEP01.h" - #include "thread.h" MotorDriverConfigStruc MotorsCfg[NUM_OF_MOTORS]={0}; HardwarePidControl MotorsControl[MAX_THREAD_MOTORS_NUM] = {0}; +int32_t MotorSpeedSamples[MAX_THREAD_MOTORS_NUM][MAX_CONTROL_SAMPLES] = {0}; +int MotorSpeedSamplePointer[MAX_THREAD_MOTORS_NUM] = {0}; + int32_t MotorSamples[MAX_THREAD_MOTORS_NUM][MAX_CONTROL_SAMPLES] = {0}; int MotorSamplePointer[MAX_THREAD_MOTORS_NUM] = {0}; double NormalizedErrorCoEfficient[MAX_THREAD_MOTORS_NUM] = {0}; @@ -105,7 +107,10 @@ uint32_t MotorPidRequestMessage(HardwarePidControl* request) MotorsControl[Motor_i].pvinputfilterfactormode = 10; //test longer control #endif for (i = 0;i < MotorsControl[Motor_i].pvinputfilterfactormode; i++) + { MotorSamples[Motor_i][i] = 0; //reset the samples value for control beginning + MotorSpeedSamples[Motor_i][i] = 0; + } NormalizedErrorCoEfficient[Motor_i] = (2*PI*DancersCfg[ThreadMotorIdToDancerId[Motor_i]].armlength); temp = 1<<(DancersCfg[ThreadMotorIdToDancerId[Motor_i]].resolutionbits); temp=(10*(temp-1)*DancersCfg[ThreadMotorIdToDancerId[Motor_i]].maximalmovementmm); diff --git a/Software/Embedded_SW/Embedded/Modules/Thread/Thread_print.c b/Software/Embedded_SW/Embedded/Modules/Thread/Thread_print.c index 6a8474438..a4208ad25 100644 --- a/Software/Embedded_SW/Embedded/Modules/Thread/Thread_print.c +++ b/Software/Embedded_SW/Embedded/Modules/Thread/Thread_print.c @@ -30,6 +30,7 @@ #include "drivers/FPGA/FPGA_GPIO/FPGA_GPIO.h" #include "modules/heaters/heaters.h" #include "modules/General/process.h" +#include "modules/ids/ids_ex.h" #include "Modules/AlarmHandling/AlarmHandling.h" #include "Control/MillisecTask.h" @@ -67,6 +68,12 @@ double TempPoolerTotalProcessedLength = 0.0; double TempTotalProcessedLength = 0.0; bool PrepareState = false; +// job parameters +bool EnableLubrication = false; +bool EnableIntersegment = false; +double IntersegmentLength = 0; + + int CurrentSegmentId = 0; typedef void (* ProcessedLengthFunc)(void); ProcessedLengthFunc ProcessedLengthFuncPtr = NULL; @@ -76,6 +83,11 @@ void ThreadInterSegmentEnded(void); void ThreadDistanceToSpoolEnded(void); uint32_t ThreadControlCBFunction(uint32_t IfIndex, uint32_t ReadValue); +bool SegmentState = false; +bool PreSegmentState = false; +bool DTSState = false; +void SendSegmentFail(void); + double KeepNormalizedError = 0; bool ThreadControlActive = false; ////////////////////////Slow Motor State//////////////////////////////////// @@ -121,6 +133,7 @@ uint32_t Poolerinitialpos = 0xFFFF; void ThreadUpdateProcessLength (double length, void *Funcptr) { + REPORT_MSG(length,"ThreadUpdateProcessLength"); CurrentRequestedLength = length*100;//Centimetres CurrentProcessedLength = 0; ProcessedLengthFuncPtr = (ProcessedLengthFunc)Funcptr; @@ -353,7 +366,7 @@ uint32_t ThreadControlCBFunction(uint32_t IfIndex, uint32_t ReadValue) //read value is the dancer angle int i,index=MAX_THREAD_MOTORS_NUM; int DancerId; - int32_t TranslatedReadValue, avreageSampleValue = 0; + int32_t TranslatedReadValue, avreageSampleValue = 0,avreageMotorSampleValue = 0; //double tempcalcspeed = 0; uint32_t calculated_speed; double NormalizedError; @@ -372,6 +385,8 @@ uint32_t ThreadControlCBFunction(uint32_t IfIndex, uint32_t ReadValue) if(MotorControlConfig[index].m_isEnabled ) { + //if (MotorDriverResponse[ThreadMotorIdToMotorId[index]].Busy == true) + // return OK; DancerId = ThreadMotorIdToDancerId[index]; if (ReadValue < 10) { @@ -427,7 +442,7 @@ uint32_t ThreadControlCBFunction(uint32_t IfIndex, uint32_t ReadValue) JobEndReason = JOB_THREAD_BREAK; ThreadControlActive = false; SendJobProgress(0.0,0,false, TMessage); - SegmentReady(Module_Thread,ModuleFail); + SendSegmentFail(); //AlarmHandlingSetAlarm(EVENT_TYPE__THREAD_BREAK,true); //EndState(CurrentJob,"ReadBreakSensor Error" ); LOG_ERROR(index, "ReadBreakSensor Error"); @@ -457,7 +472,7 @@ uint32_t ThreadControlCBFunction(uint32_t IfIndex, uint32_t ReadValue) JobEndReason = JOB_WINDER_DANCER_FAIL+DancerId; SendJobProgress(0.0,0,false, TMessage); //EndState(CurrentJob,TMessage ); - SegmentReady(Module_Thread,ModuleFail); + SendSegmentFail(); /*switch (index) { case POOLER_MOTOR: @@ -486,7 +501,23 @@ uint32_t ThreadControlCBFunction(uint32_t IfIndex, uint32_t ReadValue) { //KeepNormalizedError = NormalizedError; } + if ((JobCounter % 1000) == 0) + { + if (JobCounter >= 20000) + { + MotorSpeedSamples[index][MotorSpeedSamplePointer[index]] = CurrentControlledSpeed[index];//(-1 * TranslatedReadValue); + MotorSpeedSamplePointer[index]++; + if (MotorSpeedSamplePointer[index] >= MAX_CONTROL_SAMPLES) + MotorSpeedSamplePointer[index] = 0; + for (i=0;i MotorControlConfig[index].m_ingnoreValue) { /*if (keepdata == true) @@ -551,6 +582,7 @@ bool InitialProcess = false; uint32_t ThreadPrepareState(void *JobDetails) { int Motor_i, HW_Motor_Id, Pid_Id; + JobTicket* JobTicket = JobDetails; CurrentSegmentId = 0; JobCounter = 0; @@ -563,6 +595,11 @@ bool InitialProcess = false; AlarmHandlingSetAlarm(EVENT_TYPE__THREAD_TENSION_CONTROL_FAILURE_WINDER_DANCER,false); AlarmHandlingSetAlarm(EVENT_TYPE__WINDER_CONE_DOES_NOT_EXIST,false); + EnableLubrication = JobTicket->enablelubrication; + EnableIntersegment = JobTicket->enableintersegment; + IntersegmentLength = JobTicket->intersegmentlength; + + //start thread control for all motors for (Motor_i = 0;Motor_i < MAX_THREAD_MOTORS_NUM;Motor_i++) { @@ -659,7 +696,7 @@ bool InitialProcess = false; void SetOriginMotorSpeed(float process_speed) { - int Motor_i, HW_Motor_Id; + int i,Motor_i, HW_Motor_Id; for (Motor_i = 0; Motor_i <= WINDER_MOTOR; Motor_i++) { HW_Motor_Id = ThreadMotorIdToMotorId[Motor_i]; @@ -671,14 +708,16 @@ void SetOriginMotorSpeed(float process_speed) //MotorControlConfig[Motor_i].m_SetParam = motor_speed; OriginalMotorSpd_2PPS[Motor_i] = (int) motor_speed; CurrentControlledSpeed[Motor_i] = (int) motor_speed; + for (i = 0; i <= MAX_CONTROL_SAMPLES; i++) + MotorSpeedSamples[Motor_i][i] = motor_speed; } } //******************************************************************************************************************** -uint32_t ThreadPreSegmentState(void *JobDetails, uint32_t SegmentId) +uint32_t ThreadPreSegmentState(void *SegmentDetails, uint32_t SegmentId) { //set the speed only before the first segment, speed is constant across all job segments and intersegments - JobTicket* JobTicket = JobDetails; + //JobSegment* Segment = SegmentDetails; float process_speed = dyeingspeed; if (dyeingspeed == 0) @@ -708,14 +747,22 @@ uint32_t ThreadPreSegmentState(void *JobDetails, uint32_t SegmentId) MotorSetDirection((TimerMotors_t)HARDWARE_MOTOR_TYPE__MOTO_LLOADING,MotorsCfg[HARDWARE_MOTOR_TYPE__MOTO_LLOADING].directionthreadwize); MotorSetSpeed(HARDWARE_MOTOR_TYPE__MOTO_LLOADING, 1); } + if (EnableLubrication == true) + { + IDS_StartLubrication(); + } } // activate control fr all motors //set speed for both rocker motors //wait for all motors to get to the required speed (set the target speed for the control to check) //call the job state machine when the thread system is ready - if ((InitialProcess==false) && JobTicket->enableintersegment == true) - { - ThreadUpdateProcessLength (JobTicket->intersegmentlength,(void *)ThreadInterSegmentEnded); + if ((InitialProcess==false) && (EnableIntersegment == true)) //&& (IntersegmentLength >= 1.0)) //fix - avoid intersegment length 0 + {//add initial presegment and cleaning before first segment + ThreadUpdateProcessLength (IntersegmentLength,(void *)ThreadInterSegmentEnded); + REPORT_MSG (IntersegmentLength," ThreadPreSegmentState IntersegmentLength"); + SegmentState = false; + PreSegmentState = true; + DTSState = false; } else { @@ -728,14 +775,26 @@ uint32_t ThreadPreSegmentState(void *JobDetails, uint32_t SegmentId) return OK; } int REPSegmentId = 0; +void SendSegmentFail(void) +{ + if (SegmentState == true) + SegmentReady(Module_Thread,ModuleFail); + else if (PreSegmentState == true) + PreSegmentReady(Module_Thread,ModuleFail); + else if (DTSState == true) + DistanceToSpoolReady(Module_Thread,ModuleFail); + +} + void ThreadInterSegmentEnded(void) { REPORT_MSG (REPSegmentId,"ThreadInterSegmentEnded"); + //ThreadUpdateProcessLength (0,(void *)NULL); PreSegmentReady(Module_Thread,ModuleDone); } void ThreadSegmentEnded(void) { - REPORT_MSG (REPSegmentId," ThreadSegmentState"); + REPORT_MSG (REPSegmentId," ThreadSegmentEnded"); SegmentReady(Module_Thread,ModuleDone); } void ThreadDistanceToSpoolEnded(void) @@ -745,14 +804,17 @@ void ThreadDistanceToSpoolEnded(void) } double seglength = 0.0; //******************************************************************************************************************** -uint32_t ThreadSegmentState(void *JobDetails, int SegmentId) +uint32_t ThreadSegmentState(void *SegmentDetails, int SegmentId) { - JobTicket* JobTicket = JobDetails; + JobSegment* Segment = SegmentDetails; REPSegmentId = SegmentId; - seglength = JobTicket->segments[SegmentId]->length; + seglength = Segment->length; CurrentSegmentId = SegmentId; REPORT_MSG (seglength," ThreadSegmentState"); ThreadUpdateProcessLength (seglength,(void *)ThreadSegmentEnded); + SegmentState = true; + PreSegmentState = false; + DTSState = false; return OK; } @@ -762,12 +824,15 @@ uint32_t ThreadDistanceToSpoolState(void ) seglength = dryerbufferlength; REPORT_MSG (seglength,"ThreadDistanceToSpoolState"); ThreadUpdateProcessLength (seglength,(void *)ThreadDistanceToSpoolEnded); + SegmentState = false; + PreSegmentState = false; + DTSState = true; return OK; } char Endstr[150]; //******************************************************************************************************************** - uint32_t ThreadEndState(void *JobDetails) + uint32_t ThreadEndState(void ) { int Motor_i; ThreadControlActive = false; @@ -777,6 +842,7 @@ char Endstr[150]; Report(Endstr,__FILE__,__LINE__,(int)TotalProcessedLength,RpWarning,(int)PoolerTotalProcessedLength,0); ThreadUpdateProcessLength (0.0,(void *)NULL); + TotalProcessedLength = 0.0; SetOriginMotorSpeed(0); #ifdef HUNDRED_MICROSECONDS_DANCER_READ MillisecLogClose(); @@ -807,7 +873,7 @@ char Endstr[150]; } MotorStop(HARDWARE_MOTOR_TYPE__MOTO_RLOADING,Hard_Hiz); MotorStop(HARDWARE_MOTOR_TYPE__MOTO_LLOADING,Hard_Hiz); - + IDS_StopLubrication(); return OK; } diff --git a/Software/Embedded_SW/Embedded/Modules/Waste/Waste.h b/Software/Embedded_SW/Embedded/Modules/Waste/Waste.h index e69de29bb..f6b7d760a 100644 --- a/Software/Embedded_SW/Embedded/Modules/Waste/Waste.h +++ b/Software/Embedded_SW/Embedded/Modules/Waste/Waste.h @@ -0,0 +1,105 @@ +#ifndef WASTE_H +#define WASTE_H + + +#define temp_funcion 0 +#define notOK 1 + + +/* +#define SENSORFULL 1 +#define SENSOROVERFLOW 1 +#define SENSOREMPTY 0 + + +#define SENSORnotFULL 0 +#define SENSORnotOVERFLOW 0 +#define SENSORnotEMPTY 1 +*/ +#define PUMPON 1 +#define PUMPOFF 0 + +#define PRECENSE 1 +#define NOTPRECENSE 0 + +typedef unsigned char U8; + +typedef enum +{ + WHS_CarteidgeNotPrecense = 0, + WHS_CarteidgePrecense +} WHS_CarteidgPrecenseSensorStatus; + +typedef enum +{ + WHS_CartridgeCoverCLOSE = 0, + WHS_CartridgeCoverOPEN +} WHS_CarteidgeCoverSensorStatus; + +typedef enum +{ + SENSORnotFULL = 0, + SENSORFULL +} WHS_FullSensorStatus; + +typedef enum +{ + SENSOREMPTY = 0, + SENSORnotEMPTY +} WHS_EmptySensorStatus; + +typedef enum +{ + WHS_empty = 0, + WHS_filling, + WHS_emptying, + WHS_full, + WHS_overflow, + WHS_sttError +} WHS_sttMachin; + +typedef enum +{ + WHS_no_event = 0, + WHS_overflow_sensor, + WHS_full_sensor, + WHS_empty_sensor, + WHS_waste1_presence_sensor, + WHS_waste2_presence_sensor, + WHS_filter_sensor, + WHS_cartridge_cover_sensor, + WHS_Timeout +} WHS_sensor; + +typedef enum +{ + WasteEmpty = 0, + WasteFilling, + WasteFail, + WasteFull +} cartridge_status; + +typedef enum +{ + led_on = 0, + led_off, + led_blink, + led_panic +} led_status; + +typedef enum +{ + waste_cartridge1 = 0, + waste_cartridge2, + no_waste_cartridge +} cartridge_name; + + +U8 WHS_init(void); +U8 WHS_HW_test(void); +bool WHS_IsEmptying(); + + + +#endif + diff --git a/Software/Embedded_SW/Embedded/Modules/Waste/Waste_init.c b/Software/Embedded_SW/Embedded/Modules/Waste/Waste_init.c index e69de29bb..447e954d4 100644 --- a/Software/Embedded_SW/Embedded/Modules/Waste/Waste_init.c +++ b/Software/Embedded_SW/Embedded/Modules/Waste/Waste_init.c @@ -0,0 +1,1326 @@ +/* ---- WHS */ +#include +#include +#include "include.h" +#include "Modules/Control/control.h" // use for FPGA IO +#include "drivers/FPGA/FPGA_GPIO/FPGA_GPIO.h"//#include "FPGA_GPIO.h" // use for FPGA IO +#include "drivers/Valves/Valve.h" +#include "Common/report/report.h" +#include "Modules/Waste/Waste.h" + +#include +#include "Modules/AlarmHandling/AlarmHandling.h" + + +#define WasteTankCallBackTime eOneSecond +#define CartridgeCoverCallBackTime eOneSecond +#define CartridgeCoverCallBackFastTime eTenMillisecond +#define CartridgeWaste1CallBackTime eOneSecond +#define CartridgeWaste2CallBackTime eOneSecond +#define STARTCOUNT 1 +#define STOPCOUNT 0 +#define PumpTimeout 60 // minutes + + +/*------------Waste Tank function-----------------------*/ +bool initWHS_WasteTank(); +bool InitWasteCartStatus(); + +bool CartridgeCoverCBFunction(); +U8 CartridgeCoverCallBackFunction(); +WHS_sensor CartridgeWaste1CallBackFunction(); +WHS_sensor CartridgeWaste2CallBackFunction(); +WHS_sensor WasteTankCallBackFunction(); +U8 CartridgeWasteFilling(bool status); +bool WasteTankCBFunction(); + +U8 CartridgePrecenceCBFunction(); +U8 SetCartridgeLED(cartridge_name name,led_status led); + +bool SetWastePump( bool power); +bool SetValveDirection(); +bool RdCartridgeCoverSensor(); +bool RdWasteCartridge1Sensor(); +bool RdWasteCartridge2Sensor(); +bool RdWasteTankFilterSensor(); +bool RdWasteTankOverFlowSensor(); +bool RdWasteTankFullSensor(); +bool RdWasteTankEmptySensor(); +bool RdWasteCartridgeParam(cartridge_name cart_name); +bool CartridgeAuthentication(cartridge_name cart_name); +bool SetActiveWastCartridge(); + + + +struct waste_cartridge_params +{ + uint32_t serial_number; + cartridge_status status; /*WasteEmpty, WasteFilling, WasteFail, WasteFull*/ + bool autheticate; +}; + +struct pump_params +{ + bool status; + uint32_t time; +}; + + +struct WHS_sensors_status +{ + WHS_CarteidgeCoverSensorStatus cartridge_cover; /*open(1) ,close(0) */ + WHS_CarteidgPrecenseSensorStatus waste_cartridge1_precense_sensor; /*presence(1) ,not_precense(0) */ + bool waste_cartridge1_precense_sensor_flag; /* 1=event 0=no enent */ + WHS_CarteidgPrecenseSensorStatus waste_cartridge2_precense_sensor; /*presence(1) ,not_precense(0) */ + bool waste_cartridge2_precense_sensor_flag; /* 1=event 0=no enent */ + bool waste_tank_filter_sensor; /*presence(1) ,not_precense(0) */ + WHS_EmptySensorStatus waste_tank_empty_sensor; /*enpty(1) ,not_empty(0) */ + WHS_FullSensorStatus waste_tank_full_sensor; /*full(1) ,not_full(0) */ + bool waste_tank_over_flow_sensor; /*over_flow(1) ,not_over_flow(0) */ +}; + + + +struct WHS_information +{ + WHS_sttMachin sttMachine; + struct waste_cartridge_params cartridge_1, cartridge_2; + struct WHS_sensors_status WHS_sensors; + struct pump_params WHS_pump; + bool WHS_valve; + WHS_sensor event; + cartridge_name active_cartridge; + uint32_t Cartridge_Waste1_device_Id; + uint32_t Cartridge_Waste2_device_Id; + uint32_t Cartridge_Cover_device_Id; +}; + +struct WHS_information WHS_info; + + +bool WHS_IsEmptying() +{ + bool ret = false; + if ( WHS_info.sttMachine == WHS_emptying ) + { + ret = true; + } + return ret; +} + + +/* -------- cartridge function ----*/ + + +bool RdWasteCartridgeParam(cartridge_name cart_name) +{ + /* + read all parameters from RFid cartridge: + serial number, cartridge_status... + waste_cartridge 1 or 1 + update waste_cartridge struct + */ + if (cart_name == waste_cartridge1) + { + WHS_info.cartridge_1.serial_number = temp_funcion; //to do + WHS_info.cartridge_1.status = temp_funcion; // to do + } + else + { + WHS_info.cartridge_2.serial_number = temp_funcion; + WHS_info.cartridge_2.status = temp_funcion; + } + return OK; +} + +bool CartridgeAuthentication(cartridge_name cart_name) +{ + bool ret = notOK; + // TBD; + switch (cart_name) + { + case waste_cartridge1: + WHS_info.cartridge_1.autheticate = PASSED; + break; + case waste_cartridge2: + WHS_info.cartridge_2.autheticate = PASSED; + break; + default: + WHS_info.cartridge_1.autheticate = FAILED; + WHS_info.cartridge_2.autheticate = FAILED; + break; + } + ret = OK; + return ret; +} + +/* +bool check_RFID_authentication() +{ + bool ret = notOK; + // rd_waste_cartridge_param(); + if ( 1 ) + ret = OK; + return ret; +} + + +U8 Wr_cartridge_RFid(cartridge_name cartridge, cartridge_status status) +{ + bool ret = notOK; + // TBD; + ret = OK; + return ret; +} + +U8 set_cartridge_2(U8 cartridge_status) +{ + bool ret = notOK; + WHS_info.cartridge_2.status = temp_funcion; + return ret; +} +*/ + +/* ------------------------------*/ + + +bool SetWastePump( bool power) +{ + /* + set the waste pump on/off + off - : + 1. when waste tank is empty + 2. when empting is time out + 3. cartrigde cover is open + 4. when waste1 is not precense AND valve3way==1 + 5. when waste2 is not precense AND valve3way==2 + 6. when autentication with waste cartige is disable + on : + 1. when waste_tank_full + + void Pumps_Control(PUMPS_ENUM Pump_Id, bool Direction) //1 - OPEN, 0 - CLOSE ?? WHS_WTANKPUMP2 or WASTECH_PUMP2 + */ + bool ret = notOK; + if ( power == OPEN ) + { + Pumps_Control(WHS_WTANKPUMP2, OPEN); //waste_pump_power_on(); + REPORT_MSG(WHS_empty," ------------ WHS WHS_empty start PUMP ----------------- "); + WHS_info.WHS_pump.status = OPEN; + WHS_info.WHS_pump.time = STARTCOUNT; + ret = OPEN; + } + else + { + Pumps_Control(WHS_WTANKPUMP2, CLOSE); //waste_pump_power_off(); + REPORT_MSG(WHS_empty," ------------ WHS WHS_empty stop PUMP ----------------- "); + WHS_info.WHS_pump.status = CLOSE; + WHS_info.WHS_pump.time = STOPCOUNT; + ret = CLOSE; + } + return ret; +} + + + + +bool SetValveDirection() +{ + /* + * waste_cartridge = 1- OPEN, 0 - CLOSE + * VALVE_WASTE_TANK + * + * */ + bool ret = notOK; + if (WHS_info.WHS_valve != no_waste_cartridge) + { + Valve_Set(VALVE_WASTE_TANK, WHS_info.WHS_valve); + ret = OK; + } + return ret; +} + + +/*-------------------------- function for WHS ------------------------------- */ + +U8 CartridgeWasteFilling(bool status) +{ + bool ret = notOK; + + if ((status == ON) && (WHS_info.active_cartridge != no_waste_cartridge)) + { + + //if (WHS_info.active_cartridge != no_waste_cartridge) // + { + Valve_Set(VALVE_WASTE_TANK, WHS_info.active_cartridge); //set the valve direction + //Pannel_Leds(PANEL_BUTTON_OR_CRAT_ID Pannel_Led_Id, OPERATION_MODE LED_Mode); //set cartridge led color slow blink + //write RFID status + } + SetWastePump(OPEN); + //WHS_info.WHS_pump.time = 0; + REPORT_MSG(WHS_empty," ------------ WHS WHS_empty start PUMP ----------------- "); + } + else // stop Waste cartridge filling + { + SetWastePump(CLOSE); + Valve_Set(VALVE_WASTE_TANK, waste_cartridge2); //set the valve direction set to low POWER !!! + Pannel_Leds( CART_2, MODE_OFF); //set led color + Pannel_Leds( CART_3, MODE_OFF); //set led color + + //write RFID status + } + return ret; +} + +/* ------read waste tank sensors ----------- */ +bool RdWasteTankEmptySensor() +{ + bool ret = notOK; + WHS_Read_GPI_Registers(); + //WHS_info.WHS_sensors.waste_tank_empty_sensor = WHS_GPI_WCONTAINER_WARN(); + //ret = WHS_info.WHS_sensors.waste_tank_empty_sensor; + ret = WHS_GPI_WCONTAINER_WARN(); + return ret; +} + +bool RdWasteTankFullSensor() +{ + bool ret = notOK; + WHS_Read_GPI_Registers(); + //WHS_info.WHS_sensors.waste_tank_full_sensor = WHS_GPI_WCONTAINER_FULL(); + //ret = WHS_info.WHS_sensors.waste_tank_full_sensor; + ret = WHS_GPI_WCONTAINER_FULL(); + return ret; +} + +bool RdWasteTankOverFlowSensor() +{ + bool ret = notOK; + WHS_Read_GPI_Registers(); + //WHS_info.WHS_sensors.waste_tank_over_flow_sensor = WHS_GPI_WASTE_OVERFULL(); + //ret = WHS_info.WHS_sensors.waste_tank_over_flow_sensor; + ret = WHS_GPI_WASTE_OVERFULL(); + return ret; +} + +/*-------------*/ + + +WHS_sttMachin UpdateStateMachine() +{ + //WHS_sttMachin ret = WHS_sttError ; + + if ( WHS_info.WHS_sensors.waste_tank_full_sensor == SENSORnotFULL) + { + WHS_info.sttMachine = WHS_empty ; + REPORT_MSG(WHS_empty," ------------ WHS WHS_empty ----------------- "); + } + else if ((WHS_info.WHS_sensors.waste_tank_full_sensor == SENSORFULL) && + (WHS_info.WHS_sensors.waste_tank_empty_sensor == SENSORnotEMPTY)) + { + WHS_info.sttMachine = WHS_full ; + REPORT_MSG(WHS_full," ------------ WHS WHS_full ----------------- "); + } + else + { + WHS_info.sttMachine = WHS_sttError ; + REPORT_MSG(WHS_sttError," ------------ WHS sensor Error ----------------- "); + } + +/* if (//(WHS_info.WHS_sensors.waste_tank_over_flow_sensor == SENSORnotOVERFLOW) && + ( WHS_info.WHS_sensors.waste_tank_full_sensor == SENSORnotFULL) && + ((WHS_info.WHS_sensors.waste_tank_empty_sensor == SENSORnotEMPTY) || + (WHS_info.WHS_sensors.waste_tank_empty_sensor == SENSOREMPTY))) + WHS_info.sttMachine = WHS_empty ; + else if (//(WHS_info.WHS_sensors.waste_tank_over_flow_sensor == SENSORnotOVERFLOW) && + (WHS_info.WHS_sensors.waste_tank_full_sensor == SENSORFULL) && + (WHS_info.WHS_sensors.waste_tank_empty_sensor == SENSORnotEMPTY)) + WHS_info.sttMachine = WHS_full ; + else if (//(WHS_info.WHS_sensors.waste_tank_over_flow_sensor == SENSOROVERFLOW) && + (WHS_info.WHS_sensors.waste_tank_full_sensor == SENSORFULL) && + (WHS_info.WHS_sensors.waste_tank_empty_sensor == SENSORnotEMPTY)) + WHS_info.sttMachine = WHS_overflow ; + else + { + WHS_info.sttMachine = WHS_sttError ; + REPORT_MSG(WHS_sttError," ------------ WHS sensor Error ----------------- "); + } +*/ + return OK; +} + + +bool initWHS_WasteTank() +{ + WHS_info.WHS_sensors.waste_tank_empty_sensor = RdWasteTankEmptySensor(); + WHS_info.WHS_sensors.waste_tank_full_sensor = SENSORnotFULL;//RdWasteTankFullSensor(); + UpdateStateMachine(); + AddControlCallback(WasteTankCBFunction, WasteTankCallBackTime , WasteTankCallBackFunction, 0,0,0);//eOneMinute + return OK; +} + + +/* +WHS_sensor OverflowSensorEvent() +{ + WHS_sensor ret = WHS_no_event; + if (RdWasteTankOverFlowSensor() != WHS_info.WHS_sensors.waste_tank_over_flow_sensor) + { + WHS_info.event = WHS_overflow_sensor; + ret = WHS_overflow_sensor; + WHS_info.WHS_sensors.waste_tank_over_flow_sensor = !(WHS_info.WHS_sensors.waste_tank_over_flow_sensor); + } + return ret; +} +*/ + +WHS_sensor EmptySensorEvent() +{ + WHS_sensor ret = WHS_no_event; + if (RdWasteTankEmptySensor() != WHS_info.WHS_sensors.waste_tank_empty_sensor) + { + WHS_info.event = WHS_empty_sensor; + ret = WHS_empty_sensor; + WHS_info.WHS_sensors.waste_tank_empty_sensor = !WHS_info.WHS_sensors.waste_tank_empty_sensor; + } + return ret; +} + +WHS_sensor FullSensorEvent() +{ + WHS_sensor ret = WHS_no_event; + if ( RdWasteTankFullSensor() != WHS_info.WHS_sensors.waste_tank_full_sensor ) + { + WHS_info.event = WHS_full_sensor; + ret = WHS_full_sensor; + WHS_info.WHS_sensors.waste_tank_full_sensor = !WHS_info.WHS_sensors.waste_tank_full_sensor; + } + return ret; +} + +WHS_sensor WasteTankCallBackFunction() +{ + /* detect waste tank sensor event */ + WHS_sensor ret = WHS_no_event; +/* if ( OverflowSensorEvent()) + { + return WHS_info.event; + } + else */ + if (WHS_info.WHS_pump.time) WHS_info.WHS_pump.time += 1; + if (WHS_info.WHS_pump.time == PumpTimeout) + { + WHS_info.WHS_pump.time = 0; + AlarmHandlingSetAlarm( EVENT_TYPE__WASTE_CONTAINER_EMPTYING_TIMEOUT, false); + return WHS_info.event = WHS_Timeout; + } + if ( FullSensorEvent()) + { + return WHS_info.event; + } + else if ( EmptySensorEvent()) + { + return WHS_info.event; + } + + return ret; +} + +/* +bool start_WHS_machin() +{ + AddControlCallback( WasteTankCBFunction, eTenMillisecond, WasteTankCallBackFunction, 0,0,0 );// eOneMinute + return OK; +} + */ + +bool WasteTankCBFunction() +{ + bool ret = notOK; + static bool pump_on_flag = CLOSE; + //uint32_t Cartridge_Cover_device_Id = 0; + + + switch (WHS_info.event) + { + case WHS_empty_sensor: + if (WHS_info.WHS_sensors.waste_tank_empty_sensor == SENSORnotEMPTY) + { + if (WHS_info.sttMachine == WHS_empty) + WHS_info.sttMachine = WHS_filling; + else + { + REPORT_MSG(WHS_filling," ------------ WHS EMPTY sensor failed !!!!!!! ----------------- "); + } + } + else //SENSOREMPTY + { + if (WHS_info.sttMachine == WHS_emptying) + { + WHS_info.sttMachine = WHS_empty; + ret = CartridgeWasteFilling(OFF); + WHS_info.Cartridge_Cover_device_Id = RemoveControlCallback(WHS_info.Cartridge_Cover_device_Id, WasteTankCBFunction ); + WHS_info.Cartridge_Cover_device_Id = AddControlCallback( WasteTankCBFunction, CartridgeCoverCallBackTime, CartridgeCoverCallBackFunction, 0,0,0 );//eOneSecond + //SafeRemoveControlCallback(Cartridge_Cover_device_Id, CartridgeCoverCBFunction ); + } + else + { + REPORT_MSG(WHS_emptying," ------------ WHS EMPTY sensor failed !!!!!!! ----------------- "); + } + } + break; + case WHS_full_sensor: + if (WHS_info.WHS_sensors.waste_tank_full_sensor == SENSORFULL) + { + if (WHS_info.sttMachine == WHS_filling) + { + WHS_info.sttMachine = WHS_full; + WHS_info.Cartridge_Cover_device_Id = RemoveControlCallback(WHS_info.Cartridge_Cover_device_Id, WasteTankCBFunction ); + WHS_info.Cartridge_Cover_device_Id = AddControlCallback( WasteTankCBFunction, CartridgeCoverCallBackFastTime , CartridgeCoverCallBackFunction, 0,0,0 );//eTenMillisecond + ret = CartridgeWasteFilling(ON); + // cant start a new Job + } + else + { + REPORT_MSG(WHS_filling," ------------ WHS FULL sensor failed !!!!!!! ----------------- "); + } + } + else + { + if (WHS_info.sttMachine == WHS_full) + { + WHS_info.sttMachine = WHS_emptying; + // can start a new JOB + } + else + { + REPORT_MSG(WHS_full," ------------ WHS FULL sensor failed !!!!!!! ----------------- "); + } + } + break; + +/* case WHS_overflow_sensor: + if (WHS_info.WHS_sensors.waste_tank_empty_sensor) + { + + // 1.StopMacine + WHS_info.sttMachine = WHS_overflow; + } + else + { + WHS_info.sttMachine = WHS_full; + } + break; +*/ + case WHS_cartridge_cover_sensor: + if ( WHS_info.WHS_sensors.cartridge_cover == OPEN ) + { + if ( WHS_info.WHS_pump.status == OPEN) + { + CartridgeWasteFilling(CLOSE); + pump_on_flag = OPEN; + } + WHS_info.Cartridge_Waste1_device_Id = AddControlCallback( WasteTankCBFunction, CartridgeWaste1CallBackTime, CartridgeWaste1CallBackFunction, 0,0,0 ); //eOneSecond + WHS_info.Cartridge_Waste2_device_Id = AddControlCallback( WasteTankCBFunction, CartridgeWaste2CallBackTime, CartridgeWaste2CallBackFunction, 0,0,0 ); //eOneSecond + + + + //if (WHS_info.WHS_pump == ON) + //{ + // SetWastePump(OFF); //pump OFF + //} + // prevent NEW Job + // Display "Close cartridge cover" + // pop up message in GUI + } + else // CLOSE + { + //if (WHS_info.sttMachine == WHS_full) CartridgeWasteFilling(OPEN); + SetActiveWastCartridge(); + if (pump_on_flag == OPEN ) + { + CartridgeWasteFilling(OPEN); + pump_on_flag = CLOSE; + } + WHS_info.Cartridge_Waste1_device_Id = RemoveControlCallback(WHS_info.Cartridge_Waste1_device_Id, WasteTankCBFunction ); + WHS_info.Cartridge_Waste2_device_Id = RemoveControlCallback(WHS_info.Cartridge_Waste2_device_Id, WasteTankCBFunction ); + } + break; + case WHS_waste1_presence_sensor : + if (WHS_info.WHS_sensors.waste_cartridge1_precense_sensor == WHS_CarteidgePrecense ) // waste cartridge 1 is inserted . + { + SetCartridgeLED(waste_cartridge1, led_on); + RdWasteCartridgeParam(waste_cartridge1); + if ( CartridgeAuthentication(waste_cartridge1)) // to define authentication + { + //WHS_info.cartridge_1.autheticate = PASSED; //='0' + //???WHS_info.WHS_valve = waste_cartridge1; // or we should do it only before pumping???? + //???SetValveDirection(); // or we should do it only before pumping???? + } + else + { + //WHS_info.cartridge_1.autheticate = FAILED; //='1' + SetCartridgeLED(waste_cartridge1, led_off); + } + } + else // waste cartridge 1 take out + { + WHS_info.cartridge_1.autheticate = FAILED; + //???if (WHS_info.cartridge_2.autheticate == PASSED) // or we should do it only before pumping???? + //???{ + //???WHS_info.WHS_valve = waste_cartridge; + //???SetValveDirection(); + //???} + //???else + //???{ + //??? + //???} + //??? RdWasteCartridgeParam(waste_cartridge2); + //???WHS_info.WHS_valve = waste_cartridge1; + } + //SetActiveWastCartridge(); + break; + case WHS_waste2_presence_sensor : + if (WHS_info.WHS_sensors.waste_cartridge2_precense_sensor == WHS_CarteidgePrecense ) // waste cartridge is inserted . + { + SetCartridgeLED(waste_cartridge2, led_on); + RdWasteCartridgeParam(waste_cartridge2); + if ( CartridgeAuthentication(waste_cartridge2)) // to define authentication + { + //WHS_info.cartridge_2.autheticate = PASSED; //='0' + //???WHS_info.WHS_valve = waste_cartridge2; // or we should do it only before pumping???? + //???SetValveDirection(); // or we should do it only before pumping???? + } + else + { + //WHS_info.cartridge_2.autheticate = FAILED; //='1' + SetCartridgeLED(waste_cartridge2, led_off); + } + } + else // waste cartridge 2 take out + { + WHS_info.cartridge_2.autheticate = FAILED; + /* + if (WHS_info.cartridge_2.autheticate == PASSED) // or we should do it only before pumping???? + { + WHS_info.WHS_valve = waste_cartridge; + SetValveDirection(); + } + else + { + + } + RdWasteCartridgeParam(waste_cartridge2); + WHS_info.WHS_valve = waste_cartridge1; + */ + } + //SetActiveWastCartridge(); + break; + case WHS_Timeout: + AlarmHandlingSetAlarm( EVENT_TYPE__WASTE_CONTAINER_EMPTYING_TIMEOUT, true); + CartridgeWasteFilling(OFF); + break; + case WHS_no_event: + break; + default: //error state + break; + } + WHS_info.event = WHS_no_event; + return ret; +} + + +/*------------------------------- Cartridge Cover -----------------------------------------*/ + +bool RdCartridgeCoverSensor() +{ + bool ret = notOK; + WHS_Read_GPI_Registers(); + // WHS_info.WHS_sensors.cartridge_cover = Get_COVER_1_State(CartridgesDoor); + // ret = WHS_info.WHS_sensors.cartridge_cover; + ret = Get_COVER_1_State(CartridgesDoor); + return ret; +} + + + + +WHS_sensor CartridgeCoverCallBackFunction() +{ + WHS_sensor ret = WHS_no_event; + //ret = RdCartridgeCoverSensor(); + if (WHS_info.WHS_sensors.cartridge_cover != RdCartridgeCoverSensor()) + { + WHS_info.event = WHS_cartridge_cover_sensor; + WHS_info.WHS_sensors.cartridge_cover = !WHS_info.WHS_sensors.cartridge_cover; + ret = WHS_cartridge_cover_sensor; + } + return ret; +} + +WHS_sensor CartridgeWaste1CallBackFunction() +{ + WHS_sensor ret = WHS_no_event; + //ret = RdCartridgeCoverSensor(); + if (WHS_info.WHS_sensors.waste_cartridge1_precense_sensor != RdWasteCartridge1Sensor()) + { + WHS_info.event = WHS_waste1_presence_sensor; + WHS_info.WHS_sensors.waste_cartridge1_precense_sensor = !WHS_info.WHS_sensors.waste_cartridge1_precense_sensor; + ret = WHS_waste1_presence_sensor; + } + return ret; +} + +WHS_sensor CartridgeWaste2CallBackFunction() +{ + WHS_sensor ret = WHS_no_event; + //ret = RdCartridgeCoverSensor(); + if (WHS_info.WHS_sensors.waste_cartridge2_precense_sensor != RdWasteCartridge2Sensor()) + { + WHS_info.event = WHS_waste2_presence_sensor; + WHS_info.WHS_sensors.waste_cartridge2_precense_sensor = !WHS_info.WHS_sensors.waste_cartridge2_precense_sensor; + ret = WHS_waste2_presence_sensor; + } + return ret; +} + +/*------------------------------- Cartridge Waste -----------------------------------------*/ +bool InitWasteCartStatus() +{ + WHS_info.WHS_sensors.cartridge_cover = RdCartridgeCoverSensor(); + WHS_info.WHS_sensors.waste_cartridge1_precense_sensor = RdWasteCartridge1Sensor(); + WHS_info.WHS_sensors.waste_cartridge2_precense_sensor = RdWasteCartridge2Sensor(); + if (WHS_info.WHS_sensors.waste_cartridge1_precense_sensor == WHS_CarteidgePrecense) CartridgeAuthentication(waste_cartridge1); + if (WHS_info.WHS_sensors.waste_cartridge2_precense_sensor == WHS_CarteidgePrecense) CartridgeAuthentication(waste_cartridge2); + SetActiveWastCartridge(); + + if (WHS_info.WHS_sensors.cartridge_cover == WHS_CartridgeCoverOPEN) + { + WHS_info.Cartridge_Waste1_device_Id = AddControlCallback( WasteTankCBFunction, eOneSecond, CartridgeWaste1CallBackFunction, 0,0,0 ); + WHS_info.Cartridge_Waste2_device_Id = AddControlCallback( WasteTankCBFunction, eOneSecond, CartridgeWaste2CallBackFunction, 0,0,0 ); + } + WHS_info.Cartridge_Cover_device_Id = AddControlCallback( WasteTankCBFunction, eOneSecond, CartridgeCoverCallBackFunction, 0,0,0 ); + + return OK; +} + +bool RdWasteCartridge1Sensor() +{ + bool ret = notOK; + WHS_Read_GPI_Registers(); + //WHS_info.WHS_sensors.waste_cartridge1_precense_sensor = Is_Cartridge_Present(CART_2); + //ret = WHS_info.WHS_sensors.waste_cartridge1_precense_sensor; + ret = Is_Cartridge_Present(CART_2); + return ret; +} + +bool RdWasteCartridge2Sensor() +{ + bool ret = notOK; + WHS_Read_GPI_Registers(); + //WHS_info.WHS_sensors.waste_cartridge2_precense_sensor = Is_Cartridge_Present(CART_3); + //ret = WHS_info.WHS_sensors.waste_cartridge2_precense_sensor; + ret = Is_Cartridge_Present(CART_3); + return ret; +} + +bool SetActiveWastCartridge() +{ + bool ret = notOK; + if (( WHS_info.WHS_sensors.waste_cartridge1_precense_sensor == PRECENSE ) && + (WHS_info.cartridge_1.autheticate == PASSED)) WHS_info.active_cartridge = waste_cartridge1; + else if (( WHS_info.WHS_sensors.waste_cartridge2_precense_sensor == PRECENSE) && + (WHS_info.cartridge_2.autheticate == PASSED)) WHS_info.active_cartridge = waste_cartridge2; + else WHS_info.active_cartridge = no_waste_cartridge; + return ret; + +} + +/* +U8 RdWastePrecenseSensor(cartridge_name name) +{ + + // we have 2 waste_cartridge (waste_cartridge1 and waste_cartridge2) + // bool Is_Cartridge_Present(PANEL_BUTTON_OR_CRAT_ID Cartridge); //use CART_2 or CART_3 + + WHS_Read_GPI_Registers(); + switch (name) + { + case waste_cartridge1: + if (WHS_info.WHS_sensors.waste_cartridge1_precense_sensor != Is_Cartridge_Present(CART_2)) + { + WHS_info.WHS_sensors.waste_cartridge1_precense_sensor = !WHS_info.WHS_sensors.waste_cartridge1_precense_sensor; + WHS_info.event = WHS_waste1_presence_sensor; + } + break; + case waste_cartridge2: + if (WHS_info.WHS_sensors.waste_cartridge2_precense_sensor != Is_Cartridge_Present(CART_3)) + { + WHS_info.WHS_sensors.waste_cartridge2_precense_sensor = !WHS_info.WHS_sensors.waste_cartridge2_precense_sensor; + WHS_info.event = WHS_waste2_presence_sensor; + } + break; + default : + break; + } + return OK; +} +*/ +/* +U8 cartridge_handeling() +{ + AddControlCallback( CartridgePrecenceCBFunction, eOneMinute, CartridgePrecenceCallBackFunction, 0,0,0 ); // + return OK; +} +*/ + +U8 SetCartridgeLED(cartridge_name name,led_status led) +{ + bool ret = notOK; + return ret; +} + +/* +U8 CartridgePrecenceCBFunction() +{ + if ( WHS_info.WHS_sensors.waste_cartridge1_precense_sensor_flag ) // if we have changes at cartridge1: + { + if (WHS_info.WHS_sensors.waste_cartridge1_precense_sensor) // if new cartridge is presence: + { + if (rd_waste_cartridge_param()== OK) //read parameter from RFID + SetCartridgeLED(waste_cartridge1,led_on); //change led status to ON + } + else // if the cartridge is removed + { + SetCartridgeLED(waste_cartridge1, led_off); //change led status to OFF + } + WHS_info.WHS_sensors.waste_cartridge1_precense_sensor_flag = 0; //remove the flag + + } + else if (WHS_info.WHS_sensors.waste_cartridge2_precense_sensor_flag ) + { + if (WHS_info.WHS_sensors.waste_cartridge2_precense_sensor) + { + + } + else + { + + } + } + return OK; +}*/ +/* +U8 CartridgePrecenceCallBackFunction() +{ + bool ret = notOK; + return ret; +} +*/ + + + + + + + + +bool CartridgeCoverCBFunction() +{ + bool ret = notOK; + if (WHS_info.WHS_sensors.cartridge_cover == OPEN) + { + //if (WHS_info.WHS_pump == ON) + //{ + SetWastePump(OFF); //pump OFF + //} + // prevent NEW Job + // Display "Close cartridge cover" + // pop up message in GUI + } + else + { + // can do a NEW Job + // remove message "Close cartridge cover" + // remove pop up message in GUI + } + WHS_info.event = WHS_no_event; + return ret; +} + + +/*------------------------------------------------------------------------------------------------*/ + + + +U8 WHS_init(void) +{ + InitWasteCartStatus(); + initWHS_WasteTank(); + SetWastePump(CLOSE); + return 0; +} + + + + + + + + + + + + + + + + + +/*---------------------------------- HW Test --------------------------------------------------------------*/ + + + +bool RdWasteTankFilterSensor() +{ + bool ret = notOK; + WHS_Read_GPI_Registers(); + WHS_info.WHS_sensors.waste_tank_filter_sensor = WHS_GPI_SW_FILTER_PRES(); + ret = WHS_info.WHS_sensors.waste_tank_filter_sensor; + return ret; +} + + +U8 RdCartridgeDoor() +{ + bool ret = notOK; + ret = RdCartridgeCoverSensor(); + return ret; +} +U8 RdWaste1() +{ + bool ret = notOK; + ret = RdWasteCartridge1Sensor(); + return ret; +} +U8 RdWaste2() +{ + bool ret = notOK; + ret = RdWasteCartridge2Sensor(); + return ret; +} +U8 SetValve(bool value) +{ + bool ret = notOK; + ret = SetValveDirection( ); + return ret; +} + +U8 SetPump(bool value) +{ + bool ret = notOK; + ret = SetWastePump(value); + return ret; +} + +U8 RdFilter() +{ + bool ret = notOK; + ret = RdWasteTankFilterSensor(); + return ret; +} +U8 RdEmpty() +{ + bool ret = notOK; + ret = RdWasteTankEmptySensor(); + return ret; +} +U8 RdFull() +{ + bool ret = notOK; + ret = RdWasteTankFullSensor(); + return ret; +} +U8 RdOverFlow() +{ + bool ret = notOK; + RdWasteTankOverFlowSensor(); + return ret; +} + + + +U8 WHS_HW_test() +{ + bool ret = notOK; +/* ret = RdCartridgeDoor(); + while (ret == RdCartridgeDoor()); +*/ +/* --- connect JO271 cable ---*/ + ret = RdWaste1(); + while (ret == RdWaste1());// blue = waste1 + ret = RdWaste2(); + while (ret == RdWaste2());// yellow = waste2 + + /* --- connect JO71 JO72 JO121 cable ---*/ + + ret = SetValve(1); //red LED On + ret = SetValve(0); //red LED Off + + + ret = SetPump(1); // led green (backplan) On + ret = SetPump(0); // led green (backplan) Off + + ret = RdFilter(); + while (ret == RdFilter()); + ret = RdEmpty(); + while (ret == RdEmpty()); + ret = RdFull(); + while (ret == RdFull()); +// ret = RdOverFlow(); +// while (ret == RdOverFlow()); + return ret; +} + + + + + + + + +/*------------------------------------------------------------------------------------------------*/ + +/* +//U8 WasteCartridgeCallBackFunction(); +//U8 WasteCartridgeCBFunction(); + +bool start_WHS_machin(); +U8 CartridgePrecenceCallBackFunction(); +uint32_t EmptyWasteTankFullCBFunction(); +U8 cartridge_handeling(); + +U8 RdWastePrecenseSensor(cartridge_name name); + +U8 rd_waste_cartridge_param(); +U8 set_cartridge_1(U8 cartridge_status); +U8 set_cartridge_2(U8 cartridge_status); +U8 check_sensors_before_start_emptying(); +bool check_RFID_authentication(); + +uint32_t waste_tank_init(void); +uint32_t EmptyWasteTankCBFunction(); + + + +U8 WasteCartridgeCallBackFunction() +{ + bool ret = notOK; + + ret = RdWastePrecenseSensor(waste_cartridge1); + ret = RdWastePrecenseSensor(waste_cartridge2); + return ret; +} + + +U8 Wr_cartridge_RFid(cartridge_name cartridge, cartridge_status status); +WHS_sttMachin UpdateStateMachine(); + +*/ + +// uint32_t updateWasteTankStruct(); +//uint32_t WasteTankFullCallBackFunction(uint32_t IfIndex, uint32_t ReadValue); + +/*--- functipons not in use ----*/ + +/* +U8 check_sensors_before_start_emptying() ???????????????????? +{ + bool ret = notOK; + + if ((WHS_info.WHS_sensors.cartridge_cover == CLOSE) && + (( WHS_info.WHS_sensors.waste_cartridge1_precense_sensor == precense) || + (WHS_info.WHS_sensors.waste_cartridge2_precense_sensor == precense)) && + (WHS_info.WHS_sensors.waste_tank_filter_sensor == 1 )) + { + ret = OK; + } + return ret; +} + + + + +uint32_t updateWasteTankStruct() //----------what is the timing??????----------------- +{ +// bool waste_number =1; + + rd_waste_precense_sensor( ); + RdWasteTankFilterSensor(); + rd_whs_cartridge_cover(); + +// rd_waste_tank_RdWasteTankEmptySensor_sensor(); +// RdWasteTankFullSensor(); +// rd_waste_tank_over_flow_sensor(); + return OK; +} + + + + +uint32_t WasteTankFullCallBackFunction(uint32_t IfIndex, uint32_t ReadValue) +{ + if ( RdWasteTankFullSensor() != WHS_info.WHS_sensors.waste_tank_full_sensor ) + { + WHS_info.event = WHS_full_sensor; + WHS_info.WHS_sensors.waste_tank_full_sensor = !WHS_info.WHS_sensors.waste_tank_full_sensor; + } + return OK; +} + + +uint32_t WasteTankEmptyCallBackFunction(uint32_t IfIndex, uint32_t ReadValue) +{ + if (RdWasteTankEmptySensor() != WHS_info.WHS_sensors.waste_tank_empty_sensor) + { + WHS_info.event = WHS_empty_sensor; + WHS_info.WHS_sensors.waste_tank_empty_sensor = !WHS_info.WHS_sensors.waste_tank_empty_sensor; + } + return OK; +} + +uint32_t WasteTankOverflowCallBackFunction(uint32_t IfIndex, uint32_t ReadValue) +{ + if (rd_waste_tank_over_flow_sensor() != WHS_info.WHS_sensors.waste_tank_over_flow_sensor) + { + WHS_info.event = WHS_overflow_sensor; + WHS_info.WHS_sensors.waste_tank_over_flow_sensor = !(WHS_info.WHS_sensors.waste_tank_over_flow_sensor); + } + return OK; +} + + +U8 CartridgeCoverCallBackFunction() +{ + bool ret = notOK; + return ret; +} + + +U8 CartridgeCoverCBFunction() +{ + bool ret = notOK; + return ret; +} + + + + +uint32_t WHS_machin() +{ + switch( WHS_info.sttMachine ) + { + case WHS_empty: // last OnOffPBstate was OFF + + break; + case WHS_filling : // last OnOffPBstate was COUNTPB + + break; + case WHS_emptying: // last OnOffPBstate was SHORTPB + + break; + case WHS_full: + + break; + case WHS_overflow: + + break; + default: // WHS_sttError + break; + } + return OK; +} + + + + +uint32_t EmptyWasteTankCBFunction() +{ + bool ret = notOK; +//--------try state machine------- + if (WHS_info.event == WHS_no_event) + return OK; + else + { +// WHS_info.sttMachine = UpdateStateMachine(); +// WHS_info.event = WHS_no_event; + switch (WHS_info.event) + { + case WHS_empty_sensor: + if (WHS_info.WHS_sensors.waste_tank_empty_sensor) + { + + } + else + { + ret = CartridgeWasteFilling(OFF); + } + break; + case WHS_full_sensor: + if (WHS_info.WHS_sensors.waste_tank_full_sensor) + { + ret = CartridgeWasteFilling(ON); + // cant start a new Job + } + else + { + // can start a new JOB + WHS_info.sttMachine = WHS_empty; + } + break; + case WHS_overflow_sensor: + if (WHS_info.WHS_sensors.waste_tank_empty_sensor) + { + + // 1.StopMacine + // 2. + + WHS_info.sttMachine = WHS_overflow; + } + else + { + WHS_info.sttMachine = WHS_full; + } + break; + default: //error state + break; + } + WHS_info.event = WHS_no_event;; + } + return ret; +} + + + +uint32_t start_WHS_machin() +{ + switch( WHS_info.sttMachine ) + { + case WHS_empty: // last OnOffPBstate was OFF + AddControlCallback( EmptyWasteTankCBFunction, eOneMinute, WasteTankEmptyCallBackFunction, 0,0,0 ); // + break; + case WHS_filling : // last OnOffPBstate was COUNTPB + AddControlCallback( EmptyWasteTankCBFunction, eOneMinute, WasteTankFullCallBackFunction, 0,0,0 ); // + AddControlCallback( EmptyWasteTankCBFunction, eOneMinute, WasteTankEmptyCallBackFunction, 0,0,0 ); // + break; + case WHS_emptying: // last OnOffPBstate was SHORTPB + AddControlCallback( EmptyWasteTankCBFunction, eOneMinute, WasteTankEmptyCallBackFunction, 0,0,0 ); // + AddControlCallback( EmptyWasteTankCBFunction, eOneMinute, WasteTankFullCallBackFunction, 0,0,0 ); // + break; + case WHS_full: + AddControlCallback( EmptyWasteTankCBFunction, eOneMinute, WasteTankFullCallBackFunction, 0,0,0 ); // + AddControlCallback( EmptyWasteTankCBFunction, eOneMinute, WasteTankOverflowCallBackFunction, 0,0,0 ); // + break; + case WHS_overflow: + AddControlCallback( EmptyWasteTankCBFunction, eOneMinute, WasteTankFullCallBackFunction, 0,0,0 ); // + AddControlCallback( EmptyWasteTankCBFunction, eOneMinute, WasteTankOverflowCallBackFunction, 0,0,0 ); // + break; + default: // WHS_sttError + break; + } + return OK; +} + +*/ + +//U8 WasteCartridgeCBFunction() +//{ +// bool ret = notOK; +// switch (WHS_info.event) +// { +// /*case WHS_waste1_presence_sensor : +// if (WHS_info.WHS_sensors.waste_cartridge1_precense_sensor ) // waste cartridge 1 is inserted . +// { +// SetCartridgeLED(waste_cartridge1, led_on); +// RdWasteCartridgeParam(waste_cartridge1); +// if ( CartridgeAuthentication(waste_cartridge1)) // to define authentication +// { +// //WHS_info.cartridge_1.autheticate = PASSED; //='0' +// //???WHS_info.WHS_valve = waste_cartridge1; // or we should do it only before pumping???? +// //???SetValveDirection(); // or we should do it only before pumping???? +// } +// else +// { +// //WHS_info.cartridge_1.autheticate = FAILED; //='1' +// SetCartridgeLED(waste_cartridge1, led_off); +// } +// } +// else // waste cartridge 1 take out +// { +// WHS_info.cartridge_1.autheticate = FAILED; +// //???if (WHS_info.cartridge_2.autheticate == PASSED) // or we should do it only before pumping???? +// //???{ +// //???WHS_info.WHS_valve = waste_cartridge; +// //???SetValveDirection(); +// //???} +// //???else +// //???{ +// //??? +// //???} +// //??? RdWasteCartridgeParam(waste_cartridge2); +// //???WHS_info.WHS_valve = waste_cartridge1; +// } +// +// break; +// case WHS_waste2_presence_sensor : +// if (WHS_info.WHS_sensors.waste_cartridge2_precense_sensor ) // waste cartridge is inserted . +// { +// SetCartridgeLED(waste_cartridge2, led_on); +// RdWasteCartridgeParam(waste_cartridge2); +// if ( CartridgeAuthentication(waste_cartridge2)) // to define authentication +// { +// //WHS_info.cartridge_2.autheticate = PASSED; //='0' +// //???WHS_info.WHS_valve = waste_cartridge2; // or we should do it only before pumping???? +// //???SetValveDirection(); // or we should do it only before pumping???? +// } +// else +// { +// //WHS_info.cartridge_2.autheticate = FAILED; //='1' +// SetCartridgeLED(waste_cartridge2, led_off); +// } +// } +// else // waste cartridge 2 take out +// { +// WHS_info.cartridge_2.autheticate = FAILED; +// +// if (WHS_info.cartridge_2.autheticate == PASSED) // or we should do it only before pumping???? +// { +// WHS_info.WHS_valve = waste_cartridge; +// SetValveDirection(); +// } +// else +// { +// +// } +// RdWasteCartridgeParam(waste_cartridge2); +// WHS_info.WHS_valve = waste_cartridge1; +// +// } +// break;*/ +// default: +// break; +// } +// +// WHS_info.event = WHS_no_event; +// +// return ret; +//} + + +//IDS_Dispenser_Build_Pressure_Callback + + +/*------------------------------------------------------------------------------------------------*/ + + + + diff --git a/Software/Embedded_SW/Embedded/StateMachines/Initialization/InitSequence.c b/Software/Embedded_SW/Embedded/StateMachines/Initialization/InitSequence.c index e385c33a2..64cb99918 100644 --- a/Software/Embedded_SW/Embedded/StateMachines/Initialization/InitSequence.c +++ b/Software/Embedded_SW/Embedded/StateMachines/Initialization/InitSequence.c @@ -23,6 +23,8 @@ #include "InitSequence.h" #include "drivers/I2C_Communication/DAC/Blower.h" +#include "drivers/I2C_Communication/ADC_MUX/ADC_MUX.h" +#include "drivers/Valves/Valve.h" #include "heaters/heaters_ex.h" @@ -38,7 +40,7 @@ INIT_SEQUENCE_MACHINE_READY_TO_DYE, INIT_SEQUENCE_END, }INIT_SEQUENCE_STAGES_ENUM; - INIT_SEQUENCE_STAGES_ENUM InitStages = INIT_SEQUENCE_INIT; + INIT_SEQUENCE_STAGES_ENUM InitStages = INIT_SEQUENCE_INIT, StoredInitStages = INIT_SEQUENCE_INIT; MACHINE_STATE_STAGES_ENUM MachineState = MACHINE_STATE_INIT; MACHINE_STATE_STAGES_ENUM GetMachineState(void) @@ -49,7 +51,9 @@ void SetMachineState(MACHINE_STATE_STAGES_ENUM NewState) { MachineState = NewState; } -uint32_t HWControlId; +uint32_t HWControlId,InitSchedulerControlId; +uint32_t MidTankControlId; + uint32_t RESET_Cause = 0; void InitSequenceResetReason(void); @@ -72,7 +76,7 @@ uint32_t InitSequenceCallBackFunction(uint32_t IfIndex, uint32_t BusyFlag) { ActivateHeadMagnet(); InitStages++; - InitSequenceStateMachine(InitStages); + //InitSequenceStateMachine(InitStages); } else { @@ -81,11 +85,23 @@ uint32_t InitSequenceCallBackFunction(uint32_t IfIndex, uint32_t BusyFlag) } return OK; } +/*******************************************************************************************************/ +uint32_t InitScheduler(uint32_t IfIndex, uint32_t BusyFlag) +{ + if (InitStages > StoredInitStages) + { + StoredInitStages = InitStages; + InitSequenceStateMachine(InitStages); + } + return OK; +} +/*******************************************************************************************************/ uint32_t Start_InitSequence(void) { MachineState = MACHINE_STATE_HW_CONFIG; HWControlId = AddControlCallback( InitSequenceCallBackFunction, 4* eOneSecond, TemplateDataReadCBFunction,0,0, 0 ); + InitSchedulerControlId = AddControlCallback( InitScheduler, eOneSecond, TemplateDataReadCBFunction,0,0, 0 ); return OK; } void InitSequenceResetReason(void) @@ -104,7 +120,7 @@ void InitSequenceResetReason(void) LOG_ERROR(RESET_Cause,"Reset Reason Register"); SysCtlResetCauseClear(RESET_Cause); InitStages++; - InitSequenceStateMachine(InitStages); + //InitSequenceStateMachine(InitStages); //return OK; } @@ -113,7 +129,7 @@ void InitSequenceBuiltInTestCallBack(uint32_t IfIndex, uint32_t BusyFlag) if (1)//BIT OK { InitStages++; - InitSequenceStateMachine(InitStages); + //InitSequenceStateMachine(InitStages); } else { @@ -127,6 +143,44 @@ uint32_t InitSequenceBuiltInTest(void) InitSequenceBuiltInTestCallBack(0,0); return OK; } +int MidTankOperationCounter = 0; +uint32_t InitSequenceMidTankCallBackFunction(uint32_t IfIndex, uint32_t BusyFlag) +{ + int MidTankOpenAir = 8; + int MidTankReadPressure = 16; + int MidTankCloseAir = 24; + int MidTankEnd = 32; + int portId; + + if (MidTankOperationCounter >= MidTankEnd) + { + SafeRemoveControlCallback(MidTankControlId, InitSequenceMidTankCallBackFunction); + } + else if (MidTankOperationCounter >= MidTankCloseAir) + { + //close air valve for midtank (MidTankOperationCounter-MidTankCloseAir) + portId = (MidTankOperationCounter - MidTankCloseAir) ; //0-7 + Disable_MidTank_Pressure_Reading(portId); + Valve_Set(IDS_Id_to_AirValve[portId], Atm_MidTank_OFF ); //Atm_MidTank_OFF/ON + } + else if (MidTankOperationCounter >= MidTankReadPressure) + { + //read pressure for midtank (MidTankOperationCounter-MidTankCloseAir) + for (portId = 0;portId < MAX_SYSTEM_DISPENSERS;portId++) + { + Read_MidTank_Pressure_Sensor(portId); + } + } + else if (MidTankOperationCounter >= MidTankOpenAir) + { + //open air valve for midtank (MidTankOperationCounter-MidTankOpenAir) + portId = (MidTankOperationCounter - MidTankOpenAir) ; //0-7 + Enable_MidTank_Pressure_Reading(portId); + Valve_Set(IDS_Id_to_AirValve[portId], Atm_MidTank_ON ); //Atm_MidTank_OFF/ON + } + MidTankOperationCounter++; + return OK; +} uint32_t InitSequenceBlowerCallBackFunction(uint32_t IfIndex, uint32_t BusyFlag) { if (SafeRemoveControlCallback(HWControlId, InitSequenceBlowerCallBackFunction )==OK) @@ -137,7 +191,7 @@ uint32_t InitSequenceBlowerCallBackFunction(uint32_t IfIndex, uint32_t BusyFlag) Control_Voltage_To_Blower(BlowerCfg.heatingvoltage); Safety_Init(); InitStages++; - InitSequenceStateMachine(InitStages); + //InitSequenceStateMachine(InitStages); return OK; } uint32_t InitSequenceInitialBlowerActivation(void) @@ -150,20 +204,46 @@ uint32_t InitSequenceInitialBlowerActivation(void) Control_Voltage_To_Blower(BlowerCfg.voltage); HWControlId = AddControlCallback( InitSequenceBlowerCallBackFunction, 10* eOneSecond/*eHundredMillisecond*/, TemplateDataReadCBFunction,0,0, 0 ); } + MidTankControlId = AddControlCallback( InitSequenceMidTankCallBackFunction, 300/*eHundredMillisecond*/, TemplateDataReadCBFunction,0,0, 0 ); + + return OK; +} +int NumOfCheckedDispnsers = 0; +uint32_t InitSequenceDispenserPressureBuildUpTestCallBackFunction(uint32_t IfIndex, uint32_t BusyFlag) +{ + NumOfCheckedDispnsers--; + if(NumOfCheckedDispnsers==0) + { + InitStages++; + //InitSequenceStateMachine(InitStages); + MachineState = MACHINE_STATE_DISPENSER_PRESSURE_BUILDUP_TEST; + + } return OK; } uint32_t InitSequenceDispenserPressureBuildUpTest(void) { - InitStages++; - InitSequenceStateMachine(InitStages); - MachineState = MACHINE_STATE_DISPENSER_PRESSURE_BUILDUP_TEST; + int Dispenser_i; + Report("InitSequenceDispenserPressureBuildUpTest",__FILE__,__LINE__,(int)0,RpWarning,(int)0,0); + + for (Dispenser_i = 0;Dispenser_i=powerIdleSecondsLimit) + { + if (powerIdleState == false) + { + Report("PowerIdle Idle activated ",__FILE__,__LINE__,(int)powerIdleSecondsLimit,RpWarning,(int)powerIdleSecondsCounter,0); + powerIdleState = true; + //SetPowerMachineState(sttIDLE); + //move to idle state + PowerIdleSetIdle(); + } + } + return OK; +} +void PowerIdleInit(void) +{ + IdleControlId = AddControlCallback( PowerIdleCallBackFunction, eOneSecond, TemplateDataReadCBFunction,0,0, 0 ); + if (IdleControlId == 0xFF) + Report("AddControlCallback failed",__FILE__,__LINE__,(int)IdleControlId,RpWarning,(int)0,0); + Report("PowerIdleInit ",__FILE__,__LINE__,(int)powerIdleSecondsLimit,RpWarning,(int)0,0); + +} +int getIdleCounter (void) {return powerIdleSecondsCounter;} +void setIdleLimit (int Limit) {powerIdleSecondsLimit = Limit;} +void setmachineActive(bool Active){machineActive = Active;} +void resetIdleCounter (void) {powerIdleSecondsCounter = 0;} +bool getIdleState (void) {return powerIdleState;} + +void PowerIdleOutOfIdleState(void) +{ + Report("PowerIdle Out of Idle ",__FILE__,__LINE__,(int)powerIdleSecondsLimit,RpWarning,(int)powerIdleSecondsCounter,0); + powerIdleSecondsCounter = 0; + if (powerIdleState == true) + { + powerIdleState = false; + //SetPowerMachineState(sttON); + if (HandleProcessParameters(&ActiveProcessParameters)!= OK) + { + LOG_ERROR (1, "Turn Heaters active failed"); + return ; + } + } + +} +void PowerIdleActivateIdleState(void) +{ + Report("PowerIdle Activate Idle ",__FILE__,__LINE__,(int)machineActive,RpWarning,(int)powerIdleSecondsCounter,0); + if (machineActive == true) + { + LOG_ERROR(machineActive, "machine is active, cannot switch on idle state"); + return; + } + powerIdleSecondsCounter = 0; + if (powerIdleState == false) + { + powerIdleState = true; + PowerIdleSetIdle(); + } + +} diff --git a/Software/Embedded_SW/Embedded/StateMachines/Initialization/PowerIdle.h b/Software/Embedded_SW/Embedded/StateMachines/Initialization/PowerIdle.h new file mode 100644 index 000000000..efe0e7cb4 --- /dev/null +++ b/Software/Embedded_SW/Embedded/StateMachines/Initialization/PowerIdle.h @@ -0,0 +1,27 @@ +/* + * PowerIdle.h + * + * Created on: Apr 3, 2019 + * Author: shlomo + */ + +#ifndef STATEMACHINES_INITIALIZATION_POWERIDLE_H_ +#define STATEMACHINES_INITIALIZATION_POWERIDLE_H_ + +int getIdleCounter (void); + +void setIdleLimit (int Limit); + +void resetIdleCounter (void); +bool getIdleState (void); + +void PowerIdleOutOfIdleState(void); +void PowerIdleActivateIdleState(void); + +void setmachineActive(bool Active); +void PowerIdleInit(void); + + + + +#endif /* STATEMACHINES_INITIALIZATION_POWERIDLE_H_ */ diff --git a/Software/Embedded_SW/Embedded/StateMachines/Initialization/PowerOffSequence.c b/Software/Embedded_SW/Embedded/StateMachines/Initialization/PowerOffSequence.c new file mode 100644 index 000000000..454204229 --- /dev/null +++ b/Software/Embedded_SW/Embedded/StateMachines/Initialization/PowerOffSequence.c @@ -0,0 +1,347 @@ +/* + * PowerOffSequence.c + * + * Created on: Apr 2, 2019 + * Author: shlomo + */ + + +#include "modules/General/GeneralHardware.h" +#include "modules/General/Safety.h" +#include "modules/thread/thread.h" +#include "modules/waste/waste.h" +#include "modules/ids/ids.h" +#include "modules/control/control.h" +#include "modules/AlarmHandling/AlarmHandling.h" +#include "modules/heaters/heaters_ex.h" +#include "modules/Diagnostics/Diagnostics.h" +#include "Modules/General/process.h" + +#include "Modules/Thread/Thread_ex.h" +#include "Common/SWUpdate/FirmwareUpgrade.h" + +#include "StateMachines/Printing/PrintingSTM.h" +#include "PowerIdle.h" +#include "InitSequence.h" + +#include "drivers/I2C_Communication/DAC/Blower.h" +#include "drivers/I2C_Communication/ADC_MUX/ADC_MUX.h" +#include "drivers/Heater/TemperatureSensor.h" +#include "drivers/Valves/Valve.h" + +#include "heaters/heaters_ex.h" + +#include "PowerOffSequence.h" +/* + typedef enum + { + POWER_OFF_INIT, + POWER_OFF_HEAD_CLEAN, + POWER_OFF_MIXER_FLUSH, + POWER_OFF_HEATERS_OFF, + POWER_OFF_STORE_DATA, + POWER_OFF_WAIT_FOR_PROCESSES,//wait for waste emptying, ink filling, thread loading + POWER_OFF_STOP_RUNNING_JOB, + POWER_OFF_SET_VALVE_POSITION, + POWER_OFF_WAIT_FOR_TEMPERATURE, + POWER_OFF_TURN_OFF_DRYER_FAN, + POWER_OFF_TURN_OFF_COOLER, + POWER_OFF_TURN_OFF_BLOWER, + POWER_OFF_POWER_OFF, + POWER_OFF_MAX, + }POWER_OFF_STAGES_ENUM; +*/ +POWER_OFF_STAGES_ENUM PowerOffMachineState = POWER_OFF_INIT,StoredMachineState = POWER_OFF_INIT; +uint32_t PowerOffControlId = 0xFF; +uint32_t WaitForProcessControlId = 0xFF; +uint32_t PowerOffSequenceStateMachine( POWER_OFF_STAGES_ENUM ReadValue); + +/*******************************************************************************************************/ +uint32_t PowerOffScheduler(uint32_t IfIndex, uint32_t BusyFlag) +{ + if (PowerOffMachineState > StoredMachineState) + { + StoredMachineState = PowerOffMachineState; + PowerOffSequenceStateMachine (PowerOffMachineState); + } + return OK; +} +/*******************************************************************************************************/ +uint32_t PowerOffInit(void) +{ + LOG_ERROR(0,"Power Off Init"); + PowerOffMachineState = POWER_OFF_HEAD_CLEAN; + PowerOffControlId = AddControlCallback( PowerOffScheduler, eOneSecond, TemplateDataReadCBFunction,0,0, 0 ); + return OK; +} +/*******************************************************************************************************/ +uint32_t PowerOffCancel(void) +{ + if (PowerOffMachineState >= POWER_OFF_HEAD_CLEAN) + PowerOffMachineState = POWER_OFF_CANCELLED; + return OK; +} + +/*******************************************************************************************************/ +uint32_t PowerOffHeadClean(void) +{ + //TBD + PowerOffMachineState = POWER_OFF_MIXER_FLUSH; + return OK; +} +/*******************************************************************************************************/ +uint32_t PowerOffMixerFlush(void) +{ + //TBD + PowerOffMachineState = POWER_OFF_HEATERS_OFF; + return OK; +} +/*******************************************************************************************************/ +uint32_t PowerOffHeatersOff(void) +{ + ProcessParameters ProcessParametersClear; + ProcessParametersClear.dryerzone1temp = 0; + ProcessParametersClear.dryerzone2temp = 0; + ProcessParametersClear.dryerzone3temp = 0; + ProcessParametersClear.mixertemp = 0; + ProcessParametersClear.headzone1temp = 0; + ProcessParametersClear.headzone2temp = 0; + ProcessParametersClear.headzone3temp = 0; + ProcessParametersClear.headzone4temp = 0; + ProcessParametersClear.headzone5temp = 0; + ProcessParametersClear.headzone6temp = 0; + ProcessParametersClear.dyeingspeed = 40; + if (HandleProcessParameters(&ProcessParametersClear)!= OK) + { + LOG_ERROR (PowerOffMachineState, "Turn Off Heaters failed"); + return ERROR; + } + + PowerOffMachineState = POWER_OFF_STORE_DATA; + + return OK; +} +/*******************************************************************************************************/ +uint32_t PowerOffStoreData(void) +{ + //TBD + REPORT_MSG (PowerOffMachineState, "Store Data"); + IDS_Dispenser_Store_Data(); + PowerOffMachineState = POWER_OFF_WAIT_FOR_PROCESSES; + return OK; +} +/*******************************************************************************************************/ +int WaitForProcessCounter = 0; +uint32_t PowerOffWaitForProcessesCallback(uint32_t IfIndex, uint32_t BusyFlag) +{ + if ((WHS_IsEmptying()|| + //MidTankFillingActive()|| + ThreadLoadingActive()|| + SwUpgradeActive())&& + (WaitForProcessCounter++<900)) + { + REPORT_MSG (PowerOffMachineState, "On going processes, wait for end of process"); + resetIdleCounter(); + } + else + { + PowerOffMachineState = POWER_OFF_SET_VALVE_POSITION; + SafeRemoveControlCallback(WaitForProcessControlId, PowerOffWaitForProcessesCallback); + WaitForProcessControlId = 0xFF; + } + return OK; +} +/*******************************************************************************************************/ +uint32_t PowerOffWaitForProcesses(void) +{ + int i; + REPORT_MSG (PowerOffMachineState, "Stop dispensers homing"); + for (i=0;i= MaxTemp)&&(readTemp < 28000)) + MaxTemp = readTemp; + readTemp = TemperatureSensorRead( TEMP_SENSE_ANALOG_DYEINGH_TEMP1); + if ((readTemp>= MaxTemp)&&(readTemp < 28000)) + MaxTemp = readTemp; + readTemp = TemperatureSensorRead( TEMP_SENSE_ANALOG_DYEINGH_TEMP2); + if ((readTemp>= MaxTemp)&&(readTemp < 28000)) + MaxTemp = readTemp; + readTemp = TemperatureSensorRead( TEMP_SENSE_ANALOG_DYEINGH_TEMP3); + if ((readTemp>= MaxTemp)&&(readTemp < 28000)) + MaxTemp = readTemp; + readTemp = TemperatureSensorRead( TEMP_SENSE_ANALOG_DYEINGH_TEMP4); + if ((readTemp>= MaxTemp)&&(readTemp < 28000)) + MaxTemp = readTemp; + readTemp = TemperatureSensorRead( TEMP_SENSE_ANALOG_DYEINGH_TEMP5); + if ((readTemp>= MaxTemp)&&(readTemp < 28000)) + MaxTemp = readTemp; + readTemp = TemperatureSensorRead( HEAD6_PT100); + if ((readTemp>= MaxTemp)&&(readTemp < 28000)) + MaxTemp = readTemp; + readTemp = TemperatureSensorRead( TEMP_SENSE_ANALOG_DRYER_TEMP1); + if ((readTemp>= MaxTemp)&&(readTemp < 28000)) + MaxTemp = readTemp; + +#define POWER_OFF_TEMP_THRESHOLD 10000 + + if ((MaxTemp>POWER_OFF_TEMP_THRESHOLD)&&(WaitForProcessCounter++<1800)) + { + Report("On going cooling down, wait for end of cooling",__FILE__,__LINE__,(int)MaxTemp,RpWarning,(int)WaitForProcessCounter,0); + resetIdleCounter(); + } + else + { + Report("ended cooling down, wait for end of cooling",__FILE__,__LINE__,(int)MaxTemp,RpWarning,(int)WaitForProcessCounter,0); + PowerOffMachineState = POWER_OFF_TURN_OFF_DRYER_FAN; + SafeRemoveControlCallback(WaitForProcessControlId, PowerOffWaitForTemperatureCallback); + WaitForProcessControlId = 0xFF; + } + return OK; +} +/*******************************************************************************************************/ +uint32_t PowerOffWaitForTemperature(void) +{ + if (WaitForProcessControlId == 0xFF) + { + WaitForProcessCounter = 0; + WaitForProcessControlId = AddControlCallback( PowerOffWaitForTemperatureCallback, eOneSecond, TemplateDataReadCBFunction,0,0, 0 ); + } + //TBD + return OK; +} +/*******************************************************************************************************/ +uint32_t PowerOffTurnOffDryerFan(void) +{ + Control_Dryer_Fan(STOP,75);//use START or STOP, 0 - 100% + PowerOffMachineState = POWER_OFF_TURN_OFF_COOLER; + + //TBD + return OK; +} +/*******************************************************************************************************/ +uint32_t PowerOffTurnOffCooler(void) +{ + uint32_t DeActivateChiller(); + PowerOffMachineState = POWER_OFF_TURN_OFF_BLOWER; + return OK; +} +/*******************************************************************************************************/ +uint32_t PowerOffTurnOffBlower(void) +{ + Turn_the_Blower_Off();//Turn off + PowerOffMachineState = POWER_OFF_POWER_OFF; + return OK; +} +/*******************************************************************************************************/ +uint32_t PowerOffPowerOff(void) +{ + int i; + for (i = 0;i<10;i++) + { + REPORT_MSG (10-i, "Power off in x seconds"); + Task_sleep (1000); + } + Power_Off(); + return OK; +} +/*******************************************************************************************************/ +uint32_t PowerOffSequenceStateMachine( POWER_OFF_STAGES_ENUM ReadValue) +{ + uint32_t status = OK; + + REPORT_MSG(ReadValue,"PowerOffSequenceStateMachine"); + switch (ReadValue) + { + case POWER_OFF_INIT: + break; + case POWER_OFF_HEAD_CLEAN: + status = PowerOffHeadClean(); + break; + case POWER_OFF_MIXER_FLUSH: + status = PowerOffMixerFlush(); + break; + case POWER_OFF_HEATERS_OFF: + status = PowerOffHeatersOff(); + break; + case POWER_OFF_STORE_DATA: + status = PowerOffStoreData(); + break; + case POWER_OFF_WAIT_FOR_PROCESSES: //wait for waste emptying: ink filling: thread loading + status = PowerOffWaitForProcesses(); + break; + case POWER_OFF_STOP_RUNNING_JOB: + status = PowerOffStopRunningJob(); + break; + case POWER_OFF_SET_VALVE_POSITION: + status = PowerOffSetValvePosition(); + break; + case POWER_OFF_WAIT_FOR_TEMPERATURE: + status = PowerOffWaitForTemperature(); + break; + case POWER_OFF_TURN_OFF_DRYER_FAN: + status = PowerOffTurnOffDryerFan(); + break; + case POWER_OFF_TURN_OFF_COOLER: + status = PowerOffTurnOffCooler(); + break; + case POWER_OFF_TURN_OFF_BLOWER: + status = PowerOffTurnOffBlower(); + break; + case POWER_OFF_POWER_OFF: + status = PowerOffPowerOff(); + break; + case POWER_OFF_ERROR: + case POWER_OFF_CANCELLED: + RemoveControlCallback( PowerOffControlId,PowerOffScheduler); + PowerOffControlId = 0xFF; + RemoveControlCallback(WaitForProcessControlId, PowerOffWaitForProcessesCallback); + RemoveControlCallback(WaitForProcessControlId, PowerOffWaitForTemperatureCallback); + WaitForProcessControlId = 0xFF; + LOG_ERROR(ReadValue,"POWER OFF Cancelled"); + break; + default: + LOG_ERROR(ReadValue,"ERROR IN POWER OFF STATE MACHINE"); + break; + } +return OK; +} + diff --git a/Software/Embedded_SW/Embedded/StateMachines/Initialization/PowerOffSequence.h b/Software/Embedded_SW/Embedded/StateMachines/Initialization/PowerOffSequence.h new file mode 100644 index 000000000..af4d4230d --- /dev/null +++ b/Software/Embedded_SW/Embedded/StateMachines/Initialization/PowerOffSequence.h @@ -0,0 +1,36 @@ +/* + * PowerOffSequence.h + * + * Created on: Apr 2, 2019 + * Author: shlomo + */ + +#ifndef STATEMACHINES_INITIALIZATION_POWEROFFSEQUENCE_H_ +#define STATEMACHINES_INITIALIZATION_POWEROFFSEQUENCE_H_ + + typedef enum + { + POWER_OFF_INIT, + POWER_OFF_HEAD_CLEAN, + POWER_OFF_MIXER_FLUSH, + POWER_OFF_HEATERS_OFF, + POWER_OFF_STORE_DATA, + POWER_OFF_WAIT_FOR_PROCESSES,//wait for waste emptying, ink filling, thread loading + POWER_OFF_STOP_RUNNING_JOB, + POWER_OFF_SET_VALVE_POSITION, + POWER_OFF_WAIT_FOR_TEMPERATURE, + POWER_OFF_TURN_OFF_DRYER_FAN, + POWER_OFF_TURN_OFF_COOLER, + POWER_OFF_TURN_OFF_BLOWER, + POWER_OFF_POWER_OFF, + POWER_OFF_ERROR, + POWER_OFF_CANCELLED, + POWER_OFF_MAX, + }POWER_OFF_STAGES_ENUM; + + +uint32_t PowerOffInit(void); +uint32_t PowerOffCancel(void);//POWER_OFF_CANCELLED + + +#endif /* STATEMACHINES_INITIALIZATION_POWEROFFSEQUENCE_H_ */ diff --git a/Software/Embedded_SW/Embedded/StateMachines/Printing/JobSTM.c b/Software/Embedded_SW/Embedded/StateMachines/Printing/JobSTM.c index 8c3d127ab..b5034a11c 100644 --- a/Software/Embedded_SW/Embedded/StateMachines/Printing/JobSTM.c +++ b/Software/Embedded_SW/Embedded/StateMachines/Printing/JobSTM.c @@ -37,6 +37,7 @@ #include "PMR/Printing/CurrentJobResponse.pb-c.h" #include "PMR/Printing/ResumeCurrentJobRequest.pb-c.h" #include "PMR/Printing/ResumeCurrentJobResponse.pb-c.h" +#include "PMR/Printing/JobUploadStrategy.pb-c.h" #include "PMR/Printing/JobStatus.pb-c.h" #include "PMR/Printing/AbortJobRequest.pb-c.h" #include "PMR/Printing/AbortJobResponse.pb-c.h" @@ -58,6 +59,7 @@ #include "PMR/Diagnostics/ThreadAbortJoggingRequest.pb-c.h" #include "PMR/Diagnostics/ThreadAbortJoggingResponse.pb-c.h" +#include "StateMachines/Initialization/PowerIdle.h" #include "./printingSTM.h" #include "modules/thread/thread_ex.h" @@ -88,7 +90,7 @@ JobSegment *TSegment; JobSpool *Tspool; bool CopyConfigured[MAX_SYSTEM_MODULES]; char ErrorMsg[100]; - +JobUploadStrategy uploadstrategy = JOB_UPLOAD_STRATEGY__Default; ModuleStateEnum PrepareWaiting[MAX_SYSTEM_MODULES] = {ModuleIdle,ModuleIdle,ModuleIdle,ModuleIdle,ModuleIdle}; @@ -377,6 +379,7 @@ uint32_t ThreadJoggingFunc(int speed) { //load essential job prameters to enable thread running Ticket.n_segments = 1; + n_segments = 1; Ticket.segments = my_malloc(sizeof(Ticket.segments)); TSegment = my_malloc(sizeof(JobSegment)); Tspool = my_malloc(sizeof(JobSpool)); @@ -387,7 +390,7 @@ uint32_t ThreadJoggingFunc(int speed) Tspool->bottombackingrate = 18; Tspool->segmentoffsetpulses = 1000; Tspool->startoffsetpulses = 240; - Tspool->rotationsperpassage = 6; + Tspool->rotationsperpassage = 3.1415926*2; Ticket.spool = Tspool; CurrentJob = &Ticket; InternalWindingConfigMessage(Tspool); @@ -587,6 +590,10 @@ void JobRequestFunc(MessageContainer* requestContainer) ErrorCode error = ERROR_CODE__NONE; JobEndReasonEnum JobAlarmReason = JOB_OK; + if (JobActive == true) + { + LOG_ERROR(JobActive, "Job started while active"); + } JobRequest* request = job_request__unpack(NULL, requestContainer->data.len, requestContainer->data.data); if (request != NULL) { @@ -608,7 +615,17 @@ void JobRequestFunc(MessageContainer* requestContainer) if (CurrentRequest!= NULL) job_request__free_unpacked(CurrentRequest,NULL); CurrentRequest = request; - + n_segments = 0; + if (CurrentJob->uploadstrategy == JOB_UPLOAD_STRATEGY__JobDescriptionFile) + { + LOG_ERROR(JobActive, "Job upload strategy file"); + uploadstrategy = JOB_UPLOAD_STRATEGY__JobDescriptionFile; + } + else + { + uploadstrategy = JOB_UPLOAD_STRATEGY__Default; + n_segments = CurrentJob->n_segments; + } status = PASSED; JobEndReason = JOB_OK; JobAlarmReason = AlarmHandlingPrepareJob(CurrentJob); @@ -645,7 +662,8 @@ void JobRequestFunc(MessageContainer* requestContainer) } if (status == PASSED) { - Report("Job Request ",__FILE__,__LINE__,Ticket->processparameters->dyeingspeed,RpWarning,Ticket->n_segments, Ticket->intersegmentlength); + Report("Job Request ",__FILE__,__LINE__,Ticket->processparameters->dyeingspeed,RpWarning,n_segments, Ticket->intersegmentlength); + OpenJobFile(); StartJob(CurrentJob); } } @@ -937,6 +955,7 @@ Void jobTask(UArg arg0, UArg arg1) case JobRequestMsg: JobEndReason = JOB_OK; JobActive = true; + setmachineActive(true); /*ValidateState (CurrentJob); break; case ValidationResultsOk:*/ @@ -960,6 +979,8 @@ Void jobTask(UArg arg0, UArg arg1) break; case PrintingResultsOk: JobActive = false; + setmachineActive(false); + resetIdleCounter(); CurrentJob = NULL; //if (CurrentRequest!= NULL) // job_request__free_unpacked(CurrentRequest,NULL); @@ -971,6 +992,8 @@ Void jobTask(UArg arg0, UArg arg1) break; case PrintingResultsFail: JobActive = false; + setmachineActive(false); + resetIdleCounter(); CurrentJob = NULL; //if (CurrentRequest!= NULL) // job_request__free_unpacked(CurrentRequest,NULL); diff --git a/Software/Embedded_SW/Embedded/StateMachines/Printing/PrintingSTM.c b/Software/Embedded_SW/Embedded/StateMachines/Printing/PrintingSTM.c index abbfe07b6..c52ed8b4c 100644 --- a/Software/Embedded_SW/Embedded/StateMachines/Printing/PrintingSTM.c +++ b/Software/Embedded_SW/Embedded/StateMachines/Printing/PrintingSTM.c @@ -25,6 +25,10 @@ #include "PMR/Hardware/UploadHardWareConfigurationRequest.pb-c.h" #include "PMR/Hardware/HardwareMotorType.pb-c.h" #include "modules/General/process.h" +#include "PMR/Printing/JobDescriptionFileBrushStop.pb-c.h" +#include "PMR/Printing/JobDescriptionFileSegment.pb-c.h" +#include "Common/SWUpdate/FileSystem.h" +#include "drivers/Flash_Memory/fatfs/ff.h" ////////////////////////////////State machine operation//////////////////////////////////// //the state machine operation is used to operate in runtime correct profile flow execution //by recieved esign flow of the user from the UI @@ -34,11 +38,11 @@ * functions describes motor operation flow and movement state during profile execution * used to operate in runtime correct profileflow execution *********************************************************************************************/ -static uint32_t PreSegmentState(void *JobDetails, int); -static uint32_t SegmentState(void *JobDetails, int); +static uint32_t PreSegmentState(void *Segment, int); +static uint32_t SegmentState(void *Segment, int); uint32_t EndState(void *JobDetails, char *Message); //static uint32_t ExitState(void *JobDetails); - +uint16_t n_segments = 0; /********************************************************************** * the array and enum of PrintingState_t below must be in sync order ***********************************************************************/ @@ -65,9 +69,174 @@ ModuleStateEnum EndWaiting[MAX_SYSTEM_MODULES] = {ModuleIdle,ModuleIdle,M bool Configured[MAX_SYSTEM_MODULES] = {false,false,false,false,false}; bool SuspendLargeMessages = false; +/* +Parsing the job description file. +The job description file simply contains an array of segments and their brush stops. +The job description file is meant to be read brush stop by brush stop while the job is in progress. +The following diagram represents a single job description file segment structure. +The process of reading the whole file is simply repeating that reading order. + +Each JobDescriptionFileSegment contains a “BrushStopsCount” field that should be used to determine how many brush stops are associated +with the current segment and how many times the process of reading brush stops should be repeated. +1. 32bit integer containing the next JobFileDescriptionSegment message byte count +2. JobDescriptionFileSegment message +3. 32bit integer containing the next JobDescriptionFileBrushStop message byte count +4. JobDescriptionFileBrushStop message + +1. Read segment message length. +2. Read segment message. +a. Read brush stop message length. +b. Read brush stop message. +c. Go to step 2.a x Segment.BrushStopsCount. +3. Go to step 1 until end of file. +*/ -/******************************************************************************************************************** - * this function is for development initial stages. it analyses the hardware configuration to determine which modules are operational +//job file reading functions +uint32_t bBytes = 0,readbBytes = 0,ImmediateRead = 0,SegmentSize = 0,BrushStopSize = 0; +FRESULT Fresult = FR_OK; +uint8_t *SegmentPtr = 0, *BrushStopPtr = 0; +FIL *JobRequestFileHandle = 0; //the system supports a single active file +FRESULT OpenJobFile() +{ + //n_segments = 0; + if (CurrentJob->uploadstrategy == JOB_UPLOAD_STRATEGY__JobDescriptionFile) + { + JobRequestFileHandle = my_malloc(sizeof(FIL)); + + Fresult = FileOpen(CurrentJob->jobdescriptionfile, &bBytes, JobRequestFileHandle); + if (Fresult == FR_OK) + { + readbBytes = 0; + } + REPORT_MSG(bBytes,"OpenJobFile"); + } + return Fresult; +} +FRESULT CloseJobFile() +{ + Fresult = f_close(JobRequestFileHandle); + readbBytes = 0; + ImmediateRead = 0; + SegmentSize = 0; + BrushStopSize = 0; + my_free (JobRequestFileHandle); + JobRequestFileHandle = NULL; + if (BrushStopPtr) + my_free(BrushStopPtr); + if (SegmentPtr) + my_free(SegmentPtr); + REPORT_MSG(Fresult,"CloseJobFile"); + + return Fresult; +} +JobDescriptionFileSegment *GetNextSegmentFromJobFile() +{ + uint32_t status = OK; + JobDescriptionFileSegment *Segment = NULL; + if (JobRequestFileHandle == NULL) + { + LOG_ERROR(JobRequestFileHandle,"JobRequestFileHandle == NULL"); + return NULL; + } + if(readbBytes < bBytes) + { + Fresult = f_read(JobRequestFileHandle,&SegmentSize,4,&ImmediateRead ); + if (Fresult == FR_OK) + { + readbBytes += ImmediateRead; + if (SegmentPtr) + my_free(SegmentPtr); + SegmentPtr = my_malloc (SegmentSize); + if (SegmentPtr) + { + Fresult = f_read(JobRequestFileHandle,SegmentPtr,SegmentSize,&ImmediateRead ); + if (Fresult == FR_OK) + { + readbBytes += ImmediateRead; + //n_segments++; + Segment = job_description_file_segment__unpack(NULL, SegmentSize, SegmentPtr); + } + }// read segment data + my_free(SegmentPtr); + }//segment malloc + else + { + LOG_ERROR (SegmentPtr, "malloc error"); + status = ERROR; + } + }//segment read size + else + { + LOG_ERROR (Fresult, "f_read error"); + status = ERROR; + } + return Segment; +} +void FreeSegmentFileData(JobDescriptionFileSegment *Segment) +{ + job_description_file_segment__free_unpacked(Segment,NULL); + Segment = NULL; + if (SegmentPtr) + my_free(SegmentPtr); +} +JobDescriptionFileBrushStop *GetNextBrushStopFromJobFile() +{ + uint32_t status = OK; + JobDescriptionFileBrushStop *BrushStop = NULL; + if (JobRequestFileHandle == NULL) + { + LOG_ERROR(JobRequestFileHandle,"JobRequestFileHandle == NULL"); + return NULL; + } + Fresult = f_read(JobRequestFileHandle,&BrushStopSize,4,&ImmediateRead ); + if (Fresult == FR_OK) + { + readbBytes += ImmediateRead; + if (BrushStopPtr) + my_free(BrushStopPtr); + + BrushStopPtr = my_malloc (BrushStopSize); + if (BrushStopPtr) + { + Fresult = f_read(JobRequestFileHandle,BrushStopPtr,BrushStopSize,&ImmediateRead ); + if (Fresult == FR_OK) + { + readbBytes += ImmediateRead; + BrushStop = job_description_file_brush_stop__unpack(NULL, BrushStopSize, BrushStopPtr); + }//brushstop malloc ok + else + { + LOG_ERROR (Fresult, "f_read error"); + status = ERROR; + } + my_free(BrushStopPtr); + }//brushstop size read ok + else + { + LOG_ERROR (BrushStopPtr, "malloc error"); + status = ERROR; + } + }// if brush stop count + else + { + LOG_ERROR (0, "f_read error brush stop size error"); + status = ERROR; + } + REPORT_MSG(BrushStop->index,"BrushStop file Read Index"); + + return BrushStop; +} +void FreeBrushStopFileData(JobDescriptionFileBrushStop *BrushStop) +{ + REPORT_MSG(BrushStop->index,"Free BrushStop file Read Index"); + if (BrushStop) + job_description_file_brush_stop__free_unpacked (BrushStop,NULL); + BrushStop = NULL; + if (BrushStopPtr) + my_free(BrushStopPtr); +} +/************************************************************************************************************************************/ +/* this function is for development initial stages. it analyses the hardware configuration to determine which modules are operational * according to the configuration map */ @@ -158,6 +327,7 @@ uint32_t PreSegmentReady(int ModuleId, ModuleStateEnum result) if (PreSegmentWaiting[ModuleId] != ModuleWaiting) { LOG_ERROR (ModuleId, "Message from unrelated module!!"); + return OK; } PreSegmentWaiting[ModuleId] = result; @@ -191,7 +361,7 @@ uint32_t PreSegmentReady(int ModuleId, ModuleStateEnum result) } //******************************************************************************************************************** -static uint32_t PreSegmentState(void *JobDetails, int SegmentId) +static uint32_t PreSegmentState(void *SegmentDetails, int SegmentId) { SendJobProgress(0.0, SegmentId, false, "PreSegment Start"); if (Configured[Module_Thread]) @@ -208,15 +378,15 @@ static uint32_t PreSegmentState(void *JobDetails, int SegmentId) } if (Configured[Module_Thread]) { - ThreadPreSegmentState(JobDetails,SegmentId); + ThreadPreSegmentState(SegmentDetails,SegmentId); } if (Configured[Module_Winder]) { - Winder_Presegment(JobDetails,SegmentId); //must be after ThreadPreSegmentState + Winder_Presegment(SegmentDetails,SegmentId); //must be after ThreadPreSegmentState } if (Configured[Module_IDS]) { - IDSPreSegmentState(JobDetails,SegmentId); + IDSPreSegmentState(SegmentDetails,SegmentId); } return OK; } @@ -232,11 +402,13 @@ uint32_t SegmentReady(int ModuleId, ModuleStateEnum result) assert (ModuleIdmessageData; - Report("PrintSTMMsgHandler",__FILE__,__LINE__, RpMessage,0x1000,Message->messageId,PrtMessage->messageId); + Report("PrintSTMMsgHandler",__FILE__,__LINE__, 1000,RpMessage,Message->messageId,PrtMessage->messageId); if ((Message->messageId != PrintMessage)&&(Message->messageId != Abort)) { @@ -452,10 +628,28 @@ void PrintSTMMsgHandler(void * msg) { case PrintRequest: SegmentId = 0; - PreSegmentState(CurrentJob,SegmentId); + if (CurrentJob->uploadstrategy == JOB_UPLOAD_STRATEGY__JobDescriptionFile) + { + Segment = GetNextSegmentFromJobFile(); + SSegment.length = Segment->length; + SSegment.has_length = Segment->has_length; + SSegment.n_brushstops = Segment->brushstopscount; + PreSegmentState(&SSegment,SegmentId); + } + else + { + PreSegmentState(CurrentJob->segments[SegmentId],SegmentId); + } break; case PreSegmentResultsOk: - SegmentState(CurrentJob,SegmentId); + if (CurrentJob->uploadstrategy == JOB_UPLOAD_STRATEGY__JobDescriptionFile) + { + SegmentState(&SSegment,SegmentId); + } + else + { + SegmentState(CurrentJob->segments[SegmentId],SegmentId); + } break; case PreSegmentResultsFail: EndState(CurrentJob, "PreSegment Failed"); @@ -463,8 +657,9 @@ void PrintSTMMsgHandler(void * msg) break; case SegmentResultsOk: SegmentId++; - LOG_ERROR(SegmentId, "SegmentResultsOk segmentId"); - if (SegmentId >= CurrentJob->n_segments) + //REPORT_MSG(SegmentId, "SegmentResultsOk segmentId"); + Report("SegmentResultsOk segmentId",__FILE__,__LINE__, SegmentId,RpMessage,n_segments,0); + if (SegmentId >= n_segments) { if (dryerbufferlength == 0) EndState(CurrentJob, "Job Ended"); @@ -473,7 +668,21 @@ void PrintSTMMsgHandler(void * msg) } else { - PreSegmentState(CurrentJob,SegmentId); + if (CurrentJob->uploadstrategy == JOB_UPLOAD_STRATEGY__JobDescriptionFile) + { + if (Segment) + FreeSegmentFileData(Segment); + + Segment = GetNextSegmentFromJobFile(); + SSegment.length = Segment->length; + SSegment.has_length = Segment->has_length; + SSegment.n_brushstops = Segment->brushstopscount; + PreSegmentState(&SSegment,SegmentId); + } + else + { + PreSegmentState(CurrentJob->segments[SegmentId],SegmentId); + } } break; case SegmentResultsFail: diff --git a/Software/Embedded_SW/Embedded/StateMachines/Printing/PrintingSTM.h b/Software/Embedded_SW/Embedded/StateMachines/Printing/PrintingSTM.h index 878e063b5..d7d8262f4 100644 --- a/Software/Embedded_SW/Embedded/StateMachines/Printing/PrintingSTM.h +++ b/Software/Embedded_SW/Embedded/StateMachines/Printing/PrintingSTM.h @@ -17,6 +17,9 @@ #include "PMR/Printing/JobRequest.pb-c.h" #include "PMR/Printing/JobTicket.pb-c.h" #include "PMR/Printing/JobResponse.pb-c.h" +#include "PMR/Printing/JobDescriptionFileBrushStop.pb-c.h" +#include "PMR/Printing/JobDescriptionFileSegment.pb-c.h" +#include "drivers/Flash_Memory/fatfs/ff.h" #define MAX_MSG_LEN 100 typedef enum @@ -166,8 +169,10 @@ uint32_t CurrentJobRequestFunc(MessageContainer* requestContainer); uint32_t ResumeCurrentJobRequestFunc(MessageContainer* requestContainer); bool JobIsActive(void); + extern bool SuspendLargeMessages; +extern uint16_t n_segments; void SendJobProgress(double ProcessedLength,int SegmentId, bool done, char *Message); uint32_t PrepareReady(int ModuleId, ModuleStateEnum result); @@ -179,4 +184,12 @@ uint32_t EndState(void *JobDetails, char *Message); bool GetHeatersPrepareWaiting(void); +extern JobUploadStrategy uploadstrategy; +FRESULT OpenJobFile(); +FRESULT CloseJobFile(); +JobDescriptionFileSegment *GetNextSegmentFromJobFile(); +void FreeSegmentFileData(JobDescriptionFileSegment *Segment); +JobDescriptionFileBrushStop *GetNextBrushStopFromJobFile(); +void FreeBrushStopFileData(JobDescriptionFileBrushStop *BrushStop); + #endif /* STATEMACHINES_PRINTSTM_H_ */ -- cgit v1.3.1