aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Embedded_SW/Embedded/Modules/IDS
diff options
context:
space:
mode:
Diffstat (limited to 'Software/Embedded_SW/Embedded/Modules/IDS')
-rw-r--r--Software/Embedded_SW/Embedded/Modules/IDS/IDS_dispenser.c58
-rw-r--r--Software/Embedded_SW/Embedded/Modules/IDS/IDS_ex.h3
-rw-r--r--Software/Embedded_SW/Embedded/Modules/IDS/IDS_maint.c19
-rw-r--r--Software/Embedded_SW/Embedded/Modules/IDS/IDS_print.c39
4 files changed, 108 insertions, 11 deletions
diff --git a/Software/Embedded_SW/Embedded/Modules/IDS/IDS_dispenser.c b/Software/Embedded_SW/Embedded/Modules/IDS/IDS_dispenser.c
index c8f435cb9..4d103395c 100644
--- a/Software/Embedded_SW/Embedded/Modules/IDS/IDS_dispenser.c
+++ b/Software/Embedded_SW/Embedded/Modules/IDS/IDS_dispenser.c
@@ -17,7 +17,8 @@
#include "Common/SWUpdate/FileSystem.h"
#include "drivers/Flash_Memory/fatfs/ff.h"
-#include "drivers/Flash_ram/FlashProgram.h"
+//#include "drivers/Flash_ram/FlashProgram.h"
+#include "drivers/Flash_ram/MCU_E2Prom.h"
#include "StateMachines/Printing/PrintingSTM.h"
@@ -32,6 +33,29 @@ uint32_t OpenValveTimeout = 10;
#define DISPENSER_BUILD_PRESSURE_TIMEOUT 120000
#define DISPENSER_BUILD_PRESSURE_LAG 50
#define DEFAULT_NANOLITER_PER_PULSE 2.34
+
+FPGA_GPI_ENUM Dispenser_Id_to_LS_50_Id[MAX_SYSTEM_DISPENSERS] = {
+ GPI_LS_DISPENSER_50_1, //MOTO_DISPENSER_1 = 6,
+ GPI_LS_DISPENSER_50_2, //MOTO_DISPENSER_2 = 7,
+ GPI_LS_DISPENSER_50_3, //MOTO_DISPENSER_3 = 8,
+ GPI_LS_DISPENSER_50_4, //MOTO_DISPENSER_4 = 9,
+ GPI_LS_DISPENSER_50_5, //MOTO_DISPENSER_5 = 10,
+ GPI_LS_DISPENSER_50_6, //MOTO_DISPENSER_6 = 11,
+ GPI_LS_DISPENSER_50_7, //MOTO_DISPENSER_7 = 12,
+ GPI_LS_DISPENSER_50_8, //MOTO_DISPENSER_8 = 13,
+};
+FPGA_GPI_ENUM Dispenser_Id_to_LS_25_Id[MAX_SYSTEM_DISPENSERS] = {
+ GPI_LS_DISPENSER_25_1, //MOTO_DISPENSER_1 = 6,
+ GPI_LS_DISPENSER_25_2, //MOTO_DISPENSER_2 = 7,
+ GPI_LS_DISPENSER_25_3, //MOTO_DISPENSER_3 = 8,
+ GPI_LS_DISPENSER_25_4, //MOTO_DISPENSER_4 = 9,
+ GPI_LS_DISPENSER_25_5, //MOTO_DISPENSER_5 = 10,
+ GPI_LS_DISPENSER_25_6, //MOTO_DISPENSER_6 = 11,
+ GPI_LS_DISPENSER_25_7, //MOTO_DISPENSER_7 = 12,
+ GPI_LS_DISPENSER_25_8, //MOTO_DISPENSER_8 = 13,
+};
+bool DispenserDirectionFlag_50[MAX_SYSTEM_DISPENSERS] = {0,0,0,0,0,0,0,0};
+bool DispenserDirectionFlag_25[MAX_SYSTEM_DISPENSERS] = {0,0,0,0,0,0,0,0};
uint32_t DispenserPrepareSpeed = DISPENSER_BUILD_PRESSURE_SPEED;
double DispenserPreparePressure = DISPENSER_BUILD_PRESSURE_LIMIT;
uint32_t DispenserPrepareTimeout = DISPENSER_BUILD_PRESSURE_TIMEOUT;
@@ -249,7 +273,10 @@ void IDS_Dispenser_Content_Init (void)
}
//==================================
- memcpy(&Bytes,(void *)DISPENSERS_MAP_IN_FLASH,sizeof(Bytes));
+ //MCU_E2PromProgramChunk(DISPENSERS_MAP_IN_EEPROM,4,&Bytes);
+
+ MCU_E2PromReadChunk(DISPENSERS_MAP_IN_EEPROM,4,&Bytes);
+ //memcpy(&Bytes,(void *)DISPENSERS_MAP_IN_FLASH,sizeof(Bytes));
bool havedata = false;
DispenserData* StoredDispenserData;
if ((Bytes)&&(Bytes < 500))
@@ -257,9 +284,11 @@ void IDS_Dispenser_Content_Init (void)
buffer = my_malloc (Bytes);
if (buffer)
{
- memcpy(buffer, (void *)(DISPENSERS_MAP_IN_FLASH+4),Bytes);
+ MCU_E2PromReadChunk(DISPENSERS_MAP_IN_EEPROM+4,Bytes,buffer);
+ //memcpy(buffer, (void *)(DISPENSERS_MAP_IN_FLASH+4),Bytes);
StoredDispenserData = dispenser_data__unpack(NULL,Bytes,buffer);
- havedata = true;
+ if (StoredDispenserData)
+ havedata = true;
free(buffer);
}
}
@@ -323,11 +352,14 @@ uint32_t IDS_Dispenser_Store_Data (void)
if (JobIsActive()==false)
{
response_size = dispenser_data__pack(&StoreDispenserData, dispensers_container_buffer);
- EraseFlashSection(DISPENSERS_SECTION_FLASH);
+
+ MCU_E2PromProgramChunk(DISPENSERS_MAP_IN_EEPROM,4,&response_size);
+ MCU_E2PromProgramChunk(DISPENSERS_MAP_IN_EEPROM+4, response_size, dispensers_container_buffer);
+ /*EraseFlashSection(DISPENSERS_SECTION_FLASH);
ReadAppAndProgram(DISPENSERS_MAP_IN_FLASH, 4,&response_size);
ReadAppAndProgram(DISPENSERS_MAP_IN_FLASH+4, response_size, dispensers_container_buffer);
//ReportWithPackageFilter(IDSFilter,"IDS_Dispenser_Store ",__FILE__,__LINE__,(int)response_size,RpWarning,(int)StoreDispenserData.dispenserinfo[4]->nanolitterperpulse *100,0);
-
+ */
/*Status = FileWrite(IDS_Dispenser_Data,response_size,DispenserStorePath,BIOS_NO_WAIT);
if (Status == FR_OK)
{
@@ -371,6 +403,16 @@ void IDS_Dispenser_Content_Calculation (char DispenserId)
{
ReportWithPackageFilter(IDSFilter,"IDS_Dispenser_Data ",__FILE__,DispenserId,(int)IDS_Dispenser_Data[DispenserId].consumedinnanolitter,RpWarning,(int)CurrentDispenserSpeed[DispenserId],0);
}
+ if ((Dispenser_Id_to_LS_50_Id[DispenserId])&&(DispenserDirectionFlag_50[DispenserId]==false))
+ {
+ DispenserDirectionFlag_50[DispenserId]= true;
+ ReportWithPackageFilter(IDSFilter,"Dispenser at 50% ",__FILE__,DispenserId,(int)IDS_Dispenser_Data[DispenserId].consumedinnanolitter,RpWarning,(int)65000000,0);
+ }
+ if ((Dispenser_Id_to_LS_25_Id[DispenserId])&&(DispenserDirectionFlag_25[DispenserId]==false))
+ {
+ DispenserDirectionFlag_25[DispenserId]= true;
+ ReportWithPackageFilter(IDSFilter,"Dispenser at 25% ",__FILE__,DispenserId,(int)IDS_Dispenser_Data[DispenserId].consumedinnanolitter,RpWarning,(int)32500000,0);
+ }
}
if (DispenserId == 0)
{
@@ -401,6 +443,8 @@ void IDS_Dispenser_RefillStarted (char DispenserId,char MicroSteps)
IDS_Dispenser_Data[DispenserId].nanolitterperpulse = assumedFlow;
IDS_Dispenser_Data[DispenserId].microsteps = 1;
IDS_Dispenser_Data[DispenserId].direction = 0;*/
+ DispenserDirectionFlag_50[DispenserId] = false;
+ DispenserDirectionFlag_25[DispenserId] = false;
ReportWithPackageFilter(IDSFilter,"IDS_Dispenser_RefillStarted",__FILE__,__LINE__,(int)DispenserId,RpWarning,(int)(CurrentDispenserSpeed[DispenserId]),0);
}
void IDS_Dispenser_RefillEnded (char DispenserId,char MicroSteps)
@@ -410,6 +454,8 @@ void IDS_Dispenser_RefillEnded (char DispenserId,char MicroSteps)
IDS_Dispenser_Data[DispenserId].numberofrefills++;
//IDS_Dispenser_Data[DispenserId].direction = 1;
IDS_Dispenser_Data[DispenserId].consumedinnanolitter = 0;
+ DispenserDirectionFlag_50[DispenserId] = false;
+ DispenserDirectionFlag_25[DispenserId] = false;
ReportWithPackageFilter(IDSFilter,"IDS_Dispenser_RefillEnded",__FILE__,__LINE__,(int)DispenserId,RpWarning,(int)IDS_Dispenser_Data[DispenserId].numberofrefills,0);
}
void DispenserDataRequestFunc(MessageContainer* requestContainer)
diff --git a/Software/Embedded_SW/Embedded/Modules/IDS/IDS_ex.h b/Software/Embedded_SW/Embedded/Modules/IDS/IDS_ex.h
index 0a8060496..ceb504099 100644
--- a/Software/Embedded_SW/Embedded/Modules/IDS/IDS_ex.h
+++ b/Software/Embedded_SW/Embedded/Modules/IDS/IDS_ex.h
@@ -60,6 +60,9 @@ void IDS_Dispenser_Content_Init (void);
uint32_t IDSPrepareState(void *JobDetails);
void IDSPrepareStart(void);
+//this function returns preparation ratio for the most cool heater (current temperature/ target temerature)
+double IdsPrepareProgress(void);
+
uint32_t IDSPreSegmentState(void *SegmentDetails, int SegmentId);
uint32_t IDSCheckSegmentData(void *SegmentDetails, int SegmentId);
uint32_t IDSSegmentState(void *SegmentDetails, int SegmentId);
diff --git a/Software/Embedded_SW/Embedded/Modules/IDS/IDS_maint.c b/Software/Embedded_SW/Embedded/Modules/IDS/IDS_maint.c
index a1aa37c07..9c422444f 100644
--- a/Software/Embedded_SW/Embedded/Modules/IDS/IDS_maint.c
+++ b/Software/Embedded_SW/Embedded/Modules/IDS/IDS_maint.c
@@ -83,6 +83,7 @@ uint32_t InitialDispenserTimeout = INITIAL_DISPENSER_TIMEOUT_LIMIT;
uint32_t InitialDispenserTimeLag = INITIAL_DISPENSER_TIMEOUT;
uint32_t InitialDispenserSpeed = INITIAL_DISPENSER_SPEED;
+uint32_t DispenserHomingTimeoutControlId [MAX_SYSTEM_DISPENSERS] = {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};
uint32_t ControlIdtoInactiveDispenserId [MAX_SYSTEM_DISPENSERS] = {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};
//uint32_t IDS_StopHomeDispenserBuildPressure (uint32_t deviceID);
@@ -189,6 +190,14 @@ uint32_t IDS_HomeDispenserWaitForHomingEnd(uint32_t DispenserId, uint32_t timeo
}
return OK;
}*/
+uint32_t IDS_Honing_Timeout_Callback(uint32_t DispenserId, uint32_t ReadValue)
+{
+ ReportWithPackageFilter(IDSFilter,"IDS_Honing_Timeout_Callback",__FILE__,DispenserId,(int)(GetDispenserPressure(DispenserId)*100),RpWarning,2000,0);
+ SafeRemoveControlCallback(DispenserHomingTimeoutControlId[DispenserId], IDS_Honing_Timeout_Callback );
+ AlarmHandlingSetAlarm (DispenserId+EVENT_TYPE__DISPENSER_1_REFILL_FAILURE,true);
+ return OK;
+}
+
uint32_t IDS_HomeDispenserCallback(uint32_t motorId, uint32_t ReadValue)
{
uint8_t DispenserId = motorId-HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_1;
@@ -203,7 +212,8 @@ uint32_t IDS_HomeDispenserCallback(uint32_t motorId, uint32_t ReadValue)
HomingRequestCallback[DispenserId](DispenserId,0);
HomingRequestCallback[DispenserId] = NULL;
}
-// HomingActive[DispenserId]= false;
+ RemoveControlCallback(DispenserHomingTimeoutControlId[DispenserId], IDS_Honing_Timeout_Callback );
+ // HomingActive[DispenserId]= false;
IDS_Dispenser_RefillEnded ( DispenserId, MotorsCfg[motorId].microstep);
ReportWithPackageFilter(IDSFilter,"Homing ended",__FILE__,millisecondCounter,(int)DispenserId,RpWarning,(int)DispenserHomingTime[DispenserId],0);
// DispenserHomingControlId[DispenserId] = AddControlCallback( IDS_HomeDispenserBackMoveCallback, InitialDispenserTimeLag, GetDispenserPressure,motorId, motorId, 0 );
@@ -295,17 +305,23 @@ uint32_t IDS_HomeDispenser (uint32_t DispenserId, uint32_t speed , callback_fptr
Enable_MidTank_Pressure_Reading(DispenserId);
IDS_Dispenser_RefillStarted(DispenserId,1);
+ AlarmHandlingSetAlarm (DispenserId+EVENT_TYPE__DISPENSER_1_REFILL_FAILURE,false);
if (DispenserId== LUBRICANT_DISPENSER)
{
MotorMovetoLimitSwitch (MotorId,1-MotorsCfg[MotorId].directionthreadwize, speed/4, Dispenser_Id_to_LS_Id[DispenserId], IDS_HomeDispenserCallback,0);
CurrentDispenserSpeed[DispenserId] = speed/4;
ReportWithPackageFilter(IDSFilter,"IDS_HomeDispenser ",__FILE__,(int)(midTankContent*1000),(int)DispenserId,RpWarning,speed/4,0);
+ if (DispenserHomingTimeoutControlId[DispenserId] == 0xFF)
+ DispenserHomingTimeoutControlId[DispenserId] = AddControlCallback("IDS Homing Timeout", IDS_Honing_Timeout_Callback, eOneHour*4,TemplateDataReadCBFunction ,DispenserId, 0, 0 );
+
}
else
{
MotorMovetoLimitSwitch (MotorId,1-MotorsCfg[MotorId].directionthreadwize, speed, Dispenser_Id_to_LS_Id[DispenserId], IDS_HomeDispenserCallback,0);
CurrentDispenserSpeed[DispenserId] = speed;
ReportWithPackageFilter(IDSFilter,"IDS_HomeDispenser ",__FILE__,(int)(midTankContent*1000),(int)DispenserId,RpWarning,speed,0);
+ if (DispenserHomingTimeoutControlId[DispenserId] == 0xFF)
+ DispenserHomingTimeoutControlId[DispenserId] = AddControlCallback("IDS Homing Timeout", IDS_Honing_Timeout_Callback, eOneHour,TemplateDataReadCBFunction ,DispenserId, 0, 0 );
}
CurrentDispenserSpeed[DispenserId] = (-1*CurrentDispenserSpeed[DispenserId]);
DispenserLastMovementDown[DispenserId] = true;
@@ -327,6 +343,7 @@ uint32_t IDS_StopHomeDispenser (uint32_t DispenserId)
TimerMotors_t MotorId = (DispenserId)+HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_1;
MotorAbortMovetoLimitSwitch(MotorId);
+ RemoveControlCallback(DispenserHomingTimeoutControlId[DispenserId], IDS_Honing_Timeout_Callback );
//close dry air valve in the dispenser
Disable_MidTank_Pressure_Reading(DispenserId);
Valve_Set(IDS_Id_to_AirValve[DispenserId], Atm_MidTank_OFF);
diff --git a/Software/Embedded_SW/Embedded/Modules/IDS/IDS_print.c b/Software/Embedded_SW/Embedded/Modules/IDS/IDS_print.c
index 559ffdecc..19507775e 100644
--- a/Software/Embedded_SW/Embedded/Modules/IDS/IDS_print.c
+++ b/Software/Embedded_SW/Embedded/Modules/IDS/IDS_print.c
@@ -134,7 +134,7 @@ void IDS_Dispenser_SetPreSegmentWFCFValues(double dispenserpresegmentwfcf, doubl
/*uint32_t IDS_DispenserControlInit()
{
- DispensersControl = (void *)(DISPENSERS_MAP_IN_FLASH);
+ DispensersControl = (void *)(?/);
DispensersControl = DispensersCtrl;
//EraseFlashSection(DispensersControl,sizeof(HardwarePidControl)*MAX_SYSTEM_DISPENSERS);
@@ -459,11 +459,31 @@ c. Go to step 2.a x Segment.BrushStopsCount.
uint32_t DispenserPrepareControlId = 0xFF;
int NumOfActiveDispensers = 0;
int DispenserBuildTimeCounter = 0;
- double TargetNumberOfStepsPreRun,MaximalPressurePreRun;
+ double TargetNumberOfStepsPreRun = 120000,MaximalPressurePreRun = 4;
int DispenserTotalPrepareSteps[MAX_SYSTEM_DISPENSERS];
bool DispenserLastMovementDown[MAX_SYSTEM_DISPENSERS];
#define PRESSURE_READ_TIME_GAP 100
+ //this function returns preparation ratio for the most cool heater (current temperature/ target temerature)
+ double IdsPrepareProgress(void)
+ {
+ HardwarePidControlType i;
+ double MaxDifference = 1.00,temp = 0;
+ if (TargetNumberOfStepsPreRun == 0)
+ return 1.00;
+ for (i = 0; i < MAX_DYE_DISPENSERS; i++)
+ {
+ if (DispenserUsedInJob[i] == false) //we actually should check for all dispensers
+ continue;
+ if (DispenserTotalPrepareSteps[i]>TargetNumberOfStepsPreRun)
+ continue;
+ temp = DispenserTotalPrepareSteps[i]/TargetNumberOfStepsPreRun;
+ if (temp<MaxDifference)
+ MaxDifference = temp;
+ }
+ //Report("IdsPrepareProgress" ,__FILE__,__LINE__,(int)(MaxDifference*100),RpWarning,0,0);
+ return MaxDifference;
+ }
uint32_t InactiveDispenserHome(uint32_t DispenserId, uint32_t ReadValue)
{
@@ -1523,7 +1543,7 @@ uint32_t IDSPreSegmentState(void *SegmentDetails, int SegmentId)
//********************************************************************************************************************
uint32_t SegmentNumOfBrushStops = 0;
-double BrushStopTime = 0;
+double BrushStopTime = 0,BrushStopOffset = 0,PrevBrushStopOffset = 0;
uint32_t BrushStopCounter = 0;
uint32_t BrushStopStartTime = 0,BrushStopLength = 0;
@@ -1532,7 +1552,16 @@ void IDS_StartBrushStop(int n_dispensers, JobDispenser** Dispensers)
int Dispenser_i,DispenserId;
TimerMotors_t HW_Motor_Id;
double segmentfirst_speed;
+ double tempBrushStopTime = 0;
//ReportWithPackageFilter(IDSFilter,"IDS_StartBrushStop",__FILE__,__LINE__,(int)JobBrushStopId,RpWarning,(int)0,0);
+ PrevBrushStopOffset = BrushStopOffset;
+ BrushStopOffset = FileBrushStop->offsetmeters;
+ tempBrushStopTime = (BrushStopOffset-PrevBrushStopOffset); //length in meters
+ tempBrushStopTime = ((tempBrushStopTime*100)/dyeingspeed);//brushstop in seconds (length in cetimeters/ centimeters per second)
+ tempBrushStopTime *= 1000; // milliseconds
+ if (tempBrushStopTime > 100)
+ BrushStopTime = tempBrushStopTime;
+ ReportWithPackageFilter(IDSFilter,"IDS_StartBrushStop offset", __FILE__, tempBrushStopTime,(int)(BrushStopOffset*100), RpWarning,(int)(PrevBrushStopOffset*100), 0);
if (n_dispensers)
{
@@ -1611,7 +1640,7 @@ void IDS_StartBrushStop(int n_dispensers, JobDispenser** Dispensers)
//usnprintf(IdMessage, 80,"IDS_StartBrushStop %d/%d K %d,C %d,M %d,Y %d,TI %d",FileBrushStop->index,SegmentNumOfBrushStops,CurrentDispenserSpeed[0],
// CurrentDispenserSpeed[1],CurrentDispenserSpeed[2],CurrentDispenserSpeed[3],CurrentDispenserSpeed[4]);
if (BuildIdsJobPrintString(IdMessage,"IDS_StartBrushStop ",FileBrushStop->index))
- ReportWithPackageFilter(IDSFilter,IdMessage, __FILE__, SegmentNumOfBrushStops, FileBrushStop->index, RpWarning,(int)FileBrushStop->offsetmeters, 0);
+ ReportWithPackageFilter(IDSFilter,IdMessage, __FILE__, SegmentNumOfBrushStops, FileBrushStop->index, RpWarning,(int)(FileBrushStop->offsetmeters*100), 0);
}
uint32_t IDSBrushStopRestartCallback(uint32_t IfIndex, uint32_t readValue)
@@ -1714,6 +1743,8 @@ uint32_t IDSSegmentState(void *SegmentDetails, int SegmentId)
if (CurrentDispenserSpeed[CLEANER_DISPENSER]>0)
IDS_Cleaning_Stop_Cleaning_Solution(NULL);
#endif
+ BrushStopOffset = 0;
+ PrevBrushStopOffset = 0;
SegmentNumOfBrushStops = Segment->n_brushstops;
BrushStopTime = Segment->length*1000/(double)SegmentNumOfBrushStops; //brushstop in meters //brushstop in millisecond
BrushStopTime = ((BrushStopTime*100)/dyeingspeed);//brushstop in seconds