aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Embedded_SW
diff options
context:
space:
mode:
authorShlomo Hecht <shlomo@twine-s.com>2019-04-07 14:34:19 +0300
committerShlomo Hecht <shlomo@twine-s.com>2019-04-07 14:34:19 +0300
commite859f581bb925e575bba10e4468c3644a92ad266 (patch)
treef87e499812e80d59e912c48be4855244d64ad726 /Software/Embedded_SW
parentb40a16bd00381b710196b2db6bad08e875d90184 (diff)
downloadTango-e859f581bb925e575bba10e4468c3644a92ad266.tar.gz
Tango-e859f581bb925e575bba10e4468c3644a92ad266.zip
power down and idle changes
Diffstat (limited to 'Software/Embedded_SW')
-rw-r--r--Software/Embedded_SW/Embedded/Common/SWUpdate/FileSystem.c51
-rw-r--r--Software/Embedded_SW/Embedded/Common/SWUpdate/FirmwareUpgrade.c85
-rw-r--r--Software/Embedded_SW/Embedded/Common/SWUpdate/FirmwareUpgrade.h1
-rw-r--r--Software/Embedded_SW/Embedded/Common/SW_Info/SW_Info.c2
-rw-r--r--Software/Embedded_SW/Embedded/Common/report/distributor.c2
-rw-r--r--Software/Embedded_SW/Embedded/Common/report/reportInit.c37
-rw-r--r--Software/Embedded_SW/Embedded/Communication/Container.c5
-rw-r--r--Software/Embedded_SW/Embedded/Communication/PMR/Debugging/DebugLogCategory.pb-c.c4
-rw-r--r--Software/Embedded_SW/Embedded/Communication/PMR/Debugging/DebugLogCategory.pb-c.h2
-rw-r--r--Software/Embedded_SW/Embedded/Communication/PMR/EmbeddedParameters/AlarmSourceType.pb-c.c16
-rw-r--r--Software/Embedded_SW/Embedded/Communication/PMR/EmbeddedParameters/AlarmSourceType.pb-c.h5
-rw-r--r--Software/Embedded_SW/Embedded/Communication/PMR/EmbeddedParameters/ConfigurationParameters.pb-c.c110
-rw-r--r--Software/Embedded_SW/Embedded/Communication/PMR/EmbeddedParameters/ConfigurationParameters.pb-c.h18
-rw-r--r--Software/Embedded_SW/Embedded/Communication/PMR/Printing/JobTicket.pb-c.c19
-rw-r--r--Software/Embedded_SW/Embedded/Communication/PMR/Printing/JobTicket.pb-c.h4
-rw-r--r--Software/Embedded_SW/Embedded/DataDef.h25
-rw-r--r--Software/Embedded_SW/Embedded/Drivers/ADC_Sampling/ADC.c68
-rw-r--r--Software/Embedded_SW/Embedded/Drivers/ADC_Sampling/ADC.h29
-rw-r--r--Software/Embedded_SW/Embedded/Drivers/FPGA/FPGA.c68
-rw-r--r--Software/Embedded_SW/Embedded/Drivers/FPGA/FPGA.h3
-rw-r--r--Software/Embedded_SW/Embedded/Drivers/FPGA/FPGA_Comm.h47
-rw-r--r--Software/Embedded_SW/Embedded/Drivers/FPGA/FPGA_GPIO/FPGA_GPIO.c115
-rw-r--r--Software/Embedded_SW/Embedded/Drivers/FPGA/FPGA_GPIO/FPGA_GPIO.h4
-rw-r--r--Software/Embedded_SW/Embedded/Drivers/FPGA/FPGA_SPI_Comm.c73
-rw-r--r--Software/Embedded_SW/Embedded/Drivers/FPGA/FPGA_SPI_Comm.h5
-rw-r--r--Software/Embedded_SW/Embedded/Drivers/FPGA/Full_Vme/ispvme/ispvm_ui.c9
-rw-r--r--Software/Embedded_SW/Embedded/Drivers/FPGA/Full_Vme/ispvme/ivm_core.c1
-rw-r--r--Software/Embedded_SW/Embedded/Drivers/FPGA/Full_Vme/ispvme/vmopcode.h3
-rw-r--r--Software/Embedded_SW/Embedded/Drivers/FPGA/Motors_Driver/L6470.c (renamed from Software/Embedded_SW/Embedded/Drivers/FPGA/Moters_Driver/L6470.c)4
-rw-r--r--Software/Embedded_SW/Embedded/Drivers/FPGA/Motors_Driver/L6470.h (renamed from Software/Embedded_SW/Embedded/Drivers/FPGA/Moters_Driver/L6470.h)0
-rw-r--r--Software/Embedded_SW/Embedded/Drivers/FPGA/Motors_Driver/PowerSTEP01.h (renamed from Software/Embedded_SW/Embedded/Drivers/FPGA/Moters_Driver/PowerSTEP01.h)6
-rw-r--r--Software/Embedded_SW/Embedded/Drivers/Heater/Heater.c30
-rw-r--r--Software/Embedded_SW/Embedded/Drivers/I2C_Communication/ADC_MUX/ADC_MUX.c33
-rw-r--r--Software/Embedded_SW/Embedded/Drivers/I2C_Communication/ADC_MUX/ADC_MUX.h21
-rw-r--r--Software/Embedded_SW/Embedded/Drivers/I2C_Communication/Dispenser_Card/IO_Ports/Dispenser_IO.c322
-rw-r--r--Software/Embedded_SW/Embedded/Drivers/Motors/Motor.c35
-rw-r--r--Software/Embedded_SW/Embedded/Drivers/Motors/Motor.h11
-rw-r--r--Software/Embedded_SW/Embedded/Drivers/Motors/MotorActions.c160
-rw-r--r--Software/Embedded_SW/Embedded/Drivers/SPI/SPI_Comm.c4
-rw-r--r--Software/Embedded_SW/Embedded/Drivers/SSI_Comm/Dancer/Dancer.c5
-rw-r--r--Software/Embedded_SW/Embedded/Drivers/SSI_Comm/Dancer/Dancer.h1
-rw-r--r--Software/Embedded_SW/Embedded/Drivers/Valves/Valve.c13
-rw-r--r--Software/Embedded_SW/Embedded/Drivers/flash_ram/FlashProgram.c6
-rw-r--r--Software/Embedded_SW/Embedded/Main.c19
-rw-r--r--Software/Embedded_SW/Embedded/Modules/AlarmHandling/AlarmHandling.c567
-rw-r--r--Software/Embedded_SW/Embedded/Modules/AlarmHandling/AlarmHandling.h1
-rw-r--r--Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c16
-rw-r--r--Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.h1
-rw-r--r--Software/Embedded_SW/Embedded/Modules/Diagnostics/DiagnosticActions.c6
-rw-r--r--Software/Embedded_SW/Embedded/Modules/Diagnostics/Diagnostics.c88
-rw-r--r--Software/Embedded_SW/Embedded/Modules/General/GeneralHardware.c10
-rw-r--r--Software/Embedded_SW/Embedded/Modules/General/buttons.c153
-rw-r--r--Software/Embedded_SW/Embedded/Modules/General/buttons.h6
-rw-r--r--Software/Embedded_SW/Embedded/Modules/General/process.c2
-rw-r--r--Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_print.c23
-rw-r--r--Software/Embedded_SW/Embedded/Modules/IDS/IDS.h5
-rw-r--r--Software/Embedded_SW/Embedded/Modules/IDS/IDS_Cleaning.c56
-rw-r--r--Software/Embedded_SW/Embedded/Modules/IDS/IDS_dispenser.c61
-rw-r--r--Software/Embedded_SW/Embedded/Modules/IDS/IDS_ex.h19
-rw-r--r--Software/Embedded_SW/Embedded/Modules/IDS/IDS_maint.c12
-rw-r--r--Software/Embedded_SW/Embedded/Modules/IDS/IDS_print.c858
-rw-r--r--Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Progress.c3
-rw-r--r--Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Stub_Dancer.c3
-rw-r--r--Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Stub_Dispenser.c37
-rw-r--r--Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Stub_IntADC.c2
-rw-r--r--Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Stub_L6470.c3
-rw-r--r--Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Stub_Motor.c3
-rw-r--r--Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Stub_SpeedSensor.c3
-rw-r--r--Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Stub_TempSensor.c3
-rw-r--r--Software/Embedded_SW/Embedded/Modules/Stubs_Handler/Stub_Valve.c11
-rw-r--r--Software/Embedded_SW/Embedded/Modules/Thread/Thread.h2
-rw-r--r--Software/Embedded_SW/Embedded/Modules/Thread/ThreadLoad.c63
-rw-r--r--Software/Embedded_SW/Embedded/Modules/Thread/Thread_Winder.c70
-rw-r--r--Software/Embedded_SW/Embedded/Modules/Thread/Thread_ex.h8
-rw-r--r--Software/Embedded_SW/Embedded/Modules/Thread/Thread_init.c9
-rw-r--r--Software/Embedded_SW/Embedded/Modules/Thread/Thread_print.c96
-rw-r--r--Software/Embedded_SW/Embedded/Modules/Waste/Waste.h105
-rw-r--r--Software/Embedded_SW/Embedded/Modules/Waste/Waste_init.c1326
-rw-r--r--Software/Embedded_SW/Embedded/StateMachines/Initialization/InitSequence.c103
-rw-r--r--Software/Embedded_SW/Embedded/StateMachines/Initialization/PowerIdle.c130
-rw-r--r--Software/Embedded_SW/Embedded/StateMachines/Initialization/PowerIdle.h27
-rw-r--r--Software/Embedded_SW/Embedded/StateMachines/Initialization/PowerOffSequence.c347
-rw-r--r--Software/Embedded_SW/Embedded/StateMachines/Initialization/PowerOffSequence.h36
-rw-r--r--Software/Embedded_SW/Embedded/StateMachines/Printing/JobSTM.c31
-rw-r--r--Software/Embedded_SW/Embedded/StateMachines/Printing/PrintingSTM.c257
-rw-r--r--Software/Embedded_SW/Embedded/StateMachines/Printing/PrintingSTM.h13
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_ */