Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 0 additions & 17 deletions becker/becker.vcxproj
Original file line number Diff line number Diff line change
Expand Up @@ -98,23 +98,6 @@
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="main.cpp">
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Legacy|Win32'">NotUsing</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">NotUsing</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">NotUsing</PrecompiledHeader>
<PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
</PrecompiledHeaderFile>
<PrecompiledHeaderOutputFile Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
</PrecompiledHeaderOutputFile>
<PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Legacy|Win32'">
</PrecompiledHeaderFile>
<PrecompiledHeaderFile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
</PrecompiledHeaderFile>
<PrecompiledHeaderOutputFile Condition="'$(Configuration)|$(Platform)'=='Legacy|Win32'">
</PrecompiledHeaderOutputFile>
<PrecompiledHeaderOutputFile Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
</PrecompiledHeaderOutputFile>
</ClCompile>
<ClCompile Include="becker_cartridge.cpp" />
<ClCompile Include="configuration_dialog.cpp" />
</ItemGroup>
Expand Down
3 changes: 0 additions & 3 deletions becker/becker.vcxproj.filters
Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<ClCompile Include="main.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="becker_cartridge.cpp">
<Filter>Source Files</Filter>
</ClCompile>
Expand Down
165 changes: 103 additions & 62 deletions becker/becker_cartridge.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,122 +16,163 @@
// VCC (Virtual Color Computer). If not, see <http://www.gnu.org/licenses/>.
////////////////////////////////////////////////////////////////////////////////
#include "becker_cartridge.h"
#include "configuration_dialog.h"
#include "resource.h"
#include <vcc/devices/serial/beckerport.h>
#include <vcc/bus/cartridge_capi.h>
#include <vcc/utils/winapi.h>
#include <vcc/utils/persistent_value_store.h>
#include "../CartridgeMenu.h"
#include <Windows.h>

// Contains Becker cart exports
HINSTANCE gModuleInstance;

becker_cartridge::becker_cartridge(std::unique_ptr<context_type> context, HINSTANCE module_instance)
:
context_(move(context)),
module_instance_(module_instance),
configuration_dialog_(module_instance, *this)
{}
namespace
{
using becker_device_type = ::vcc::devices::serial::Becker;

struct menu_identifiers
{
static const UINT open_configuration = 16;
};

becker_cartridge::name_type becker_cartridge::name() const
{
return ::vcc::utils::load_string(module_instance_, IDS_MODULE_NAME);
const std::string configuration_section_id_ = "DW Becker";

void* gHostKey = nullptr;
const cartridge_capi_context* context_ = nullptr;
std::string configuration_path_;
configuration_dialog configuration_dialog_;
becker_device_type gBecker;
}

becker_cartridge::catalog_id_type becker_cartridge::catalog_id() const
static void build_menu();


// Becker dll main
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved)
{
return ::vcc::utils::load_string(module_instance_, IDS_CATNUMBER);
if (fdwReason == DLL_PROCESS_ATTACH)
{
gModuleInstance = hinstDLL;
}

return true;
}

becker_cartridge::description_type becker_cartridge::description() const
extern "C"
{
return ::vcc::utils::load_string(module_instance_, IDS_DESCRIPTION);
}

__declspec(dllexport) const char* PakGetName()
{
static const auto name(::vcc::utils::load_string(gModuleInstance, IDS_MODULE_NAME));
return name.c_str();
}

