Support for LEDs

This commit is contained in:
Dimitris Panokostas 2016-08-29 20:08:05 +02:00
parent b7c425cdbf
commit 89aaed4a53
5 changed files with 230 additions and 34 deletions

View file

@ -478,6 +478,9 @@ void cfgfile_save_options (struct zfile *f, struct uae_prefs *p, int type)
#ifdef RASPBERRY
cfgfile_write (f, _T("gfx_correct_aspect"), _T("%d"), p->gfx_correct_aspect);
cfgfile_write (f, _T("gfx_fullscreen_ratio"), _T("%d"), p->gfx_fullscreen_ratio);
cfgfile_write (f, _T("kbd_led_num"), _T("%d"), p->kbd_led_num);
cfgfile_write (f, _T("kbd_led_scr"), _T("%d"), p->kbd_led_scr);
cfgfile_write (f, _T("kbd_led_cap"), _T("%d"), p->kbd_led_cap);
#endif
cfgfile_write_bool (f, _T("immediate_blits"), p->immediate_blits);
@ -878,6 +881,12 @@ static int cfgfile_parse_host (struct uae_prefs *p, TCHAR *option, TCHAR *value)
if (cfgfile_intval (option, value, "gfx_fullscreen_ratio", &p->gfx_fullscreen_ratio, 1))
return 1;
if (cfgfile_intval (option, value, "kbd_led_num", &p->kbd_led_num, 1))
return 1;
if (cfgfile_intval (option, value, "kbd_led_scr", &p->kbd_led_scr, 1))
return 1;
if (cfgfile_intval (option, value, "kbd_led_cap", &p->kbd_led_cap, 1))
return 1;
#endif
if (cfgfile_string (option, value, _T("config_info"), p->info, sizeof p->info / sizeof (TCHAR))
@ -2573,6 +2582,9 @@ void default_prefs (struct uae_prefs *p, int type)
#ifdef RASPBERRY
p->gfx_correct_aspect = 1;
p->gfx_fullscreen_ratio = 100;
p->kbd_led_num = -1; // No status on numlock
p->kbd_led_scr = -1; // No status on scrollock
p->kbd_led_cap = -1; // No status on capslock
#endif
p->immediate_blits = 0;
p->waiting_blits = 0;

View file

@ -143,6 +143,9 @@ struct uae_prefs {
#ifdef RASPBERRY
int gfx_correct_aspect;
int gfx_fullscreen_ratio;
int kbd_led_num;
int kbd_led_scr;
int kbd_led_cap;
#endif
bool immediate_blits;

View file

@ -29,6 +29,42 @@ static gcn::Slider* sldPandoraSpeed;
#endif
static gcn::UaeCheckBox* chkBSDSocket;
#ifdef RASPBERRY
class StringListModel : public gcn::ListModel
{
private:
std::vector<std::string> values;
public:
StringListModel(const char *entries[], int count)
{
for(int i=0; i<count; ++i)
values.push_back(entries[i]);
}
int getNumberOfElements()
{
return values.size();
}
std::string getElementAt(int i)
{
if(i < 0 || i >= values.size())
return "---";
return values[i];
}
};
static gcn::Label *lblNumLock;
static gcn::UaeDropDown* cboKBDLed_num;
static gcn::Label *lblScrLock;
static gcn::UaeDropDown* cboKBDLed_scr;
static gcn::Label *lblCapLock;
static gcn::UaeDropDown* cboKBDLed_cap;
const char *listValues[] = { "", "POWER", "DF0", "DF1", "DF2", "DF3", "DF*", "HD" };
StringListModel KBDLedList(listValues, 8);
#endif
class MiscActionListener : public gcn::ActionListener
{
@ -60,6 +96,30 @@ class MiscActionListener : public gcn::ActionListener
}
}
#endif
#ifdef RASPBERRY
else if (actionEvent.getSource() == cboKBDLed_num)
{
if (cboKBDLed_num->getSelected() == 0) changed_prefs.kbd_led_num = -1; // Nothing
if (cboKBDLed_num->getSelected() == 7) changed_prefs.kbd_led_num = 5; // HD
if (cboKBDLed_num->getSelected() == 6) changed_prefs.kbd_led_num = -2; // Any DFs
if (cboKBDLed_num->getSelected() >= 1 && cboKBDLed_num->getSelected() <= 4) changed_prefs.kbd_led_num = cboKBDLed_num->getSelected() - 1; // Specific DF#
}
else if (actionEvent.getSource() == cboKBDLed_cap)
{
if (cboKBDLed_cap->getSelected() == 0) changed_prefs.kbd_led_cap = -1;
if (cboKBDLed_cap->getSelected() == 7) changed_prefs.kbd_led_cap = 5;
if (cboKBDLed_cap->getSelected() == 6) changed_prefs.kbd_led_cap = -2;
if (cboKBDLed_cap->getSelected() >= 1 && cboKBDLed_cap->getSelected() <= 4) changed_prefs.kbd_led_cap = cboKBDLed_cap->getSelected() - 1;
}
else if (actionEvent.getSource() == cboKBDLed_scr)
{
if (cboKBDLed_scr->getSelected() == 0) changed_prefs.kbd_led_scr = -1;
if (cboKBDLed_scr->getSelected() == 7) changed_prefs.kbd_led_scr = 5;
if (cboKBDLed_scr->getSelected() == 6) changed_prefs.kbd_led_scr = -2;
if (cboKBDLed_scr->getSelected() >= 1 && cboKBDLed_scr->getSelected() <= 4) changed_prefs.kbd_led_scr = cboKBDLed_scr->getSelected() - 1;
}
#endif
}
};
MiscActionListener* miscActionListener;
@ -114,8 +174,48 @@ void InitPanelMisc(const struct _ConfigCategory& category)
#endif
category.panel->add(chkBSDSocket, DISTANCE_BORDER, posY);
posY += chkBSDSocket->getHeight() + DISTANCE_NEXT_Y;
RefreshPanelMisc();
#ifdef RASPBERRY
lblNumLock = new gcn::Label("NumLock LED");
lblNumLock->setSize(150, LABEL_HEIGHT);
lblNumLock->setAlignment(gcn::Graphics::LEFT);
cboKBDLed_num = new gcn::UaeDropDown(&KBDLedList);
cboKBDLed_num->setSize(150, DROPDOWN_HEIGHT);
cboKBDLed_num->setBaseColor(gui_baseCol);
cboKBDLed_num->setId("numlock");
cboKBDLed_num->addActionListener(miscActionListener);
lblCapLock = new gcn::Label("CapsLock LED");
lblCapLock->setSize(150, LABEL_HEIGHT);
lblCapLock->setAlignment(gcn::Graphics::LEFT);
cboKBDLed_cap = new gcn::UaeDropDown(&KBDLedList);
cboKBDLed_cap->setSize(150, DROPDOWN_HEIGHT);
cboKBDLed_cap->setBaseColor(gui_baseCol);
cboKBDLed_cap->setId("capslock");
cboKBDLed_cap->addActionListener(miscActionListener);
lblScrLock = new gcn::Label("ScrollLock LED");
lblScrLock->setSize(150, LABEL_HEIGHT);
lblScrLock->setAlignment(gcn::Graphics::LEFT);
cboKBDLed_scr = new gcn::UaeDropDown(&KBDLedList);
cboKBDLed_scr->setSize(150, DROPDOWN_HEIGHT);
cboKBDLed_scr->setBaseColor(gui_baseCol);
cboKBDLed_scr->setId("scrolllock");
cboKBDLed_scr->addActionListener(miscActionListener);
category.panel->add(lblNumLock, DISTANCE_BORDER, posY);
// category.panel->add(lblCapLock, lblNumLock->getX() + lblNumLock->getWidth() + DISTANCE_NEXT_X, posY);
category.panel->add(lblScrLock, lblCapLock->getX() + lblCapLock->getWidth() + DISTANCE_NEXT_X, posY);
posY += lblNumLock->getHeight() + 4;
category.panel->add(cboKBDLed_num, DISTANCE_BORDER, posY);
// category.panel->add(cboKBDLed_cap, cboKBDLed_num->getX() + cboKBDLed_num->getWidth() + DISTANCE_NEXT_X, posY);
category.panel->add(cboKBDLed_scr, cboKBDLed_cap->getX() + cboKBDLed_cap->getWidth() + DISTANCE_NEXT_X, posY);
posY += cboKBDLed_scr->getHeight() + DISTANCE_NEXT_Y;
#endif
RefreshPanelMisc();
}
@ -130,6 +230,15 @@ void ExitPanelMisc(void)
delete lblPandoraSpeedInfo;
#endif
delete chkBSDSocket;
#ifdef RASPBERRY
delete lblCapLock;
delete lblScrLock;
delete lblNumLock;
delete cboKBDLed_num;
delete cboKBDLed_cap;
delete cboKBDLed_scr;
#endif
delete miscActionListener;
}
@ -148,4 +257,18 @@ void RefreshPanelMisc(void)
#endif
chkBSDSocket->setSelected(changed_prefs.socket_emu);
#ifdef RASPBERRY
if (changed_prefs.kbd_led_num == -1) cboKBDLed_num->setSelected(0);
if (changed_prefs.kbd_led_num == -2) cboKBDLed_num->setSelected(6);
if (changed_prefs.kbd_led_num == 5) cboKBDLed_num->setSelected(7);
if (changed_prefs.kbd_led_num >= 1 && changed_prefs.kbd_led_num <= 4) cboKBDLed_num->setSelected(changed_prefs.kbd_led_num + 1);
if (changed_prefs.kbd_led_cap == -1) cboKBDLed_cap->setSelected(0);
if (changed_prefs.kbd_led_cap == -2) cboKBDLed_cap->setSelected(6);
if (changed_prefs.kbd_led_cap == 5) cboKBDLed_cap->setSelected(7);
if (changed_prefs.kbd_led_cap >= 1 && changed_prefs.kbd_led_cap <= 4) cboKBDLed_cap->setSelected(changed_prefs.kbd_led_cap + 1);
if (changed_prefs.kbd_led_scr == -1) cboKBDLed_scr->setSelected(0);
if (changed_prefs.kbd_led_scr == -2) cboKBDLed_scr->setSelected(6);
if (changed_prefs.kbd_led_scr == 5) cboKBDLed_scr->setSelected(7);
if (changed_prefs.kbd_led_scr >= 1 && changed_prefs.kbd_led_scr <= 4) cboKBDLed_scr->setSelected(changed_prefs.kbd_led_scr + 1);
#endif
}

