aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Embedded_SW/Embedded
diff options
context:
space:
mode:
authorShlomo Hecht <shlomo@twine-s.com>2018-10-22 09:57:56 +0300
committerShlomo Hecht <shlomo@twine-s.com>2018-10-22 09:57:56 +0300
commite64ec3bb6dd7294f9765bf4ca032e4aea42509e8 (patch)
treef46a2564394361a1b6f0ab1c42cfd0b61f8b60ff /Software/Embedded_SW/Embedded
parent62c58ec1e5496c2e6a12be1179ee8ed5ee2890f3 (diff)
downloadTango-e64ec3bb6dd7294f9765bf4ca032e4aea42509e8.tar.gz
Tango-e64ec3bb6dd7294f9765bf4ca032e4aea42509e8.zip
IDS - do not switch off valve between segments if used in the next segment. SCREW - preparations for interrupts. Alarm Handling - low temperature. Homing - bi-directional.
Diffstat (limited to 'Software/Embedded_SW/Embedded')
-rw-r--r--Software/Embedded_SW/Embedded/Communication/PMR/Diagnostics/DispenserHomingRequest.pb-c.c19
-rw-r--r--Software/Embedded_SW/Embedded/Communication/PMR/Diagnostics/DispenserHomingRequest.pb-c.h5
-rw-r--r--Software/Embedded_SW/Embedded/Communication/PMR/Diagnostics/MotorHomingRequest.pb-c.c19
-rw-r--r--Software/Embedded_SW/Embedded/Communication/PMR/Diagnostics/MotorHomingRequest.pb-c.h5
-rw-r--r--Software/Embedded_SW/Embedded/Drivers/FPGA/FPGA_INTERRUPTS/FPGA_Interrupts.c24
-rw-r--r--Software/Embedded_SW/Embedded/Drivers/FPGA/FPGA_INTERRUPTS/FPGA_Interrupts.h5
-rw-r--r--Software/Embedded_SW/Embedded/Main.c2
-rw-r--r--Software/Embedded_SW/Embedded/Modules/AlarmHandling/AlarmHandling.c84
-rw-r--r--Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c78
-rw-r--r--Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.h1
-rw-r--r--Software/Embedded_SW/Embedded/Modules/Diagnostics/DiagnosticsHoming.c77
-rw-r--r--Software/Embedded_SW/Embedded/Modules/IDS/IDS_ex.h1
-rw-r--r--Software/Embedded_SW/Embedded/Modules/IDS/IDS_maint.c38
-rw-r--r--Software/Embedded_SW/Embedded/Modules/IDS/IDS_print.c29
-rw-r--r--Software/Embedded_SW/Embedded/Modules/Thread/Thread_Winder.c7
15 files changed, 312 insertions, 82 deletions
diff --git a/Software/Embedded_SW/Embedded/Communication/PMR/Diagnostics/DispenserHomingRequest.pb-c.c b/Software/Embedded_SW/Embedded/Communication/PMR/Diagnostics/DispenserHomingRequest.pb-c.c
index e8c084cf7..93ee869e6 100644
--- a/Software/Embedded_SW/Embedded/Communication/PMR/Diagnostics/DispenserHomingRequest.pb-c.c
+++ b/Software/Embedded_SW/Embedded/Communication/PMR/Diagnostics/DispenserHomingRequest.pb-c.c
@@ -52,7 +52,7 @@ void dispenser_homing_request__free_unpacked
assert(message->base.descriptor == &dispenser_homing_request__descriptor);
protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator);
}
-static const ProtobufCFieldDescriptor dispenser_homing_request__field_descriptors[2] =
+static const ProtobufCFieldDescriptor dispenser_homing_request__field_descriptors[3] =
{
{
"Index",
@@ -78,15 +78,28 @@ static const ProtobufCFieldDescriptor dispenser_homing_request__field_descriptor
0, /* flags */
0,NULL,NULL /* reserved1,reserved2, etc */
},
+ {
+ "Direction",
+ 3,
+ PROTOBUF_C_LABEL_OPTIONAL,
+ PROTOBUF_C_TYPE_ENUM,
+ offsetof(DispenserHomingRequest, has_direction),
+ offsetof(DispenserHomingRequest, direction),
+ &motor_direction__descriptor,
+ NULL,
+ 0, /* flags */
+ 0,NULL,NULL /* reserved1,reserved2, etc */
+ },
};
static const unsigned dispenser_homing_request__field_indices_by_name[] = {
+ 2, /* field[2] = Direction */
0, /* field[0] = Index */
1, /* field[1] = Speed */
};
static const ProtobufCIntRange dispenser_homing_request__number_ranges[1 + 1] =
{
{ 1, 0 },
- { 0, 2 }
+ { 0, 3 }
};
const ProtobufCMessageDescriptor dispenser_homing_request__descriptor =
{
@@ -96,7 +109,7 @@ const ProtobufCMessageDescriptor dispenser_homing_request__descriptor =
"DispenserHomingRequest",
"",
sizeof(DispenserHomingRequest),
- 2,
+ 3,
dispenser_homing_request__field_descriptors,
dispenser_homing_request__field_indices_by_name,
1, dispenser_homing_request__number_ranges,
diff --git a/Software/Embedded_SW/Embedded/Communication/PMR/Diagnostics/DispenserHomingRequest.pb-c.h b/Software/Embedded_SW/Embedded/Communication/PMR/Diagnostics/DispenserHomingRequest.pb-c.h
index 32bc8c117..be6e49a24 100644
--- a/Software/Embedded_SW/Embedded/Communication/PMR/Diagnostics/DispenserHomingRequest.pb-c.h
+++ b/Software/Embedded_SW/Embedded/Communication/PMR/Diagnostics/DispenserHomingRequest.pb-c.h
@@ -14,6 +14,7 @@ PROTOBUF_C__BEGIN_DECLS
# error This file was generated by an older version of protoc-c which is incompatible with your libprotobuf-c headers. Please regenerate this file with a newer version of protoc-c.
#endif
+#include "MotorDirection.pb-c.h"
typedef struct _DispenserHomingRequest DispenserHomingRequest;
@@ -30,10 +31,12 @@ struct _DispenserHomingRequest
int32_t index;
protobuf_c_boolean has_speed;
double speed;
+ protobuf_c_boolean has_direction;
+ MotorDirection direction;
};
#define DISPENSER_HOMING_REQUEST__INIT \
{ PROTOBUF_C_MESSAGE_INIT (&dispenser_homing_request__descriptor) \
- , 0, 0, 0, 0 }
+ , 0, 0, 0, 0, 0, MOTOR_DIRECTION__Forward }
/* DispenserHomingRequest methods */
diff --git a/Software/Embedded_SW/Embedded/Communication/PMR/Diagnostics/MotorHomingRequest.pb-c.c b/Software/Embedded_SW/Embedded/Communication/PMR/Diagnostics/MotorHomingRequest.pb-c.c
index 53b923973..6899399f5 100644
--- a/Software/Embedded_SW/Embedded/Communication/PMR/Diagnostics/MotorHomingRequest.pb-c.c
+++ b/Software/Embedded_SW/Embedded/Communication/PMR/Diagnostics/MotorHomingRequest.pb-c.c
@@ -52,7 +52,7 @@ void motor_homing_request__free_unpacked
assert(message->base.descriptor == &motor_homing_request__descriptor);
protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator);
}
-static const ProtobufCFieldDescriptor motor_homing_request__field_descriptors[2] =
+static const ProtobufCFieldDescriptor motor_homing_request__field_descriptors[3] =
{
{
"MotorType",
@@ -78,15 +78,28 @@ static const ProtobufCFieldDescriptor motor_homing_request__field_descriptors[2]
0, /* flags */
0,NULL,NULL /* reserved1,reserved2, etc */
},
+ {
+ "Direction",
+ 3,
+ PROTOBUF_C_LABEL_OPTIONAL,
+ PROTOBUF_C_TYPE_ENUM,
+ offsetof(MotorHomingRequest, has_direction),
+ offsetof(MotorHomingRequest, direction),
+ &motor_direction__descriptor,
+ NULL,
+ 0, /* flags */
+ 0,NULL,NULL /* reserved1,reserved2, etc */
+ },
};
static const unsigned motor_homing_request__field_indices_by_name[] = {
+ 2, /* field[2] = Direction */
0, /* field[0] = MotorType */
1, /* field[1] = Speed */
};
static const ProtobufCIntRange motor_homing_request__number_ranges[1 + 1] =
{
{ 1, 0 },
- { 0, 2 }
+ { 0, 3 }
};
const ProtobufCMessageDescriptor motor_homing_request__descriptor =
{
@@ -96,7 +109,7 @@ const ProtobufCMessageDescriptor motor_homing_request__descriptor =
"MotorHomingRequest",
"",
sizeof(MotorHomingRequest),
- 2,
+ 3,
motor_homing_request__field_descriptors,
motor_homing_request__field_indices_by_name,
1, motor_homing_request__number_ranges,
diff --git a/Software/Embedded_SW/Embedded/Communication/PMR/Diagnostics/MotorHomingRequest.pb-c.h b/Software/Embedded_SW/Embedded/Communication/PMR/Diagnostics/MotorHomingRequest.pb-c.h
index 137c6460a..b94b0465a 100644
--- a/Software/Embedded_SW/Embedded/Communication/PMR/Diagnostics/MotorHomingRequest.pb-c.h
+++ b/Software/Embedded_SW/Embedded/Communication/PMR/Diagnostics/MotorHomingRequest.pb-c.h
@@ -15,6 +15,7 @@ PROTOBUF_C__BEGIN_DECLS
#endif
#include "HardwareMotorType.pb-c.h"
+#include "MotorDirection.pb-c.h"
typedef struct _MotorHomingRequest MotorHomingRequest;
@@ -31,10 +32,12 @@ struct _MotorHomingRequest
HardwareMotorType motortype;
protobuf_c_boolean has_speed;
double speed;
+ protobuf_c_boolean has_direction;
+ MotorDirection direction;
};
#define MOTOR_HOMING_REQUEST__INIT \
{ PROTOBUF_C_MESSAGE_INIT (&motor_homing_request__descriptor) \
- , 0, HARDWARE_MOTOR_TYPE__MOTO_DH_CLEANHEAD, 0, 0 }
+ , 0, HARDWARE_MOTOR_TYPE__MOTO_DH_CLEANHEAD, 0, 0, 0, MOTOR_DIRECTION__Forward }
/* MotorHomingRequest methods */
diff --git a/Software/Embedded_SW/Embedded/Drivers/FPGA/FPGA_INTERRUPTS/FPGA_Interrupts.c b/Software/Embedded_SW/Embedded/Drivers/FPGA/FPGA_INTERRUPTS/FPGA_Interrupts.c
index 4da372ed5..e5c78cf79 100644
--- a/Software/Embedded_SW/Embedded/Drivers/FPGA/FPGA_INTERRUPTS/FPGA_Interrupts.c
+++ b/Software/Embedded_SW/Embedded/Drivers/FPGA/FPGA_INTERRUPTS/FPGA_Interrupts.c
@@ -16,19 +16,21 @@
#include "Drivers/Motors/Motor.h"
#include "drivers/FPGA/FPGA_SPI_Comm.h"
+#include "drivers/FPGA/FPGA_INTERRUPTS/fpga_interrupts.h"
#define Screw_Not_Busy_Mask 0x02
volatile uint32_t delay;
static bool flag = 0;
+SCREW_InterruptCallback Callback_Fptr = NULL;
void PortPIntHandler(void)//FPGA1_INTn()
{
volatile uint32_t temp = F1_Moto_Driver_NBUSY2_D; // read the busy value
- delay=400;
+ /*delay=400;
if (GPIOIntStatus(GPIO_PORTP_BASE, false) & GPIO_PIN_0)
{
@@ -53,14 +55,18 @@ void PortPIntHandler(void)//FPGA1_INTn()
while(delay)
{
delay -=1;
- }
+ }*/
// must be done minimum 20uSec after the move command !!!
- temp = F1_Moto_Driver_NBUSY2_L; // read the latch in order to clear the latch value (read it after moving to prevent interrupt before movement)
+// temp = F1_Moto_Driver_NBUSY2_L; // read the latch in order to clear the latch value (read it after moving to prevent interrupt before movement)
GPIOIntClear(GPIO_PORTP_BASE, GPIO_INT_PIN_0);
+
+ if (Callback_Fptr)
+ Callback_Fptr();
}
-void Screw_Interrupt(bool IsEnable)
+
+void Screw_Interrupt(bool IsEnable ,SCREW_InterruptCallback callback)
{
volatile short temp = F1_Moto_Driver_NBUSY2_M;
@@ -69,12 +75,14 @@ void Screw_Interrupt(bool IsEnable)
temp |= Screw_Not_Busy_Mask; // Mask F1_MOTO_SCREW_A1_NBUSY
F1_Moto_Driver_NBUSY2_M = temp;
temp = F1_Moto_Driver_NBUSY2_L; // read the latch in order to clear the latch value
+ Callback_Fptr = callback;
}
else
{
temp &= ~Screw_Not_Busy_Mask; // Unask F1_MOTO_SCREW_A1_NBUSY
F1_Moto_Driver_NBUSY2_M = temp;
temp = F1_Moto_Driver_NBUSY2_L; // read the latch in order to clear the latch value
+ Callback_Fptr = NULL;
}
}
@@ -86,10 +94,10 @@ void Init_GPI_Interrupts()
// **** Settings for FPGA1_INTn *****
// Pin P0 setup
- SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOP); // Enable port p
- SysCtlDelay(3);
- GPIOPinTypeGPIOInput(GPIO_PORTP_BASE, GPIO_PIN_0); // Init PP0 as input
- GPIOPadConfigSet(GPIO_PORTP_BASE, GPIO_PIN_0, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU); // Enable weak pullup resistor for PP0
+ //SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOP); // Enable port p
+ //SysCtlDelay(3);
+ //GPIOPinTypeGPIOInput(GPIO_PORTP_BASE, GPIO_PIN_0); // Init PP0 as input
+ //GPIOPadConfigSet(GPIO_PORTP_BASE, GPIO_PIN_0, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU); // Enable weak pullup resistor for PP0
// Interrupt setup
GPIOIntDisable(GPIO_PORTP_BASE, GPIO_PIN_0); // Disable interrupt for PP0 (in case it was enabled)
diff --git a/Software/Embedded_SW/Embedded/Drivers/FPGA/FPGA_INTERRUPTS/FPGA_Interrupts.h b/Software/Embedded_SW/Embedded/Drivers/FPGA/FPGA_INTERRUPTS/FPGA_Interrupts.h
index f17ce0bac..7eafc551b 100644
--- a/Software/Embedded_SW/Embedded/Drivers/FPGA/FPGA_INTERRUPTS/FPGA_Interrupts.h
+++ b/Software/Embedded_SW/Embedded/Drivers/FPGA/FPGA_INTERRUPTS/FPGA_Interrupts.h
@@ -8,9 +8,12 @@
#ifndef DRIVERS_FPGA_FPGA_INTERRUPTS_FPGA_INTERRUPTS_H_
#define DRIVERS_FPGA_FPGA_INTERRUPTS_FPGA_INTERRUPTS_H_
+typedef void (* SCREW_InterruptCallback)(void);
+
+
+void Screw_Interrupt(bool IsEnable ,SCREW_InterruptCallback callback);
void Init_GPI_Interrupts();
-void Screw_Interrupt(bool IsEnable);
#endif /* DRIVERS_FPGA_FPGA_INTERRUPTS_FPGA_INTERRUPTS_H_ */
diff --git a/Software/Embedded_SW/Embedded/Main.c b/Software/Embedded_SW/Embedded/Main.c
index 4fa7c52b3..77ad2f6e1 100644
--- a/Software/Embedded_SW/Embedded/Main.c
+++ b/Software/Embedded_SW/Embedded/Main.c
@@ -51,6 +51,7 @@ extern Semaphore_Handle sdCardSem;
#include "drivers/FPGA/FPGA.h"
#include <drivers/FPGA/FPGA_Comm.h>
+#include <drivers/FPGA/FPGA_INTERRUPTS/fpga_interrupts.h>
#include <Drivers/I2C_Communication/Previous_Code/I2C.h>
#include "Drivers/I2C_Communication/I2C.h"
@@ -129,6 +130,7 @@ int main(void)
Calculateinit();
PortFunctionInit();
+ Init_GPI_Interrupts();
#ifdef EVALUATION_BOARD
Init_EVB();
#endif
diff --git a/Software/Embedded_SW/Embedded/Modules/AlarmHandling/AlarmHandling.c b/Software/Embedded_SW/Embedded/Modules/AlarmHandling/AlarmHandling.c
index 15ebfc632..4ec82cfc2 100644
--- a/Software/Embedded_SW/Embedded/Modules/AlarmHandling/AlarmHandling.c
+++ b/Software/Embedded_SW/Embedded/Modules/AlarmHandling/AlarmHandling.c
@@ -100,42 +100,54 @@ typedef struct
char *EventName;
}AlarmHandlingItem;
AlarmHandlingItem AlarmItem[MAX_SYSTEM_ALARMS]={
-{100,LimitSwitchAlarm,LimitSwitchAlarmEmpty_1,false,true,DEBUG_LOG_CATEGORY__Error,0xFF,0,0,false,EVENT_TYPE__Dispenser1Empty,NULL,"Dispenser1Empty"},
-{100,LimitSwitchAlarm,LimitSwitchAlarmEmpty_2,false,true,DEBUG_LOG_CATEGORY__Error,0xFF,0,0,false,EVENT_TYPE__Dispenser2Empty,NULL,"Dispenser2Empty"},
-{100,LimitSwitchAlarm,LimitSwitchAlarmEmpty_3,false,true,DEBUG_LOG_CATEGORY__Error,0xFF,0,0,false,EVENT_TYPE__Dispenser3Empty,NULL,"Dispenser3Empty"},
-{100,LimitSwitchAlarm,LimitSwitchAlarmEmpty_4,false,true,DEBUG_LOG_CATEGORY__Error,0xFF,0,0,false,EVENT_TYPE__Dispenser4Empty,NULL,"Dispenser4Empty"},
-{100,LimitSwitchAlarm,LimitSwitchAlarmEmpty_5,false,true,DEBUG_LOG_CATEGORY__Error,0xFF,0,0,false,EVENT_TYPE__Dispenser5Empty,NULL,"Dispenser5Empty"},
-{100,LimitSwitchAlarm,LimitSwitchAlarmEmpty_6,false,true,DEBUG_LOG_CATEGORY__Error,0xFF,0,0,false,EVENT_TYPE__Dispenser6Empty,NULL,"Dispenser6Empty"},
-{100,LimitSwitchAlarm,LimitSwitchAlarmEmpty_7,false,true,DEBUG_LOG_CATEGORY__Error,0xFF,0,0,false,EVENT_TYPE__Dispenser7Empty,NULL,"Dispenser7Empty"},
-{100,LimitSwitchAlarm,LimitSwitchAlarmEmpty_8,false,true,DEBUG_LOG_CATEGORY__Error,0xFF,0,0,false,EVENT_TYPE__Dispenser8Empty,NULL,"Dispenser8Empty"},
-/*{100,LimitSwitchAlarm,LimitSwitchAlarmLow_1,false,true,DEBUG_LOG_CATEGORY__Warning,0,0,0,false,EVENT_TYPE__Dispenser1LowLevel,NULL,"Dispenser1LowLevel"},
-{100,LimitSwitchAlarm,LimitSwitchAlarmLow_2,false,true,DEBUG_LOG_CATEGORY__Warning,1,0,0,false,EVENT_TYPE__Dispenser2LowLevel,NULL,"Dispenser2LowLevel"},
-{100,LimitSwitchAlarm,LimitSwitchAlarmLow_3,false,true,DEBUG_LOG_CATEGORY__Warning,2,0,0,false,EVENT_TYPE__Dispenser3LowLevel,NULL,"Dispenser3LowLevel"},
-{100,LimitSwitchAlarm,LimitSwitchAlarmLow_4,false,true,DEBUG_LOG_CATEGORY__Warning,3,0,0,false,EVENT_TYPE__Dispenser4LowLevel,NULL,"Dispenser4LowLevel"},
-{100,LimitSwitchAlarm,LimitSwitchAlarmLow_5,false,true,DEBUG_LOG_CATEGORY__Warning,4,0,0,false,EVENT_TYPE__Dispenser5LowLevel,NULL,"Dispenser5LowLevel"},
-{100,LimitSwitchAlarm,LimitSwitchAlarmLow_6,false,true,DEBUG_LOG_CATEGORY__Warning,5,0,0,false,EVENT_TYPE__Dispenser6LowLevel,NULL,"Dispenser6LowLevel"},
-{100,LimitSwitchAlarm,LimitSwitchAlarmLow_7,false,true,DEBUG_LOG_CATEGORY__Warning,6,0,0,false,EVENT_TYPE__Dispenser7LowLevel,NULL,"Dispenser7LowLevel"},
-{100,LimitSwitchAlarm,LimitSwitchAlarmLow_8,false,true,DEBUG_LOG_CATEGORY__Warning,7,0,0,false,EVENT_TYPE__Dispenser8LowLevel,NULL,"Dispenser8LowLevel"},*/
-{100,TemperatureAlarm,TEMP_SENSE_AN_ENCLOSURETEMP3,300,true,DEBUG_LOG_CATEGORY__Error,0xFF,10,0,false,EVENT_TYPE__GeneralInternalOverTemperature,NULL,"GeneralInternalOverTemperature"},
-//{100,TemperatureAlarm,TEMP_SENSE_AN_ENCLOSURETEMP1,250,true,DEBUG_LOG_CATEGORY__Error,0xFF,0,0,false,EVENT_TYPE__GeneralInternalOverTemperature,NULL,"GeneralInternalOverTemperature"},
-//{100,TemperatureAlarm,TEMP_SENSE_AN_ENCLOSURETEMP2,80,true,DEBUG_LOG_CATEGORY__Error,0xFF,0,0,false,EVENT_TYPE__GeneralInternalOverTemperature,NULL,"GeneralInternalOverTemperature"},
-{100,TemperatureAlarm,TEMP_SENSE_ANALOG_MIXCHIP_TEMP,300,true,DEBUG_LOG_CATEGORY__Error,0xFF,10,0,false,EVENT_TYPE__DyeingHead6OverTemperature,NULL,"DyeingHead6OverTemperature"},
-{100,TemperatureAlarm,TEMP_SENSE_ANALOG_DYEINGH_TEMP1,300,true,DEBUG_LOG_CATEGORY__Error,0xFF,10,0,false,EVENT_TYPE__DyeingHead1OverTemperature,NULL,"DyeingHead1OverTemperature"},
-{100,TemperatureAlarm,TEMP_SENSE_ANALOG_DYEINGH_TEMP2,300,true,DEBUG_LOG_CATEGORY__Error,0xFF,10,0,false,EVENT_TYPE__DyeingHead2OverTemperature,NULL,"DyeingHead2OverTemperature"},
-{100,TemperatureAlarm,TEMP_SENSE_ANALOG_DYEINGH_TEMP3,300,true,DEBUG_LOG_CATEGORY__Error,0xFF,10,0,false,EVENT_TYPE__DyeingHead3OverTemperature,NULL,"DyeingHead3OverTemperature"},
-{100,TemperatureAlarm,TEMP_SENSE_ANALOG_DYEINGH_TEMP4,300,true,DEBUG_LOG_CATEGORY__Error,0xFF,10,0,false,EVENT_TYPE__DyeingHead4OverTemperature,NULL,"DyeingHead4OverTemperature"},
-{100,TemperatureAlarm,TEMP_SENSE_ANALOG_DYEINGH_TEMP5,300,true,DEBUG_LOG_CATEGORY__Error,0xFF,10,0,false,EVENT_TYPE__DyeingHead5OverTemperature,NULL,"DyeingHead5OverTemperature"},
-{100,TemperatureAlarm,TEMP_SENSE_ANALOG_DRYER_TEMP1,300,true,DEBUG_LOG_CATEGORY__Error,0xFF,10,0,false,EVENT_TYPE__DryerOverTemperature,NULL,"DryerOverTemperature"},
-{100,TemperatureAlarm,TEMP_SENSE_ANALOG_DRYER_TEMP1,300,true,DEBUG_LOG_CATEGORY__Error,0xFF,10,0,false,EVENT_TYPE__DryerOverTemperature,NULL,"DryerOverTemperature"},
-{100,TemperatureAlarm,TEMP_SENSE_ANALOG_DRYER_TEMP1,300,true,DEBUG_LOG_CATEGORY__Error,0xFF,10,0,false,EVENT_TYPE__DryerOverTemperature,NULL,"DryerOverTemperature"},
-{100,PressureAlarm,1,7,true,DEBUG_LOG_CATEGORY__Error,0xFF,0,0,false,EVENT_TYPE__Dispenser1Pressure,NULL,"Dispenser1Pressure"},
-{100,PressureAlarm,2,7,true,DEBUG_LOG_CATEGORY__Error,0xFF,0,0,false,EVENT_TYPE__Dispenser2Pressure,NULL,"Dispenser2Pressure"},
-{100,PressureAlarm,3,7,true,DEBUG_LOG_CATEGORY__Error,0xFF,0,0,false,EVENT_TYPE__Dispenser3Pressure,NULL,"Dispenser3Pressure"},
-{100,PressureAlarm,4,7,true,DEBUG_LOG_CATEGORY__Error,0xFF,0,0,false,EVENT_TYPE__Dispenser4Pressure,NULL,"Dispenser4Pressure"},
-{100,PressureAlarm,5,7,true,DEBUG_LOG_CATEGORY__Error,0xFF,0,0,false,EVENT_TYPE__Dispenser5Pressure,NULL,"Dispenser5Pressure"},
-{100,PressureAlarm,6,7,true,DEBUG_LOG_CATEGORY__Error,0xFF,0,0,false,EVENT_TYPE__Dispenser6Pressure,NULL,"Dispenser6Pressure"},
-{100,PressureAlarm,7,7,true,DEBUG_LOG_CATEGORY__Error,0xFF,0,0,false,EVENT_TYPE__Dispenser7Pressure,NULL,"Dispenser7Pressure"},
-{100,PressureAlarm,8,7,true,DEBUG_LOG_CATEGORY__Error,0xFF,0,0,false,EVENT_TYPE__Dispenser8Pressure,NULL,"Dispenser8Pressure"},
+{eHundredMillisecond,LimitSwitchAlarm,LimitSwitchAlarmEmpty_1,false,true,DEBUG_LOG_CATEGORY__Error,0xFF,0,0,false,EVENT_TYPE__Dispenser1Empty,NULL,"Dispenser1Empty"},
+{eHundredMillisecond,LimitSwitchAlarm,LimitSwitchAlarmEmpty_2,false,true,DEBUG_LOG_CATEGORY__Error,0xFF,0,0,false,EVENT_TYPE__Dispenser2Empty,NULL,"Dispenser2Empty"},
+{eHundredMillisecond,LimitSwitchAlarm,LimitSwitchAlarmEmpty_3,false,true,DEBUG_LOG_CATEGORY__Error,0xFF,0,0,false,EVENT_TYPE__Dispenser3Empty,NULL,"Dispenser3Empty"},
+{eHundredMillisecond,LimitSwitchAlarm,LimitSwitchAlarmEmpty_4,false,true,DEBUG_LOG_CATEGORY__Error,0xFF,0,0,false,EVENT_TYPE__Dispenser4Empty,NULL,"Dispenser4Empty"},
+{eHundredMillisecond,LimitSwitchAlarm,LimitSwitchAlarmEmpty_5,false,true,DEBUG_LOG_CATEGORY__Error,0xFF,0,0,false,EVENT_TYPE__Dispenser5Empty,NULL,"Dispenser5Empty"},
+{eHundredMillisecond,LimitSwitchAlarm,LimitSwitchAlarmEmpty_6,false,true,DEBUG_LOG_CATEGORY__Error,0xFF,0,0,false,EVENT_TYPE__Dispenser6Empty,NULL,"Dispenser6Empty"},
+{eHundredMillisecond,LimitSwitchAlarm,LimitSwitchAlarmEmpty_7,false,true,DEBUG_LOG_CATEGORY__Error,0xFF,0,0,false,EVENT_TYPE__Dispenser7Empty,NULL,"Dispenser7Empty"},
+{eHundredMillisecond,LimitSwitchAlarm,LimitSwitchAlarmEmpty_8,false,true,DEBUG_LOG_CATEGORY__Error,0xFF,0,0,false,EVENT_TYPE__Dispenser8Empty,NULL,"Dispenser8Empty"},
+/*{eHundredMillisecond,LimitSwitchAlarm,LimitSwitchAlarmLow_1,false,true,DEBUG_LOG_CATEGORY__Warning,0,0,0,false,EVENT_TYPE__Dispenser1LowLevel,NULL,"Dispenser1LowLevel"},
+{eHundredMillisecond,LimitSwitchAlarm,LimitSwitchAlarmLow_2,false,true,DEBUG_LOG_CATEGORY__Warning,1,0,0,false,EVENT_TYPE__Dispenser2LowLevel,NULL,"Dispenser2LowLevel"},
+{eHundredMillisecond,LimitSwitchAlarm,LimitSwitchAlarmLow_3,false,true,DEBUG_LOG_CATEGORY__Warning,2,0,0,false,EVENT_TYPE__Dispenser3LowLevel,NULL,"Dispenser3LowLevel"},
+{eHundredMillisecond,LimitSwitchAlarm,LimitSwitchAlarmLow_4,false,true,DEBUG_LOG_CATEGORY__Warning,3,0,0,false,EVENT_TYPE__Dispenser4LowLevel,NULL,"Dispenser4LowLevel"},
+{eHundredMillisecond,LimitSwitchAlarm,LimitSwitchAlarmLow_5,false,true,DEBUG_LOG_CATEGORY__Warning,4,0,0,false,EVENT_TYPE__Dispenser5LowLevel,NULL,"Dispenser5LowLevel"},
+{eHundredMillisecond,LimitSwitchAlarm,LimitSwitchAlarmLow_6,false,true,DEBUG_LOG_CATEGORY__Warning,5,0,0,false,EVENT_TYPE__Dispenser6LowLevel,NULL,"Dispenser6LowLevel"},
+{eHundredMillisecond,LimitSwitchAlarm,LimitSwitchAlarmLow_7,false,true,DEBUG_LOG_CATEGORY__Warning,6,0,0,false,EVENT_TYPE__Dispenser7LowLevel,NULL,"Dispenser7LowLevel"},
+{eHundredMillisecond,LimitSwitchAlarm,LimitSwitchAlarmLow_8,false,true,DEBUG_LOG_CATEGORY__Warning,7,0,0,false,EVENT_TYPE__Dispenser8LowLevel,NULL,"Dispenser8LowLevel"},*/
+{eHundredMillisecond,TemperatureAlarm,TEMP_SENSE_AN_ENCLOSURETEMP3,250,true,DEBUG_LOG_CATEGORY__Error,0xFF,10,0,false,EVENT_TYPE__GeneralInternalOverTemperature,NULL,"Mixer Over Temperature"},
+//{eHundredMillisecond,TemperatureAlarm,TEMP_SENSE_AN_ENCLOSURETEMP1,250,true,DEBUG_LOG_CATEGORY__Error,0xFF,0,0,false,EVENT_TYPE__GeneralInternalOverTemperature,NULL,"GeneralInternal Over Temperature"},
+//{eHundredMillisecond,TemperatureAlarm,TEMP_SENSE_AN_ENCLOSURETEMP2,80,true,DEBUG_LOG_CATEGORY__Error,0xFF,0,0,false,EVENT_TYPE__GeneralInternalOverTemperature,NULL,"GeneralInternal Over Temperature"},
+{eHundredMillisecond,TemperatureAlarm,TEMP_SENSE_ANALOG_DYEINGH_TEMP1,250,true,DEBUG_LOG_CATEGORY__Error,0xFF,10,0,false,EVENT_TYPE__DyeingHead1OverTemperature,NULL,"DyeingHead1 Over Temperature"},
+{eHundredMillisecond,TemperatureAlarm,TEMP_SENSE_ANALOG_DYEINGH_TEMP2,250,true,DEBUG_LOG_CATEGORY__Error,0xFF,10,0,false,EVENT_TYPE__DyeingHead2OverTemperature,NULL,"DyeingHead2 Over Temperature"},
+{eHundredMillisecond,TemperatureAlarm,TEMP_SENSE_ANALOG_DYEINGH_TEMP3,250,true,DEBUG_LOG_CATEGORY__Error,0xFF,10,0,false,EVENT_TYPE__DyeingHead3OverTemperature,NULL,"DyeingHead3 Over Temperature"},
+{eHundredMillisecond,TemperatureAlarm,TEMP_SENSE_ANALOG_DYEINGH_TEMP4,250,true,DEBUG_LOG_CATEGORY__Error,0xFF,10,0,false,EVENT_TYPE__DyeingHead4OverTemperature,NULL,"DyeingHead4 Over Temperature"},
+{eHundredMillisecond,TemperatureAlarm,TEMP_SENSE_ANALOG_DYEINGH_TEMP5,250,true,DEBUG_LOG_CATEGORY__Error,0xFF,10,0,false,EVENT_TYPE__DyeingHead5OverTemperature,NULL,"DyeingHead5 Over Temperature"},
+{eHundredMillisecond,TemperatureAlarm,TEMP_SENSE_ANALOG_MIXCHIP_TEMP,250,true,DEBUG_LOG_CATEGORY__Error,0xFF,10,0,false,EVENT_TYPE__DyeingHead6OverTemperature,NULL,"DyeingHead6 Over Temperature"},
+{eHundredMillisecond,TemperatureAlarm,TEMP_SENSE_ANALOG_DRYER_TEMP1,250,true,DEBUG_LOG_CATEGORY__Error,0xFF,10,0,false,EVENT_TYPE__DryerOverTemperature,NULL,"Dryer Over Temperature"},
+{eHundredMillisecond,TemperatureAlarm,TEMP_SENSE_ANALOG_DRYER_TEMP1,250,true,DEBUG_LOG_CATEGORY__Error,0xFF,10,0,false,EVENT_TYPE__DryerOverTemperature,NULL,"Dryer Over Temperature"},
+{eHundredMillisecond,TemperatureAlarm,TEMP_SENSE_ANALOG_DRYER_TEMP1,300,true,DEBUG_LOG_CATEGORY__Error,0xFF,10,0,false,EVENT_TYPE__DryerOverTemperature,NULL,"Dryer Over Temperature"},
+{eHundredMillisecond,TemperatureAlarm,TEMP_SENSE_AN_ENCLOSURETEMP3,9,false,DEBUG_LOG_CATEGORY__Error,0xFF,10,0,false,EVENT_TYPE__GeneralInternalOverTemperature,NULL,"Mixer PT100 Not Working"},
+//{eHundredMillisecond,TemperatureAlarm,TEMP_SENSE_AN_ENCLOSURETEMP1,250,true,DEBUG_LOG_CATEGORY__Error,0xFF,0,0,false,EVENT_TYPE__GeneralInternalPT100 Not Working,NULL,"GeneralInternalPT100 Not Working"},
+//{eHundredMillisecond,TemperatureAlarm,TEMP_SENSE_AN_ENCLOSURETEMP2,80,true,DEBUG_LOG_CATEGORY__Error,0xFF,0,0,false,EVENT_TYPE__GeneralInternalPT100 Not Working,NULL,"GeneralInternalPT100 Not Working"},
+{eOneSecond,TemperatureAlarm,TEMP_SENSE_ANALOG_DYEINGH_TEMP1,9,false,DEBUG_LOG_CATEGORY__Error,0xFF,10,0,false,EVENT_TYPE__DyeingHead1OverTemperature,NULL,"DyeingHead 1 PT100 Not Working"},
+{eOneSecond,TemperatureAlarm,TEMP_SENSE_ANALOG_DYEINGH_TEMP2,9,false,DEBUG_LOG_CATEGORY__Error,0xFF,10,0,false,EVENT_TYPE__DyeingHead2OverTemperature,NULL,"DyeingHead 2 PT100 Not Working"},
+{eOneSecond,TemperatureAlarm,TEMP_SENSE_ANALOG_DYEINGH_TEMP3,9,false,DEBUG_LOG_CATEGORY__Error,0xFF,10,0,false,EVENT_TYPE__DyeingHead3OverTemperature,NULL,"DyeingHead 3 PT100 Not Working"},
+{eOneSecond,TemperatureAlarm,TEMP_SENSE_ANALOG_DYEINGH_TEMP4,9,false,DEBUG_LOG_CATEGORY__Error,0xFF,10,0,false,EVENT_TYPE__DyeingHead4OverTemperature,NULL,"DyeingHead 4 PT100 Not Working"},
+{eOneSecond,TemperatureAlarm,TEMP_SENSE_ANALOG_DYEINGH_TEMP5,9,false,DEBUG_LOG_CATEGORY__Error,0xFF,10,0,false,EVENT_TYPE__DyeingHead5OverTemperature,NULL,"DyeingHead 5 PT100 Not Working"},
+{eOneSecond,TemperatureAlarm,TEMP_SENSE_ANALOG_MIXCHIP_TEMP,9,false,DEBUG_LOG_CATEGORY__Error,0xFF,10,0,false,EVENT_TYPE__DyeingHead6OverTemperature,NULL,"DyeingHead 6 PT100 Not Working"},
+{eOneSecond,TemperatureAlarm,TEMP_SENSE_ANALOG_DRYER_TEMP1,9,false,DEBUG_LOG_CATEGORY__Error,0xFF,10,0,false,EVENT_TYPE__DryerOverTemperature,NULL,"Dryer PT100 Not Working"},
+{eOneSecond,TemperatureAlarm,TEMP_SENSE_ANALOG_DRYER_TEMP1,9,false,DEBUG_LOG_CATEGORY__Error,0xFF,10,0,false,EVENT_TYPE__DryerOverTemperature,NULL,"Dryer PT100 Not Working"},
+{eHundredMillisecond,TemperatureAlarm,TEMP_SENSE_ANALOG_DRYER_TEMP1,9,false,DEBUG_LOG_CATEGORY__Error,0xFF,10,0,false,EVENT_TYPE__DryerOverTemperature,NULL,"Dryer PT100 Not Working"},
+{eHundredMillisecond,PressureAlarm,1,6,true,DEBUG_LOG_CATEGORY__Error,0xFF,5,0,false,EVENT_TYPE__Dispenser1Pressure,NULL,"Dispenser1Pressure"},
+{eHundredMillisecond,PressureAlarm,2,6,true,DEBUG_LOG_CATEGORY__Error,0xFF,5,0,false,EVENT_TYPE__Dispenser2Pressure,NULL,"Dispenser2Pressure"},
+{eHundredMillisecond,PressureAlarm,3,6,true,DEBUG_LOG_CATEGORY__Error,0xFF,5,0,false,EVENT_TYPE__Dispenser3Pressure,NULL,"Dispenser3Pressure"},
+{eHundredMillisecond,PressureAlarm,4,6,true,DEBUG_LOG_CATEGORY__Error,0xFF,5,0,false,EVENT_TYPE__Dispenser4Pressure,NULL,"Dispenser4Pressure"},
+{eHundredMillisecond,PressureAlarm,5,6,true,DEBUG_LOG_CATEGORY__Error,0xFF,5,0,false,EVENT_TYPE__Dispenser5Pressure,NULL,"Dispenser5Pressure"},
+{eHundredMillisecond,PressureAlarm,6,6,true,DEBUG_LOG_CATEGORY__Error,0xFF,5,0,false,EVENT_TYPE__Dispenser6Pressure,NULL,"Dispenser6Pressure"},
+{eHundredMillisecond,PressureAlarm,7,6,true,DEBUG_LOG_CATEGORY__Error,0xFF,5,0,false,EVENT_TYPE__Dispenser7Pressure,NULL,"Dispenser7Pressure"},
+{eHundredMillisecond,PressureAlarm,8,6,true,DEBUG_LOG_CATEGORY__Error,0xFF,5,0,false,EVENT_TYPE__Dispenser8Pressure,NULL,"Dispenser8Pressure"},
{eOneMinute,MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_DRYER_DRIVING,x_STATUS_OCD,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,0,false,EVENT_TYPE__MotorDryerOverCurrent,NULL,"MotorDryerOverCurrent"},
{eOneMinute,MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_RDRIVING,x_STATUS_OCD,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,0,false,EVENT_TYPE__MotorFeederOverCurrent,NULL,"MotorFeederOverCurrent"},
{eOneMinute,MotorAlarm,HARDWARE_MOTOR_TYPE__MOTO_SCREW,x_STATUS_OCD,false,DEBUG_LOG_CATEGORY__Error,0xFF,2,0,false,EVENT_TYPE__MotorScrewOverCurrent,NULL,"MotorScrewOverCurrent"},
diff --git a/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c b/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c
index fa168067f..4ff47b56c 100644
--- a/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c
+++ b/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.c
@@ -33,6 +33,7 @@
#include "drivers/Heater/TemperatureSensor.h"
#include "drivers/FPGA/FPGA_SPI_Comm.h"
#include "drivers/FPGA/FPGA.h"
+#include <drivers/FPGA/FPGA_Comm.h>
#include "drivers/Valves/Valve.h"
#include "drivers/FPGA/FPGA_GPIO/FPGA_GPIO.h"
@@ -67,6 +68,21 @@ typedef struct MillisecMessage{
uint32_t tick;
uint8_t messageData[20];
}MillisecMessageStruc;
+typedef enum
+{
+ ScrewMessage,
+ //ScrewCalculateTemperature,
+}ScrewMessages;
+
+typedef struct ScrewMessage{
+ uint16_t messageId;
+ uint16_t msglen;
+ uint32_t tick;
+ // uint32_t SensorId;
+ // uint32_t Data;
+}ScrewMessageStruc;
+Task_Handle Screw_Task_Handle;
+Mailbox_Handle ScrewMsgQ = NULL;
//uint32_t ADC_Data[MAX_ADC_DEVICES] = {0};
//uint32_t TemperatureSensor_Data[MAX_TEMPERATURE_SENSOR_ID] = {0};
@@ -111,7 +127,9 @@ void MillisecInit(void)
Error_init(&eb);
- MillisecMsgQ = Mailbox_create(sizeof(MillisecMessageStruc), 2, NULL,&eb);
+ MillisecMsgQ = Mailbox_create(sizeof(MillisecMessageStruc), 5, NULL,&eb);
+ ScrewMsgQ = Mailbox_create(sizeof(ScrewMessageStruc), 5, NULL,&eb);
+
for (i=0;i<NUM_OF_MOTORS;i++)
{
MotorsMsgQ[i] = Mailbox_create(sizeof(MillisecMotorDataStruc), 5, NULL,&eb);
@@ -152,6 +170,16 @@ void MillisecStart(void)
ROM_TimerIntEnable(Millisec_timerBase, TIMER_TIMA_TIMEOUT);
ADCAcquireStart(0,1);
}
+void ScrewFreeInterrupt(void)
+{
+ MillisecMessageStruc Message;
+ Message.messageId = ScrewMessage;
+ if (ScrewMsgQ != NULL)
+ Mailbox_post(ScrewMsgQ , &Message, BIOS_NO_WAIT);
+
+ ROM_IntMasterEnable();
+ return ;
+}
void OneMilliSecondMillisecInterrupt(UArg arg0)
{
@@ -507,6 +535,27 @@ uint32_t MillisecLoop(uint32_t tick)
return OK;
}
+int SendNextScrewMessage()
+{
+ volatile uint32_t temp; // read the busy value
+
+ if (Mailbox_pend(MotorsMsgQ[HARDWARE_MOTOR_TYPE__MOTO_SCREW] , &MotorData[HARDWARE_MOTOR_TYPE__MOTO_SCREW], BIOS_NO_WAIT)==true)
+ {
+ if (MotorSendFPGARequest((HardwareMotorType)HARDWARE_MOTOR_TYPE__MOTO_SCREW,MotorData[HARDWARE_MOTOR_TYPE__MOTO_SCREW].Data,MotorData[HARDWARE_MOTOR_TYPE__MOTO_SCREW].Length) != OK) //sent the data to the FPGA
+ {
+ LOG_ERROR(MotorData[HARDWARE_MOTOR_TYPE__MOTO_SCREW].Data,"SCREW Send message failed");
+ }
+ else
+ {
+ LOG_ERROR(MotorData[HARDWARE_MOTOR_TYPE__MOTO_SCREW].Data,"SCREW Send message OK");
+ MotorActivity--;
+ }
+ }
+ ROM_SysCtlDelay(SYS_CLK_FREQ / 50000);
+
+ temp = F1_Moto_Driver_NBUSY2_L; // read the latch in order to clear the latch value (read it after moving to prevent interrupt before movement)
+
+}
/******************************************************************************
* ======== messageTsk ========
* Task for this function is created statically. See the project's .cfg file.
@@ -567,3 +616,30 @@ uint32_t getDrawerFansStatus(void)
{
return DrawerFansStatus;
}
+
+/******************************************************************************
+ * ======== messageTsk ========
+ * Task for this function is created statically. See the project's .cfg file.
+ * this message task is created statically in system initialization,
+ ******************************************************************************/
+void ScrewTask(UArg arg0, UArg arg1)
+{
+ ScrewMessageStruc Message;
+ //char str[60];
+ //uint16_t length;
+ //Clock_setTimeout(HostKAClock, 1000);
+ //Clock_start(HostKAClock);
+ Screw_Task_Handle = Task_self();
+ while(1)
+ {
+ Mailbox_pend(ScrewMsgQ , &Message, BIOS_WAIT_FOREVER);
+ switch (Message.messageId)
+ {
+ case ScrewMessage:
+ SendNextScrewMessage();
+ break;
+ default:
+ break;
+ }
+ }
+}
diff --git a/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.h b/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.h
index 517716c08..6e11471cc 100644
--- a/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.h
+++ b/Software/Embedded_SW/Embedded/Modules/Control/MillisecTask.h
@@ -35,6 +35,7 @@ uint32_t getDrawerFansStatus(void);
void MillisecInit(void);
void MillisecStop(void);
void MillisecStart(void);
+void ScrewFreeInterrupt(void);
extern bool watchdogCriticalAlarm;
diff --git a/Software/Embedded_SW/Embedded/Modules/Diagnostics/DiagnosticsHoming.c b/Software/Embedded_SW/Embedded/Modules/Diagnostics/DiagnosticsHoming.c
index ff2294b6b..960581da7 100644
--- a/Software/Embedded_SW/Embedded/Modules/Diagnostics/DiagnosticsHoming.c
+++ b/Software/Embedded_SW/Embedded/Modules/Diagnostics/DiagnosticsHoming.c
@@ -35,10 +35,10 @@
#include "StateMachines/Printing/PrintingSTM.h"
-FPGA_GPI_ENUM Motor_Id_to_LS_Id[NUM_OF_MOTORS] = {
- MAX_GPI, //MOTO_DH_CLEANHEAD = 0,
- MAX_GPI, //MOTO_DH_CLEANMECH = 1,
- MAX_GPI, //MOTO_DH_LID = 2,
+FPGA_GPI_ENUM Motor_Id_to_LS_IdDown[NUM_OF_MOTORS] = { // limit switch for normal homing into working mode
+ MAX_GPI, //MOTO_DH_CLEANHEAD = 0, // closing the loading system
+ MAX_GPI, //MOTO_DH_CLEANMECH = 1, //dispensers down
+ GPI_LS_DH_LID_CLOSED, //MOTO_DH_LID = 2,
MAX_GPI, //MOTO_DRYER_DRIVING = 3,
MAX_GPI, //MOTO_DRYER_LID = 4,
MAX_GPI, //MOTO_DRYER_LOADARM = 5,
@@ -55,12 +55,39 @@ FPGA_GPI_ENUM Motor_Id_to_LS_Id[NUM_OF_MOTORS] = {
GPI_LS_LDANCER1_DOWN, //MOTO_LDANCER1 = 16,
GPI_LS_LDANCER2_DOWN, //MOTO_LDANCER2 = 17,
MAX_GPI, //MOTO_LDRIVING = 18,
+ GPI_LS_LLOADMOTOR_DOWN, //MOTO_LLOADING = 19,
+ GPI_LS_LPIVOT_DOWN, //MOTO_LPIVOT1 = 20,
+ GPI_LS_RDANCER_DOWN, //MOTO_RDANCER = 21,
+ MAX_GPI, //MOTO_RDRIVING = 22,
+ GPI_LS_RDANCER_LONG, //MOTO_RLOADARM = 23,
+ 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
+ MAX_GPI, //MOTO_DH_CLEANHEAD = 0, // opening the loading system
+ MAX_GPI, //MOTO_DH_CLEANMECH = 1, //dispensers up - empting
+ GPI_LS_DH_LID_OPEN, //MOTO_DH_LID = 2,
+ MAX_GPI, //MOTO_DRYER_DRIVING = 3,
+ MAX_GPI, //MOTO_DRYER_LID = 4,
+ MAX_GPI, //MOTO_DRYER_LOADARM = 5,
+ GPI_LS_DISPENSER_UP_1, //MOTO_DISPENSER_1 = 6,
+ GPI_LS_DISPENSER_UP_2, //MOTO_DISPENSER_2 = 7,
+ GPI_LS_DISPENSER_UP_3, //MOTO_DISPENSER_3 = 8,
+ GPI_LS_DISPENSER_UP_4, //MOTO_DISPENSER_4 = 9,
+ GPI_LS_DISPENSER_UP_5, //MOTO_DISPENSER_5 = 10,
+ GPI_LS_DISPENSER_UP_6, //MOTO_DISPENSER_6 = 11,
+ GPI_LS_DISPENSER_UP_7, //MOTO_DISPENSER_7 = 12,
+ GPI_LS_DISPENSER_UP_8, //MOTO_DISPENSER_8 = 13,
+ GPI_LS_SCREW_RIGHT, //MOTO_SCREW = 14,
+ MAX_GPI, //MOTO_WINDER = 15,
+ GPI_LS_LDANCER1_UP, //MOTO_LDANCER1 = 16,
+ GPI_LS_LDANCER2_UP, //MOTO_LDANCER2 = 17,
+ MAX_GPI, //MOTO_LDRIVING = 18,
GPI_LS_LLOADMOTOR_UP, //MOTO_LLOADING = 19,
GPI_LS_LPIVOT_UP, //MOTO_LPIVOT1 = 20,
- GPI_LS_RDANCER_DOWN, //MOTO_RDANCER = 21,
+ GPI_LS_RDANCER_UP, //MOTO_RDANCER = 21,
MAX_GPI, //MOTO_RDRIVING = 22,
GPI_LS_RLOADRAM_UP, //MOTO_RLOADARM = 23,
- GPI_LS_RLOADMOTOR_DOWN, //MOTO_RLOADING = 24,
+ GPI_LS_RLOADMOTOR_UP, //MOTO_RLOADING = 24,
};
typedef enum {
MotorHomingDirectionUp,
@@ -132,11 +159,23 @@ uint32_t MotorHomingRequestFunc(MessageContainer* requestContainer)
{
if ((JobIsActive() == false)&&(isMotorConfigured(MotorId) == true))
{
- if ( Motor_Id_to_LS_Id[MotorId] != MAX_GPI)
+ if (request->direction == MOTOR_DIRECTION__Forward) //opening the loading system
+ {
+ if ( Motor_Id_to_LS_IdUp[MotorId] != MAX_GPI)
+ {
+ MotorMovetoLimitSwitch (MotorId,MotorsCfg[MotorId].directionthreadwize, speed, Motor_Id_to_LS_IdUp[MotorId], MotorHomingRequestCallback);
+ ustrncpy (HomingToken[MotorId], requestContainer->token,36);
+ return OK;
+ }
+ }
+ else // closing the system into normal work
{
- MotorMovetoLimitSwitch (MotorId,1-MotorsCfg[MotorId].directionthreadwize, speed, Motor_Id_to_LS_Id[MotorId], MotorHomingRequestCallback);
- ustrncpy (HomingToken[MotorId], requestContainer->token,36);
- return OK;
+ if ( Motor_Id_to_LS_IdDown[MotorId] != MAX_GPI)
+ {
+ MotorMovetoLimitSwitch (MotorId,1-MotorsCfg[MotorId].directionthreadwize, speed, Motor_Id_to_LS_IdDown[MotorId], MotorHomingRequestCallback);
+ ustrncpy (HomingToken[MotorId], requestContainer->token,36);
+ return OK;
+ }
}
}
}
@@ -225,20 +264,10 @@ uint32_t DispenserHomingRequestFunc(MessageContainer* requestContainer)
{
if ((JobIsActive() == false)&&(isMotorConfigured(MotorId) == true))
{
- IDS_HomeDispenser(request->index,speed,DispenserHomingRequestCallback);
- /*if ( Motor_Id_to_LS_Id[MotorId] != MAX_GPI)
- {
- //open dispenser valve dispenser to midtank direction
- Control3WayValvesWithCallback ((Valves_t) request->index, MidTank_Dispenser, NULL); //direction: MidTank_Dispenser or Dispenser_Mixer
- //Valve_Set((Valves_t) request->index, MidTank_Dispenser);
- //open dry air valve in the dispenser
- Valve_Set((Valves_t) (request->index+VALVE_2W_MID_AIR_8), Atm_MidTank_ON);
-
- MotorSetMicroStep(MotorId, 1);
-
- MotorMovetoLimitSwitch (MotorId,1-MotorsCfg[MotorId].directionthreadwize, speed, Motor_Id_to_LS_Id[MotorId], DispenserHomingRequestCallback);
- return OK;
- }*/
+ if (request->direction == MOTOR_DIRECTION__Backward) //dispenser homing
+ IDS_HomeDispenser(request->index,speed,DispenserHomingRequestCallback);
+ else //empty dispenser - support TBD
+ IDS_EmptyDispenser(request->index,speed,DispenserHomingRequestCallback);//return ERROR;
}
}
diff --git a/Software/Embedded_SW/Embedded/Modules/IDS/IDS_ex.h b/Software/Embedded_SW/Embedded/Modules/IDS/IDS_ex.h
index 06e45d1b8..2b8779207 100644
--- a/Software/Embedded_SW/Embedded/Modules/IDS/IDS_ex.h
+++ b/Software/Embedded_SW/Embedded/Modules/IDS/IDS_ex.h
@@ -41,6 +41,7 @@ uint32_t IDS_DispenserPidRequestMessage(HardwarePidControl* request);
uint32_t IDS_HomeDispenser (uint32_t deviceID, uint32_t speed , callback_fptr callback);
uint32_t IDS_StopHomeDispenser (uint32_t deviceID);
+uint32_t IDS_EmptyDispenser (uint32_t deviceID, uint32_t speed , callback_fptr callback);
uint32_t IDS_CheckDispenserLimitSwitch (LimitSwitchAlarms LS_Id);
diff --git a/Software/Embedded_SW/Embedded/Modules/IDS/IDS_maint.c b/Software/Embedded_SW/Embedded/Modules/IDS/IDS_maint.c
index 2fbc90c69..b90ed3a1f 100644
--- a/Software/Embedded_SW/Embedded/Modules/IDS/IDS_maint.c
+++ b/Software/Embedded_SW/Embedded/Modules/IDS/IDS_maint.c
@@ -28,6 +28,16 @@ FPGA_GPI_ENUM Dispenser_Id_to_LS_Id[MAX_SYSTEM_DISPENSERS] = {
GPI_LS_DISPENSER_DOWN_7, //MOTO_DISPENSER_7 = 12,
GPI_LS_DISPENSER_DOWN_8, //MOTO_DISPENSER_8 = 13,
};
+FPGA_GPI_ENUM Dispenser_Id_to_LS_Empty_Id[MAX_SYSTEM_DISPENSERS] = {
+ GPI_LS_DISPENSER_UP_1, //MOTO_DISPENSER_1 = 6,
+ GPI_LS_DISPENSER_UP_2, //MOTO_DISPENSER_2 = 7,
+ GPI_LS_DISPENSER_UP_3, //MOTO_DISPENSER_3 = 8,
+ GPI_LS_DISPENSER_UP_4, //MOTO_DISPENSER_4 = 9,
+ GPI_LS_DISPENSER_UP_5, //MOTO_DISPENSER_5 = 10,
+ GPI_LS_DISPENSER_UP_6, //MOTO_DISPENSER_6 = 11,
+ GPI_LS_DISPENSER_UP_7, //MOTO_DISPENSER_7 = 12,
+ GPI_LS_DISPENSER_UP_8, //MOTO_DISPENSER_8 = 13,
+};
FPGA_GPI_ENUM Dispenser_Id_to_Alarm_LS_Id[MAX_SYSTEM_DISPENSERS*2] = {
GPI_LS_DISPENSER_UP_1, //MOTO_DISPENSER_1 = 6,
GPI_LS_DISPENSER_UP_2, //MOTO_DISPENSER_2 = 7,
@@ -128,3 +138,31 @@ uint32_t IDS_CheckDispenserLimitSwitch (LimitSwitchAlarms LS_Id)
else
return FPGA_Read_limit_Switches(Dispenser_Id_to_Alarm_LS_Id[LS_Id]);
}
+
+uint32_t IDS_EmptyDispenser (uint32_t deviceID, uint32_t speed , callback_fptr callback)
+{
+ assert(deviceID < MAX_SYSTEM_DISPENSERS);
+
+ if (HomingActive[deviceID] == true)
+ return ERROR;
+ else
+ HomingActive[deviceID] = true;
+
+ HomingRequestCallback[deviceID] = callback;
+
+ TimerMotors_t MotorId = HARDWARE_MOTOR_TYPE__MOTO_DISPENSER_1 + deviceID;
+ if ( Dispenser_Id_to_LS_Empty_Id[deviceID] != MAX_GPI)
+ {
+ //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);
+ //open dry air valve in the dispenser
+ Valve_Set(IDS_Id_to_AirValve[deviceID], Atm_MidTank_ON);
+
+
+ MotorMovetoLimitSwitch (MotorId,1-MotorsCfg[MotorId].directionthreadwize, speed, Dispenser_Id_to_LS_Empty_Id[deviceID], IDS_HomeDispenserCallback);
+ return OK;
+ }
+ return ERROR;
+}
diff --git a/Software/Embedded_SW/Embedded/Modules/IDS/IDS_print.c b/Software/Embedded_SW/Embedded/Modules/IDS/IDS_print.c
index acd8a8983..3a86bab44 100644
--- a/Software/Embedded_SW/Embedded/Modules/IDS/IDS_print.c
+++ b/Software/Embedded_SW/Embedded/Modules/IDS/IDS_print.c
@@ -151,7 +151,28 @@ void DispenserPrepareReady(void)
DispenserPrepareReady();
return OK;
}
+bool IDS_isDispenserUsedNextSegment(void *JobDetails,int DispenserId, int SegmentId)
+{
+ JobTicket* JobTicket = JobDetails;
+ int NextSegment = SegmentId+1;
+ int Dispenser_i,n_dispensers;
+ if (JobTicket->n_segments == 0)
+ return false;
+ if (JobTicket->n_segments <= NextSegment)
+ return false;
+ if (JobTicket->segments[NextSegment]->brushstops[0]->n_dispensers)
+ {
+ n_dispensers = JobTicket->segments[NextSegment]->brushstops[0]->n_dispensers;
+ for (Dispenser_i = 0;Dispenser_i < n_dispensers;Dispenser_i++)
+ {
+ if (DispenserId == JobTicket->segments[NextSegment]->brushstops[0]->dispensers[Dispenser_i]->index) //dispenser is in use next segment
+ return true;
+ }
+ }
+
+ return false;
+}
//********************************************************************************************************************
uint32_t IDS_Valve_PresegmentReady(uint32_t deviceID, uint32_t ReadValue)
{
@@ -209,14 +230,16 @@ uint32_t IDSPreSegmentState(void *JobDetails, int SegmentId)
if (MotorsCfg[HW_Motor_Id].hardwaremotortype != DispenserIdToMotorId[DispenserId])//unconfigured dispenser
continue;
DispenserPreSegmentReady[DispenserId] = false;
- Control3WayValvesWithCallback ((Valves_t)DispenserId, MidTank_Dispenser, IDS_Valve_PresegmentReady); //direction: MidTank_Dispenser or Dispenser_Mixer
-
+ if (IDS_isDispenserUsedNextSegment(JobDetails,DispenserId,SegmentId) == false)
+ {
+ Control3WayValvesWithCallback ((Valves_t)DispenserId, MidTank_Dispenser, IDS_Valve_PresegmentReady); //direction: MidTank_Dispenser or Dispenser_Mixer
+ }
MotorStop(HW_Motor_Id,Hard_Hiz);
/*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);
+ MotorSetMicroStep(HW_Motor_Id,MotorsCfg[HW_Motor_Id].microstep);
}
}
diff --git a/Software/Embedded_SW/Embedded/Modules/Thread/Thread_Winder.c b/Software/Embedded_SW/Embedded/Modules/Thread/Thread_Winder.c
index c7dd4f7ae..effa8b2c7 100644
--- a/Software/Embedded_SW/Embedded/Modules/Thread/Thread_Winder.c
+++ b/Software/Embedded_SW/Embedded/Modules/Thread/Thread_Winder.c
@@ -8,6 +8,8 @@
#include "thread.h"
#include "drivers/Motors/Motor.h"
+#include <drivers/FPGA/FPGA_INTERRUPTS/fpga_interrupts.h>
+
#include "StateMachines/Printing/PrintingSTM.h"
#include "Modules/Control/Control.h"
#include "Modules/Control/MillisecTask.h"
@@ -21,6 +23,8 @@
#include "drivers/FPGA/FPGA_SPI_Comm.h"
#include "drivers/FPGA/FPGA_GPIO/FPGA_GPIO.h"
+
+
bool Winder_ScrewHoming = false;
//bool Winder_Active = false;
@@ -128,7 +132,7 @@ uint32_t Winder_ScrewAtOffsetCallback(uint32_t deviceID, uint32_t BusyFlag)
ScrewNumberOfSteps = 0;
DirectionChangeCounter = 0;
REPORT_MSG(BusyFlag, "Winder_ScrewAtOffsetCallback");
-
+ //Screw_Interrupt(true,ScrewFreeInterrupt);
PrepareReady(Module_Winder, ModuleDone);
return OK;
}
@@ -338,6 +342,7 @@ uint32_t Winder_End(void)
RemoveControlCallback(ScrewControlId,ScrewDirectionChange);
CurrentControlledSpeed[SCREW_MOTOR] = 0;
pend = MillisecFlushMsgQ(HARDWARE_MOTOR_TYPE__MOTO_SCREW);
+ //Screw_Interrupt(false,NULL);
return MotorStop (HARDWARE_MOTOR_TYPE__MOTO_SCREW,Hard_Hiz);
}
void Winder_ScrewHomeLimitSwitchInterrupt(void)