Skip to content

Commit b42f24e

Browse files
ChetSimpsonejaquay
authored andcommitted
separate configuration management from multipak_cartridge
add `multipak_configuration` class update configuration dialog to get/set settings using the multipak configuration update multipak cartridge to get settings from the multipak configuration update multipak configuration dialog to save the selected slot and cartridge paths to the configuration. remove `save_configuration` from `multipak_cartridge` remove `load_Configuration` from `multipak_cartridge` and move functionality into `start`
1 parent 4e79fb5 commit b42f24e

10 files changed

+158
-71
lines changed

mpi/configuration_dialog.cpp

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
#include <vcc/common/DialogOps.h>
2222
#include <vcc/core/utils/critical_section.h>
2323
#include <vcc/core/utils/filesystem.h>
24-
#include <vcc/core/utils/configuration_serializer.h>
2524

2625

2726
namespace
@@ -45,8 +44,12 @@ namespace
4544

4645
}
4746

48-
configuration_dialog::configuration_dialog(multipak_cartridge& mpi)
49-
: mpi_(mpi)
47+
configuration_dialog::configuration_dialog(
48+
multipak_configuration& configuration,
49+
multipak_cartridge& mpi)
50+
:
51+
configuration_(configuration),
52+
mpi_(mpi)
5053
{}
5154

5255

@@ -73,14 +76,9 @@ void configuration_dialog::close()
7376

