Support for LEDs
This commit is contained in:
parent
b7c425cdbf
commit
89aaed4a53
5 changed files with 230 additions and 34 deletions
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue