From 825195c0865b285b1ef66e333d46b5de2b45f89f Mon Sep 17 00:00:00 2001 From: Jay Robson Date: Tue, 13 Feb 2024 22:33:55 +1100 Subject: [PATCH] added basic file saving --- CMakeLists.txt | 4 +-- src/coolant/condenser.cpp | 9 +++++++ src/coolant/condenser.hpp | 2 ++ src/coolant/condenser_secondary.hpp | 2 +- src/coolant/evaporator.cpp | 11 ++++++++ src/coolant/evaporator.hpp | 2 ++ src/coolant/fluid_holder.cpp | 18 ++++++++++++- src/coolant/fluid_holder.hpp | 6 ++++- src/coolant/fluid_t.hpp | 25 +++++++++++++----- src/coolant/pump.cpp | 34 +++++++++++++++++++++++- src/coolant/pump.hpp | 3 ++- src/coolant/valve.cpp | 16 ++++++++++-- src/coolant/valve.hpp | 2 ++ src/coolant/vapor_pressure.cpp | 11 ++++++++ src/coolant/vapor_pressure.hpp | 4 +++ src/electric/turbine.cpp | 17 +++++++++--- src/electric/turbine.hpp | 6 ++++- src/graphics/camera.cpp | 30 ++++++++++++++++++++++ src/graphics/camera.hpp | 4 +++ src/graphics/input/keyboard.cpp | 3 +++ src/reactor/coolant/vessel.cpp | 30 ++++++++++++---------- src/reactor/coolant/vessel.hpp | 7 +++-- src/reactor/reactor.cpp | 35 +++++++++++++++++++++++++ src/reactor/reactor.hpp | 2 ++ src/reactor/rod.cpp | 21 +++++++++++++++ src/reactor/rod.hpp | 6 ++++- src/system.cpp | 40 +++++++++++++++++++++++++++-- src/system.hpp | 4 +++ src/util/pid.cpp | 16 ++++++++++++ src/util/pid.hpp | 4 +++ 30 files changed, 336 insertions(+), 38 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index a9bfd3a..2de17ea 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,10 +3,10 @@ cmake_minimum_required(VERSION 3.25) project(FastNuclearSim VERSION 1.0) set(CMAKE_CXX_STANDARD 26) -set(CMAKE_CXX_FLAGS "-g -I/usr/include/freetype2") +set(CMAKE_CXX_FLAGS "-g -O3 -I/usr/include/freetype2") file(GLOB_RECURSE SOURCES src/*.cpp) add_executable(FastNuclearSim ${SOURCES}) -target_link_libraries(FastNuclearSim PUBLIC stdc++ m GLEW glfw GL freetype assimp) +target_link_libraries(FastNuclearSim PUBLIC stdc++ m GLEW glfw GL freetype assimp jsoncpp) diff --git a/src/coolant/condenser.cpp b/src/coolant/condenser.cpp index 2ca882e..06b08f0 100644 --- a/src/coolant/condenser.cpp +++ b/src/coolant/condenser.cpp @@ -24,4 +24,13 @@ void condenser::update(double secs) update_base(secs); } +condenser::operator Json::Value() const +{ + Json::Value node(fluid_holder::operator::Json::Value()); + + node["height"] = height; + node["diameter"] = diameter; + + return node; +} diff --git a/src/coolant/condenser.hpp b/src/coolant/condenser.hpp index 4268ea1..6ab2372 100644 --- a/src/coolant/condenser.hpp +++ b/src/coolant/condenser.hpp @@ -16,6 +16,8 @@ public: condenser(fluid_t type, double height, double diameter, double mass, double level); void update(double dt); + + virtual operator Json::Value() const; }; }; diff --git a/src/coolant/condenser_secondary.hpp b/src/coolant/condenser_secondary.hpp index 6b3e7de..7023517 100644 --- a/src/coolant/condenser_secondary.hpp +++ b/src/coolant/condenser_secondary.hpp @@ -18,7 +18,7 @@ public: condenser_secondary(condenser* primary, evaporator* source, double volume); virtual double add_heat(double m, double t) { return source->add_heat(m, t); } - virtual void add_gas(double steam, double gas, double t) { return source->add_gas(steam, gas, t); } + virtual void add_gas(double steam, double gas, double t, double e) { return source->add_gas(steam, gas, t, e); } virtual double extract_fluid(double amount) { return source->extract_fluid(amount); } virtual double add_fluid(double amount, double heat); diff --git a/src/coolant/evaporator.cpp b/src/coolant/evaporator.cpp index 7bf7f3a..c81aa43 100644 --- a/src/coolant/evaporator.cpp +++ b/src/coolant/evaporator.cpp @@ -45,3 +45,14 @@ void evaporator::update(double dt) update_base(dt); } +evaporator::operator Json::Value() const +{ + Json::Value node(fluid_holder::operator::Json::Value()); + + node["height"] = height; + node["diameter"] = diameter; + node["steam_output"] = steam_output; + + return node; +} + diff --git a/src/coolant/evaporator.hpp b/src/coolant/evaporator.hpp index 226f599..fbe52aa 100644 --- a/src/coolant/evaporator.hpp +++ b/src/coolant/evaporator.hpp @@ -16,6 +16,8 @@ class evaporator : public fluid_holder public: evaporator(fluid_t type, double height, double diameter, double mass, double level); + + virtual operator Json::Value() const; double get_steam_output(); void update(double dt); diff --git a/src/coolant/fluid_holder.cpp b/src/coolant/fluid_holder.cpp index 252c6d9..5be021c 100644 --- a/src/coolant/fluid_holder.cpp +++ b/src/coolant/fluid_holder.cpp @@ -69,7 +69,7 @@ double fluid_holder::extract_fluid(double amount) return amount; } -void fluid_holder::add_gas(double m_s2, double m_a2, double t_2) +void fluid_holder::add_gas(double m_s2, double m_a2, double t_2, double e_2) { double m_2 = m_a2 + m_s2; double m_1 = get_thermal_mass(); @@ -111,6 +111,22 @@ double fluid_holder::get_gas_density() const return v > 0 ? get_gas() / v : 0; } +fluid_holder::operator Json::Value() const +{ + Json::Value node; + + node["level"] = level; + node["steam"] = steam; + node["air"] = air; + node["heat"] = heat; + + node["volume"] = volume; + node["extra_mass"] = extra_mass; + node["fluid"] = fluid; + + return node; +} + void fluid_holder::update_base(double secs) { double mass = get_thermal_mass(); diff --git a/src/coolant/fluid_holder.hpp b/src/coolant/fluid_holder.hpp index b328e2b..94d04bd 100644 --- a/src/coolant/fluid_holder.hpp +++ b/src/coolant/fluid_holder.hpp @@ -1,6 +1,8 @@ #pragma once +#include + #include "fluid_t.hpp" #include "../conversions/temperature.hpp" @@ -28,7 +30,7 @@ public: virtual double extract_fluid(double amount); virtual double add_fluid(double amount, double heat); - virtual void add_gas(double steam, double air, double t); + virtual void add_gas(double steam, double air, double heat, double energy); virtual double get_volume() const { return volume; } // litres virtual double get_level() const { return level; } // litres @@ -43,6 +45,8 @@ public: virtual double get_pressure() const; // pascals virtual double get_gas_density() const; // g/L + virtual operator Json::Value() const; + static double calc_pressure(double heat, double pressure, double mol); static double calc_pressure_mol(double heat, double pressure, double volume); diff --git a/src/coolant/fluid_t.hpp b/src/coolant/fluid_t.hpp index 7619532..d1c5f4a 100644 --- a/src/coolant/fluid_t.hpp +++ b/src/coolant/fluid_t.hpp @@ -1,6 +1,8 @@ #pragma once +#include + #include "vapor_pressure.hpp" namespace sim::coolant @@ -11,17 +13,28 @@ struct fluid_t const double gPl; // g/L const double gPmol; // g/mol const double jPg; // J/g latent heat of vaporisation - const double bubble_speed; // m/s const coolant::vapor_pressure vapor_pressure; - constexpr fluid_t(double gPl, double gPmol, double jPg, double bubble_speed, coolant::vapor_pressure vapor_pressure) : + constexpr fluid_t(double gPl, double gPmol, double jPg, coolant::vapor_pressure vapor_pressure) : gPl(gPl), gPmol(gPmol), jPg(jPg), - vapor_pressure(vapor_pressure), - bubble_speed(bubble_speed) + vapor_pressure(vapor_pressure) { - } + } + + operator Json::Value() const + { + Json::Value node; + + node["gPl"] = gPl; + node["gPmol"] = gPmol; + node["jPg"] = jPg; + + node["vapor_pressure"] = vapor_pressure; + + return node; + } constexpr double g_to_mol(double g) const { return g / gPmol; } constexpr double mol_to_g(double mol) const { return mol * gPmol; } @@ -31,7 +44,7 @@ struct fluid_t constexpr double l_to_mol(double l) const { return g_to_mol(l_to_g(l)); } }; -constexpr const fluid_t WATER = fluid_t(1000, 18, 2257, 4.1816, {8.07131 + 2.124903, 1730.63, 233.426 - 273.15}); +constexpr const fluid_t WATER = fluid_t(1000, 18, 2257, {8.07131 + 2.124903, 1730.63, 233.426 - 273.15}); } diff --git a/src/coolant/pump.cpp b/src/coolant/pump.cpp index ba4df1e..7a67b21 100644 --- a/src/coolant/pump.cpp +++ b/src/coolant/pump.cpp @@ -92,7 +92,7 @@ void pump::update(double dt) double src_heat = src->get_heat(); double p_diff_1 = dst->get_pressure() - src->get_pressure(); - double max_volume = ignore_dst_level ? src->get_level() : std::min(src->get_level(), dst->get_volume() - dst->get_level()); + double max_volume = std::min(src->get_level(), dst->get_volume() - dst->get_level()); double src_volume = src->extract_fluid(std::min(get_flow_target() * dt, max_volume)); double dst_volume = dst->add_fluid(src_volume, src_heat); @@ -104,3 +104,35 @@ void pump::update(double dt) flow = dst_volume / dt; } +pump::operator Json::Value() const +{ + Json::Value node; + + node["pid"] = pid; + node["flow"] = flow; + node["velocity"] = velocity; + node["power"] = power; + node["mass"] = mass; + node["radius"] = radius; + node["l_per_rev"] = l_per_rev; + node["friction"] = friction; + node["max_power"] = max_power; + node["target"] = target; + node["powered"] = powered; + + switch(mode) + { + case mode_t::SRC: + node["mode"] = "SRC"; + break; + case mode_t::DST: + node["mode"] = "DST"; + break; + case mode_t::NONE: + node["mode"] = "NONE"; + break; + } + + return node; +} + diff --git a/src/coolant/pump.hpp b/src/coolant/pump.hpp index 3861a46..e117fdc 100644 --- a/src/coolant/pump.hpp +++ b/src/coolant/pump.hpp @@ -36,7 +36,6 @@ public: const double max_power; // W const double target; // L - bool ignore_dst_level = false; bool powered = false; pump(fluid_holder* src, fluid_holder* dst, double mass, double radius, double power, double l_per_rev, double friction, mode_t mode, double target); @@ -46,6 +45,8 @@ public: double get_flow_mass() const; // g/s double get_rpm() const; // rev/min double get_power() const; // W + + operator Json::Value() const; const char* get_state_string(); void update(double dt); diff --git a/src/coolant/valve.cpp b/src/coolant/valve.cpp index 464e96b..40cf58b 100644 --- a/src/coolant/valve.cpp +++ b/src/coolant/valve.cpp @@ -75,9 +75,21 @@ void valve::update(double dt) double heat1 = src->get_heat(); // C double heat2 = dst->get_heat(); - src->add_gas(-mass_s, mass_a, heat2); - dst->add_gas(mass_s, mass_a, heat1); + src->add_gas(-mass_s, mass_a, heat2, 0); + dst->add_gas(mass_s, mass_a, heat1, 0); this->flow = (mass_s + mass_a) / dt; } +valve::operator Json::Value() const +{ + Json::Value node; + + node["max"] = max; + node["speed"] = speed; + node["state"] = state; + node["flow"] = flow; + + return node; +} + diff --git a/src/coolant/valve.hpp b/src/coolant/valve.hpp index 9d1c9f4..fe9c0a7 100644 --- a/src/coolant/valve.hpp +++ b/src/coolant/valve.hpp @@ -25,6 +25,8 @@ public: void add_open_speed(double v); void clear_open_speed(); + operator Json::Value() const; + constexpr double get_state() const { return state; } constexpr double get_flow() const { return flow; } }; diff --git a/src/coolant/vapor_pressure.cpp b/src/coolant/vapor_pressure.cpp index 4994ef0..67862f2 100644 --- a/src/coolant/vapor_pressure.cpp +++ b/src/coolant/vapor_pressure.cpp @@ -15,3 +15,14 @@ double vapor_pressure::calc_t(double p) const return B / (A - std::log(p) / std::log(10)) - C; } +vapor_pressure::operator Json::Value() const +{ + Json::Value node; + + node["A"] = A; + node["B"] = B; + node["C"] = C; + + return node; +} + diff --git a/src/coolant/vapor_pressure.hpp b/src/coolant/vapor_pressure.hpp index 46ceb86..0131f8f 100644 --- a/src/coolant/vapor_pressure.hpp +++ b/src/coolant/vapor_pressure.hpp @@ -1,6 +1,8 @@ #pragma once +#include + namespace sim::coolant { @@ -10,6 +12,8 @@ struct vapor_pressure constexpr vapor_pressure(double A, double B, double C) : A(A), B(B), C(C) { } + operator Json::Value() const; + double calc_p(double t) const; double calc_t(double p) const; }; diff --git a/src/electric/turbine.cpp b/src/electric/turbine.cpp index 4b1c435..7a15543 100644 --- a/src/electric/turbine.cpp +++ b/src/electric/turbine.cpp @@ -21,13 +21,24 @@ turbine::turbine(coolant::fluid_t type, coolant::condenser* condenser, double le } -void turbine::update(double secs) +void turbine::update(double dt) { } -void turbine::add_gas(double steam, double air, double t) +void turbine::add_gas(double steam, double air, double t, double e) { - condenser->add_gas(steam, air, t); + condenser->add_gas(steam, air, t, e); +} + +turbine::operator Json::Value() const +{ + Json::Value node(fluid_holder::operator::Json::Value()); + + node["length"] = length; + node["diameter"] = diameter; + node["velocity"] = velocity; + + return node; } diff --git a/src/electric/turbine.hpp b/src/electric/turbine.hpp index b6ced78..0edc48d 100644 --- a/src/electric/turbine.hpp +++ b/src/electric/turbine.hpp @@ -14,6 +14,8 @@ class turbine : public sim::coolant::fluid_holder const double length; const double diameter; + double velocity = 0; // m/s + public: turbine(coolant::fluid_t type, coolant::condenser* condenser, double length, double diameter, double mass); @@ -23,7 +25,7 @@ public: virtual double add_heat(double m, double t) { return condenser->add_heat(m, t); } virtual double extract_fluid(double amount) { return condenser->extract_fluid(amount); } virtual double add_fluid(double amount, double heat) { return condenser->add_fluid(amount, heat); } - virtual void add_gas(double steam, double gas, double t); + virtual void add_gas(double steam, double gas, double t, double e); virtual double get_volume() const { return condenser->get_volume(); } virtual double get_level() const { return condenser->get_level(); } @@ -37,6 +39,8 @@ public: virtual double get_thermal_mass() const { return condenser->get_thermal_mass(); } // grams virtual double get_pressure() const { return condenser->get_pressure(); } // pascals virtual double get_gas_density() const { return condenser->get_gas_density(); } // g/L + + virtual operator Json::Value() const; }; }; diff --git a/src/graphics/camera.cpp b/src/graphics/camera.cpp index 750d637..104c2c4 100644 --- a/src/graphics/camera.cpp +++ b/src/graphics/camera.cpp @@ -20,6 +20,36 @@ static glm::vec<3, double> pos(0, 0, 2); static glm::vec<3, double> velocity(0); static glm::mat4 camera_mat; +Json::Value camera::serialize() +{ + Json::Value node; + + node["on_ground"] = on_ground; + node["yaw"] = yaw; + node["pitch"] = pitch; + node["pos"]["x"] = pos[0]; + node["pos"]["y"] = pos[1]; + node["pos"]["z"] = pos[2]; + node["velocity"]["x"] = velocity[0]; + node["velocity"]["y"] = velocity[1]; + node["velocity"]["z"] = velocity[2]; + + return node; +} + +void camera::load(const Json::Value& node) +{ + on_ground = node["on_ground"].asBool(); + yaw = node["yaw"].asDouble(); + pitch = node["pitch"].asDouble(); + pos[0] = node["pos"]["x"].asDouble(); + pos[1] = node["pos"]["y"].asDouble(); + pos[2] = node["pos"]["z"].asDouble(); + velocity[0] = node["velocity"]["x"].asDouble(); + velocity[1] = node["velocity"]["y"].asDouble(); + velocity[2] = node["velocity"]["z"].asDouble(); +} + void camera::rotate(double y, double p) { yaw += y * 0.05; diff --git a/src/graphics/camera.hpp b/src/graphics/camera.hpp index fb9a1a4..c2b1088 100644 --- a/src/graphics/camera.hpp +++ b/src/graphics/camera.hpp @@ -2,6 +2,7 @@ #pragma once #include +#include #include "../system.hpp" @@ -12,6 +13,9 @@ glm::mat4 get_matrix(); glm::vec<3, double> get_normal(); glm::vec<3, double> get_pos(); +Json::Value serialize(); +void load(const Json::Value& node); + void rotate(double pitch, double yaw); void move(double x, double y, double z); void update(double dt); diff --git a/src/graphics/input/keyboard.cpp b/src/graphics/input/keyboard.cpp index 98a9ca8..00cf233 100644 --- a/src/graphics/input/keyboard.cpp +++ b/src/graphics/input/keyboard.cpp @@ -46,6 +46,9 @@ static void cb_keypress(GLFWwindow* win, int key, int sc, int action, int mods) case GLFW_KEY_6: sim::system::active.speed = 43200; // 12 h/s break; + case GLFW_KEY_O: + sim::system::active.save(); + break; } } diff --git a/src/reactor/coolant/vessel.cpp b/src/reactor/coolant/vessel.cpp index c1c83e8..7059d84 100644 --- a/src/reactor/coolant/vessel.cpp +++ b/src/reactor/coolant/vessel.cpp @@ -16,9 +16,9 @@ constexpr static double calc_cylinder(double h, double d) return M_PI * r * r * h * 1000; } -vessel::vessel(sim::coolant::fluid_t fluid, double height, double diameter, double mass, double level) : +vessel::vessel(sim::coolant::fluid_t fluid, double height, double diameter, double mass, double level, double bubble_hl) : sim::coolant::fluid_holder(fluid, calc_cylinder(height, diameter), mass), - height(height), diameter(diameter) + height(height), diameter(diameter), bubble_hl(bubble_hl) { this->level = level; } @@ -48,11 +48,6 @@ double vessel::get_void_ratio() const return s / m; } -double vessel::get_bubble_hl() const -{ - return (level / volume) * height * 0.5 / fluid.bubble_speed; -} - void vessel::update(double secs) { double steam_last = steam; @@ -60,19 +55,26 @@ void vessel::update(double secs) update_base(secs); double diff = steam - steam_last; - double hl = get_bubble_hl(); steam_last = steam; steam_suspended += diff; + steam_suspended *= reactor::fuel::half_life::get(secs, bubble_hl); - if(hl > 0) - { - steam_suspended *= reactor::fuel::half_life::get(secs, get_bubble_hl()); - } - - if(hl <= 0 || steam_suspended < 0) + if(steam_suspended < 0) { steam_suspended = 0; } } +vessel::operator Json::Value() const +{ + Json::Value node(fluid_holder::operator::Json::Value()); + + node["height"] = height; + node["diameter"] = diameter; + node["bubble_hl"] = bubble_hl; + node["steam_suspended"] = steam_suspended; + + return node; +} + diff --git a/src/reactor/coolant/vessel.hpp b/src/reactor/coolant/vessel.hpp index 0eafa1a..4c851a4 100644 --- a/src/reactor/coolant/vessel.hpp +++ b/src/reactor/coolant/vessel.hpp @@ -14,15 +14,18 @@ public: const double height; // meters const double diameter; // meters + const double bubble_hl; // seconds + double steam_suspended = 0; // grams - vessel(sim::coolant::fluid_t fluid, double height, double diameter, double mass, double level); + vessel(sim::coolant::fluid_t fluid, double height, double diameter, double mass, double level, double bubble_hl); double get_steam_suspended() const; // grams double get_void_ratio() const; - double get_bubble_hl() const; void update(double secs); + + virtual operator Json::Value() const; friend std::ostream& operator<<(std::ostream& o, const vessel& v) { diff --git a/src/reactor/reactor.cpp b/src/reactor/reactor.cpp index db5448c..5fbbb5b 100644 --- a/src/reactor/reactor.cpp +++ b/src/reactor/reactor.cpp @@ -239,3 +239,38 @@ void reactor::get_stats(rod::val_t type, double& min, double& max) } } +reactor::operator Json::Value() const +{ + Json::Value node; + + node["cell_width"] = cell_width; + node["cell_height"] = cell_height; + node["width"] = width; + node["height"] = height; + node["size"] = size; + node["rod_speed"] = rod_speed; + node["cursor"] = cursor; + + Json::Value j_rods; + + for(int i = 0; i < size; i++) + { + int x = i % width; + int y = i / width; + + if(rods[i]->get_id() == 0) + { + continue; + } + + Json::Value j_rod(*rods[i]); + j_rod["pos"]["x"] = x; + j_rod["pos"]["y"] = y; + j_rods.append(std::move(j_rod)); + } + + node["rods"] = std::move(j_rods); + + return node; +} + diff --git a/src/reactor/reactor.hpp b/src/reactor/reactor.hpp index f3d80e6..6d14d2e 100644 --- a/src/reactor/reactor.hpp +++ b/src/reactor/reactor.hpp @@ -39,6 +39,8 @@ struct reactor double get_total(rod::val_t type); int move_cursor(int d); void toggle_selected(); + + operator Json::Value() const; private: diff --git a/src/reactor/rod.cpp b/src/reactor/rod.cpp index cc30173..a7e2b0e 100644 --- a/src/reactor/rod.cpp +++ b/src/reactor/rod.cpp @@ -82,3 +82,24 @@ void rod::update_rod(double secs) } } +rod::operator Json::Value() const +{ + Json::Value node; + Json::Value j_vals; + + for(int i = 0; i < VAL_N; i++) + { + Json::Value j_val; + + j_val.append(vals[i]); + j_val.append(vals_n[i]); + j_vals.append(std::move(j_val)); + } + + node["selected"] = selected; + node["vals"] = std::move(j_vals); + node["id"] = get_id(); + + return node; +} + diff --git a/src/reactor/rod.hpp b/src/reactor/rod.hpp index 32e27fe..3da06cb 100644 --- a/src/reactor/rod.hpp +++ b/src/reactor/rod.hpp @@ -1,6 +1,8 @@ #pragma once +#include + #include #include #include @@ -14,7 +16,7 @@ public: bool selected = false; void* reactor = nullptr; - static const int VAL_N = 4; + static const int VAL_N = 3; enum val_t { @@ -60,6 +62,8 @@ public: return o; } + operator Json::Value() const; + protected: double vals[VAL_N] = {0}; diff --git a/src/system.cpp b/src/system.cpp index e963766..9aba2e2 100644 --- a/src/system.cpp +++ b/src/system.cpp @@ -1,11 +1,14 @@ #include "system.hpp" +#include + #include "reactor/builder.hpp" #include "reactor/control/boron_rod.hpp" #include "reactor/fuel/fuel_rod.hpp" #include "reactor/coolant/pipe.hpp" #include "reactor/coolant/heater.hpp" +#include "graphics/camera.hpp" using namespace sim; @@ -35,8 +38,8 @@ system::system() " C C C C " }; - vessel = std::make_unique(sim::coolant::WATER, 8, 10, 6e6, 5e5); - reactor = std::make_unique(sim::reactor::builder(19, 19, 1.0 / 4.0, 4, reactor::fuel::fuel_rod(0.5), vessel.get(), layout)); + vessel = std::make_unique(sim::coolant::WATER, 8, 10, 6e6, 5e5, 10); + reactor = std::make_unique(sim::reactor::builder(19, 19, 1.0 / 4.0, 4, reactor::fuel::fuel_rod(0.2), vessel.get(), layout)); condenser = std::make_unique(sim::coolant::WATER, 6, 4, 3e6, 30000); turbine = std::make_unique(sim::coolant::WATER, condenser.get(), 6, 3, 2e6); @@ -89,3 +92,36 @@ void system::update(double dt) condenser_secondary->update(dt); } +system::operator Json::Value() const +{ + Json::Value node; + + node["vessel"] = *vessel; + node["turbine"] = *turbine; + node["condenser"] = *condenser; + node["evaporator"] = *evaporator; + node["primary_pump"] = *primary_pump; + node["secondary_pump"] = *secondary_pump; + node["freight_pump"] = *freight_pump; + node["turbine_inlet_valve"] = *turbine_inlet_valve; + node["turbine_bypass_valve"] = *turbine_bypass_valve; + node["camera"] = graphics::camera::serialize(); + node["reactor"] = *reactor; + + return node; +} + +void system::save() +{ + Json::Value root(*this); + + Json::StreamWriterBuilder builder; + builder["commentStyle"] = "None"; + builder["indentation"] = ""; + + std::unique_ptr writer(builder.newStreamWriter()); + std::ofstream savefile("savefile.json"); + writer->write(root, &savefile); + savefile.close(); +} + diff --git a/src/system.hpp b/src/system.hpp index e18c4e8..94be2e1 100644 --- a/src/system.hpp +++ b/src/system.hpp @@ -2,6 +2,7 @@ #pragma once #include +#include #include "reactor/coolant/vessel.hpp" #include "reactor/reactor.hpp" @@ -45,6 +46,9 @@ struct system system(const system& o) = delete; void update(double dt); + void save(); + + operator Json::Value() const; }; }; diff --git a/src/util/pid.cpp b/src/util/pid.cpp index 1e50328..5cb6a4d 100644 --- a/src/util/pid.cpp +++ b/src/util/pid.cpp @@ -28,6 +28,22 @@ using namespace std; using namespace sim::util; +PID::operator Json::Value() const +{ + Json::Value node; + + node["max"] = _max; + node["min"] = _min; + node["Kp"] = _Kp; + node["Ki"] = _Ki; + node["Kd"] = _Kd; + node["pre_error"] = _pre_error; + node["integral"] = _integral; + + return node; +} + + /** * Implementation */ diff --git a/src/util/pid.hpp b/src/util/pid.hpp index c85ad20..d7a405e 100644 --- a/src/util/pid.hpp +++ b/src/util/pid.hpp @@ -22,6 +22,8 @@ #pragma once +#include + namespace sim::util { @@ -41,6 +43,8 @@ class PID // sp - current setpoint // pv - current process value double calculate( double dt, double sp, double pv ); + + operator Json::Value() const; private: double _max;