void becker_cartridge::start()
{
__declspec(dllexport) const char* PakGetCatalogId()
{
static const auto catalog_id(::vcc::utils::load_string(gModuleInstance, IDS_CATNUMBER));
return catalog_id.c_str();
}

// Load becker config
::vcc::utils::persistent_value_store settings(context_->configuration_path());
__declspec(dllexport) const char* PakGetDescription()
{
static const auto description(::vcc::utils::load_string(gModuleInstance, IDS_DESCRIPTION));
return description.c_str();
}

gBecker.sethost(
settings.read(configuration_section_id_, "DWServerAddr", "127.0.0.1").c_str(),
settings.read(configuration_section_id_, "DWServerPort", "65504").c_str());
gBecker.enable(true);

// Create dynamic menu
build_menu();
}
__declspec(dllexport) void PakInitialize(
void* const host_key,
const char* const configuration_path,
const cartridge_capi_context* const context)
{
gHostKey = host_key;
configuration_path_ = configuration_path;
context_ = context;

::vcc::utils::persistent_value_store settings(configuration_path_);

void becker_cartridge::stop()
{
gBecker.enable(false);
configuration_dialog_.close();
}
gBecker.sethost(
settings.read(configuration_section_id_, "DWServerAddr", "127.0.0.1").c_str(),
settings.read(configuration_section_id_, "DWServerPort", "65504").c_str());
gBecker.enable(true);

build_menu();
}

void becker_cartridge::write_port(unsigned char port_id, unsigned char value)
{
if (port_id == 0x42)

__declspec(dllexport) void PakTerminate()
{
gBecker.write(value,port_id);
gBecker.enable(false);
configuration_dialog_.close();
}
}

