Simplified LED encoding and drawing code - Ergo720's LED_MultiColor.xbe actually flashes the LED correctly now!
This commit is contained in:
parent
386eaf292f
commit
1e5d7ffede
|
@ -375,14 +375,14 @@ LRESULT CALLBACK WndMain::WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lP
|
|||
m_yBmp = GetSystemMetrics(SM_CYMENUCHECK);
|
||||
m_LedDC = CreateCompatibleDC(hDC);
|
||||
m_LedBmp = CreateCompatibleBitmap(hDC, m_xBmp, m_yBmp);
|
||||
m_BrushBlack = CreateSolidBrush(RGB(0, 0, 0));
|
||||
m_BrushRed = CreateSolidBrush(RGB(255, 0, 0));
|
||||
m_BrushGreen = CreateSolidBrush(RGB(0, 255, 0));
|
||||
m_BrushOrange = CreateSolidBrush(RGB(255, 165, 0));
|
||||
m_PenBlack = CreatePen(PS_SOLID, 1, RGB(0, 0, 0));
|
||||
m_PenRed = CreatePen(PS_SOLID, 1, RGB(255, 0, 0));
|
||||
m_PenGreen = CreatePen(PS_SOLID, 1, RGB(0, 255, 0));
|
||||
m_PenOrange = CreatePen(PS_SOLID, 1, RGB(255, 165, 0));
|
||||
m_Brushes[XBOX_LED_COLOUR_OFF] = CreateSolidBrush(RGB(0, 0, 0));
|
||||
m_Brushes[XBOX_LED_COLOUR_GREEN] = CreateSolidBrush(RGB(0, 255, 0));
|
||||
m_Brushes[XBOX_LED_COLOUR_RED] = CreateSolidBrush(RGB(255, 0, 0));
|
||||
m_Brushes[XBOX_LED_COLOUR_ORANGE] = CreateSolidBrush(RGB(255, 165, 0));
|
||||
m_Pens[XBOX_LED_COLOUR_OFF] = CreatePen(PS_SOLID, 1, RGB(0, 0, 0));
|
||||
m_Pens[XBOX_LED_COLOUR_GREEN] = CreatePen(PS_SOLID, 1, RGB(0, 255, 0));
|
||||
m_Pens[XBOX_LED_COLOUR_RED] = CreatePen(PS_SOLID, 1, RGB(255, 0, 0));
|
||||
m_Pens[XBOX_LED_COLOUR_ORANGE] = CreatePen(PS_SOLID, 1, RGB(255, 165, 0));
|
||||
DrawLedBitmap(hwnd, true);
|
||||
}
|
||||
|
||||
|
@ -1305,21 +1305,21 @@ LRESULT CALLBACK WndMain::WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lP
|
|||
|
||||
DeleteObject(m_LedBmp);
|
||||
|
||||
DeleteObject(m_BrushBlack);
|
||||
DeleteObject(m_Brushes[XBOX_LED_COLOUR_OFF]);
|
||||
|
||||
DeleteObject(m_BrushRed);
|
||||
DeleteObject(m_Brushes[XBOX_LED_COLOUR_GREEN]);
|
||||
|
||||
DeleteObject(m_BrushGreen);
|
||||
DeleteObject(m_Brushes[XBOX_LED_COLOUR_RED]);
|
||||
|
||||
DeleteObject(m_BrushOrange);
|
||||
DeleteObject(m_Brushes[XBOX_LED_COLOUR_ORANGE]);
|
||||
|
||||
DeleteObject(m_PenBlack);
|
||||
DeleteObject(m_Pens[XBOX_LED_COLOUR_OFF]);
|
||||
|
||||
DeleteObject(m_PenRed);
|
||||
DeleteObject(m_Pens[XBOX_LED_COLOUR_GREEN]);
|
||||
|
||||
DeleteObject(m_PenGreen);
|
||||
DeleteObject(m_Pens[XBOX_LED_COLOUR_RED]);
|
||||
|
||||
DeleteObject(m_PenOrange);
|
||||
DeleteObject(m_Pens[XBOX_LED_COLOUR_ORANGE]);
|
||||
|
||||
ReleaseDC(hwnd, hDC);
|
||||
|
||||
|
@ -2105,88 +2105,53 @@ void WndMain::CrashMonitor()
|
|||
void WndMain::DrawLedBitmap(HWND hwnd, bool bdefault)
|
||||
{
|
||||
HMENU hMenu = GetMenu(hwnd);
|
||||
if (bdefault) // draw default black bitmap
|
||||
{
|
||||
SelectObject(m_LedDC, m_BrushBlack);
|
||||
SelectObject(m_LedDC, m_PenBlack);
|
||||
m_OriLed = (HBITMAP)SelectObject(m_LedDC, m_LedBmp);
|
||||
Rectangle(m_LedDC, 0, 0, m_xBmp, m_yBmp);
|
||||
m_LedBmp = (HBITMAP)SelectObject(m_LedDC, m_OriLed);
|
||||
MENUITEMINFO mii;
|
||||
mii.cbSize = sizeof(mii);
|
||||
mii.fMask = MIIM_BITMAP | MIIM_FTYPE;
|
||||
mii.fType = MFT_RIGHTJUSTIFY;
|
||||
mii.hbmpItem = m_LedBmp;
|
||||
SetMenuItemInfo(hMenu, ID_LED, FALSE, &mii);
|
||||
DrawMenuBar(hwnd);
|
||||
int ActiveLEDColor;
|
||||
|
||||
// When so requested, or when not emulating, draw a black bitmap
|
||||
if (bdefault || !m_bIsStarted) {
|
||||
ActiveLEDColor = XBOX_LED_COLOUR_OFF;
|
||||
}
|
||||
else // draw colored bitmap
|
||||
{
|
||||
else { // draw colored bitmap
|
||||
static int LedSequence[4] = { XBOX_LED_COLOUR_OFF, XBOX_LED_COLOUR_OFF, XBOX_LED_COLOUR_OFF, XBOX_LED_COLOUR_OFF };
|
||||
static int LedSequenceOffset = 0;
|
||||
|
||||
bool bLedHasChanged;
|
||||
int LedSequence[4];
|
||||
|
||||
g_EmuShared->GetLedStatus(&bLedHasChanged);
|
||||
g_EmuShared->GetLedSequence(LedSequence);
|
||||
if (bLedHasChanged)
|
||||
{
|
||||
LedSequenceOffset = 0;
|
||||
if (bLedHasChanged) {
|
||||
// To prevent restarting the sequence when identical sequences are set, check if the new sequence is actually different
|
||||
int NewLedSequence[4];
|
||||
g_EmuShared->GetLedSequence(NewLedSequence);
|
||||
if (LedSequence[0] != NewLedSequence[0] || LedSequence[1] != NewLedSequence[1] || LedSequence[2] != NewLedSequence[2] || LedSequence[3] != NewLedSequence[3]) {
|
||||
// Only when the new sequence is different, restart it's cycle
|
||||
g_EmuShared->GetLedSequence(LedSequence);
|
||||
LedSequenceOffset = 0;
|
||||
}
|
||||
// Indicate we've handled the change
|
||||
bLedHasChanged = false;
|
||||
g_EmuShared->SetLedStatus(&bLedHasChanged);
|
||||
}
|
||||
|
||||
m_OriLed = (HBITMAP)SelectObject(m_LedDC, m_LedBmp);
|
||||
Rectangle(m_LedDC, 0, 0, m_xBmp, m_yBmp);
|
||||
MENUITEMINFO mii;
|
||||
mii.cbSize = sizeof(mii);
|
||||
mii.fMask = MIIM_BITMAP | MIIM_FTYPE;
|
||||
mii.fType = MFT_RIGHTJUSTIFY;
|
||||
mii.hbmpItem = m_LedBmp;
|
||||
|
||||
switch (LedSequence[LedSequenceOffset])
|
||||
{
|
||||
case XBOX_LED_COLOUR_RED:
|
||||
{
|
||||
SelectObject(m_LedDC, m_BrushRed);
|
||||
SelectObject(m_LedDC, m_PenRed);
|
||||
}
|
||||
break;
|
||||
|
||||
case XBOX_LED_COLOUR_GREEN:
|
||||
{
|
||||
SelectObject(m_LedDC, m_BrushGreen);
|
||||
SelectObject(m_LedDC, m_PenGreen);
|
||||
}
|
||||
break;
|
||||
|
||||
case XBOX_LED_COLOUR_ORANGE:
|
||||
{
|
||||
SelectObject(m_LedDC, m_BrushOrange);
|
||||
SelectObject(m_LedDC, m_PenOrange);
|
||||
}
|
||||
break;
|
||||
|
||||
case XBOX_LED_COLOUR_OFF:
|
||||
{
|
||||
SelectObject(m_LedDC, m_BrushBlack);
|
||||
SelectObject(m_LedDC, m_PenBlack);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
m_LedBmp = (HBITMAP)SelectObject(m_LedDC, m_OriLed);
|
||||
if (LedSequenceOffset == 3)
|
||||
{
|
||||
LedSequenceOffset = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
++LedSequenceOffset;
|
||||
}
|
||||
SetMenuItemInfo(hMenu, ID_LED, FALSE, &mii);
|
||||
|
||||
DrawMenuBar(hwnd);
|
||||
// Select active color and cycle through all 4 phases in the sequence
|
||||
ActiveLEDColor = LedSequence[LedSequenceOffset & 3];
|
||||
++LedSequenceOffset;
|
||||
}
|
||||
|
||||
SelectObject(m_LedDC, m_Brushes[ActiveLEDColor]);
|
||||
SelectObject(m_LedDC, m_Pens[ActiveLEDColor]);
|
||||
|
||||
m_OriLed = (HBITMAP)SelectObject(m_LedDC, m_LedBmp);
|
||||
Rectangle(m_LedDC, 0, 0, m_xBmp, m_yBmp);
|
||||
m_LedBmp = (HBITMAP)SelectObject(m_LedDC, m_OriLed);
|
||||
|
||||
MENUITEMINFO mii = { 0 };
|
||||
mii.cbSize = sizeof(mii);
|
||||
mii.fMask = MIIM_FTYPE | MIIM_BITMAP;
|
||||
mii.fType = MFT_RIGHTJUSTIFY;
|
||||
mii.hbmpItem = m_LedBmp;
|
||||
SetMenuItemInfo(hMenu, ID_LED, FALSE, &mii);
|
||||
|
||||
DrawMenuBar(hwnd);
|
||||
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -151,14 +151,8 @@ class WndMain : public Wnd
|
|||
HBITMAP m_LogoBmp;
|
||||
HBITMAP m_GameLogoBMP;
|
||||
HBITMAP m_LedBmp;
|
||||
HBRUSH m_BrushBlack;
|
||||
HBRUSH m_BrushRed;
|
||||
HBRUSH m_BrushGreen;
|
||||
HBRUSH m_BrushOrange;
|
||||
HPEN m_PenBlack;
|
||||
HPEN m_PenRed;
|
||||
HPEN m_PenGreen;
|
||||
HPEN m_PenOrange;
|
||||
HBRUSH m_Brushes[4];
|
||||
HPEN m_Pens[4];
|
||||
int m_xBmp, m_yBmp;
|
||||
|
||||
// ******************************************************************
|
||||
|
|
|
@ -52,26 +52,15 @@ void SetLEDSequence(LED::Sequence aLEDSequence)
|
|||
DbgPrintf("SMC : SetLEDSequence : %u\n", (byte)aLEDSequence);
|
||||
|
||||
bool bLedHasChanged = true;
|
||||
int LedSequence[4] = { XBOX_LED_COLOUR_OFF, XBOX_LED_COLOUR_OFF, XBOX_LED_COLOUR_OFF, XBOX_LED_COLOUR_OFF };
|
||||
|
||||
if (aLEDSequence == LED::GREEN) // Automatic solid green color
|
||||
{
|
||||
int LedSequence[4] = { XBOX_LED_COLOUR_GREEN, XBOX_LED_COLOUR_GREEN, XBOX_LED_COLOUR_GREEN, XBOX_LED_COLOUR_GREEN };
|
||||
LedSequence[0] = ((aLEDSequence >> 6) & 2) | ((aLEDSequence >> 3) & 1);
|
||||
LedSequence[1] = ((aLEDSequence >> 5) & 2) | ((aLEDSequence >> 2) & 1);
|
||||
LedSequence[2] = ((aLEDSequence >> 4) & 2) | ((aLEDSequence >> 1) & 1);
|
||||
LedSequence[3] = ((aLEDSequence >> 3) & 2) | ((aLEDSequence >> 0) & 1);
|
||||
|
||||
g_EmuShared->SetLedStatus(&bLedHasChanged);
|
||||
g_EmuShared->SetLedSequence(LedSequence);
|
||||
}
|
||||
else // Draw the color represented by the sequence obtained
|
||||
{
|
||||
int LedSequence[4] = { XBOX_LED_COLOUR_OFF, XBOX_LED_COLOUR_OFF, XBOX_LED_COLOUR_OFF, XBOX_LED_COLOUR_OFF };
|
||||
|
||||
LedSequence[0] = ((aLEDSequence >> 3) & 1) | ((aLEDSequence >> 6) & 2);
|
||||
LedSequence[1] = ((aLEDSequence >> 2) & 1) | ((aLEDSequence >> 5) & 2);
|
||||
LedSequence[2] = ((aLEDSequence >> 1) & 1) | ((aLEDSequence >> 4) & 2);
|
||||
LedSequence[3] = (aLEDSequence & 1) | ((aLEDSequence >> 3) & 2);
|
||||
|
||||
g_EmuShared->SetLedStatus(&bLedHasChanged);
|
||||
g_EmuShared->SetLedSequence(LedSequence);
|
||||
}
|
||||
g_EmuShared->SetLedStatus(&bLedHasChanged);
|
||||
g_EmuShared->SetLedSequence(LedSequence);
|
||||
}
|
||||
|
||||
/* SMCDevice */
|
||||
|
|
Loading…
Reference in New Issue