aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Embedded_SW/Embedded/Modules
diff options
context:
space:
mode:
authorShlomo Hecht <shlomo@twine-s.com>2018-06-20 19:59:18 +0300
committerShlomo Hecht <shlomo@twine-s.com>2018-06-20 19:59:18 +0300
commit0087c3567ff7322869fa6871e16372a49c382f38 (patch)
tree8642cdf67a65a11938f05499164f3f6a8ba7f510 /Software/Embedded_SW/Embedded/Modules
parent65d898feb5cadb4bf421f03e40ef3f3109c881a6 (diff)
downloadTango-0087c3567ff7322869fa6871e16372a49c382f38.tar.gz
Tango-0087c3567ff7322869fa6871e16372a49c382f38.zip
IDS Handling, Reports, Winder message flushing
Diffstat (limited to 'Software/Embedded_SW/Embedded/Modules')
-rw-r--r--Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c13
-rw-r--r--Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.h1
-rw-r--r--Software/Embedded_SW/Embedded/Modules/Heaters/Heaters.h1
-rw-r--r--Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_init.c6
-rw-r--r--Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_print.c5
-rw-r--r--Software/Embedded_SW/Embedded/Modules/IDS/IDS_print.c96
-rw-r--r--Software/Embedded_SW/Embedded/Modules/Thread/Thread_Winder.c4
-rw-r--r--Software/Embedded_SW/Embedded/Modules/Thread/Thread_print.c8
8 files changed, 98 insertions, 36 deletions
diff --git a/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c b/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c
index 67de0271f..3066153ab 100644
--- a/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c
+++ b/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c
@@ -192,6 +192,18 @@ int32_t MillisecSetMotorSpeed(TimerMotors_t MotorId, unsigned long Data, int Len
return OK;
}
+int MillisecFlushMsgQ(TimerMotors_t MotorId)
+{
+ MillisecMotorDataStruc MotorData = {0};
+ int pend = Mailbox_getNumPendingMsgs(MotorsMsgQ[MotorId]);
+ int i;
+ if (pend)
+ {
+ for (i=0;i<pend;i++)
+ Mailbox_pend(MotorsMsgQ[MotorId] , &MotorData, BIOS_NO_WAIT);
+ }
+ return pend;
+}
int32_t MillisecWriteToMotor(TimerMotors_t MotorId, unsigned long Data, int Length, MSecFptr Callback)
{
MillisecMotorDataStruc MotorData = {0};
@@ -354,6 +366,7 @@ uint32_t MillisecLoop(uint32_t tick)
{
for (Sensor_i = 0;Sensor_i < MAX_SYSTEM_DISPENSERS;Sensor_i++)
CalculateDispenserPressure(Sensor_i);
+ FPGA_GetAllDispensersValveBusyOCD();
}
/* OLD CODE
diff --git a/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.h b/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.h
index cf49e697a..807b81e98 100644
--- a/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.h
+++ b/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.h
@@ -19,6 +19,7 @@ int32_t MillisecSetMotorSpeed(TimerMotors_t MotorId, unsigned long Data, int Len
int32_t MillisecReadFromMotor(TimerMotors_t MotorId, unsigned long Data, int Length, MSecFptr Callback);
int32_t MillisecReadFromTempSensor(uint32_t TempSensorId, MSecFptr Callback);
+int MillisecFlushMsgQ(TimerMotors_t MotorId);
uint32_t getMotorStatusData(int MotorId);
uint32_t getMotorSpeedData(int MotorId);
diff --git a/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters.h b/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters.h
index 1878b6e55..757fa0412 100644
--- a/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters.h
+++ b/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters.h
@@ -70,5 +70,6 @@ extern uint32_t Heater_timerBase;
uint32_t HeaterRecalculateSharedHeatersParams(uint32_t deviceId, uint32_t new_outputproportionalpowerlimit);
void HeatingTestSendResonse(uint32_t status, bool last,bool heater1Active,bool heater2Active, int temperature1, int temperature2,int Heater1Percentage,int Heater2Percentage, char* Message);
+uint32_t HeaterRecalculateHeaterParams(uint32_t deviceId, uint32_t new_outputproportionalpowerlimit);
#endif
diff --git a/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_init.c b/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_init.c
index 7d5ec7afd..3fa8cfa40 100644
--- a/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_init.c
+++ b/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_init.c
@@ -45,10 +45,10 @@ typedef enum {
}HEATERS_EVENTS_ENUM;
/******************** GLOBAL PARAMETERS ********************************************/
-HeaterPIDControlConfig HeaterControl[MAX_HEATERS_NUM] = {0};
-HeaterControlConfig_t HeaterPIDConfig[MAX_HEATERS_NUM] = {0};
+HeaterPIDControlConfig HeaterControl[MAX_HEATERS_NUM] = {0,0,0,0,0,0,0,0,0,0,0,0};
+HeaterControlConfig_t HeaterPIDConfig[MAX_HEATERS_NUM] = {0,0,0,0,0,0,0,0,0,0,0,0};
uint32_t HeaterId2PT100Id[MAX_HEATERS_NUM] = {ANALOG_DRYER_TEMP1,ANALOG_DRYER_TEMP2,ANALOG_DRYER_TEMP3,TEMP_SENSE_ANALOG_DYEINGH_TEMP1,TEMP_SENSE_ANALOG_DYEINGH_TEMP2,TEMP_SENSE_ANALOG_DYEINGH_TEMP3,TEMP_SENSE_ANALOG_DYEINGH_TEMP4,ANALOG_MIXCHIP_TEMP};
-bool AcHeaterConfigured[MAX_AC_HEATERS] = {0};
+bool AcHeaterConfigured[MAX_AC_HEATERS] = {0,0,0};
int NumberOFSlicesInUse = 0;
uint32_t MillisecondsPerChange = 0;
diff --git a/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_print.c b/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_print.c
index e7711953f..38ae19f36 100644
--- a/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_print.c
+++ b/Software/Embedded_SW/Embedded/Modules/Heaters/Heaters_print.c
@@ -151,6 +151,11 @@ uint32_t HeaterCommandRequestMessage(int HeaterId, bool OnOff, int Temperature)
{
//uint32_t status = NOT_SUPPORTED;
//MessageContainer responseContainer;
+ if (HeaterControl[HeaterId].configured == false)
+ {
+ LOG_ERROR (HeaterId,"HeaterControl not configured");
+ return ERROR;
+ }
if (HeaterReducedPowerStarted == false)
{
HeaterReducedPowerStarted = true;
diff --git a/Software/Embedded_SW/Embedded/Modules/IDS/IDS_print.c b/Software/Embedded_SW/Embedded/Modules/IDS/IDS_print.c
index f44f2d790..66cfb3c7d 100644
--- a/Software/Embedded_SW/Embedded/Modules/IDS/IDS_print.c
+++ b/Software/Embedded_SW/Embedded/Modules/IDS/IDS_print.c
@@ -41,9 +41,9 @@ bool DispenserReady[MAX_SYSTEM_DISPENSERS] = {true};
/******************** STRUCTURES AND ENUMs ********************************************/
/******************** GLOBAL PARAMETERS ********************************************/
DispenserControlConfig_t DispenserControlConfig[MAX_SYSTEM_DISPENSERS];
-uint32_t ControlIdtoDispenserId [MAX_SYSTEM_DISPENSERS] = {0xFF};
-int OriginalDispenserSpd_2PPS[MAX_SYSTEM_DISPENSERS] = {0};
-bool DispenserPreSegmentReady[MAX_SYSTEM_DISPENSERS] = {false};
+uint32_t ControlIdtoDispenserId [MAX_SYSTEM_DISPENSERS] = {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};
+int OriginalDispenserSpd_2PPS[MAX_SYSTEM_DISPENSERS] = {0,0,0,0,0,0,0,0};
+bool DispenserPreSegmentReady[MAX_SYSTEM_DISPENSERS] = {true,true,true,true,true,true,true,true};
int JobBrushStopId = 0;
uint32_t IDS_DispenserPidRequestMessage(HardwarePidControl* request)
@@ -126,17 +126,13 @@ uint32_t IDS_DispenserPidRequestMessage(HardwarePidControl* request)
*
*/
//ValveCommand (Enable,MixerDirection);
- #ifdef DEBUG_TEST_FUNCTIONS
-// add control here
- #else
- #endif
}
//set 3 dancers to the profile positions
for (i = 0; i < MAX_SYSTEM_DISPENSERS; i++)
{
DispenserReady[i] = true;
}
-
+ DispenserPrepareReady();
return OK;
}
void DispenserPrepareReady(void)
@@ -172,7 +168,7 @@ uint32_t IDSPreSegmentState(void *JobDetails, int SegmentId)
{
//set the speed only before the first segment, speed is constant accros job
JobTicket* JobTicket = JobDetails;
- int Dispenser_i;
+ int Dispenser_i,n_dispensers,DispenserId;
TimerMotors_t HW_Motor_Id;
JobBrushStopId = 0;
@@ -181,18 +177,35 @@ 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.
*/
- for (Dispenser_i = 0;Dispenser_i <= MAX_SYSTEM_DISPENSERS;Dispenser_i++)
+ if (SegmentId>=JobTicket->n_segments)
+ {
+ LOG_ERROR(SegmentId,"Error Segment");
+ return ERROR;
+ }
+ if (JobBrushStopId>=JobTicket->segments[SegmentId]->n_brushstops)
+ {
+ LOG_ERROR(JobBrushStopId,"Error JobBrushStopId");
+ return ERROR;
+ }
+ if (JobTicket->segments[SegmentId]->brushstops[JobBrushStopId]->n_dispensers)
{
- HW_Motor_Id = DispenserIdToMotorId[Dispenser_i];
- Control3WayValvesWithCallback (Dispenser_i, MidTank_Dispenser, IDS_Valve_PresegmentReady); //direction: MidTank_Dispenser or Dispenser_Mixer
+ n_dispensers = JobBrushStopId>=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;
+ HW_Motor_Id = DispenserIdToMotorId[DispenserId];
+ if (MotorsCfg[HW_Motor_Id].hardwaremotortype != DispenserIdToMotorId[DispenserId])//unconfigured dispenser
+ continue;
+ Control3WayValvesWithCallback ((Valves_t)DispenserId, MidTank_Dispenser, IDS_Valve_PresegmentReady); //direction: MidTank_Dispenser or Dispenser_Mixer
- MotorStop(HW_Motor_Id,Hard_Stop);
- if (JobTicket->segments[SegmentId]->brushstops[JobBrushStopId]->dispensers[Dispenser_i]->has_dispenserstepdivision)
- MotorSetMicroStep(HW_Motor_Id,JobTicket->segments[SegmentId]->brushstops[JobBrushStopId]->dispensers[Dispenser_i]->dispenserstepdivision);
- else
- MotorSetMicroStep(HW_Motor_Id,MotorsCfg[HW_Motor_Id].microstep);
- DispenserPreSegmentReady[Dispenser_i] = false;
+ MotorStop(HW_Motor_Id,Hard_Stop);
+ if (JobTicket->segments[SegmentId]->brushstops[JobBrushStopId]->dispensers[Dispenser_i]->has_dispenserstepdivision)
+ MotorSetMicroStep(HW_Motor_Id,JobTicket->segments[SegmentId]->brushstops[JobBrushStopId]->dispensers[Dispenser_i]->dispenserstepdivision);
+ else
+ MotorSetMicroStep(HW_Motor_Id,MotorsCfg[HW_Motor_Id].microstep);
+ DispenserPreSegmentReady[DispenserId] = false;
+ }
}
//call the job state machine when the thread system is ready
//PreSegmentReady(Module_IDS,ModuleDone);
@@ -204,26 +217,45 @@ uint32_t IDSPreSegmentState(void *JobDetails, int SegmentId)
uint32_t IDSSegmentState(void *JobDetails, int SegmentId)
{
JobTicket* JobTicket = JobDetails;
- int Dispenser_i;
+ int Dispenser_i,n_dispensers,DispenserId;
TimerMotors_t HW_Motor_Id;
double segmentfirst_speed;
- int CurrentSegment = 0;
+ int CurrentSegment = SegmentId;
- for (Dispenser_i = 0;Dispenser_i <= MAX_SYSTEM_DISPENSERS;Dispenser_i++)
+ if (CurrentSegment>=JobTicket->n_segments)
+ {
+ LOG_ERROR(CurrentSegment,"Error Segment");
+ return ERROR;
+ }
+ if (JobBrushStopId>=JobTicket->segments[CurrentSegment]->n_brushstops)
{
- HW_Motor_Id = DispenserIdToMotorId[Dispenser_i];
- //(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;
-// double Dispenser_speed = (segmentfirst_speed * MotorsCfg[HW_Motor_Id].pulseperround)/(2*PI* MotorsCfg[HW_Motor_Id].pulleyradius);
- //DispenserControlConfig[Dispenser_i].m_SetParam = Dispenser_speed;
-// OriginalDispenserSpd_2PPS[Dispenser_i] = (int)Dispenser_speed;
- if ((int)segmentfirst_speed > 0)
- {
- Control3WayValvesWithCallback (Dispenser_i, Dispenser_Mixer, NULL); //direction: MidTank_Dispenser or Dispenser_Mixer
- MotorSetSpeed(HW_Motor_Id, segmentfirst_speed);
- }
+ LOG_ERROR(JobBrushStopId,"Error JobBrushStopId");
+ return ERROR;
}
+ if (JobTicket->segments[CurrentSegment]->brushstops[JobBrushStopId]->n_dispensers)
+ {
+ n_dispensers = JobBrushStopId>=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;
+ // double Dispenser_speed = (segmentfirst_speed * MotorsCfg[HW_Motor_Id].pulseperround)/(2*PI* MotorsCfg[HW_Motor_Id].pulleyradius);
+ //DispenserControlConfig[Dispenser_i].m_SetParam = Dispenser_speed;
+ // OriginalDispenserSpd_2PPS[Dispenser_i] = (int)Dispenser_speed;
+ if ((int)segmentfirst_speed > 0)
+ {
+ Control3WayValvesWithCallback (DispenserId, Dispenser_Mixer, NULL); //direction: MidTank_Dispenser or Dispenser_Mixer
+ MotorSetSpeed(HW_Motor_Id, segmentfirst_speed);
+ }
+ }
+ }
+
return OK;
}
diff --git a/Software/Embedded_SW/Embedded/Modules/Thread/Thread_Winder.c b/Software/Embedded_SW/Embedded/Modules/Thread/Thread_Winder.c
index 3505ff3c6..e564e52d0 100644
--- a/Software/Embedded_SW/Embedded/Modules/Thread/Thread_Winder.c
+++ b/Software/Embedded_SW/Embedded/Modules/Thread/Thread_Winder.c
@@ -72,6 +72,8 @@ uint32_t Winder_PrepareStage2(uint32_t deviceID, uint32_t ReadValue)
uint32_t status=OK;
uint32_t numOfSteps = InternalWinderCfg.startoffsetpulses*MotorsCfg[HARDWARE_MOTOR_TYPE__MOTO_SCREW].microstep;
+ MotorSetMaxSpeed (HARDWARE_MOTOR_TYPE__MOTO_SCREW,MotorsCfg[HARDWARE_MOTOR_TYPE__MOTO_SCREW].maxfrequency);
+
status |= MotorMoveWithCallback(HARDWARE_MOTOR_TYPE__MOTO_SCREW, (1-MotorsCfg[HARDWARE_MOTOR_TYPE__MOTO_SCREW].directionthreadwize),numOfSteps, Winder_ScrewAtOffsetCallback);
//set motor location 0 here
return status;
@@ -180,10 +182,12 @@ uint32_t Winder_Presegment(void *JobDetails)
}
uint32_t Winder_End(void)
{
+ int pend;
//stop screw
ScrewNumberOfSteps = 0;
if (ScrewControlId != 0xFF)
RemoveControlCallback(ScrewControlId,ScrewDirectionChange);
+ pend = MillisecFlushMsgQ(HARDWARE_MOTOR_TYPE__MOTO_SCREW);
return MotorStop (HARDWARE_MOTOR_TYPE__MOTO_SCREW,Hard_Hiz);
}
void Winder_ScrewHomeLimitSwitchInterrupt(void)
diff --git a/Software/Embedded_SW/Embedded/Modules/Thread/Thread_print.c b/Software/Embedded_SW/Embedded/Modules/Thread/Thread_print.c
index e9cc3ddde..444a9fb5d 100644
--- a/Software/Embedded_SW/Embedded/Modules/Thread/Thread_print.c
+++ b/Software/Embedded_SW/Embedded/Modules/Thread/Thread_print.c
@@ -523,12 +523,14 @@ void ThreadDistanceToSpoolEnded(void)
{
}
+double seglength = 0.0;
//********************************************************************************************************************
uint32_t ThreadSegmentState(void *JobDetails, int SegmentId)
{
JobTicket* JobTicket = JobDetails;
+ seglength = JobTicket->segments[SegmentId]->length;
CurrentSegmentId = SegmentId;
- ThreadUpdateProcessLength (JobTicket->segments[SegmentId]->length,(void *)ThreadSegmentEnded);
+ ThreadUpdateProcessLength (seglength,(void *)ThreadSegmentEnded);
return OK;
}
@@ -536,9 +538,13 @@ uint32_t ThreadSegmentState(void *JobDetails, int SegmentId)
uint32_t ThreadEndState(void *JobDetails)
{
int Motor_i;
+ ThreadUpdateProcessLength (0.0,(void *)NULL);
+ SetOriginMotorSpeed(0);
+
if (SpeedControlId != 0xFF)
{
RemoveControlCallback(SpeedControlId,ThreadLengthCBFunction);
+ SpeedControlId == 0xFF;
}
for ( Motor_i = 0;Motor_i < MAX_THREAD_MOTORS_NUM;Motor_i++)
{