From 050b4cef6dec4cd18121081a802a2a5e0cf0d774 Mon Sep 17 00:00:00 2001 From: Shlomo Hecht Date: Mon, 20 Apr 2020 19:48:40 +0300 Subject: dispenser eeprom implementation --- .../Embedded_SW/Embedded/Communication/Container.c | 4 + Software/Embedded_SW/Embedded/DataDef.h | 1 + .../Dispenser_Card/EEPROM/Dispenser_EEPROM.c | 163 +++++++++++++++++++++ .../Dispenser_Card/EEPROM/Dispenser_EEPROM.h | 1 + .../Stubs Collection/stubs/dye sequence stubs.cs | 40 +++++ 5 files changed, 209 insertions(+) create mode 100644 Software/Stubs Collection/stubs/dye sequence stubs.cs (limited to 'Software') 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 #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(progressRequest); + +//Set WFCF build to waste Time Value +int WCFBuildTime = 20000; + +progressRequest.Amount = 0xE4; +progressRequest.Delay = WCFBuildTime; + +response = stubManager.Run(progressRequest); + +// Set special dispensers true (close valve) or false (open valve) +int ClosedValve = 1; //closed + +progressRequest.Amount = 0xE5; +progressRequest.Delay = ClosedValve; + +response = stubManager.Run(progressRequest); + +} \ No newline at end of file -- cgit v1.3.1