diff options
| author | Shlomo Hecht <shlomo@twine-s.com> | 2019-04-07 14:34:19 +0300 |
|---|---|---|
| committer | Shlomo Hecht <shlomo@twine-s.com> | 2019-04-07 14:34:19 +0300 |
| commit | e859f581bb925e575bba10e4468c3644a92ad266 (patch) | |
| tree | f87e499812e80d59e912c48be4855244d64ad726 /Software/Embedded_SW | |
| parent | b40a16bd00381b710196b2db6bad08e875d90184 (diff) | |
| download | Tango-e859f581bb925e575bba10e4468c3644a92ad266.tar.gz Tango-e859f581bb925e575bba10e4468c3644a92ad266.zip | |
power down and idle changes
Diffstat (limited to 'Software/Embedded_SW')
86 files changed, 5012 insertions, 1044 deletions
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 <Communication/PMR/FirmwareUpgrade/VersionFileDescriptor.pb-c.h> #include <Communication/PMR/FirmwareUpgrade/VersionPackageDescriptor.pb-c.h> +#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 (CurrentRunningFile<NumberOfFiles) + return OK; + if (SafeRemoveControlCallback(ActivateVersionControlId, ActivateVersionCallBackFunction )==OK) + ActivateVersionControlId = 0xFF; + else + LOG_ERROR(255,"ActivateVersionCallBackFunction"); + return OK; + + /* + responseContainer = createContainer(MESSAGE_TYPE__ActivateVersionResponse, ActivateToken, false, &response, &activate_version_response__pack, &activate_version_response__get_packed_size); + responseContainer.continuous = true; + uint8_t* container_buffer = my_malloc(message_container__get_packed_size(&responseContainer)); + size_t container_size = message_container__pack(&responseContainer, container_buffer); + my_free(responseContainer.data.data); + SendChars(container_buffer, container_size); + + if (Reboot == true) + { + Power_Reset(); + } +*/ +} uint32_t ActivateVersionRequestFunc(MessageContainer* requestContainer) { @@ -31,8 +85,12 @@ uint32_t ActivateVersionRequestFunc(MessageContainer* requestContainer) char SWUpgradePath[100]; char FullPath[50]; FRESULT Fresult = FR_OK; + FILINFO* fno = 0; + + fno = my_malloc(sizeof(FILINFO)); + if (fno == 0) + return ERROR; int File_i; - bool Reboot = false; MessageContainer responseContainer; ActivateVersionRequest* request = activate_version_request__unpack(NULL, requestContainer->data.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_i<VersionPackage->n_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 <stdint.h> #include <stdbool.h> #include <driverlib/gpio.h> +#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 <id> (--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<MAX_ADC_DEVICES); + assert (DataItemId<ADC_MAX_ADC_DEVICES); if (bufferFlipFlop == 0) bufnotinuse = 1; else bufnotinuse = 0; @@ -299,7 +299,7 @@ void ADCAcquireInit(void) // (called by MillisecInit) // acquire the data for the data logger. Multiple ADC and sequencers // will be used in order to acquire all the channels. // - for(ui32Chan = 0; ui32Chan < MAX_ADC_DEVICES; ui32Chan++) + for(ui32Chan = 0; ui32Chan < ADC_MAX_ADC_DEVICES; ui32Chan++) { // // If this is the first ADC then set the base for ADC0 @@ -332,7 +332,7 @@ void ADCAcquireInit(void) // (called by MillisecInit) // uint32_t ui32ChCtl = g_pui32ADCSeq[ui32Chan]; //TODO define all the numbers under #define and not here - if((ui32Chan == 7) || (ui32Chan == 15) || (ui32Chan == (MAX_ADC_DEVICES - 1))) + if((ui32Chan == 7) || (ui32Chan == 15) || (ui32Chan == (ADC_MAX_ADC_DEVICES - 1))) { ui32ChCtl |= ADC_CTL_IE | ADC_CTL_END; } @@ -432,7 +432,7 @@ double Calculate_Pitot_Pressure() // WHS - AN_AIRPRESS_1 double Pressure = 0.0, temp, PKpa,PBar,VADC = 0.0 ,VSensor,PMicroBar; - VsampleInBits = ADC_GetReading(CHAN_AIR_PRESSURE_1); + VsampleInBits = ADC_GetReading(ADC_AIR_PRESSURE_1); //---- VBits -> 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 <stdbool.h> #include <drivers/FPGA/FPGA_Comm.h> #include <DataDef.h> +#include <Drivers/FPGA/Motors_Driver/L6470.h> +#include <Drivers/FPGA/Motors_Driver/PowerSTEP01.h> #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 <stdio.h> #include <stdlib.h> #include <string.h> @@ -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 <stdio.h> #include <string.h> #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/Motors_Driver/L6470.c index cd0b09b93..f92278657 100644 --- a/Software/Embedded_SW/Embedded/Drivers/FPGA/Moters_Driver/L6470.c +++ b/Software/Embedded_SW/Embedded/Drivers/FPGA/Motors_Driver/L6470.c @@ -7,6 +7,7 @@ //#include "graphics_adapter.h" //#include "Embedded/include.h" #include <DataDef.h> +#include <Drivers/FPGA/Motors_Driver/L6470.h> #include <stdint.h> #include <stdbool.h> #include "drivers/SPI/SPI_Comm.h" @@ -18,9 +19,6 @@ ////////////// //#include "stdafx.h" -#include "L6470.h" -//#include "FPGA_Comm.h" -// To use time library of C #include <time.h> //int volatile * const MOSI_Reg = (int *)MOSI_BASE; diff --git a/Software/Embedded_SW/Embedded/Drivers/FPGA/Moters_Driver/L6470.h b/Software/Embedded_SW/Embedded/Drivers/FPGA/Motors_Driver/L6470.h index 745a7f753..745a7f753 100644 --- a/Software/Embedded_SW/Embedded/Drivers/FPGA/Moters_Driver/L6470.h +++ b/Software/Embedded_SW/Embedded/Drivers/FPGA/Motors_Driver/L6470.h diff --git a/Software/Embedded_SW/Embedded/Drivers/FPGA/Moters_Driver/PowerSTEP01.h b/Software/Embedded_SW/Embedded/Drivers/FPGA/Motors_Driver/PowerSTEP01.h index bf1fe91d5..ab99cc340 100644 --- a/Software/Embedded_SW/Embedded/Drivers/FPGA/Moters_Driver/PowerSTEP01.h +++ b/Software/Embedded_SW/Embedded/Drivers/FPGA/Motors_Driver/PowerSTEP01.h @@ -7,8 +7,8 @@ * Author: avi */ -#ifndef DRIVERS_FPGA_MOTERS_DRIVER_POWERSTEP01_H_ -#define DRIVERS_FPGA_MOTERS_DRIVER_POWERSTEP01_H_ +#ifndef DRIVERS_FPGA_MOTORS_DRIVER_POWERSTEP01_H_ +#define DRIVERS_FPGA_MOTORS_DRIVER_POWERSTEP01_H_ //powerSTEP01 @@ -165,4 +165,4 @@ typedef enum { POWERSTEP01_TDT_4000ns = (((uint8_t)0x1F)<<POWERSTEP01_TDT_SHIFT) } powerstep01_Tdt_t; -#endif /* DRIVERS_FPGA_MOTERS_DRIVER_POWERSTEP01_H_ */ +#endif /* DRIVERS_FPGA_MOTORS_DRIVER_POWERSTEP01_H_ */ diff --git a/Software/Embedded_SW/Embedded/Drivers/Heater/Heater.c b/Software/Embedded_SW/Embedded/Drivers/Heater/Heater.c index 0c44ef71e..14c548f2a 100644 --- a/Software/Embedded_SW/Embedded/Drivers/Heater/Heater.c +++ b/Software/Embedded_SW/Embedded/Drivers/Heater/Heater.c @@ -38,6 +38,10 @@ typedef struct uint32_t HeaterActive = 0; +extern F2_CTRL_REG F2_CTRL_Reg; +extern F1_GPO_REG F1_GPO_Reg; +extern F3_GPO_01_REG F3_GPO_01_Reg; + static GPIOIntPortMap portMap[MAX_HEATERS_NUM] = { {DRYER_SSR3_CTRL, false}, // HARDWARE_PID_CONTROL_TYPE__DryerAirTemperature **** Not connected **** @@ -67,15 +71,23 @@ uint32_t ActivateHeater (int HeaterId) #ifndef EVALUATION_BOARD if(HeaterId == HARDWARE_PID_CONTROL_TYPE__HeadHeaterZ5) { - F1_gpo_01 |= portMap[HeaterId].m_pin; + //F1_gpo_01 |= portMap[HeaterId].m_pin; + F1_GPO_Reg.ushort |= portMap[HeaterId].m_pin; + F1_gpo_01 = F1_GPO_Reg.ushort; + } else if(HeaterId == HARDWARE_PID_CONTROL_TYPE__HeadHeaterZ6) { - F3_GPO_01_bus |= portMap[HeaterId].m_pin; + //F3_GPO_01_bus |= portMap[HeaterId].m_pin; + F3_GPO_01_Reg.ushort |= portMap[HeaterId].m_pin; + F3_GPO_01_bus = F3_GPO_01_Reg.ushort; + } else { - F2_CTRL |= portMap[HeaterId].m_pin; + //F2_CTRL |= portMap[HeaterId].m_pin; + F2_CTRL_Reg.ushort |= portMap[HeaterId].m_pin; + F2_CTRL = F2_CTRL_Reg.ushort; } #endif //--------------------------------------------------------------------------------------- @@ -114,15 +126,21 @@ uint32_t DeActivateHeater (int HeaterId) #ifndef EVALUATION_BOARD if(HeaterId == HARDWARE_PID_CONTROL_TYPE__HeadHeaterZ5) { - F1_gpo_01 &= ~portMap[HeaterId].m_pin; + //F1_gpo_01 &= ~portMap[HeaterId].m_pin; + F1_GPO_Reg.ushort&= ~portMap[HeaterId].m_pin; + F1_gpo_01 = F1_GPO_Reg.ushort; } else if(HeaterId == HARDWARE_PID_CONTROL_TYPE__HeadHeaterZ6) { - F3_GPO_01_bus &= ~portMap[HeaterId].m_pin; + //F3_GPO_01_bus &= ~portMap[HeaterId].m_pin; + F3_GPO_01_Reg.ushort &= ~portMap[HeaterId].m_pin; + F3_GPO_01_bus = F3_GPO_01_Reg.ushort; } else { - F2_CTRL &= ~portMap[HeaterId].m_pin; + //F2_CTRL &= ~portMap[HeaterId].m_pin; + F2_CTRL_Reg.ushort &= ~portMap[HeaterId].m_pin; + F2_CTRL = F2_CTRL_Reg.ushort; } #endif //--------------------------------------------------------------------------------------- diff --git a/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/ADC_MUX/ADC_MUX.c b/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/ADC_MUX/ADC_MUX.c index 082981bee..0f37af1b5 100644 --- a/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/ADC_MUX/ADC_MUX.c +++ b/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/ADC_MUX/ADC_MUX.c @@ -240,6 +240,11 @@ double Get_MidTank_Pressure_Sensor(MidTank_t MidTank_ID) //0-7 assert (MidTank_ID<NUM_OF_MIDTANKS); return MidTank_Pressure[MidTank_ID]; } +int Get_MidTank_Int100_Sensor(MidTank_t MidTank_ID) //0-7 +{ + assert (MidTank_ID<NUM_OF_MIDTANKS); + return (int)(MidTank_Pressure[MidTank_ID]*100); +} ///////////////////////// Head_MixChip_Heaters_Current ////////////////////////////// @@ -252,12 +257,12 @@ uint32_t Heaters_Current_Bits[9];//just for debug void Enable_Reading_Heaters_Current(HEATERS_CURRENT Heater_ID) //0-8 { - assert (Heater_ID<NUM_OF_HEATERS); + assert (Heater_ID<NUM_OF_CURRENT_HEATERS); Heaters_Current_Read_Enable[Heater_ID] = true; } void Disable_Reading_Heaters_Current(HEATERS_CURRENT Heater_ID) //0-8 { - assert (Heater_ID<NUM_OF_HEATERS); + assert (Heater_ID<NUM_OF_CURRENT_HEATERS); Heaters_Current_Read_Enable[Heater_ID] = false; } @@ -265,9 +270,9 @@ uint32_t Read_Heaters_Current(HEATERS_CURRENT Heater_ID) //0-8 { uint32_t Status = OK; - assert (Heater_ID<NUM_OF_HEATERS); + assert (Heater_ID<NUM_OF_CURRENT_HEATERS); - if(Heater_ID < DRYER_CURRENT_1) + if(Heater_ID < HEATER_DRYER_CURRENT_1) Status = Read_Head_MixChip_Heaters_Current(Heater_ID); else Status = Read_Dryer_Heaters_Current(Heater_ID); @@ -294,36 +299,36 @@ uint32_t Read_Head_MixChip_Heaters_Current(HEATERS_CURRENT Heater_ID) //0-5 * */ - assert (Heater_ID<NUM_OF_HEATERS); + assert (Heater_ID<NUM_OF_CURRENT_HEATERS); #warning need to change the hardware://there is overflow in Dyer Head zone 4 with resistor 0.05 - const double Resistor[NUM_OF_HEATERS] = {0.025, 0.025, 0.025, 0.025, 0.020, 0.025}; + const double Resistor[NUM_OF_CURRENT_HEATERS] = {0.025, 0.025, 0.025, 0.025, 0.020, 0.025}; if (Heaters_Current_Read_Enable[Heater_ID] == false) return Heaters_Current[Heater_ID]; switch(Heater_ID) { - case HEAD_ZONE_1: + case HEATER_HEAD_CURRENT_ZONE_1: I2C_Slave_Add = 0x40; Channel = 0x10; break; - case HEAD_ZONE_2: + case HEATER_HEAD_CURRENT_ZONE_2: I2C_Slave_Add = 0x40; Channel = 0x08; break; - case HEAD_ZONE_3: + case HEATER_HEAD_CURRENT_ZONE_3: I2C_Slave_Add = 0x40; Channel = 0x04; break; - case HEAD_ZONE_4: + case HEATER_HEAD_CURRENT_ZONE_4: I2C_Slave_Add = 0x44; Channel = 0x80; break; - case HEAD_ZONE_5_6: + case HEATER_HEAD_CURRENT_ZONE_5_6: I2C_Slave_Add = 0x44; Channel = 0x40; break; - case MIXCHIP: + case HEATER_MIXCHIP_CURRENT: I2C_Slave_Add = 0x46; Channel = 0x08; break; @@ -352,11 +357,11 @@ uint32_t Read_Head_MixChip_Heaters_Current(HEATERS_CURRENT Heater_ID) //0-5 double Get_Heaters_Current(HEATERS_CURRENT Heater_ID) //0-8 { - assert (Heater_ID<NUM_OF_HEATERS); + assert (Heater_ID<NUM_OF_CURRENT_HEATERS); return Heaters_Current[Heater_ID]; } int Get_Heaters_Current_Integer(HEATERS_CURRENT Heater_ID) //0-8 { - assert (Heater_ID<NUM_OF_HEATERS); + assert (Heater_ID<NUM_OF_CURRENT_HEATERS); return (int)(Heaters_Current[Heater_ID]*100); } diff --git a/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/ADC_MUX/ADC_MUX.h b/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/ADC_MUX/ADC_MUX.h index f30f587b3..6d1d9a1d5 100644 --- a/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/ADC_MUX/ADC_MUX.h +++ b/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/ADC_MUX/ADC_MUX.h @@ -25,16 +25,16 @@ typedef enum typedef enum { - HEAD_ZONE_1, - HEAD_ZONE_2, - HEAD_ZONE_3, - HEAD_ZONE_4, - HEAD_ZONE_5_6, - MIXCHIP, - DRYER_CURRENT_1, - DRYER_CURRENT_2, - DRYER_CURRENT_3, - NUM_OF_HEATERS, + 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_MIXCHIP_CURRENT, + HEATER_DRYER_CURRENT_1, + HEATER_DRYER_CURRENT_2, + HEATER_DRYER_CURRENT_3, + NUM_OF_CURRENT_HEATERS, } HEATERS_CURRENT; extern bool Heaters_Current_Read_Enable[9]; @@ -45,6 +45,7 @@ extern uint32_t Heaters_Current_Bits[9]; uint32_t Read_MidTank_Pressure_Sensor(MidTank_t MidTank_ID); double Get_MidTank_Pressure_Sensor(MidTank_t MidTank_ID); //0-7 +int Get_MidTank_Int100_Sensor(MidTank_t MidTank_ID); //0-7 void MidTankPressureCorrection(double Offset); void Enable_MidTank_Pressure_Reading(MidTank_t MidTank_ID); //0-7 diff --git a/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/Dispenser_Card/IO_Ports/Dispenser_IO.c b/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/Dispenser_Card/IO_Ports/Dispenser_IO.c index 6d032fe64..790f77f8a 100644 --- a/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/Dispenser_Card/IO_Ports/Dispenser_IO.c +++ b/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/Dispenser_Card/IO_Ports/Dispenser_IO.c @@ -19,17 +19,25 @@ uint8_t TCA9534Init(uint8_t Dispenser_ID, TCA9534Regs* Regs)//1 { uint8_t status = PASSED; - uint8_t Write_Buf[2]; + if(Dispenser_struct[Dispenser_ID].Type == DISP_TYPE_EEPROM128KB) + { + uint8_t Write_Buf[2]; - status |= Select_Dispenser_Mux_Channel(Dispenser_ID); + status |= Select_Dispenser_Mux_Channel(Dispenser_ID); - //Set all GPIO to Input - Regs->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); + //Read the Realay_on pin + TCA9534SetReadInputReg(Dispenser_ID); + TCA9534ReadInputReg(Dispenser_ID, Regs); + if(Regs->Config[Dispenser_ID].bit.RELAY_ON != LOW) + { + status |= FAILED; + } - //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); + //---------------------- 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 != HIGH) - { - status |= FAILED; - } + //deley + delayms(Relay_Operate_time); - //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); + //Read the Realay_on pin + TCA9534SetReadInputReg(Dispenser_ID); + TCA9534ReadInputReg(Dispenser_ID, Regs); + if(Regs->Config[Dispenser_ID].bit.RELAY_ON != HIGH) + { + status |= FAILED; + } - //deley - delayms(Relay_Operate_time); + //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); - //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 != 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); + //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); - //Read the Realay_on pin - TCA9534SetReadInputReg(Dispenser_ID); - TCA9534ReadInputReg(Dispenser_ID, Regs); - if(Regs->Config[Dispenser_ID].bit.RELAY_ON != HIGH) - { - 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; + } + } 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); + uint8_t 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); - } + //set Mux to the current dispenser Channel + status |= Select_Dispenser_Mux_Channel(Dispenser_ID); - //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); + 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); + }*/ + } 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 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 Mux to the current dispenser Channel + status |= Select_Dispenser_Mux_Channel(Dispenser_ID); - //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); + 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); + }*/ + + } 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 <DataDef.h> +#include <Drivers/FPGA/Motors_Driver/L6470.h> #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 <DataDef.h> +#include <Drivers/FPGA/Motors_Driver/L6470.h> #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 <driverlib/rom.h> #include <driverlib/rom_map.h> #include <DataDef.h> +#include <Drivers/FPGA/Motors_Driver/L6470.h> +#include <Drivers/FPGA/Motors_Driver/PowerSTEP01.h> #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 <Drivers/SSI_Comm/SSI_Comm.h> #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 <driverlib/timer.h> +#include <Drivers/FPGA/Motors_Driver/L6470.h> #include <Drivers/SSI_Comm/SSI_Comm.h> #include <inc/hw_ints.h> @@ -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,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"}, - /*{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,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"}, - {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 */ + {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, 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,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, 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, 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, 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, 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, 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, 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,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, 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,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, 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"}, - {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"}, }; -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_i<JobTicket->n_segments;Segment_i++) + + /*for (Segment_i=0;Segment_i<JobTicket->n_segments;Segment_i++) { for (Brush_i=0;Brush_i<JobTicket->segments[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_i<MAX_SYSTEM_DISPENSERS;Dispenser_i++) { - if (DispenserInUse[Dispenser_i] == true) + if (DispenserUsedInJob[Dispenser_i] == true) { for (Alarm_i = 0;Alarm_i<MAX_SYSTEM_ALARMS;Alarm_i++) { @@ -521,7 +566,7 @@ JobEndReasonEnum AlarmHandlingPrepareJob(void *CurrentJob) } for (Alarm_i = 0;Alarm_i<MAX_SYSTEM_ALARMS;Alarm_i++) { - if (AlarmItem[Alarm_i].AlarmSource == CoversAlarm) + if (AlarmItem[Alarm_i].AlarmSource == ALARM_SOURCE_TYPE__CoversAlarm) { if (AlarmState[Alarm_i].Status == true) { @@ -530,7 +575,7 @@ JobEndReasonEnum AlarmHandlingPrepareJob(void *CurrentJob) break; } } - if (AlarmItem[Alarm_i].AlarmSource == MotorAlarm) + if (AlarmItem[Alarm_i].AlarmSource == ALARM_SOURCE_TYPE__MotorAlarm) { if (AlarmState[Alarm_i].Status == true) { @@ -622,7 +667,6 @@ void AlarmHandlingInternalSetAlarm(uint32_t AlarmId, bool value) { if (AlarmState[Alarm_i].Status != value) { - AlarmState[Alarm_i].Status = value; if (value == true) { // no need to call consequent actionsAlarmHandlingConsequentActions(Alarm_i, AlarmItem[Alarm_i].Severity); @@ -634,12 +678,14 @@ void AlarmHandlingInternalSetAlarm(uint32_t AlarmId, bool value) AlarmState[Alarm_i].EventPtr->has_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;i<MAX_SYSTEM_ALARMS;i++) + response.events = (Event **)my_malloc(sizeof(Event*)*response.n_events); + if(response.events) { - if (AlarmState[i].Status == true) + for (i = 0;i<MAX_SYSTEM_ALARMS;i++) { - if (AlarmState[i].EventPtr) + if (AlarmState[i].Status == true) { - response.events[e]=AlarmState[i].EventPtr; - e++; + if (AlarmState[i].EventPtr) + { + response.events[e]=AlarmState[i].EventPtr; + e++; + } } } } + else + { + LOG_ERROR(response.n_events,"events malloc error"); + return; + } + } + else + { + response.events = NULL; } responseContainer = createAllocatedContainer(MESSAGE_TYPE__StartEventsNotificationResponse, AlarmHandlingToken, false, &response, &start_events_notification_response__pack, &start_events_notification_response__get_packed_size,&alarm_response_buffer); responseContainer.continuous = true; diff --git a/Software/Embedded_SW/Embedded/Modules/AlarmHandling/AlarmHandling.h b/Software/Embedded_SW/Embedded/Modules/AlarmHandling/AlarmHandling.h index 4f9db2fc1..09dfa3f3d 100644 --- a/Software/Embedded_SW/Embedded/Modules/AlarmHandling/AlarmHandling.h +++ b/Software/Embedded_SW/Embedded/Modules/AlarmHandling/AlarmHandling.h @@ -21,5 +21,6 @@ JobEndReasonEnum AlarmHandlingPrepareJob(void *CurrentJob); uint32_t StartEventsNotificationRequestFunc(MessageContainer* requestContainer); uint32_t StopEventsNotificationRequestFunc(MessageContainer* requestContainer); uint32_t ResolveEventRequestFunc(MessageContainer* requestContainer); +void AlarmHandlingSetFlags(bool CheckHardLimitAlarms,bool CheckCurrentAlarms, bool checkTamperAlarms); #endif /* MODULES_ALARMHANDLING_ALARMHANDLING_H_ */ diff --git a/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c b/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c index 5fe242436..d34ac9ff9 100644 --- a/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c +++ b/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c @@ -85,7 +85,7 @@ uint32_t Dancer_Data[NUM_OF_DANCERS] = {0}; float Speed_Data = 0; uint32_t DrawerFansStatus = 0; uint32_t SystemFansStatus = 0; - +uint8_t Gas_PPM = 0; bool watchdogCriticalAlarm = false; @@ -474,6 +474,7 @@ uint32_t MillisecLowLoop(uint32_t tick) if (Hundred_msTick) { Speed_Data = Calculate_Speed_Sensor_Velocity(); + Read_Buttons_Reg(); for (Sensor_i = 0;Sensor_i < MAX_TEMPERATURE_SENSOR_ID;Sensor_i++) { MillisecReadFromTempSensor(Sensor_i, NULL); @@ -483,6 +484,7 @@ uint32_t MillisecLowLoop(uint32_t tick) if (watchdogCriticalAlarm == false) { Control_WD(ENABLE,5); //activate heaters/dispenser watchdog, 0.5 seconds + //LOG_ERROR (1111, "Control_WD"); } } } @@ -499,9 +501,9 @@ uint32_t MillisecLowLoop(uint32_t tick) //Read_MidTank_Pressure_Sensor(Disp_i); } FPGA_GetAllDispensersValveBusyOCD(); - /*temp = Read_Fans_Tacho(); + temp = Read_Fans_Tacho(); DrawerFansStatus = temp & 0x1F; - SystemFansStatus = temp & 0xE0;*/ + SystemFansStatus = temp & 0xE0; KeepAliveOneSecondCall(); for (Motor_i = 0;Motor_i < NUM_OF_MOTORS;Motor_i++) { @@ -510,10 +512,11 @@ uint32_t MillisecLowLoop(uint32_t tick) if (isMotorConfigured(Motor_i)) MotorGetStatusFromFPGA(Motor_i); } - for (Heater_i = 0;Heater_i < NUM_OF_HEATERS;Heater_i++) + for (Heater_i = 0;Heater_i < NUM_OF_CURRENT_HEATERS;Heater_i++) { Read_Heaters_Current(Heater_i); } + Gas_PPM = Calculate_Gas_Power_Consumption(); } if (OneMinute_Tick) { @@ -621,6 +624,11 @@ uint32_t getDrawerFansStatus(void) { return DrawerFansStatus; } +uint8_t getGasReading(void) +{ + return Gas_PPM; +} + uint32_t getSystemFansStatus(void) { return SystemFansStatus; diff --git a/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.h b/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.h index 7e2af1079..064302685 100644 --- a/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.h +++ b/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.h @@ -32,6 +32,7 @@ uint32_t getADCData(int DeviceId); float getSensorSpeedData(void); uint32_t getDrawerFansStatus(void); uint32_t getSystemFansStatus(void); +uint8_t getGasReading(void); void MillisecInit(void); void MillisecStop(void); diff --git a/Software/Embedded_SW/Embedded/Modules/Diagnostics/DiagnosticActions.c b/Software/Embedded_SW/Embedded/Modules/Diagnostics/DiagnosticActions.c index e3f593924..425894857 100644 --- a/Software/Embedded_SW/Embedded/Modules/Diagnostics/DiagnosticActions.c +++ b/Software/Embedded_SW/Embedded/Modules/Diagnostics/DiagnosticActions.c @@ -254,6 +254,12 @@ uint32_t SetDigitalOutRequestRequestFunc(MessageContainer* requestContainer) else Valve_Set(VALVE_MIXCHIP_WASTECH,0); break; + case INTERFACE_IOS__GPO_BLOWER_PWM: + if (request->value == 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]; +//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]; -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 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]; -double dispenserspressure[MAX_SYSTEM_DISPENSERS][DIAGNOSTICS_LIMIT]; +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;i<NUM_OF_HEATERS;i++) + for (i=0;i<NUM_OF_CURRENT_HEATERS;i++) { HeatersCurrent[i][0] = Get_Heaters_Current(i); } @@ -558,21 +558,21 @@ void SendDiagnostics(void) DiagnosticsMonitor.midtank8level = MidTankpressure[7]; DiagnosticsMonitor.n_drierzone1heatercurrent = 1; - DiagnosticsMonitor.drierzone1heatercurrent = HeatersCurrent[DRYER_CURRENT_1]; + DiagnosticsMonitor.drierzone1heatercurrent = HeatersCurrent[HEATER_DRYER_CURRENT_1]; DiagnosticsMonitor.n_drierzone2heatercurrent = 1; - DiagnosticsMonitor.drierzone2heatercurrent = HeatersCurrent[DRYER_CURRENT_2]; + DiagnosticsMonitor.drierzone2heatercurrent = HeatersCurrent[HEATER_DRYER_CURRENT_2]; DiagnosticsMonitor.n_mixer1heatercurrent = 1; - DiagnosticsMonitor.mixer1heatercurrent = HeatersCurrent[MIXCHIP]; + DiagnosticsMonitor.mixer1heatercurrent = HeatersCurrent[HEATER_MIXCHIP_CURRENT]; DiagnosticsMonitor.n_headzone1heatercurrent = 1; - DiagnosticsMonitor.headzone1heatercurrent = HeatersCurrent[HEAD_ZONE_1]; + DiagnosticsMonitor.headzone1heatercurrent = HeatersCurrent[HEATER_HEAD_CURRENT_ZONE_1]; DiagnosticsMonitor.n_headzone2heatercurrent = 1; - DiagnosticsMonitor.headzone2heatercurrent = HeatersCurrent[HEAD_ZONE_2]; + DiagnosticsMonitor.headzone2heatercurrent = HeatersCurrent[HEATER_HEAD_CURRENT_ZONE_2]; DiagnosticsMonitor.n_headzone3heatercurrent = 1; - DiagnosticsMonitor.headzone3heatercurrent = HeatersCurrent[HEAD_ZONE_3]; + DiagnosticsMonitor.headzone3heatercurrent = HeatersCurrent[HEATER_HEAD_CURRENT_ZONE_3]; DiagnosticsMonitor.n_headzone4heatercurrent = 1; - DiagnosticsMonitor.headzone4heatercurrent = HeatersCurrent[HEAD_ZONE_4]; + DiagnosticsMonitor.headzone4heatercurrent = HeatersCurrent[HEATER_HEAD_CURRENT_ZONE_4]; DiagnosticsMonitor.n_headzone5_6heatercurrent = 1; - DiagnosticsMonitor.headzone5_6heatercurrent = HeatersCurrent[HEAD_ZONE_5_6]; + DiagnosticsMonitor.headzone5_6heatercurrent = HeatersCurrent[HEATER_HEAD_CURRENT_ZONE_5_6]; response.monitors = &DiagnosticsMonitor; //response.digitalpins = DigitalPinArray; diff --git a/Software/Embedded_SW/Embedded/Modules/General/GeneralHardware.c b/Software/Embedded_SW/Embedded/Modules/General/GeneralHardware.c index 97bb2e245..f5aec59f6 100644 --- a/Software/Embedded_SW/Embedded/Modules/General/GeneralHardware.c +++ b/Software/Embedded_SW/Embedded/Modules/General/GeneralHardware.c @@ -58,7 +58,7 @@ uint32_t HWConfigurationInit(void) uint8_t* buffer = NULL; uint32_t Bytes = 0,i,j,k=0; uint32_t status = OK; - UploadHardwareConfigurationRequest* UploadRequest; + UploadHardwareConfigurationRequest* UploadRequest=0; GeneralHwReady = false; Control_WD(ENABLE,250); @@ -175,7 +175,7 @@ uint32_t EmbeddedParametersInit(void) LoadConfigurationParameters(Params); DataUpdated=true; free (buffer); - configuration_parameters__free_unpacked(NULL,Params); + configuration_parameters__free_unpacked(Params,NULL); } else { @@ -189,7 +189,11 @@ uint32_t EmbeddedParametersInit(void) MidTankPressureCorrection(EmbeddedParameters.midtankpressurecorrection); SetDiagnosticCollectionLimit(EmbeddedParameters.diagnosticcollectionlimit); ThreadSetBreakSensorLimit(EmbeddedParameters.breaksensorlimit); - + bool a1,a2,a3; + a1 = (EmbeddedParameters.generalparameters[0] < 0.5)?false:true; + a2 = (EmbeddedParameters.generalparameters[1] < 0.5)?false:true; + a3 = (EmbeddedParameters.generalparameters[2] < 0.5)?false:true; + AlarmHandlingSetFlags(a1,a2,a3); return Fresult; } diff --git a/Software/Embedded_SW/Embedded/Modules/General/buttons.c b/Software/Embedded_SW/Embedded/Modules/General/buttons.c index 0550c8ca7..ee6204060 100644 --- a/Software/Embedded_SW/Embedded/Modules/General/buttons.c +++ b/Software/Embedded_SW/Embedded/Modules/General/buttons.c @@ -22,10 +22,11 @@ #include "Modules/Thread/Thread_ex.h" #include "Modules/General/buttons.h" +#include "StateMachines/Initialization/PowerOffSequence.h" -int MachineOnOff(); -int ch_to_power_down(); -int ch_to_power_up(); +//int MachineOnOff(); +int PowerDown(); +int PowerUp(); int thredJog(); @@ -57,8 +58,8 @@ typedef enum button power , jog, load; -uint32_t ButtonsCallBackFunction(uint32_t IfIndex, uint32_t ReadValue); -uint32_t ButtonsCBFunction(uint32_t IfIndex, uint32_t ReadValue); +uint32_t ButtonPowerCallBackFunction(uint32_t IfIndex, uint32_t ReadValue); +uint32_t ButtonPowerCBFunction(uint32_t IfIndex, uint32_t ReadValue); uint32_t ShortLongOffPB(uint8_t OnOffPB, button *pBtn); uint32_t StateMachine( button *pBtn); @@ -72,6 +73,8 @@ uint32_t joggingMachine(uint8_t OnOffPB, button *pBtn); uint32_t ButtonLoadCallBackFunction(uint32_t IfIndex, uint32_t ReadValue); uint32_t ButtonLoadCBFunction(uint32_t IfIndex, uint32_t ReadValue); +uint32_t LoadStatMachine( button *pBtn); + /* void Power_Reset(); @@ -81,6 +84,21 @@ bool Read_PWR_Button();//TODO move to GPIO folder */ +int PowerDown() +{ + bool ret = OK; + PowerOffInit(); + + return ret; +} + +int PowerUp() +{ + bool ret = OK; + + return ret; +} + /* * read GPIO status @@ -89,27 +107,34 @@ bool Read_PWR_Button();//TODO move to GPIO folder * * return !GPIOstatus */ -uint32_t ButtonsCallBackFunction(uint32_t IfIndex, uint32_t ReadValue) +uint32_t ButtonPowerCallBackFunction(uint32_t IfIndex, uint32_t ReadValue) { - if(ROM_GPIOPinRead(GPIO_PORTN_BASE, GPIO_PIN_7)) + return Read_PWR_Button(); + /* + * + if(ROM_GPIOPinRead(GPIO_PORTN_BASE, GPIO_PIN_7)) return 0x00; else return 0x01; + */ } uint32_t ButtonJogCallBackFunction(uint32_t IfIndex, uint32_t ReadValue) { - if(ROM_GPIOPinRead(GPIO_PORTN_BASE, GPIO_PIN_7)) - return 0x00; - else - return 0x01; + return Get_Thread_Jogging_Button(); +// +// if(ROM_GPIOPinRead(GPIO_PORTN_BASE, GPIO_PIN_7)) +// return 0x00; +// else +// return 0x01; } uint32_t ButtonLoadCallBackFunction(uint32_t IfIndex, uint32_t ReadValue) { - if(ROM_GPIOPinRead(GPIO_PORTN_BASE, GPIO_PIN_7)) - return 0x00; - else - return 0x01; + return Get_Thread_Load_Button(); +// if(ROM_GPIOPinRead(GPIO_PORTN_BASE, GPIO_PIN_7)) +// return 0x00; +// else +// return 0x01; } //uint32_t AddControlCallback( ControlCBFunction Callback, CTRL_TIMING_ENUM CtrlFrequency, DataReadCBFunction DriverfPtr, uint16_t IfIndex, uint32_t Parameter1, uint32_t Parameter2 ); @@ -120,7 +145,7 @@ uint32_t ButtonLoadCallBackFunction(uint32_t IfIndex, uint32_t ReadValue) uint32_t Buttons_Init(void) { - power.bttn_status = 0 ; +// power.bttn_status = 0 ; // power.bttn_name = "power"; //option power.bttn_status = 0; // 0=release 1=press power.Action = OFFPB ; //off,short,long,count,replong @@ -128,10 +153,10 @@ uint32_t Buttons_Init(void) power.state = sttOFF; //sttOFF, sttON, sttDISABLE, sttENABLE, sttIDLE, sttJOGGING power.count = 0; - AddControlCallback( ButtonsCBFunction, BUTTOMS_SAMPLE_TIME, ButtonsCallBackFunction, 0,0,0 ); // eFiftyMillisecond + AddControlCallback( ButtonPowerCBFunction, BUTTOMS_SAMPLE_TIME, ButtonPowerCallBackFunction, 0,0,0 ); // eFiftyMillisecond - jog.bttn_status = 0 ; -// power.bttn_name = "power"; //option +// jog.bttn_status = 0 ; +// jog.bttn_name = "jog"; //option jog.bttn_status = 0; // 0=release 1=press jog.Action = OFFPB ; //OFFPB,short,long,count,replong jog.color = colorOFF; //colorOFF, BLUE, BLINK, @@ -139,8 +164,8 @@ uint32_t Buttons_Init(void) jog.count = 0; AddControlCallback( ButtonJogCBFunction, BUTTOMS_SAMPLE_TIME, ButtonJogCallBackFunction, 0,0,0 ); // - load.bttn_status = 0 ; -// power.bttn_name = "power"; //option +// load.bttn_status = 0 ; +// load.bttn_name = "load"; //option load.bttn_status = 0; // 0=release 1=press load.Action = OFFPB ; //OFFPB,short,long,count,replong load.color = colorOFF; //colorOFF, BLUE, BLINK, @@ -153,7 +178,7 @@ return OK; //read the buttons data here and handle -uint32_t ButtonsCBFunction(uint32_t IfIndex, uint32_t ReadValue) +uint32_t ButtonPowerCBFunction(uint32_t IfIndex, uint32_t ReadValue) { ShortLongOffPB(ReadValue,&power); return 0; @@ -169,7 +194,9 @@ uint32_t ButtonJogCBFunction(uint32_t IfIndex, uint32_t ReadValue) uint32_t ButtonLoadCBFunction(uint32_t IfIndex, uint32_t ReadValue) { - // ShortLongOffPB(ReadValue,&load); + uint8_t parameter = 2; + REPORT_MSG(parameter," ------------ Start thread loading empty function ----------------- "); + LoadStatMachine(&load); return 0; } @@ -177,36 +204,6 @@ uint32_t ButtonLoadCBFunction(uint32_t IfIndex, uint32_t ReadValue) -//OnOffPB = getPBstatus(POWER_PB); - - - -/* - * - * - */ -int Get_timer() -{ - // to go timer - return 0; -} - -int ClearTimer() -{ - //to do clear timer - return 0; -} -int StartTimer() -{ - // to do start timer - return 0; -} -int StopTimer() -{ - // to do start timer - return 0; -} - /* --------------------------------------------------------- * --- ShortLongOffPB(int OnOffPB, enum PBstat *ret) ---- * input: OnOffPB status(0(pressed) or 1(relesed) @@ -222,7 +219,6 @@ int StopTimer() ------------------------------------------------------------*/ -//ShortLongOffPB( OnOffPB, &ret) uint32_t ShortLongOffPB(uint8_t OnOffPB, button *pBtn) @@ -237,14 +233,16 @@ uint32_t ShortLongOffPB(uint8_t OnOffPB, button *pBtn) if( OnOffPB ) { pBtn->Action = 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<MAX_SYSTEM_DISPENSERS); @@ -251,24 +276,12 @@ void IDS_Dispenser_Content_Calculation (char DispenserId) { if (seconds_counter++>=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_i<MAX_SYSTEM_DISPENSERS;Dispenser_i++) { DispenserUsedInJob[Dispenser_i] = false; } - if (JobTicket->n_segments == 0) - return false; + if (EnableCleaning == true) + DispenserUsedInJob[CLEANER_DISPENSER] = true; + if (JobTicket->enablelubrication == true) + DispenserUsedInJob[LUBRICANT_DISPENSER] = true; - for (Segment_i=0;Segment_i<JobTicket->n_segments;Segment_i++) + Fresult = OpenJobFile(); + if (Fresult == FR_OK) + { + Segment = GetNextSegmentFromJobFile(); + while(Segment) { - for (Brush_i=0;Brush_i<JobTicket->segments[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_i<Segment->brushstopscount;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_i<MAX_SYSTEM_DISPENSERS;Dispenser_i++) + { + DispenserUsedInJob[Dispenser_i] = false; + } + n_segments = 0; + if (EnableCleaning == true) + DispenserUsedInJob[CLEANER_DISPENSER] = true; + if (JobTicket->enablelubrication == 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_i<Segment->brushstopscount;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_i<MAX_SYSTEM_DISPENSERS;Dispenser_i++) + { + DispenserUsedInJob[Dispenser_i] = false; + } + if (n_segments == 0) + return false; + + for (Segment_i=0;Segment_i<n_segments;Segment_i++) + { + for (Brush_i=0;Brush_i<JobTicket->segments[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,51 +497,26 @@ 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;i<MAX_SYSTEM_DISPENSERS;i++) + Valve_Set(VALVE_MIXCHIP_WASTECH, Mixer_Head); + + SegmentNumOfBrushStops = Segment->n_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 <Container.h> #include <DataDef.h> +#include <Drivers/FPGA/Motors_Driver/L6470.h> #include <stdbool.h> #include <stdlib.h> #include <stdio.h> @@ -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 <Container.h> #include <DataDef.h> +#include <Drivers/FPGA/Motors_Driver/L6470.h> #include <PMR/Stubs/StubL6470DriverResponse.pb-c.h> #include <PMR/Stubs/StubL6470DriverRequest.pb-c.h> #include <stdbool.h> @@ -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 <Container.h> #include <DataDef.h> +#include <Drivers/FPGA/Motors_Driver/L6470.h> #include <PMR/Stubs/StubMotorInitRequest.pb-c.h> #include <PMR/Stubs/StubMotorInitResponse.pb-c.h> #include <PMR/Stubs/StubMotorRunRequest.pb-c.h> @@ -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 <Container.h> #include <DataDef.h> +#include <Drivers/FPGA/Motors_Driver/L6470.h> #include <stdbool.h> #include <stdlib.h> #include <stdio.h> @@ -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 <Container.h> #include <DataDef.h> +#include <Drivers/FPGA/Motors_Driver/L6470.h> #include <stdbool.h> #include <stdlib.h> #include <stdio.h> @@ -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 <DataDef.h> +#include <Drivers/FPGA/Motors_Driver/PowerSTEP01.h> #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<MAX_CONTROL_SAMPLES;i++) + avreageMotorSampleValue += MotorSpeedSamples[index][i]; + avreageMotorSampleValue = avreageMotorSampleValue / MAX_CONTROL_SAMPLES; + //Report("MotorSpeedUpdated",__FILE__,index,OriginalMotorSpd_2PPS[index],RpWarning,avreageMotorSampleValue,0); + OriginalMotorSpd_2PPS[index] = avreageMotorSampleValue; + } + } calculated_speed = (1-MotorControlConfig[index].m_calculatedError)*OriginalMotorSpd_2PPS[index]; + //calculated_speed = (1-MotorControlConfig[index].m_calculatedError)*CurrentControlledSpeed[index]; if (abs(calculated_speed-CurrentControlledSpeed[index])> 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 <Container.h> +#include <DataDef.h> +#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 <PMR/Diagnostics/EventType.pb-c.h> +#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<MAX_SYSTEM_DISPENSERS;Dispenser_i++) + { + if (isMotorConfigured(Dispenser_i + HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_1)==true) + { + IDS_Dispenser_Build_Pressure(Dispenser_i,InitSequenceDispenserPressureBuildUpTestCallBackFunction); + Report("IDS_Dispenser_Build_Pressure",__FILE__,__LINE__,(int)Dispenser_i,RpWarning,(int)Dispenser_i,0); + NumOfCheckedDispnsers++; + } + } + + return OK; } uint32_t InitSequenceThreadDetection(void) { InitStages++; MachineState = MACHINE_STATE_THREAD_DETECTION; - InitSequenceStateMachine(InitStages); + //InitSequenceStateMachine(InitStages); return OK; } @@ -177,7 +257,7 @@ uint32_t InitSequenceStartHeatingCallBackFunction(uint32_t IfIndex, uint32_t Bus else Report("Remove control callback failed",__FILE__,__LINE__,(int)HWControlId,RpWarning,(int)InitSequenceStartHeatingCallBackFunction,0); InitStages++; - InitSequenceStateMachine(InitStages); + //InitSequenceStateMachine(InitStages); } return OK; } @@ -243,6 +323,7 @@ uint32_t InitSequenceStateMachine( INIT_SEQUENCE_STAGES_ENUM ReadValue) break; default: LOG_ERROR(ReadValue,"ERROR IN INIT STATE MACHINE"); + RemoveControlCallback( InitSchedulerControlId,InitScheduler); break; } return OK; diff --git a/Software/Embedded_SW/Embedded/StateMachines/Initialization/PowerIdle.c b/Software/Embedded_SW/Embedded/StateMachines/Initialization/PowerIdle.c new file mode 100644 index 000000000..22b30748f --- /dev/null +++ b/Software/Embedded_SW/Embedded/StateMachines/Initialization/PowerIdle.c @@ -0,0 +1,130 @@ +/* + * PowerIdle.c + * + * Created on: Apr 3, 2019 + * Author: shlomo + */ +#include "modules/General/GeneralHardware.h" +#include "modules/General/Safety.h" +#include "modules/thread/thread.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 "StateMachines/Printing/PrintingSTM.h" +#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 "Modules/General/buttons.h" + +#include "heaters/heaters_ex.h" + +#define DEFAULT_IDLE_TIME_LIMIT 3600 +int powerIdleSecondsCounter = 0; +int powerIdleSecondsLimit = DEFAULT_IDLE_TIME_LIMIT; +bool powerIdleState = false; +bool machineActive = false; +uint32_t IdleControlId = 0xFF; +ProcessParameters ActiveProcessParameters; +void PowerIdleSetIdle(void) +{ + memcpy (&ActiveProcessParameters,&ProcessParametersKeep,sizeof(ProcessParameters)); + ProcessParameters ProcessParametersClear; + ProcessParametersClear.dryerzone1temp = 80; + ProcessParametersClear.dryerzone2temp = 80; + ProcessParametersClear.dryerzone3temp = 80; + ProcessParametersClear.mixertemp = 0; + ProcessParametersClear.headzone1temp = 80; + ProcessParametersClear.headzone2temp = 80; + ProcessParametersClear.headzone3temp = 80; + ProcessParametersClear.headzone4temp = 80; + ProcessParametersClear.headzone5temp = 80; + ProcessParametersClear.headzone6temp = 80; + ProcessParametersClear.dyeingspeed = 40; + if (HandleProcessParameters(&ProcessParametersClear)!= OK) + { + LOG_ERROR (1, "Turn Heaters idle failed"); + return; + } + if (BlowerCfg.enabled == true) + { + Turn_the_Blower_On();//Turn on with the Default_Voltage + if (BlowerCfg.heatingvoltage) + Control_Voltage_To_Blower(BlowerCfg.heatingvoltage); + else + Control_Voltage_To_Blower(BlowerCfg.voltage-500); + } +} + +uint32_t PowerIdleCallBackFunction(uint32_t IfIndex, uint32_t BusyFlag) +{ + if (machineActive == true) + return OK; + if (powerIdleSecondsCounter%10 == 0) + Report("PowerIdle Idle counter ",__FILE__,__LINE__,(int)powerIdleSecondsLimit,RpWarning,(int)powerIdleSecondsCounter,0); + + if (++powerIdleSecondsCounter>=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<MAX_SYSTEM_DISPENSERS;i++) + IDS_StopHomeDispenser(i); + if (WHS_IsEmptying()|| + //MidTankFillingActive()|| + ThreadLoadingActive()|| + SwUpgradeActive()) + { + WaitForProcessCounter = 0; //15 minutes wait + REPORT_MSG (PowerOffMachineState, "On going processes, wait for end of process"); + WaitForProcessControlId = AddControlCallback( PowerOffWaitForProcessesCallback, eOneSecond, TemplateDataReadCBFunction,0,0, 0 ); + } + else + { + PowerOffMachineState = POWER_OFF_STOP_RUNNING_JOB; + } + //TBD + return OK; +} +/*******************************************************************************************************/ +uint32_t PowerOffStopRunningJob(void) +{ + if (JobIsActive()) + { + REPORT_MSG (PowerOffMachineState, "Stop running job"); + AbortJob("Power off pressed"); + } + PowerOffMachineState = POWER_OFF_SET_VALVE_POSITION; + return OK; +} +/*******************************************************************************************************/ +uint32_t PowerOffSetValvePosition(void) +{ + //TBD + PowerOffMachineState = POWER_OFF_WAIT_FOR_TEMPERATURE; + return OK; +} +/*******************************************************************************************************/ +uint32_t PowerOffWaitForTemperatureCallback(uint32_t IfIndex, uint32_t BusyFlag) +{ + uint32_t MaxTemp = 0,readTemp; + readTemp = TemperatureSensorRead( MIXER_PT100); + if ((readTemp>= 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. -/******************************************************************************************************************** - * this function is for development initial stages. it analyses the hardware configuration to determine which modules are operational +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. +*/ + +//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 (ModuleId<MAX_SYSTEM_MODULES); assert (result<=ModuleFail); - LOG_ERROR (ModuleId, "SegmentReady"); + //REPORT_MSG (ModuleId, "SegmentReady"); + Report("SegmentReady",__FILE__,__LINE__,(int)ModuleId,RpWarning,(int)result,0); if (SegmentWaiting[ModuleId] != ModuleWaiting) { LOG_ERROR (ModuleId, "Message from unrelated module!!"); + return OK; } SegmentWaiting[ModuleId] = result; @@ -271,18 +443,18 @@ uint32_t SegmentReady(int ModuleId, ModuleStateEnum result) } //******************************************************************************************************************** -static uint32_t SegmentState(void *JobDetails, int SegmentId) +static uint32_t SegmentState(void *SegmentDetails, int SegmentId) { SendJobProgress(0.0, SegmentId, false, "Segment Start"); if (Configured[Module_IDS]) { //SegmentWaiting[Module_IDS] = ModuleWaiting; - IDSSegmentState(JobDetails,SegmentId); + IDSSegmentState(SegmentDetails,SegmentId); } if (Configured[Module_Thread]) { SegmentWaiting[Module_Thread] = ModuleWaiting; - ThreadSegmentState(JobDetails,SegmentId); + ThreadSegmentState(SegmentDetails,SegmentId); } if (Configured[Module_Winder]) { @@ -307,6 +479,7 @@ uint32_t DistanceToSpoolReady(int ModuleId, ModuleStateEnum result) if (DistanceToSpoolWaiting[ModuleId] != ModuleWaiting) { LOG_ERROR (ModuleId, "Message from unrelated module!!"); + return OK; } DistanceToSpoolWaiting[ModuleId] = result; @@ -388,7 +561,7 @@ uint32_t EndState(void *JobDetails, char *Message) PreSegmentWaiting[Module_IDS] = ModuleIdle; DistanceToSpoolWaiting[Module_IDS] = ModuleIdle; //EndWaiting[Module_IDS] = ModuleWaiting; - IDSEndState(JobDetails); + IDSEndState(); } if (Configured[Module_Heaters]) { @@ -404,8 +577,9 @@ uint32_t EndState(void *JobDetails, char *Message) PreSegmentWaiting[Module_Thread] = ModuleIdle; DistanceToSpoolWaiting[Module_Thread] = ModuleIdle; //EndWaiting[Module_Thread] = ModuleWaiting; - ThreadEndState(CurrentJob); + ThreadEndState(); } + CloseJobFile(); //ROM_IntMasterEnable(); SendJobProgress(0.0,0,true,Message); @@ -432,16 +606,18 @@ void StartPrinting(void) //******************************************************************************************************************** //******************************************************************************************************************** -void StopPrinting(void) -{ -} int SegmentId = 0; +JobDescriptionFileSegment *Segment; +JobSegment SSegment; + +//******************************************************************************************************************** +//******************************************************************************************************************** void PrintSTMMsgHandler(void * msg) { JobMessageStruc *Message = msg; PrintMessageStruc *PrtMessage = (PrintMessageStruc *)Message->messageData; - 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_ */ |