View file

@ -109,7 +109,10 @@ int customControlMap[SDLK_LAST];
char start_path_data[MAX_DPATH];
char currentDir[MAX_DPATH];
#ifdef CAPSLOCK_DEBIAN_WORKAROUND
static int capslock = 0;
#include <linux/kd.h>
#include <sys/ioctl.h>
unsigned long kbd_led_status;
char kbd_flags;
#endif
static char config_path[MAX_DPATH];
@ -853,6 +856,24 @@ int main (int argc, char *argv[])
alloc_AmigaMem();
RescanROMs();
#ifdef CAPSLOCK_DEBIAN_WORKAROUND
// set capslock state based upon current "real" state
ioctl(0, KDGKBLED, &kbd_flags);
ioctl(0, KDGETLED, &kbd_led_status);
if ((kbd_flags & 07) & LED_CAP)
{
// record capslock pressed
kbd_led_status |= LED_CAP;
inputdevice_do_keyboard(AK_CAPSLOCK, 1);
} else
{
// record capslock as not pressed
kbd_led_status &= ~LED_CAP;
inputdevice_do_keyboard(AK_CAPSLOCK, 0);
}
ioctl(0, KDSETLED, kbd_led_status);
#endif
//keyboard_settrans();
real_main (argc, argv);
@ -946,7 +967,15 @@ int handle_msgpump (void)
inputdevice_translatekeycode(0, rEvent.key.keysym.scancode, 1);
}
break;
#ifdef CAPSLOCK_DEBIAN_WORKAROUND
if (rEvent.key.keysym.sym == SDLK_CAPSLOCK)
{
ioctl(0, KDGETLED, &kbd_led_status);
kbd_led_status |= LED_CAP;
ioctl(0, KDSETLED, kbd_led_status);
}
#endif
break;
}
break;
@ -976,7 +1005,7 @@ int handle_msgpump (void)
}
else if(keycode > 0) {
// Send mapped key release
inputdevice_do_keyboard(keycode, 0);
inputdevice_do_keyboard(keycode, 0);
break;
}
}
@ -994,6 +1023,14 @@ int handle_msgpump (void)
else
inputdevice_translatekeycode(0, rEvent.key.keysym.scancode, 0);
}
#ifdef CAPSLOCK_DEBIAN_WORKAROUND
if (rEvent.key.keysym.sym == SDLK_CAPSLOCK)
{
ioctl(0, KDGETLED, &kbd_led_status);
kbd_led_status &= ~LED_CAP;
ioctl(0, KDSETLED, kbd_led_status);
}
#endif
break;
}
break;

