most functionality to splashdwon, find neutral and start mission. short timeouts still in code for testing, will adjust to go directly to sit_idle after splashdown
Dependencies: mbed MODSERIAL FATFileSystem
Diff: ConfigFileIO/ConfigFileIO.cpp
- Revision:
- 57:ec69651c8c21
- Child:
- 73:f6f378311c8d
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ConfigFileIO/ConfigFileIO.cpp Thu Jun 14 16:10:25 2018 +0000 @@ -0,0 +1,457 @@ +#include "ConfigFileIO.hpp" +#include "StaticDefs.hpp" + +//configuration file io, both to read, set, and save + +ConfigFileIO::ConfigFileIO() { +} + +void ConfigFileIO::saveBattData(float p_gain, float i_gain, float d_gain) { + ConfigFile write_Batt_txt; //write to the config file + + char PGain_buffer[128]; + sprintf(PGain_buffer,"# configuration file for battery mover parameters\n\n#Gains\nPGain"); + + char string_pgain[128]; + sprintf(string_pgain, "%f", p_gain); + write_Batt_txt.setValue(PGain_buffer, string_pgain); + + char string_igain[128]; + sprintf(string_igain, "%f", i_gain); + write_Batt_txt.setValue("IGain", string_igain); + + char string_dgain[128]; + sprintf(string_dgain, "%f", d_gain); + write_Batt_txt.setValue("DGain", string_dgain); + + write_Batt_txt.setValue("\n#string pot parameters\nzeroCounts", "610"); + write_Batt_txt.setValue("PistonTravelLimit", "73.0"); + write_Batt_txt.setValue("slope", "0.12176"); + write_Batt_txt.setValue("filterWn", "6.0"); + write_Batt_txt.setValue("deadband", "0.5"); + + //SAVE THE DATA! + pc().printf("Saving BATTERY MOVER PID data!"); + + if (!write_Batt_txt.write("/local/batt.txt")) { + pc().printf("\n\rERROR: (SAVE)Failure to write batt.txt file."); + } + else { + pc().printf("\n\rFile batt.txt successful written.\n\r"); + } +} + +void ConfigFileIO::savePitchData(float p_gain, float i_gain, float d_gain, int batt_zeroOffset) { + ConfigFile write_pitch_txt; //write to the config file + + char PGain_buffer[128]; + sprintf(PGain_buffer,"# pitch outer loop parameters\n\n#Gains\nPGain"); + + char string_pgain[128]; + sprintf(string_pgain, "%f", p_gain); + write_pitch_txt.setValue(PGain_buffer, string_pgain); + + char string_igain[128]; + sprintf(string_igain, "%f", i_gain); + write_pitch_txt.setValue("IGain", string_igain); + + char string_dgain[128]; + sprintf(string_dgain, "%f", d_gain); + write_pitch_txt.setValue("DGain", string_dgain); + + write_pitch_txt.setValue("\n#Pitch sensor filter parameters\nfilterWn", "6.0"); + write_pitch_txt.setValue("deadband", "0.5"); + + char string_zeroOffset[128]; + sprintf(string_zeroOffset, "%d", batt_zeroOffset); + //bce setting was 41 mm during LASR experiments + write_pitch_txt.setValue("\n#Offset for neutral (default: 41)\nzeroOffset", string_zeroOffset); + + //SAVE THE DATA! + pc().printf("Saving Buoyancy Engine Neutral Buoyancy Positions!"); + + if (!write_pitch_txt.write("/local/pitch.txt")) { + pc().printf("\n\rERROR: (SAVE)Failure to write depth.txt file."); + } + else { + pc().printf("\n\rFile pitch.txt successful written.\n\r"); + } +} + +void ConfigFileIO::saveBCEData(float p_gain, float i_gain, float d_gain) { + ConfigFile write_BCE_txt; //write to the config file + + char PGain_buffer[128]; + sprintf(PGain_buffer,"# configuration file for BCE parameters\n\n#Gains\nPGain"); + + char string_pgain[128]; + sprintf(string_pgain, "%f", p_gain); + write_BCE_txt.setValue(PGain_buffer, string_pgain); + + char string_igain[128]; + sprintf(string_igain, "%f", i_gain); + write_BCE_txt.setValue("IGain", string_igain); + + char string_dgain[128]; + sprintf(string_dgain, "%f", d_gain); + write_BCE_txt.setValue("DGain", string_dgain); + + write_BCE_txt.setValue("\n#string pot parameters\nzeroCounts", "253"); + write_BCE_txt.setValue("PistonTravelLimit", "320.0"); + write_BCE_txt.setValue("slope", "0.12176"); + write_BCE_txt.setValue("filterWn", "6.0"); + write_BCE_txt.setValue("deadband", "0.5"); + + //SAVE THE DATA! + pc().printf("Saving BCE PID data!"); + + if (!write_BCE_txt.write("/local/bce.txt")) { + pc().printf("\n\rERROR: (SAVE)Failure to write bce.txt file."); + } + else { + pc().printf("\n\rFile bce.txt successful written.\n\r"); + } +} + +void ConfigFileIO::saveDepthData(float p_gain, float i_gain, float d_gain, int bce_zeroOffset) { + ConfigFile write_depth_txt; //write to the config file + + char PGain_buffer[128]; + sprintf(PGain_buffer,"# depth outer loop parameters\n\n#Gains\nPGain"); + + char string_pgain[128]; + sprintf(string_pgain, "%f", p_gain); + write_depth_txt.setValue(PGain_buffer, string_pgain); + + char string_igain[128]; + sprintf(string_igain, "%f", i_gain); + write_depth_txt.setValue("IGain", string_igain); + + char string_dgain[128]; + sprintf(string_dgain, "%f", d_gain); + write_depth_txt.setValue("DGain", string_dgain); + + write_depth_txt.setValue("\n#Depth sensor filter parameters\nfilterWn", "6.0"); + write_depth_txt.setValue("deadband", "0.5"); + + char string_zeroOffset[128]; + sprintf(string_zeroOffset, "%d", bce_zeroOffset); + //bce setting was 240 mm during LASR experiments + write_depth_txt.setValue("\n#Offset for neutral (default: 240)\nzeroOffset", string_zeroOffset); + + //SAVE THE DATA! + pc().printf("Saving Buoyancy Engine Neutral Buoyancy Positions!"); + + if (!write_depth_txt.write("/local/depth.txt")) { + pc().printf("\n\rERROR: (SAVE)Failure to write depth.txt file."); + } + else { + pc().printf("\n\rFile depth.txt successful written.\n\r"); + } +} + +//write rudder (servo driver) file rudder.txt +void ConfigFileIO::saveRudderData(float setMinDeg, float setMaxDeg, float setCenterPWM, float setMinPWM, float setMaxPWM) { + ConfigFile rudder_txt; + + char header[128]; + sprintf(header,"# rudder (servo) inner loop (heading outer loop uses this)"); + + char string_min_deg[128]; + sprintf(string_min_deg, "%f", setMinDeg); + rudder_txt.setValue("setMinDeg", string_min_deg); + + char string_max_deg[128]; + sprintf(string_max_deg, "%f", setMaxDeg); + rudder_txt.setValue("setMaxDeg", string_max_deg); + + char string_ctr_pwm[128]; + sprintf(string_ctr_pwm, "%f", setCenterPWM); + rudder_txt.setValue("setCenterPWM", string_ctr_pwm); + + char string_min_pwm[128]; + sprintf(string_min_pwm, "%f", setMinPWM); + rudder_txt.setValue("setMinPWM", string_min_pwm); + + char string_max_pwm[128]; + sprintf(string_max_pwm, "%f", setMaxPWM); + rudder_txt.setValue("setMaxPWM", string_max_pwm); + + //SAVE THE DATA! + pc().printf("Saving RUDDER DATA!"); + + if (!rudder_txt.write("/local/rudder.txt")) { + pc().printf("\n\rERROR: (SAVE)Failure to write rudder.txt file."); + } + else { + pc().printf("\n\rFile rudder.txt successful written.\n\r"); + } +} + +int ConfigFileIO::load_BCE_config() { + ConfigFile cfg; + int count = 0; + if (!cfg.read("/local/bce.txt")) { + error("File Read Error"); + } + char value[BUFSIZ]; + + if (cfg.getValue("PGain", &value[0] , sizeof(value))) { + bce().setControllerP(atof(value)); + count++; + } + if (cfg.getValue("IGain", &value[0] ,sizeof(value))) { + bce().setControllerI(atof(value)); + count++; + } + if (cfg.getValue("DGain", &value[0] , sizeof(value))) { + bce().setControllerD(atof(value)); + count++; + } + if (cfg.getValue("zeroCounts", &value[0],sizeof(value))) { + bce().setZeroCounts(atoi(value)); + count++; + } + if (cfg.getValue("PistonTravelLimit", &value[0], sizeof(value))) { + bce().setTravelLimit(atof(value)); + count++; + } + if (cfg.getValue("slope", &value[0], sizeof(value))) { + bce().setPotSlope(atof(value)); + count++; + } + if (cfg.getValue("filterWn", &value[0], sizeof(value))) { + bce().setFilterFrequency(atof(value)); + count++; + } + if (cfg.getValue("deadband", &value[0], sizeof(value))) { + bce().setDeadband(atof(value)); + count++; + } + + return count; +} + +//write to heading.txt +void ConfigFileIO::saveHeadingData(float heading_p_gain, float heading_i_gain, float heading_d_gain, float heading_offset) { + ConfigFile heading_txt; + + char PGain_buffer[128]; + sprintf(PGain_buffer,"# HEADING (rudder outer loop) parameters\n\n#Gains\nPGain"); + + //convert input numbers into text and save them to text file + char string_pgain[128]; + sprintf(string_pgain, "%f", heading_p_gain); + heading_txt.setValue(PGain_buffer, string_pgain); + + char string_igain[128]; + sprintf(string_igain, "%f", heading_i_gain); + heading_txt.setValue("IGain", string_igain); + + char string_dgain[128]; + sprintf(string_dgain, "%f", heading_d_gain); + heading_txt.setValue("DGain", string_dgain); + + heading_txt.setValue("\n# HEADING sensor filter parameters\nfilterWn", "6.0"); + heading_txt.setValue("deadband", "0.5"); + + char string_zeroOffset[128]; + sprintf(string_zeroOffset, "%f", heading_offset); + heading_txt.setValue("\n#HEADING offset for dive (no default!)\nzeroOffset", string_zeroOffset); + + //SAVE THE DATA! + pc().printf("(ConfigFileIO) Saving HEADING parameters!"); + + if (!heading_txt.write("/local/heading.txt")) { + pc().printf("\n\rERROR: (SAVE) Failure to write heading.txt file."); + } + else { + pc().printf("\n\rFile heading.txt successful written.\n\r"); + } +} + +int ConfigFileIO::load_BATT_config() { + ConfigFile cfg; + int count = 0; + if (!cfg.read("/local/batt.txt")) { + error("BATT File Read Error"); + } + char value[BUFSIZ]; + + + if (cfg.getValue("PGain", &value[0] , sizeof(value))) { + batt().setControllerP(atof(value)); + count++; + } + if (cfg.getValue("IGain", &value[0] ,sizeof(value))) { + batt().setControllerI(atof(value)); + count++; + } + if (cfg.getValue("DGain", &value[0] , sizeof(value))) { + batt().setControllerD(atof(value)); + count++; + } + if (cfg.getValue("zeroCounts", &value[0],sizeof(value))) { + batt().setZeroCounts(atoi(value)); + count++; + } + if (cfg.getValue("PistonTravelLimit", &value[0], sizeof(value))) { + batt().setTravelLimit(atof(value)); + count++; + } + if (cfg.getValue("slope", &value[0], sizeof(value))) { + batt().setPotSlope(atof(value)); + count++; + } + if (cfg.getValue("filterWn", &value[0], sizeof(value))) { + batt().setFilterFrequency(atof(value)); + count++; + } + if (cfg.getValue("deadband", &value[0], sizeof(value))) { + batt().setDeadband(atof(value)); + count++; + } + + return count; +} + +int ConfigFileIO::load_DEPTH_config() { + ConfigFile cfg; + int count = 0; + if (!cfg.read("/local/depth.txt")) { + error("DEPTH File Read Error"); + } + char value[BUFSIZ]; + + if (cfg.getValue("PGain", &value[0] , sizeof(value))) { + depthLoop().setControllerP(atof(value)); + count++; + } + if (cfg.getValue("IGain", &value[0] ,sizeof(value))) { + depthLoop().setControllerI(atof(value)); + count++; + } + if (cfg.getValue("DGain", &value[0] , sizeof(value))) { + depthLoop().setControllerD(atof(value)); + count++; + } + if (cfg.getValue("filterWn", &value[0], sizeof(value))) { + depthLoop().setFilterFrequency(atof(value)); + count++; + } + if (cfg.getValue("deadband", &value[0], sizeof(value))) { + depthLoop().setDeadband(atof(value)); + count++; + } + if (cfg.getValue("zeroOffset", &value[0], sizeof(value))) { + depthLoop().setOutputOffset(atof(value)); + count++; + } + return count; +} + +int ConfigFileIO::load_PITCH_config() { + ConfigFile cfg; + int count = 0; + if (!cfg.read("/local/pitch.txt")){ + error("PITCH File Read Error"); + } + char value[BUFSIZ]; + + if (cfg.getValue("PGain", &value[0] , sizeof(value))) { + pitchLoop().setControllerP(atof(value)); + count++; + } + if (cfg.getValue("IGain", &value[0] ,sizeof(value))) { + pitchLoop().setControllerI(atof(value)); + count++; + } + if (cfg.getValue("DGain", &value[0] , sizeof(value))) { + pitchLoop().setControllerD(atof(value)); + count++; + } + if (cfg.getValue("filterWn", &value[0], sizeof(value))) { + pitchLoop().setFilterFrequency(atof(value)); + count++; + } + if (cfg.getValue("deadband", &value[0], sizeof(value))) { + pitchLoop().setDeadband(atof(value)); + count++; + } + + if (cfg.getValue("zeroOffset", &value[0], sizeof(value))) { + pitchLoop().setOutputOffset(atof(value)); + count++; + } + return count; +} + +int ConfigFileIO::load_HEADING_config() { + ConfigFile cfg; + int count = 0; + if (!cfg.read("/local/heading.txt")){ + error("HEADING File Read Error"); + } + char value[BUFSIZ]; + + if (cfg.getValue("PGain", &value[0] , sizeof(value))) { + headingLoop().setControllerP(atof(value)); + count++; + } + if (cfg.getValue("IGain", &value[0] ,sizeof(value))) { + headingLoop().setControllerI(atof(value)); + count++; + } + if (cfg.getValue("DGain", &value[0] , sizeof(value))) { + headingLoop().setControllerD(atof(value)); + count++; + } + if (cfg.getValue("filterWn", &value[0], sizeof(value))) { + headingLoop().setFilterFrequency(atof(value)); + count++; + } + if (cfg.getValue("deadband", &value[0], sizeof(value))) { + headingLoop().setDeadband(atof(value)); + count++; + } + + if (cfg.getValue("zeroOffset", &value[0], sizeof(value))) { + headingLoop().setOutputOffset(atof(value)); + count++; + } + return count; +} + +int ConfigFileIO::load_RUDDER_config() { + ConfigFile cfg; + int count = 0; + if (!cfg.read("/local/rudder.txt")){ + error("RUDDER File Read Error"); + } + char value[BUFSIZ]; + + //float values below + if (cfg.getValue("setMinDeg", &value[0] , sizeof(value))) { + rudder().setMinDeg(atof(value)); + count++; + } + if (cfg.getValue("setMaxDeg", &value[0] ,sizeof(value))) { + rudder().setMaxDeg(atof(value)); + count++; + } + + //integer values below + if (cfg.getValue("setCenterPWM", &value[0] , sizeof(value))) { + rudder().setCenterPWM(atof(value)); + count++; + } + if (cfg.getValue("setMinPWM", &value[0], sizeof(value))) { + rudder().setMinPWM(atof(value)); + count++; + } + if (cfg.getValue("setMaxPWM", &value[0], sizeof(value))) { + rudder().setMaxPWM(atof(value)); + count++; + } + return count; +} \ No newline at end of file