diff --git a/firmware/Makefile b/firmware/Makefile index 2cdd69f775..e8a0987db5 100644 --- a/firmware/Makefile +++ b/firmware/Makefile @@ -202,6 +202,7 @@ CPPSRC = $(CHCPPSRC) \ $(BOARDSRC_CPP) \ $(ENGINES_SRC_CPP) \ $(HW_LAYER_EMS_CPP) \ + $(HW_LAYER_DRIVERS_CPP) \ $(HW_SENSORS_SRC) \ $(TUNERSTUDIO_SRC_CPP) \ $(CONSOLE_SRC_CPP) \ diff --git a/firmware/controllers/algo/engine_configuration_generated_structures.h b/firmware/controllers/algo/engine_configuration_generated_structures.h index fa9893d4d8..66160dc15b 100644 --- a/firmware/controllers/algo/engine_configuration_generated_structures.h +++ b/firmware/controllers/algo/engine_configuration_generated_structures.h @@ -1,4 +1,4 @@ -// this section was generated automatically by ConfigDefinition.jar based on rusefi_config.txt Fri Mar 22 22:56:39 EDT 2019 +// this section was generated automatically by ConfigDefinition.jar based on rusefi_config.txt Mon Mar 25 14:42:37 EDT 2019 // begin #ifndef ENGINE_CONFIGURATION_GENERATED_H_ #define ENGINE_CONFIGURATION_GENERATED_H_ @@ -2214,7 +2214,11 @@ typedef struct { /** * offset 3129 */ - uint8_t unusedTest55[3]; + brain_pin_e tle8888_cs; + /** + * offset 3130 + */ + uint8_t unusedTest55[2]; /** * Optional timing advance table for Cranking (see useSeparateAdvanceForCranking) * offset 3132 @@ -2360,7 +2364,11 @@ typedef struct { /** * offset 4020 */ - int mainUnusedEnd[615]; + spi_device_e tle8888spiDevice; + /** + * offset 4024 + */ + int mainUnusedEnd[614]; /** total size 6480*/ } engine_configuration_s; @@ -2607,4 +2615,4 @@ typedef struct { #endif // end -// this section was generated automatically by ConfigDefinition.jar based on rusefi_config.txt Fri Mar 22 22:56:39 EDT 2019 +// this section was generated automatically by ConfigDefinition.jar based on rusefi_config.txt Mon Mar 25 14:42:37 EDT 2019 diff --git a/firmware/controllers/algo/rusefi_enums.h b/firmware/controllers/algo/rusefi_enums.h index 96f65e0893..b224035dd7 100644 --- a/firmware/controllers/algo/rusefi_enums.h +++ b/firmware/controllers/algo/rusefi_enums.h @@ -524,6 +524,7 @@ typedef enum { CIM_DEFAULT = 0, CIM_FIXED_ANGLE = 1, + // todo: make this a one byte enum Force_4_bytes_size_cranking_ignition_mode = ENUM_32_BITS, } cranking_ignition_mode_e; @@ -533,7 +534,7 @@ typedef enum { UART_DEVICE_2 = 2, UART_DEVICE_3 = 3, UART_DEVICE_4 = 4, - +// todo: make this a one byte enum Force_4_bytes_size_uart_device = ENUM_32_BITS, } uart_device_e; @@ -545,6 +546,7 @@ typedef enum { SPI_DEVICE_3 = 3, SPI_DEVICE_4 = 4, + // todo: make this a one byte enum Force_4_bytes_size_spi_device = ENUM_32_BITS, } spi_device_e; diff --git a/firmware/controllers/algo/rusefi_generated.h b/firmware/controllers/algo/rusefi_generated.h index fc5abd4f64..115a3cde13 100644 --- a/firmware/controllers/algo/rusefi_generated.h +++ b/firmware/controllers/algo/rusefi_generated.h @@ -1582,8 +1582,10 @@ #define externalKnockSenseAdc_offset_hex c37 #define stepperEnablePin_offset 3128 #define stepperEnablePin_offset_hex c38 -#define unusedTest55_offset 3129 -#define unusedTest55_offset_hex c39 +#define tle8888_cs_offset 3129 +#define tle8888_cs_offset_hex c39 +#define unusedTest55_offset 3130 +#define unusedTest55_offset_hex c3a #define crankingAdvanceBins_offset 3132 #define crankingAdvanceBins_offset_hex c3c #define crankingAdvance_offset 3148 @@ -1682,8 +1684,10 @@ #define idlePidFalloffDeltaRpm_offset_hex fb0 #define unusedIdleTimingPid_offset 4018 #define unusedIdleTimingPid_offset_hex fb2 -#define mainUnusedEnd_offset 4020 -#define mainUnusedEnd_offset_hex fb4 +#define tle8888spiDevice_offset 4020 +#define tle8888spiDevice_offset_hex fb4 +#define mainUnusedEnd_offset 4024 +#define mainUnusedEnd_offset_hex fb8 #define cltCrankingCorrBins_offset 6480 #define cltCrankingCorrBins_offset_hex 1950 #define cltCrankingCorr_offset 6512 diff --git a/firmware/hw_layer/drivers/drivers.mk b/firmware/hw_layer/drivers/drivers.mk index 439d3d0455..783533a735 100644 --- a/firmware/hw_layer/drivers/drivers.mk +++ b/firmware/hw_layer/drivers/drivers.mk @@ -1,10 +1,16 @@ DRIVERS_DIR=$(PROJECT_DIR)/hw_layer/drivers HW_LAYER_DRIVERS_INC = \ - $(DRIVERS_DIR) + $(DRIVERS_DIR) \ + $(DRIVERS_DIR)\gpio \ HW_LAYER_DRIVERS_CORE = \ $(DRIVERS_DIR)/gpio/core.c \ HW_LAYER_DRIVERS = \ $(DRIVERS_DIR)/gpio/tle6240.c \ + + +HW_LAYER_DRIVERS_CPP = \ + $(DRIVERS_DIR)/gpio/tle8888.cpp \ + diff --git a/firmware/hw_layer/drivers/gpio/core.c b/firmware/hw_layer/drivers/gpio/core.c index d3f903abde..29848e4ccf 100644 --- a/firmware/hw_layer/drivers/gpio/core.c +++ b/firmware/hw_layer/drivers/gpio/core.c @@ -265,6 +265,9 @@ const char *portNameExt(unsigned int pin) return NULL; } +/** + * @return result code + */ int gpiochip_register(const char *name, struct gpiochip_ops *ops, size_t size, void *priv) { (void)name; (void)ops; (void)size; (void)priv; diff --git a/firmware/hw_layer/drivers/gpio/tle8888.cpp b/firmware/hw_layer/drivers/gpio/tle8888.cpp new file mode 100644 index 0000000000..9e8acc05e5 --- /dev/null +++ b/firmware/hw_layer/drivers/gpio/tle8888.cpp @@ -0,0 +1,22 @@ +/** + * @date Mar 25, 2019 + * @author Andrey Belomutskiy, (c) 2012-2019 + */ + +#define TLE8888_CmdOE 0x1C + +#include "engine.h" +#include "tle8888.h" + +EXTERN_ENGINE; + +static SPIDriver *driver; + +static SPIConfig spiConfig; + +void initTle8888(DECLARE_ENGINE_PARAMETER_SIGNATURE) { + if (engineConfiguration->tle8888_cs == GPIO_UNASSIGNED) { + return; + } + +} diff --git a/firmware/hw_layer/drivers/gpio/tle8888.h b/firmware/hw_layer/drivers/gpio/tle8888.h new file mode 100644 index 0000000000..e98ea9ab74 --- /dev/null +++ b/firmware/hw_layer/drivers/gpio/tle8888.h @@ -0,0 +1,15 @@ +/* + * tle8888.h + * + * Created on: Mar 25, 2019 + * Author: garage + */ + +#ifndef HW_LAYER_DRIVERS_GPIO_TLE8888_H_ +#define HW_LAYER_DRIVERS_GPIO_TLE8888_H_ + +#include "global.h" + +void initTle8888(DECLARE_ENGINE_PARAMETER_SIGNATURE); + +#endif /* HW_LAYER_DRIVERS_GPIO_TLE8888_H_ */ diff --git a/firmware/hw_layer/hardware.cpp b/firmware/hw_layer/hardware.cpp index ea35939c17..13b782ee18 100644 --- a/firmware/hw_layer/hardware.cpp +++ b/firmware/hw_layer/hardware.cpp @@ -23,6 +23,7 @@ #include "yaw_rate_sensor.h" #include "pin_repository.h" #include "max31855.h" +#include "tle8888.h" #include "accelerometer.h" #include "eficonsole.h" #include "console_io.h" @@ -428,6 +429,8 @@ void initHardware(Logging *l) { initMax31855(sharedLogger, getSpiDevice(CONFIGB(max31855spiDevice)), CONFIGB(max31855_cs)); #endif /* EFI_MAX_31855 */ + initTle8888(PASS_ENGINE_PARAMETER_SIGNATURE); + #if EFI_CAN_SUPPORT initCan(); #endif /* EFI_CAN_SUPPORT */ diff --git a/firmware/integration/rusefi_config.txt b/firmware/integration/rusefi_config.txt index 1e4647864f..553cb84ed0 100644 --- a/firmware/integration/rusefi_config.txt +++ b/firmware/integration/rusefi_config.txt @@ -944,7 +944,8 @@ float[MAP_ACCEL_TAPER] mapAccelTaperMult;;"mult", 1, 0, 0.0, 300, pin_output_mode_e stepperDirectionPinMode; adc_channel_e externalKnockSenseAdc; brain_pin_e stepperEnablePin; - uint8_t[3] unusedTest55; + brain_pin_e tle8888_cs; + uint8_t[2] unusedTest55; float[CRANKING_ADVANCE_CURVE_SIZE] crankingAdvanceBins;Optional timing advance table for Cranking (see useSeparateAdvanceForCranking);"RPM", 1, 0, 0.0, 18000, 2 float[CRANKING_ADVANCE_CURVE_SIZE] crankingAdvance ;Optional timing advance table for Cranking (see useSeparateAdvanceForCranking);"deg", 1, 0, -20, 90, 2 @@ -990,8 +991,9 @@ tChargeMode_e tChargeMode; int16_t idleTimingPidDeadZone;If RPM is too perfect, let's leave the advance angle alone to avoid oscillation;"RPM", 1, 0, 0, 1000, 0 int16_t idlePidFalloffDeltaRpm;Added to the work zone for smooth correction falloff;"RPM", 1, 0, 0, 1000, 0 int16_t unusedIdleTimingPid; + spi_device_e tle8888spiDevice; - int[615] mainUnusedEnd; + int[614] mainUnusedEnd; end_struct diff --git a/firmware/tunerstudio/rusefi.ini b/firmware/tunerstudio/rusefi.ini index 17e5e15b81..b9d6898192 100644 --- a/firmware/tunerstudio/rusefi.ini +++ b/firmware/tunerstudio/rusefi.ini @@ -68,7 +68,7 @@ enable2ndByteCanID = false ; see PAGE_0_SIZE in C source code ; CONFIG_DEFINITION_START -; this section was generated automatically by ConfigDefinition.jar based on rusefi_config.txt Fri Mar 22 22:56:39 EDT 2019 +; this section was generated automatically by ConfigDefinition.jar based on rusefi_config.txt Mon Mar 25 14:42:37 EDT 2019 pageSize = 20000 page = 1 @@ -796,7 +796,8 @@ page = 1 stepperDirectionPinMode = bits, U08, 3126, [0:1], "default", "default inverted", "open collector", "open collector inverted" externalKnockSenseAdc = bits, U08, 3127, [0:4] "PA0", "PA1", "PA2", "PA3", "PA4", "PA5", "PA6", "PA7", "PB0", "PB1", "PC0", "PC1", "PC2", "PC3", "PC4", "PC5", "Disabled", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID" stepperEnablePin = bits, U08, 3128, [0:7], "NONE", "INVALID", "PA0", "PA1", "PA2", "PA3", "PA4", "PA5", "PA6", "PA7", "PA8", "PA9", "PA10", "PA11", "PA12", "PA13", "PA14", "PA15", "PB0", "PB1", "PB2", "PB3", "PB4", "PB5", "PB6", "PB7", "PB8", "PB9", "PB10", "PB11", "PB12", "PB13", "PB14", "PB15", "PC0", "PC1", "PC2", "PC3", "PC4", "PC5", "PC6", "PC7", "PC8", "PC9", "PC10", "PC11", "PC12", "PC13", "PC14", "PC15", "PD0", "PD1", "PD2", "PD3", "PD4", "PD5", "PD6", "PD7", "PD8", "PD9", "PD10", "PD11", "PD12", "PD13", "PD14", "PD15", "PE0", "PE1", "PE2", "PE3", "PE4", "PE5", "PE6","PE7","PE8","PE9","PE10","PE11","PE12","PE13","PE14","PE15", "PF0","PF1","PF2","PF3","PF4","PF5","PF6","PF7","PF8","PF9","PF10","PF11","PF12","PF13","PF14","PF15", "PG0","PG1","PG2","PG3","PG4","PG5","PG6","PG7","PG8","PG9","PG10","PG11","PG12","PG13","PG14","PG15", "PH0","PH1","PH2","PH3","PH4","PH5","PH6","PH7","PH8","PH9","PH10","PH11","PH12","PH13","PH14","PH15","INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID" -;no TS info - skipping unusedTest55 offset 3129 + tle8888_cs = bits, U08, 3129, [0:7], "NONE", "INVALID", "PA0", "PA1", "PA2", "PA3", "PA4", "PA5", "PA6", "PA7", "PA8", "PA9", "PA10", "PA11", "PA12", "PA13", "PA14", "PA15", "PB0", "PB1", "PB2", "PB3", "PB4", "PB5", "PB6", "PB7", "PB8", "PB9", "PB10", "PB11", "PB12", "PB13", "PB14", "PB15", "PC0", "PC1", "PC2", "PC3", "PC4", "PC5", "PC6", "PC7", "PC8", "PC9", "PC10", "PC11", "PC12", "PC13", "PC14", "PC15", "PD0", "PD1", "PD2", "PD3", "PD4", "PD5", "PD6", "PD7", "PD8", "PD9", "PD10", "PD11", "PD12", "PD13", "PD14", "PD15", "PE0", "PE1", "PE2", "PE3", "PE4", "PE5", "PE6","PE7","PE8","PE9","PE10","PE11","PE12","PE13","PE14","PE15", "PF0","PF1","PF2","PF3","PF4","PF5","PF6","PF7","PF8","PF9","PF10","PF11","PF12","PF13","PF14","PF15", "PG0","PG1","PG2","PG3","PG4","PG5","PG6","PG7","PG8","PG9","PG10","PG11","PG12","PG13","PG14","PG15", "PH0","PH1","PH2","PH3","PH4","PH5","PH6","PH7","PH8","PH9","PH10","PH11","PH12","PH13","PH14","PH15","INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID" +;no TS info - skipping unusedTest55 offset 3130 crankingAdvanceBins = array, F32, 3132, [4], "RPM", 1, 0, 0.0, 18000, 2 crankingAdvance = array, F32, 3148, [4], "deg", 1, 0, -20, 90, 2 servoOutputPins1 = bits, U08, 3164, [0:7], "NONE", "INVALID", "PA0", "PA1", "PA2", "PA3", "PA4", "PA5", "PA6", "PA7", "PA8", "PA9", "PA10", "PA11", "PA12", "PA13", "PA14", "PA15", "PB0", "PB1", "PB2", "PB3", "PB4", "PB5", "PB6", "PB7", "PB8", "PB9", "PB10", "PB11", "PB12", "PB13", "PB14", "PB15", "PC0", "PC1", "PC2", "PC3", "PC4", "PC5", "PC6", "PC7", "PC8", "PC9", "PC10", "PC11", "PC12", "PC13", "PC14", "PC15", "PD0", "PD1", "PD2", "PD3", "PD4", "PD5", "PD6", "PD7", "PD8", "PD9", "PD10", "PD11", "PD12", "PD13", "PD14", "PD15", "PE0", "PE1", "PE2", "PE3", "PE4", "PE5", "PE6","PE7","PE8","PE9","PE10","PE11","PE12","PE13","PE14","PE15", "PF0","PF1","PF2","PF3","PF4","PF5","PF6","PF7","PF8","PF9","PF10","PF11","PF12","PF13","PF14","PF15", "PG0","PG1","PG2","PG3","PG4","PG5","PG6","PG7","PG8","PG9","PG10","PG11","PG12","PG13","PG14","PG15", "PH0","PH1","PH2","PH3","PH4","PH5","PH6","PH7","PH8","PH9","PH10","PH11","PH12","PH13","PH14","PH15","INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID", "INVALID" @@ -844,7 +845,8 @@ page = 1 idleTimingPidDeadZone = scalar, S16, 4014, "RPM", 1, 0, 0, 1000, 0 idlePidFalloffDeltaRpm = scalar, S16, 4016, "RPM", 1, 0, 0, 1000, 0 ;no TS info - skipping unusedIdleTimingPid offset 4018 -;no TS info - skipping mainUnusedEnd offset 4020 + tle8888spiDevice = bits,U32, 4020, [0:1], "Off", "SPI1", "SPI2", "SPI3" +;no TS info - skipping mainUnusedEnd offset 4024 cltCrankingCorrBins = array, F32, 6480, [8], "C", 1, 0, -100.0, 250.0, 2 cltCrankingCorr = array, F32, 6512, [8], "%", 1, 0, 0.0, 500.0, 2 idleAdvanceBins = array, F32, 6544, [8], "RPM", 1, 0, 0.0, 18000, 2 @@ -2540,6 +2542,7 @@ cmd_set_engine_type_default = "w\x00\x31\x00\x00" field = "Saab CDM knock", cdmInputPin field = "comm status light", communicationLedPin field = "running status light", runningLedPin + field = "TLE8888 Chip Select", tle8888_cs dialog = allPins1_2, "", xAxis @@ -2752,8 +2755,10 @@ cmd_set_engine_type_default = "w\x00\x31\x00\x00" field = "Main Relay Pin", mainRelayPin field = "Fuel Pump Pin Mode", fuelPumpPinMode field = "Fuel Pump Pin", fuelPumpPin - field = "Check Engine Pin Mode", malfunctionIndicatorPinMode - field = "Check Engine Pin", malfunctionIndicatorPin + field = "Check Engine Pin Mode", malfunctionIndicatorPinMode + field = "Check Engine Pin", malfunctionIndicatorPin + field = "TLE8888 Chip Select", tle8888_cs + field = "TLE8888 SPI", tle8888spiDevice ; Engine->MIL Settings dialog = malfunction, "Check Engine Settings" diff --git a/firmware/tunerstudio/rusefi.input b/firmware/tunerstudio/rusefi.input index cc81d2b992..f457a72b89 100644 --- a/firmware/tunerstudio/rusefi.input +++ b/firmware/tunerstudio/rusefi.input @@ -1638,6 +1638,7 @@ cmd_set_engine_type_default = "w\x00\x31\x00\x00" field = "Saab CDM knock", cdmInputPin field = "comm status light", communicationLedPin field = "running status light", runningLedPin + field = "TLE8888 Chip Select", tle8888_cs dialog = allPins1_2, "", xAxis @@ -1850,8 +1851,10 @@ cmd_set_engine_type_default = "w\x00\x31\x00\x00" field = "Main Relay Pin", mainRelayPin field = "Fuel Pump Pin Mode", fuelPumpPinMode field = "Fuel Pump Pin", fuelPumpPin - field = "Check Engine Pin Mode", malfunctionIndicatorPinMode - field = "Check Engine Pin", malfunctionIndicatorPin + field = "Check Engine Pin Mode", malfunctionIndicatorPinMode + field = "Check Engine Pin", malfunctionIndicatorPin + field = "TLE8888 Chip Select", tle8888_cs + field = "TLE8888 SPI", tle8888spiDevice ; Engine->MIL Settings dialog = malfunction, "Check Engine Settings" diff --git a/java_console/models/src/com/rusefi/config/Fields.java b/java_console/models/src/com/rusefi/config/Fields.java index c14202954c..240bbf3ec1 100644 --- a/java_console/models/src/com/rusefi/config/Fields.java +++ b/java_console/models/src/com/rusefi/config/Fields.java @@ -1,6 +1,6 @@ package com.rusefi.config; -// this file was generated automatically by ConfigDefinition.jar based on rusefi_config.txt Fri Mar 22 22:56:39 EDT 2019 +// this file was generated automatically by ConfigDefinition.jar based on rusefi_config.txt Mon Mar 25 14:42:37 EDT 2019 public class Fields { public static final int LE_COMMAND_LENGTH = 200; public static final int BLOCKING_FACTOR = 400; @@ -1008,7 +1008,8 @@ public class Fields { public static final int stepperDirectionPinMode_offset = 3126; public static final int externalKnockSenseAdc_offset = 3127; public static final int stepperEnablePin_offset = 3128; - public static final int unusedTest55_offset = 3129; + public static final int tle8888_cs_offset = 3129; + public static final int unusedTest55_offset = 3130; public static final int crankingAdvanceBins_offset = 3132; public static final int crankingAdvance_offset = 3148; public static final int servoOutputPins1_offset = 3164; @@ -1058,7 +1059,8 @@ public class Fields { public static final int idleTimingPidDeadZone_offset = 4014; public static final int idlePidFalloffDeltaRpm_offset = 4016; public static final int unusedIdleTimingPid_offset = 4018; - public static final int mainUnusedEnd_offset = 4020; + public static final int tle8888spiDevice_offset = 4020; + public static final int mainUnusedEnd_offset = 4024; public static final int cltCrankingCorrBins_offset = 6480; public static final int cltCrankingCorrBins_offset_hex = 1950; public static final int cltCrankingCorr_offset = 6512; @@ -1886,6 +1888,7 @@ public class Fields { public static final Field STEPPERDIRECTIONPINMODE = Field.create("STEPPERDIRECTIONPINMODE", 3126, FieldType.INT, pin_output_mode_e); public static final Field EXTERNALKNOCKSENSEADC = Field.create("EXTERNALKNOCKSENSEADC", 3127, FieldType.INT, adc_channel_e); public static final Field STEPPERENABLEPIN = Field.create("STEPPERENABLEPIN", 3128, FieldType.INT, brain_pin_e); + public static final Field TLE8888_CS = Field.create("TLE8888_CS", 3129, FieldType.INT, brain_pin_e); public static final Field SERVOOUTPUTPINS1 = Field.create("SERVOOUTPUTPINS1", 3164, FieldType.INT, brain_pin_e); public static final Field SERVOOUTPUTPINS2 = Field.create("SERVOOUTPUTPINS2", 3165, FieldType.INT, brain_pin_e); public static final Field SERVOOUTPUTPINS3 = Field.create("SERVOOUTPUTPINS3", 3166, FieldType.INT, brain_pin_e); @@ -1927,6 +1930,7 @@ public class Fields { public static final Field IDLETIMINGPIDDEADZONE = Field.create("IDLETIMINGPIDDEADZONE", 4014, FieldType.INT); public static final Field IDLEPIDFALLOFFDELTARPM = Field.create("IDLEPIDFALLOFFDELTARPM", 4016, FieldType.INT); public static final Field UNUSEDIDLETIMINGPID = Field.create("UNUSEDIDLETIMINGPID", 4018, FieldType.INT); + public static final Field TLE8888SPIDEVICE = Field.create("TLE8888SPIDEVICE", 4020, FieldType.INT); public static final Field FSIOFORMULAS1 = Field.create("FSIOFORMULAS1", 6672, FieldType.INT); public static final Field FSIOFORMULAS2 = Field.create("FSIOFORMULAS2", 6872, FieldType.INT); public static final Field FSIOFORMULAS3 = Field.create("FSIOFORMULAS3", 7072, FieldType.INT);