View file

@ -736,19 +736,42 @@ void gui_disk_image_change (int unitnum, const char *name, bool writeprotected)
void gui_led (int led, int on)
{
#ifdef RASPBERRY
static unsigned long kb_led_status;
#define LED_DFs -2 // Define for any DF* access
ioctl(NULL, KDGETLED, &kb_led_status);
switch(led)
{
case LED_DF0:
if(on) kb_led_status |= LED_SCR; else kb_led_status &= ~LED_SCR;
break;
case LED_HD:
if(on) kb_led_status |= LED_NUM; else kb_led_status &= ~LED_NUM;
break;
}
ioctl(NULL, KDSETLED, kb_led_status);
unsigned long kbd_led_status;
// Check current prefs/ update if changed
if (currprefs.kbd_led_num != changed_prefs.kbd_led_num) currprefs.kbd_led_num = changed_prefs.kbd_led_num;
if (currprefs.kbd_led_scr != changed_prefs.kbd_led_scr) currprefs.kbd_led_scr = changed_prefs.kbd_led_scr;
ioctl(0, KDGETLED, &kbd_led_status);
// Handle floppy led status
if (led == LED_DF0 || led == LED_DF1 || led == LED_DF2 || led == LED_DF3)
{
if (currprefs.kbd_led_num == led || currprefs.kbd_led_num == LED_DFs)
{
if (on) kbd_led_status |= LED_NUM; else kbd_led_status &= ~LED_NUM;
}
if (currprefs.kbd_led_scr == led || currprefs.kbd_led_scr == LED_DFs)
{
if (on) kbd_led_status |= LED_SCR; else kbd_led_status &= ~LED_SCR;
}
}
// Handle power, hd/cd led status
if (led == LED_POWER || led == LED_HD)
{
if (currprefs.kbd_led_num == led)
{
if (on) kbd_led_status |= LED_NUM; else kbd_led_status &= ~LED_NUM;
}
if (currprefs.kbd_led_scr == led)
{
if (on) kbd_led_status |= LED_SCR; else kbd_led_status &= ~LED_SCR;
}
}
ioctl(0, KDSETLED, kbd_led_status);
#endif
}
@ -764,27 +787,25 @@ void gui_flicker_led (int led, int unitnum, int status)
case LED_POWER:
break;
case LED_DF0:
case LED_DF1:
case LED_DF2:
case LED_DF3:
gui_led(LED_DF0,1);
break;
case LED_HD:
case LED_HD:
if (status == 0) {
hd_resetcounter--;
if (hd_resetcounter > 0)
return;
}
hd_resetcounter--;
if (hd_resetcounter > 0)
return;
#ifdef RASPBERRY
// HD LED off
gui_led(LED_HD, 0);
#endif
}
#ifdef RASPBERRY
// HD LED on
else gui_led(LED_HD, 1);
#endif
gui_data.hd = status;
hd_resetcounter = 2;
gui_led(LED_HD,1);
break;
break;
}
gui_led(LED_HD,0);
gui_led(LED_DF0,0);
}