7477
void configuration_dialog::select_new_cartridge(size_t slot)
7578
{
76-
::vcc::core::configuration_serializer serializer(gConfigurationFilename);
77-
78-
// Get default paths for modules.
79-
const auto gLastAccessedPath(serializer.read("DefaultPaths", "MPIPath"));
80-
8179
FileDialog dlg;
8280
dlg.setTitle("Load Program Pak");
83-
dlg.setInitialDir(gLastAccessedPath.c_str());
81+
dlg.setInitialDir(configuration_.last_accessed_module_path().c_str());
8482
dlg.setFilter(
8583
"All Pak Types (*.dll; *.rom; *.ccc; *.pak)\0*.dll;*.ccc;*.rom;*.pak\0"
8684
"Hardware Pak (*.dll)\0*.dll\0"
@@ -93,10 +91,8 @@ void configuration_dialog::select_new_cartridge(size_t slot)
9391

9492
if (mpi_.mount_cartridge(slot, dlg.path()) == cartridge_loader_status::success)
9593
{
96-
serializer.write(
97-
"DefaultPaths",
98-
"MPIPath",
99-
::vcc::core::utils::get_directory_from_path(dlg.path()));
94+
configuration_.slot_cartridge_path(slot, dlg.path());
95+
configuration_.last_accessed_module_path(::vcc::core::utils::get_directory_from_path(dlg.path()));
10096
}
10197

10298
mpi_.build_menu();
@@ -124,6 +120,7 @@ void configuration_dialog::set_selected_slot(size_t slot)
124120

125121
// FIXME: Maube move this to the callsite or when the dialog closes or at least make it optional?
126122
mpi_.switch_to_slot(slot);
123+
configuration_.selected_slot(slot);
127124
}
128125

129126

@@ -163,6 +160,7 @@ void configuration_dialog::eject_or_select_new_cartridge(size_t slot)
163160
if (!mpi_.empty(slot))
164161
{
165162
mpi_.eject_cartridge(slot);
163+
configuration_.slot_cartridge_path(slot, {});
166164
}
167165
else
168166
{
@@ -198,7 +196,6 @@ INT_PTR configuration_dialog::process_message(
198196
switch (message)
199197
{
200198
case WM_CLOSE:
201-
mpi_.save_configuration();
202199
DestroyWindow(hDlg);
203200
dialog_handle_ = nullptr;
204201
parent_handle_ = nullptr;

mpi/configuration_dialog.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,17 @@
1717
////////////////////////////////////////////////////////////////////////////////
1818
#pragma once
1919
#include "multipak_cartridge.h"
20+
#include "multipak_configuration.h"
2021
#include <Windows.h>
2122

2223

2324
class configuration_dialog
2425
{
2526
public:
2627

27-
explicit configuration_dialog(multipak_cartridge& mpi);
28+
configuration_dialog(
29+
multipak_configuration& configuration,
30+
multipak_cartridge& mpi);
2831

2932
configuration_dialog(const configuration_dialog&) = delete;
3033
configuration_dialog(configuration_dialog&&) = delete;
@@ -56,6 +59,7 @@ class configuration_dialog
5659

5760
private:
5861

62+
multipak_configuration& configuration_;
5963
multipak_cartridge& mpi_;
6064
HWND dialog_handle_ = nullptr;
6165
HWND parent_handle_ = nullptr;

mpi/mpi.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,12 @@
2727
#define EXPORT_PUBLIC_API extern "C" __declspec(dllexport)
2828

2929
HINSTANCE gModuleInstance = nullptr;
30-
std::string gConfigurationFilename;
30+
static std::string gConfigurationFilename;
3131
// FIXME: The host context will be provided by VCC once the full implementation is complete
3232
const std::shared_ptr<host_cartridge_context> gHostContext(std::make_shared<host_cartridge_context>(nullptr, gConfigurationFilename));
33-
multipak_cartridge gMultiPakInterface(gHostContext);
34-
configuration_dialog gConfigurationDialog(gMultiPakInterface);
33+
multipak_configuration gMultiPakConfiguration("MPI");
34+
multipak_cartridge gMultiPakInterface(gMultiPakConfiguration, gHostContext);
35+
configuration_dialog gConfigurationDialog(gMultiPakConfiguration, gMultiPakInterface);
3536

3637

3738
BOOL WINAPI DllMain(HINSTANCE module_instance, DWORD reason, LPVOID /*reserved*/)
@@ -78,6 +79,7 @@ extern "C"
7879
const char* const configuration_path,
7980
const cpak_cartridge_context* const context)
8081
{
82+
gMultiPakConfiguration.configuration_path(configuration_path);
8183
gConfigurationFilename = configuration_path;
8284
gHostContext->add_menu_item_ = context->add_menu_item;
8385
gHostContext->read_memory_byte_ = context->read_memory_byte;

mpi/mpi.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,3 @@ extern const std::shared_ptr<host_cartridge_context> gHostContext;
2525
extern multipak_cartridge gMultiPakInterface;
2626
extern configuration_dialog gConfigurationDialog;
2727
extern std::string gLastAccessedPath;
28-
extern std::string gConfigurationFilename;

mpi/mpi.vcxproj

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@
9797
<ClCompile Include="configuration_dialog.cpp" />
9898
<ClCompile Include="mpi.cpp" />
9999
<ClCompile Include="multipak_cartridge.cpp" />
100+
<ClCompile Include="multipak_configuration.cpp" />
100101
</ItemGroup>
101102
<ItemGroup>
102103
<ClInclude Include="cartridge_slot.h" />
@@ -105,6 +106,7 @@
105106
<ClInclude Include="multipak_cartridge.h" />
106107
<ClInclude Include="configuration_dialog.h" />
107108
<ClInclude Include="multipak_cartridge_context.h" />
109+
<ClInclude Include="multipak_configuration.h" />
108110
<ClInclude Include="resource.h" />
109111
</ItemGroup>
110112
<ItemGroup>

mpi/mpi.vcxproj.filters

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@
1313
<ClCompile Include="multipak_cartridge.cpp">
1414
<Filter>Source Files</Filter>
1515
</ClCompile>
16+
<ClCompile Include="multipak_configuration.cpp">
17+
<Filter>Source Files</Filter>
18+
</ClCompile>
1619
</ItemGroup>
1720
<ItemGroup>
1821
<ClInclude Include="cartridge_slot.h">
@@ -36,6 +39,9 @@
3639
<ClInclude Include="multipak_cartridge_context.h">
3740
<Filter>Header Files</Filter>
3841
</ClInclude>
42+
<ClInclude Include="multipak_configuration.h">
43+
<Filter>Header Files</Filter>
44+
</ClInclude>
3945
</ItemGroup>
4046
<ItemGroup>
4147
<Filter Include="Header Files">

mpi/multipak_cartridge.cpp

Lines changed: 23 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
#include "multipak_cartridge_context.h"
2020
#include "mpi.h"
2121
#include "resource.h"
22-
#include <vcc/core/utils/configuration_serializer.h>
2322
#include <vcc/core/utils/winapi.h>
2423
#include <vcc/core/utils/filesystem.h>
2524

@@ -68,8 +67,12 @@ namespace
6867
}
6968

7069

71-
multipak_cartridge::multipak_cartridge(std::shared_ptr<context_type> context)
72-
: context_(move(context))
70+
multipak_cartridge::multipak_cartridge(
71+
multipak_configuration& configuration,
72+
std::shared_ptr<context_type> context)
73+
:
74+
configuration_(configuration),
75+
context_(move(context))
7376
{ }
7477

7578
multipak_cartridge::name_type multipak_cartridge::name() const
@@ -90,7 +93,23 @@ multipak_cartridge::description_type multipak_cartridge:: description() const
9093

9194
void multipak_cartridge::start()
9295
{
93-
load_configuration();
96+
// Get the startup slot and set Chip select and SCS slots from ini file
97+
switch_slot_ = configuration_.selected_slot();
98+
cached_cts_slot_ = switch_slot_;
99+
cached_scs_slot_ = switch_slot_;
100+
101+
// Mount them
102+
for (auto slot(0u); slot < slots_.size(); slot++)
103+
{
104+
const auto path(vcc::core::utils::find_pak_module_path(configuration_.slot_cartridge_path(slot)));
105+
if (!path.empty())
106+
{
107+
mount_cartridge(slot, path);
108+
}
109+
}
110+
111+
// Build the dynamic menu
112+
build_menu();
94113
}
95114

96115
void multipak_cartridge::reset()
@@ -392,47 +411,6 @@ void multipak_cartridge::build_menu()
392411
}
393412

394413

395-
void multipak_cartridge::load_configuration()
396-
{
397-
const auto& section(name());
398-
::vcc::core::configuration_serializer serializer(context_->configuration_path());
399-
400-
// Get the startup slot and set Chip select and SCS slots from ini file
401-
switch_slot_ = serializer.read(section, "SWPOSITION", 3);
402-
cached_cts_slot_ = switch_slot_;
403-
cached_scs_slot_ = switch_slot_;
404-
405-
// Mount them
406-
for (auto slot(0u); slot < slots_.size(); slot++)
407-
{
408-
const auto path(vcc::core::utils::find_pak_module_path(serializer.read(section, "SLOT" + std::to_string(slot + 1))));
409-
if (!path.empty())
410-
{
411-
mount_cartridge(slot, path);
412-
}
413-
}
414-
415-
// Build the dynamic menu
416-
build_menu();
417-
}
418-
419-
void multipak_cartridge::save_configuration() const
420-
{
421-
vcc::core::utils::section_locker lock(mutex_);
422-
423-
const auto& section(name());
424-
::vcc::core::configuration_serializer serializer(context_->configuration_path());
425-
426-
serializer.write(section, "SWPOSITION", switch_slot_);
427-
for (auto slot(0u); slot < slots_.size(); slot++)
428-
{
429-
serializer.write(
430-
section,
431-
"SLOT" + ::std::to_string(slot + 1),
432-
vcc::core::utils::strip_application_path(slots_[slot].path()));
433-
}
434-
}
435-
436414
void multipak_cartridge::assert_cartridge_line(slot_id_type slot, bool line_state)
437415
{
438416
vcc::core::utils::section_locker lock(mutex_);

mpi/multipak_cartridge.h

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
////////////////////////////////////////////////////////////////////////////////
1818
#pragma once
1919
#include "cartridge_slot.h"
20+
#include "multipak_configuration.h"
2021
#include <vcc/core/cartridges/basic_cartridge.h>
2122
#include <vcc/core/cartridge_loader.h>
2223
#include <vcc/core/utils/critical_section.h>
@@ -41,7 +42,9 @@ class multipak_cartridge : public ::vcc::core::cartridge
4142

4243
public:
4344

44-
explicit multipak_cartridge(std::shared_ptr<context_type> context);
45+
multipak_cartridge(
46+
multipak_configuration& configuration,
47+
std::shared_ptr<context_type> context);
4548
multipak_cartridge(const multipak_cartridge&) = delete;
4649
multipak_cartridge(multipak_cartridge&&) = delete;
4750

@@ -80,23 +83,18 @@ class multipak_cartridge : public ::vcc::core::cartridge
8083
void build_menu();
8184

8285
// Make automatic when mounting, ejecting, selecting slot, etc.
83-
void save_configuration() const;
8486
void assert_cartridge_line(slot_id_type slot, bool line_state);
8587
void append_menu_item(slot_id_type slot, menu_item_type item);
8688

8789

88-
private:
89-
90-
void load_configuration();
91-
92-
9390
private:
9491

9592
static const size_t slot_select_port_id = 0x7f;
9693
static const size_t default_switch_slot_value = 0x03;
9794
static const size_t default_slot_register_value = 0xff;
9895

9996
vcc::core::utils::critical_section mutex_;
97+
multipak_configuration& configuration_;
10098
std::shared_ptr<context_type> context_;
10199
std::array<vcc::modules::mpi::cartridge_slot, NUMSLOTS> slots_;
102100
unsigned char slot_register_ = default_slot_register_value;

mpi/multipak_configuration.cpp

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
#include "multipak_configuration.h"
2+
#include <vcc/core/utils/configuration_serializer.h>
3+
4+
5+
using serializer = ::vcc::core::configuration_serializer;
6+
7+
8+
multipak_configuration::multipak_configuration(string_type section)
9+
: section_(move(section))
10+
{}
11+
12+
13+
void multipak_configuration::configuration_path(path_type path)
14+
{
15+
configuration_path_ = move(path);
16+
}
17+
18+
multipak_configuration::path_type multipak_configuration::configuration_path() const
19+
{
20+
return configuration_path_;
21+
}
22+
23+
24+
multipak_configuration::path_type multipak_configuration::last_accessed_module_path() const
25+
{
26+
return serializer(configuration_path()).read("DefaultPaths", "MPIPath");
27+
}
28+
29+
void multipak_configuration::last_accessed_module_path(const path_type& path) const
30+
{
31+
serializer(configuration_path()).write("DefaultPaths", "MPIPath", path);
32+
}
33+
34+
35+
void multipak_configuration::selected_slot(slot_id_type slot) const
36+
{
37+
serializer(configuration_path()).write(section_, "SWPOSITION", slot);
38+
}
39+
40+
multipak_configuration::slot_id_type multipak_configuration::selected_slot() const
41+
{
42+
return serializer(configuration_path()).read(section_, "SWPOSITION", 3);
43+
}
44+
45+
46+
void multipak_configuration::slot_cartridge_path(slot_id_type slot, const path_type& path) const
47+
{
48+
serializer(configuration_path()).write(section_, get_slot_path_key(slot), path);
49+
}
50+
51+
multipak_configuration::path_type multipak_configuration::slot_cartridge_path(slot_id_type slot) const
52+
{
53+
return serializer(configuration_path()).read(section_, get_slot_path_key(slot));
54+
}
55+
56+
57+
multipak_configuration::string_type multipak_configuration::get_slot_path_key(slot_id_type slot) const
58+
{
59+
return "SLOT" + ::std::to_string(slot + 1);
60+
}

0 commit comments

Comments
 (0)