added Config::reset() to support re-reading the config file, added PPPC::event_*() stubs to handle events and PPPC::update_pins() to write to the pport

git-svn-id: http://apu.dw.local/svnusers/JoshHoltrop/pppc/trunk@56 8131a0b2-b21c-1c47-bd6a-f003126495bd
This commit is contained in:
joshholtrop 2009-08-19 18:48:24 +00:00
parent ff99f698b2
commit 2dd4be5a62
4 changed files with 74 additions and 5 deletions

View File

@ -17,12 +17,19 @@ Config::Entry::Entry(const string & name)
}
Config::Config()
{
reset();
}
void Config::reset()
{
port = "LPT1"; /* default to first parallel port */
entries.clear(); /* erase any entries previously configured */
}
void Config::read(const char * file)
{
reset();
ifstream ifs(file);
if (ifs.is_open())
{
@ -68,7 +75,11 @@ void Config::read(const char * file)
{
if (parts.first == "pin")
{
entries[entry_num].pin = atoi(parts.second.c_str());
int pin = atoi(parts.second.c_str());
if (pin >= 0 && pin <= 7)
entries[entry_num].pin = pin;
else
cerr << "Bad pin #: " << parts.second << endl;
}
else if (parts.first == "on_start")
{

View File

@ -31,6 +31,7 @@ class Config
void read(const char * file);
protected:
void reset();
std::pair<std::string, std::string> split(const std::string & line);
Action parseAction(const std::string & str);
};

57
pppc.cc
View File

@ -11,6 +11,11 @@
#include "pppc.h"
using namespace std;
#define SET_BIT(var,position,value) \
(var) = ((var) & (~(1 << (position)))) | ((value) << (position))
#define GET_BIT(var,position) \
(((var) >> (position)) & 0x1)
static LRESULT WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
int WinMain(
@ -91,11 +96,15 @@ void addMenuItem(HMENU hMenu, CHAR * itemstr, WORD id)
PPPC::PPPC(HINSTANCE hInstance, const char * config_file)
{
m_pins = 0u;
if (config_file != NULL)
{
m_config.read(config_file);
}
event_start();
/* Load the application icon */
HICON icon = ::LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1));
if (icon == 0)
@ -151,7 +160,6 @@ PPPC::PPPC(HINSTANCE hInstance, const char * config_file)
/* begin capturing session notifications */
session_notification_enable(m_hWnd);
}
BOOL PPPC::mainLoop()
@ -179,12 +187,12 @@ BOOL PPPC::mainLoop()
if (msg.wParam == WTS_SESSION_LOGON
|| msg.wParam == WTS_SESSION_UNLOCK)
{
pport_write(0xFF);
event_unlock();
}
if (msg.wParam == WTS_SESSION_LOGOFF
|| msg.wParam == WTS_SESSION_LOCK)
{
pport_write(0x0);
event_lock();
}
break;
case WM_COMMAND:
@ -195,7 +203,6 @@ BOOL PPPC::mainLoop()
break;
}
break;
break;
}
}
@ -204,9 +211,51 @@ BOOL PPPC::mainLoop()
PPPC::~PPPC()
{
event_exit();
/* delete the tray icon */
Shell_NotifyIcon(NIM_DELETE, &m_nid);
/* stop listening for session notifications */
session_notification_disable(m_hWnd);
}
void PPPC::event_start()
{
for (int sz = m_config.entries.size(), i = 0; i < sz; i++)
{
switch (m_config.entries[i].on_start)
{
case Config::ON:
SET_BIT(m_pins, m_config.entries[i].pin, 1);
break;
case Config::OFF:
SET_BIT(m_pins, m_config.entries[i].pin, 0);
break;
default:
break;
}
}
update_pins();
}
void PPPC::event_exit()
{
update_pins();
}
void PPPC::event_lock()
{
update_pins();
m_previous_pins = m_pins;
}
void PPPC::event_unlock()
{
update_pins();
}
void PPPC::update_pins()
{
pport_write(m_pins);
}

8
pppc.h
View File

@ -15,9 +15,17 @@ class PPPC
BOOL mainLoop();
protected:
void event_start();
void event_exit();
void event_lock();
void event_unlock();
void update_pins();
Config m_config;
HWND m_hWnd;
NOTIFYICONDATA m_nid;
unsigned char m_pins;
unsigned char m_previous_pins;
};
/* non class-member functions */