aboutsummaryrefslogtreecommitdiffstats
path: root/Software
diff options
context:
space:
mode:
authorShlomo Hecht <shlomo@twine-s.com>2020-04-20 19:48:40 +0300
committerShlomo Hecht <shlomo@twine-s.com>2020-04-20 19:48:40 +0300
commit050b4cef6dec4cd18121081a802a2a5e0cf0d774 (patch)
treeac5a89ecfac64f917d3ffbf5b24a58e8a7766dd0 /Software
parent106fdd749e24f589afba0fb7ffdd712d6ef567ff (diff)
downloadTango-050b4cef6dec4cd18121081a802a2a5e0cf0d774.tar.gz
Tango-050b4cef6dec4cd18121081a802a2a5e0cf0d774.zip
dispenser eeprom implementation
Diffstat (limited to 'Software')
-rw-r--r--Software/Embedded_SW/Embedded/Communication/Container.c4
-rw-r--r--Software/Embedded_SW/Embedded/DataDef.h1
-rw-r--r--Software/Embedded_SW/Embedded/Drivers/I2C_Communication/Dispenser_Card/EEPROM/Dispenser_EEPROM.c163
-rw-r--r--Software/Embedded_SW/Embedded/Drivers/I2C_Communication/Dispenser_Card/EEPROM/Dispenser_EEPROM.h1
-rw-r--r--Software/Stubs Collection/stubs/dye sequence stubs.cs40
5 files changed, 209 insertions, 0 deletions
diff --git a/Software/Embedded_SW/Embedded/Communication/Container.c b/Software/Embedded_SW/Embedded/Communication/Container.c
index 5282ab9e0..c35b0ca45 100644
--- a/Software/Embedded_SW/Embedded/Communication/Container.c
+++ b/Software/Embedded_SW/Embedded/Communication/Container.c
@@ -32,6 +32,7 @@
#include "Modules/General/GeneralHardware.h"
#include "Modules/General/MachineStatus.h"
+#include "Drivers/I2C_Communication/Dispenser_Card/EEPROM/Dispenser_EEPROM.h"
#include "Modules/heaters/heaters_ex.h"
#include "Modules/AlarmHandling/AlarmHandling.h"
@@ -483,6 +484,9 @@ void receive_callback(char* buffer, size_t length)
case MESSAGE_TYPE__StopThreadLoadingRequest:
StopThreadLoadingFunc(requestContainer);
break;
+ case MESSAGE_TYPE__DispenserEEpromRequest:
+ DispenserEEpromRequestFunc(requestContainer);
+ break;
default:
//unsupported message type !!
LOG_ERROR (requestContainer->type,"unsupported message type");
diff --git a/Software/Embedded_SW/Embedded/DataDef.h b/Software/Embedded_SW/Embedded/DataDef.h
index 1621f2ecc..3729ee739 100644
--- a/Software/Embedded_SW/Embedded/DataDef.h
+++ b/Software/Embedded_SW/Embedded/DataDef.h
@@ -517,6 +517,7 @@ typedef struct
uint32_t Pressure_Slope;
uint8_t Production_Test_Date[8];//string
uint32_t ATS_Location;
+ uint32_t ATS_Channel;
uint32_t Spare1;
uint32_t Spare2;
uint8_t Unit_Empty;
diff --git a/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/Dispenser_Card/EEPROM/Dispenser_EEPROM.c b/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/Dispenser_Card/EEPROM/Dispenser_EEPROM.c
index 1c9935a52..346eb65f6 100644
--- a/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/Dispenser_Card/EEPROM/Dispenser_EEPROM.c
+++ b/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/Dispenser_Card/EEPROM/Dispenser_EEPROM.c
@@ -21,6 +21,10 @@
#include <drivers/FPGA/FPGA_Comm.h>
#include "drivers/FPGA/FPGA_GPIO/FPGA_GPIO.h"
+#include "PMR/Diagnostics/DispenserEEprom.pb-c.h"
+#include "PMR/Diagnostics/DispenserEEpromRequest.pb-c.h"
+#include "PMR/Diagnostics/DispenserEEpromResponse.pb-c.h"
+
#define I2C_Slave_EEprom_Add 0xA0 //eeprom address - 32kByte & 128kByte
@@ -235,5 +239,164 @@ uint8_t Check_Dispenser_Type(uint8_t Dispenser_ID)
return Dispenser_struct[Dispenser_ID].Status;
}
+uint32_t Get_EEPROM_DATA_From_Dispenser(int Dispenser_ID,DispenserEEprom *dispensereeprom)
+{
+ uint32_t status = OK;
+ status |= I2C_EEprom_Set_for_Read_Ch(Dispenser_ID, 0xA0);
+ status |= I2C_EEprom_Read_Ch(Dispenser_ID, 0xA0);
+
+ if (status == OK)
+ {
+ dispensereeprom->has_header = true;
+ dispensereeprom->header = Dispenser_struct[Dispenser_ID].Read_Disp_EEPROM.bytes.Header;
+ dispensereeprom->has_tablelength = true;
+ dispensereeprom->tablelength = Dispenser_struct[Dispenser_ID].Read_Disp_EEPROM.bytes.Table_Length;
+ dispensereeprom->has_tableversion = true;
+ dispensereeprom->tableversion = Dispenser_struct[Dispenser_ID].Read_Disp_EEPROM.bytes.Table_version;
+ memcpy(dispensereeprom->dispenserp_n,Dispenser_struct[Dispenser_ID].Read_Disp_EEPROM.bytes.Dispenser_Part_Number,sizeof(Dispenser_struct[Dispenser_ID].Read_Disp_EEPROM.bytes.Dispenser_Part_Number));
+ memcpy(dispensereeprom->pcbs_n,Dispenser_struct[Dispenser_ID].Read_Disp_EEPROM.bytes.PCB_SN,sizeof(Dispenser_struct[Dispenser_ID].Read_Disp_EEPROM.bytes.PCB_SN));
+ memcpy(dispensereeprom->pcbpartnumber,Dispenser_struct[Dispenser_ID].Read_Disp_EEPROM.bytes.PCB_Part_Number,sizeof(Dispenser_struct[Dispenser_ID].Read_Disp_EEPROM.bytes.PCB_Part_Number));
+ memcpy(dispensereeprom->dispensers_n,Dispenser_struct[Dispenser_ID].Read_Disp_EEPROM.bytes.Dispenser_SN,sizeof(Dispenser_struct[Dispenser_ID].Read_Disp_EEPROM.bytes.Dispenser_SN));
+ dispensereeprom->has_minimalpressure = true;
+ dispensereeprom->minimalpressure = Dispenser_struct[Dispenser_ID].Read_Disp_EEPROM.bytes.Maximal_Pressure;
+ dispensereeprom->has_maximalpressure = true;
+ dispensereeprom->maximalpressure = Dispenser_struct[Dispenser_ID].Read_Disp_EEPROM.bytes.Maximal_Pressure;
+ dispensereeprom->has_minimalmv = true;
+ dispensereeprom->minimalmv = Dispenser_struct[Dispenser_ID].Read_Disp_EEPROM.bytes.Minimal_MV;
+ dispensereeprom->has_maximalmv = true;
+ dispensereeprom->maximalmv = Dispenser_struct[Dispenser_ID].Read_Disp_EEPROM.bytes.Maximal_MV;
+ dispensereeprom->has_totalcycles = true;
+ dispensereeprom->totalcycles = Dispenser_struct[Dispenser_ID].Read_Disp_EEPROM.bytes.Total_Cycles;
+ dispensereeprom->has_bubblesize = true;
+ dispensereeprom->bubblesize = Dispenser_struct[Dispenser_ID].Read_Disp_EEPROM.bytes.Bubble_Size;
+ dispensereeprom->has_avg_nl_stepvalue_1_4 = true;
+ dispensereeprom->avg_nl_stepvalue_1_4 = Dispenser_struct[Dispenser_ID].Read_Disp_EEPROM.bytes.AVG_Nl_Step_Value_1_4;
+ dispensereeprom->has_avg_nl_stepvalue_2_4 = true;
+ dispensereeprom->avg_nl_stepvalue_2_4 = Dispenser_struct[Dispenser_ID].Read_Disp_EEPROM.bytes.AVG_Nl_Step_Value_2_4;
+ dispensereeprom->has_avg_nl_stepvalue_3_4 = true;
+ dispensereeprom->avg_nl_stepvalue_3_4 = Dispenser_struct[Dispenser_ID].Read_Disp_EEPROM.bytes.AVG_Nl_Step_Value_3_4;
+ dispensereeprom->has_avg_nl_stepvalue_4_4 = true;
+ dispensereeprom->avg_nl_stepvalue_4_4 = Dispenser_struct[Dispenser_ID].Read_Disp_EEPROM.bytes.AVG_Nl_Step_Value_4_4;
+ dispensereeprom->has_sw_reserve = true;
+ dispensereeprom->sw_reserve = Dispenser_struct[Dispenser_ID].Read_Disp_EEPROM.bytes.SW_Reserve;
+ dispensereeprom->has_spare1_pressure = true;
+ dispensereeprom->spare1_pressure = Dispenser_struct[Dispenser_ID].Read_Disp_EEPROM.bytes.Spare1_pressure;
+ dispensereeprom->has_spare2_pressure = true;
+ dispensereeprom->spare2_pressure = Dispenser_struct[Dispenser_ID].Read_Disp_EEPROM.bytes.Spare2_pressure;
+ dispensereeprom->has_motorpulsespercycle = true;
+ dispensereeprom->motorpulsespercycle = Dispenser_struct[Dispenser_ID].Read_Disp_EEPROM.bytes.Motor_PPC;
+ dispensereeprom->has_color = true;
+ dispensereeprom->color = Dispenser_struct[Dispenser_ID].Read_Disp_EEPROM.bytes.color;
+ dispensereeprom->has_pressureslope = true;
+ dispensereeprom->pressureslope = Dispenser_struct[Dispenser_ID].Read_Disp_EEPROM.bytes.Pressure_Slope;
+ memcpy(dispensereeprom->productiondate,Dispenser_struct[Dispenser_ID].Read_Disp_EEPROM.bytes.Production_Test_Date,sizeof(Dispenser_struct[Dispenser_ID].Read_Disp_EEPROM.bytes.Production_Test_Date));
+ dispensereeprom->has_atslocation = true;
+ dispensereeprom->atslocation = Dispenser_struct[Dispenser_ID].Read_Disp_EEPROM.bytes.ATS_Location;
+ dispensereeprom->has_spare1 = true;
+ dispensereeprom->spare1 = Dispenser_struct[Dispenser_ID].Read_Disp_EEPROM.bytes.Spare1;
+ dispensereeprom->has_spare2 = true;
+ dispensereeprom->spare2 = Dispenser_struct[Dispenser_ID].Read_Disp_EEPROM.bytes.Spare2;
+ dispensereeprom->has_atschannel = true;
+ dispensereeprom->atschannel = Dispenser_struct[Dispenser_ID].Read_Disp_EEPROM.bytes.ATS_Channel;
+ dispensereeprom->has_unitempty = true;
+ dispensereeprom->unitempty = Dispenser_struct[Dispenser_ID].Read_Disp_EEPROM.bytes.Unit_Empty;
+ dispensereeprom->has_dryrunpass_fail = true;
+ dispensereeprom->dryrunpass_fail = Dispenser_struct[Dispenser_ID].Read_Disp_EEPROM.bytes.Dry_Run_Status;
+ dispensereeprom->has_flowpass_fail = true;
+ dispensereeprom->flowpass_fail = Dispenser_struct[Dispenser_ID].Read_Disp_EEPROM.bytes.Flow_Status;
+ dispensereeprom->has_checksum = true;
+ dispensereeprom->checksum = Dispenser_struct[Dispenser_ID].Read_Disp_EEPROM.bytes.CheckSum;
+
+ }
+ return status;
+}
+uint32_t Prepare_EEPROM_DATA_For_Burning(int Dispenser_ID,DispenserEEprom *dispensereeprom)
+{
+ uint32_t status = OK;
+ Dispenser_struct[Dispenser_ID].Read_Disp_EEPROM.bytes.Header = dispensereeprom->header;
+ Dispenser_struct[Dispenser_ID].Read_Disp_EEPROM.bytes.Table_Length = dispensereeprom->tablelength;
+ Dispenser_struct[Dispenser_ID].Read_Disp_EEPROM.bytes.Table_version = dispensereeprom->tableversion;
+ Dispenser_struct[Dispenser_ID].Read_Disp_EEPROM.bytes.Maximal_Pressure = dispensereeprom->minimalpressure;
+ Dispenser_struct[Dispenser_ID].Read_Disp_EEPROM.bytes.Maximal_Pressure = dispensereeprom->maximalpressure;
+ Dispenser_struct[Dispenser_ID].Read_Disp_EEPROM.bytes.Minimal_MV = dispensereeprom->minimalmv;
+ Dispenser_struct[Dispenser_ID].Read_Disp_EEPROM.bytes.Maximal_MV = dispensereeprom->maximalmv;
+ Dispenser_struct[Dispenser_ID].Read_Disp_EEPROM.bytes.Total_Cycles = dispensereeprom->totalcycles;
+ Dispenser_struct[Dispenser_ID].Read_Disp_EEPROM.bytes.Bubble_Size = dispensereeprom->bubblesize;
+ Dispenser_struct[Dispenser_ID].Read_Disp_EEPROM.bytes.AVG_Nl_Step_Value_1_4 = dispensereeprom->avg_nl_stepvalue_1_4;
+ Dispenser_struct[Dispenser_ID].Read_Disp_EEPROM.bytes.AVG_Nl_Step_Value_2_4 = dispensereeprom->avg_nl_stepvalue_2_4;
+ Dispenser_struct[Dispenser_ID].Read_Disp_EEPROM.bytes.AVG_Nl_Step_Value_3_4 = dispensereeprom->avg_nl_stepvalue_3_4;
+ Dispenser_struct[Dispenser_ID].Read_Disp_EEPROM.bytes.AVG_Nl_Step_Value_4_4 = dispensereeprom->avg_nl_stepvalue_4_4;
+ Dispenser_struct[Dispenser_ID].Read_Disp_EEPROM.bytes.SW_Reserve = dispensereeprom->sw_reserve;
+ Dispenser_struct[Dispenser_ID].Read_Disp_EEPROM.bytes.Spare1_pressure = dispensereeprom->spare1_pressure;
+ Dispenser_struct[Dispenser_ID].Read_Disp_EEPROM.bytes.Spare2_pressure = dispensereeprom->spare2_pressure;
+ Dispenser_struct[Dispenser_ID].Read_Disp_EEPROM.bytes.Motor_PPC = dispensereeprom->motorpulsespercycle;
+ Dispenser_struct[Dispenser_ID].Read_Disp_EEPROM.bytes.color = dispensereeprom->color;
+ Dispenser_struct[Dispenser_ID].Read_Disp_EEPROM.bytes.Pressure_Slope = dispensereeprom->pressureslope;
+ Dispenser_struct[Dispenser_ID].Read_Disp_EEPROM.bytes.ATS_Location = dispensereeprom->atslocation;
+ Dispenser_struct[Dispenser_ID].Read_Disp_EEPROM.bytes.Spare1 = dispensereeprom->spare1;
+ Dispenser_struct[Dispenser_ID].Read_Disp_EEPROM.bytes.Spare2 = dispensereeprom->spare2;
+ Dispenser_struct[Dispenser_ID].Read_Disp_EEPROM.bytes.ATS_Channel = dispensereeprom->atschannel;
+ Dispenser_struct[Dispenser_ID].Read_Disp_EEPROM.bytes.Unit_Empty = dispensereeprom->unitempty;
+ Dispenser_struct[Dispenser_ID].Read_Disp_EEPROM.bytes.Dry_Run_Status = dispensereeprom->dryrunpass_fail;
+ Dispenser_struct[Dispenser_ID].Read_Disp_EEPROM.bytes.Flow_Status = dispensereeprom->flowpass_fail;
+ Dispenser_struct[Dispenser_ID].Read_Disp_EEPROM.bytes.CheckSum = dispensereeprom->checksum;
+ if (dispensereeprom->dispenserp_n)
+ strncpy(Dispenser_struct[Dispenser_ID].Read_Disp_EEPROM.bytes.Dispenser_Part_Number,dispensereeprom->dispenserp_n,sizeof(Dispenser_struct[Dispenser_ID].Read_Disp_EEPROM.bytes.Dispenser_Part_Number));
+ if (dispensereeprom->pcbs_n)
+ strncpy(Dispenser_struct[Dispenser_ID].Read_Disp_EEPROM.bytes.PCB_SN,dispensereeprom->pcbs_n,sizeof(Dispenser_struct[Dispenser_ID].Read_Disp_EEPROM.bytes.PCB_SN));
+ if (dispensereeprom->pcbpartnumber)
+ strncpy(Dispenser_struct[Dispenser_ID].Read_Disp_EEPROM.bytes.PCB_Part_Number,dispensereeprom->pcbpartnumber,sizeof(Dispenser_struct[Dispenser_ID].Read_Disp_EEPROM.bytes.PCB_Part_Number));
+ if (dispensereeprom->dispensers_n)
+ strncpy(Dispenser_struct[Dispenser_ID].Read_Disp_EEPROM.bytes.Dispenser_SN,dispensereeprom->dispensers_n,sizeof(Dispenser_struct[Dispenser_ID].Read_Disp_EEPROM.bytes.Dispenser_SN));
+ if (dispensereeprom->productiondate)
+ strncpy(Dispenser_struct[Dispenser_ID].Read_Disp_EEPROM.bytes.Production_Test_Date,dispensereeprom->productiondate,sizeof(Dispenser_struct[Dispenser_ID].Read_Disp_EEPROM.bytes.Production_Test_Date));
+ status = I2C_EEprom_Write_Ch(Dispenser_ID, 0xA0);
+ SysCtlDelay(5000000);//Must delay for at least 5 milli. !!! (See data sheet )
+ return status;
+}
+uint32_t DispenserEEpromRequestFunc(MessageContainer* requestContainer)
+{
+ DispenserEEpromRequest *request = dispenser_eeprom_request__unpack(NULL, requestContainer->data.len, requestContainer->data.data);
+ DispenserEEpromResponse Cresponse = DISPENSER_EEPROM_RESPONSE__INIT;
+ MessageContainer responseContainer;
+
+ uint32_t status = OK;
+ DispenserEEprom *DispenserEEpromInstance;
+ Report("DispenserEEpromRequestFunc",__FILE__,__LINE__,request->dispenserid,RpWarning,(int)request->burnrequest,0);
+ if (request->burnrequest == true)
+ {
+ status = Prepare_EEPROM_DATA_For_Burning(request->dispenserid,request->dispensereeprom);
+ }
+ else
+ {
+ DispenserEEpromInstance = my_malloc(sizeof(DispenserEEprom));
+ if (DispenserEEpromInstance)
+ status = Get_EEPROM_DATA_From_Dispenser(request->dispenserid,DispenserEEpromInstance);
+ else
+ {
+ status = FAILED;
+ LOG_ERROR(request->dispenserid,"my_malloc failed");
+ }
+ }
+ if ((request->burnrequest == false) && (status = OK))
+ {
+ Cresponse.dispensereeprom = DispenserEEpromInstance;
+ }
+ Cresponse.has_dispenserid = true;
+ Cresponse.dispenserid = request->dispenserid;
+ responseContainer = createContainer(MESSAGE_TYPE__DispenserEEpromResponse, requestContainer->token, true, &Cresponse, &dispenser_eeprom_response__pack, &dispenser_eeprom_response__get_packed_size);
+ responseContainer.continuous = false;
+ if (status != OK)
+ {
+ responseContainer.error = ERROR_CODE__INVALID_PARAMETER;
+ responseContainer.has_error = 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((char*)container_buffer, container_size);
+ return OK;
+
+}
diff --git a/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/Dispenser_Card/EEPROM/Dispenser_EEPROM.h b/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/Dispenser_Card/EEPROM/Dispenser_EEPROM.h
index bc1eb946a..3483e4033 100644
--- a/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/Dispenser_Card/EEPROM/Dispenser_EEPROM.h
+++ b/Software/Embedded_SW/Embedded/Drivers/I2C_Communication/Dispenser_Card/EEPROM/Dispenser_EEPROM.h
@@ -17,6 +17,7 @@ uint32_t I2C_EEprom_Read_Ch(uint8_t Dispenser_ID);
uint32_t test_disp_eeprom(uint8_t Dispenser_ID , uint8_t EEprom_Add);
uint8_t Check_Dispenser_Type();
+uint32_t DispenserEEpromRequestFunc(MessageContainer* requestContainer);
#endif /* DRIVERS_I2C_COMMUNICATION_DISPENSERS_EEPROM_MUX_DISP_EEPROM_MUX_H_ */
diff --git a/Software/Stubs Collection/stubs/dye sequence stubs.cs b/Software/Stubs Collection/stubs/dye sequence stubs.cs
new file mode 100644
index 000000000..8aaf3a823
--- /dev/null
+++ b/Software/Stubs Collection/stubs/dye sequence stubs.cs
@@ -0,0 +1,40 @@
+using System;
+using System.Text;
+using System.Linq;
+using System.Drawing;
+using System.Diagnostics;
+using System.Windows.Forms;
+using System.Threading;
+using System.Threading.Tasks;
+using System.Collections.Generic;
+using Tango.PMR.Stubs;
+using Tango.Stubs;
+
+public void OnExecute(StubManager stubManager)
+{
+
+//"Set WFCF Value
+ int WCFvalue = 40;
+ProgressRequest progressRequest = new ProgressRequest();
+progressRequest.Amount = 0xE3;
+progressRequest.Delay = WCFvalue;
+
+var response = stubManager.Run<ProgressResponse>(progressRequest);
+
+//Set WFCF build to waste Time Value
+int WCFBuildTime = 20000;
+
+progressRequest.Amount = 0xE4;
+progressRequest.Delay = WCFBuildTime;
+
+response = stubManager.Run<ProgressResponse>(progressRequest);
+
+// Set special dispensers true (close valve) or false (open valve)
+int ClosedValve = 1; //closed
+
+progressRequest.Amount = 0xE5;
+progressRequest.Delay = ClosedValve;
+
+response = stubManager.Run<ProgressResponse>(progressRequest);
+
+} \ No newline at end of file