From 0087c3567ff7322869fa6871e16372a49c382f38 Mon Sep 17 00:00:00 2001 From: Shlomo Hecht Date: Wed, 20 Jun 2018 19:59:18 +0300 Subject: IDS Handling, Reports, Winder message flushing --- .../Embedded/Modules/Control/MillisecTask.c | 13 +++ .../Embedded/Modules/Control/MillisecTask.h | 1 + .../Embedded_SW/Embedded/Modules/Heaters/Heaters.h | 1 + .../Embedded/Modules/Heaters/Heaters_init.c | 6 +- .../Embedded/Modules/Heaters/Heaters_print.c | 5 ++ .../Embedded_SW/Embedded/Modules/IDS/IDS_print.c | 96 ++++++++++++++-------- .../Embedded/Modules/Thread/Thread_Winder.c | 4 + .../Embedded/Modules/Thread/Thread_print.c | 8 +- 8 files changed, 98 insertions(+), 36 deletions(-) (limited to 'Software/Embedded_SW/Embedded/Modules') 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=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++) { -- cgit v1.3.1