unsigned char becker_cartridge::read_port(unsigned char port_id)
{
switch (port_id)
{
case 0x41: // read status
return gBecker.read(port_id) != 0 ? 2 : 0;

case 0x42: // read data
return gBecker.read(port_id);
__declspec(dllexport) void PakWritePort(unsigned char port_id, unsigned char value)
{
if (port_id == 0x42)
{
gBecker.write(value, port_id);
}
}

return 0;
}
__declspec(dllexport) unsigned char PakReadPort(unsigned char port_id)
{
switch (port_id)
{
case 0x41: // read status
return gBecker.read(port_id) != 0 ? 2 : 0;

void becker_cartridge::status(char* text_buffer, size_t buffer_size)
{
gBecker.status(text_buffer); // text buffer size??
}
case 0x42: // read data
return gBecker.read(port_id);
}

return 0;
}

void becker_cartridge::menu_item_clicked(unsigned char menu_item_id)
{
if (menu_item_id == menu_identifiers::open_configuration)
__declspec(dllexport) void PakGetStatus(char* text_buffer, [[maybe_unused]] size_t buffer_size)
{
configuration_dialog_.open();
gBecker.status(text_buffer); // text buffer size??
}


__declspec(dllexport) void PakMenuItemClicked(unsigned char menu_item_id)
{
if (menu_item_id == menu_identifiers::open_configuration)
{
configuration_dialog_.open();
}
}

}


void becker_cartridge::build_menu() const
static void build_menu()
{
context_->add_menu_item("", MID_BEGIN, MIT_Head);
context_->add_menu_item("", MID_ENTRY, MIT_Seperator);
context_->add_menu_item("DriveWire Server..", ControlId(menu_identifiers::open_configuration), MIT_StandAlone);
context_->add_menu_item("", MID_FINISH, MIT_Head);
context_->add_menu_item(gHostKey, "", MID_BEGIN, MIT_Head);
context_->add_menu_item(gHostKey, "", MID_ENTRY, MIT_Seperator);
context_->add_menu_item(gHostKey, "DriveWire Server..", ControlId(menu_identifiers::open_configuration), MIT_StandAlone);
context_->add_menu_item(gHostKey, "", MID_FINISH, MIT_Head);
}


becker_cartridge::string_type becker_cartridge::server_address() const
std::string becker_server_address()
{
return gBecker.server_address();
}

becker_cartridge::string_type becker_cartridge::server_port() const
std::string becker_server_port()
{
return gBecker.server_port();
}

// Save becker config
void becker_cartridge::configure_server(string_type server_address, string_type server_port)
void becker_configure_server(std::string server_address, std::string server_port)
{
gBecker.sethost(server_address.c_str(), server_port.c_str());

::vcc::utils::persistent_value_store settings(context_->configuration_path());
::vcc::utils::persistent_value_store settings(configuration_path_);

settings.write(configuration_section_id_, "DWServerAddr", server_address);
settings.write(configuration_section_id_, "DWServerPort", server_port);
Expand Down
62 changes: 5 additions & 57 deletions becker/becker_cartridge.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,63 +16,11 @@
// VCC (Virtual Color Computer). If not, see <http://www.gnu.org/licenses/>.
////////////////////////////////////////////////////////////////////////////////
#pragma once
#include "configuration_dialog.h"
#include <vcc/devices/serial/beckerport.h>
#include <vcc/bus/cartridge.h>
#include <vcc/bus/cartridge_context.h>
#include <memory>
#include <Windows.h>
#include <string>

extern HINSTANCE gModuleInstance;

class becker_cartridge
:
public ::vcc::bus::cartridge,
private ::cartridge_controller
{
public:

using context_type = ::vcc::bus::cartridge_context;
using becker_device_type = ::vcc::devices::serial::Becker;


public:

becker_cartridge(std::unique_ptr<context_type> context, HINSTANCE module_instance);

name_type name() const override;
catalog_id_type catalog_id() const override;
description_type description() const override;

void start() override;
void stop() override;

void write_port(unsigned char port_id, unsigned char value) override;
unsigned char read_port(unsigned char port_id) override;

void status(char* text_buffer, size_t buffer_size) override;
void menu_item_clicked(unsigned char menu_item_id) override;


protected:

string_type server_address() const override;
string_type server_port() const override;
void configure_server(string_type server_address, string_type server_port) override;

void build_menu() const;


private:

struct menu_identifiers
{
static const UINT open_configuration = 16;
};

static const inline std::string configuration_section_id_ = "DW Becker";

const std::unique_ptr<context_type> context_;
const HINSTANCE module_instance_;
configuration_dialog configuration_dialog_;
becker_device_type gBecker;
};
std::string becker_server_address();
std::string becker_server_port();
void becker_configure_server(std::string server_address, std::string server_port);
18 changes: 5 additions & 13 deletions becker/configuration_dialog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,26 +16,18 @@
// VCC (Virtual Color Computer). If not, see <http://www.gnu.org/licenses/>.
////////////////////////////////////////////////////////////////////////////////
#include "configuration_dialog.h"
#include "becker_cartridge.h"
#include "resource.h"
#include <vcc/common/DialogOps.h>
#include <vcc/utils/winapi.h>


configuration_dialog::configuration_dialog(
HINSTANCE module_handle,
controller_type& controller)
:
module_handle_(module_handle),
controller_(controller)
{}


void configuration_dialog::open()
{
if (!dialog_handle_)
{
dialog_handle_ = CreateDialogParam(
module_handle_,
gModuleInstance,
MAKEINTRESOURCE(IDD_PROPPAGE),
GetActiveWindow(),
callback_procedure,
Expand Down Expand Up @@ -110,21 +102,21 @@ INT_PTR configuration_dialog::process_message(
IDC_TCPHOST,
WM_SETTEXT,
0,
reinterpret_cast<LPARAM>(controller_.server_address().c_str()));
reinterpret_cast<LPARAM>(becker_server_address().c_str()));
SendDlgItemMessage(
hDlg,
IDC_TCPPORT,
WM_SETTEXT,
0,
reinterpret_cast<LPARAM>(controller_.server_port().c_str()));
reinterpret_cast<LPARAM>(becker_server_port().c_str()));
return TRUE;

case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDOK:
// Save config dialog data
controller_.configure_server(
becker_configure_server(
::vcc::utils::get_dialog_item_text(hDlg, IDC_TCPHOST),
::vcc::utils::get_dialog_item_text(hDlg, IDC_TCPPORT));
EndDialog(hDlg, LOWORD(wParam));
Expand Down
Loading