Implement panel checking.
This commit is contained in:
parent
e4ae22e9e5
commit
033f6edff5
@ -4,15 +4,26 @@
|
|||||||
|
|
||||||
using namespace olc;
|
using namespace olc;
|
||||||
|
|
||||||
|
|
||||||
class PGEX_SMX : public PGEX{
|
class PGEX_SMX : public PGEX{
|
||||||
|
|
||||||
public:
|
public:
|
||||||
PGEX_SMX():PGEX(true){};
|
PGEX_SMX():PGEX(true){
|
||||||
HWButton GetPanel(Key k,int pad)const{
|
|
||||||
std::cout<<SMX_GetInputState(pad);
|
|
||||||
};
|
};
|
||||||
|
//UP is 0x2
|
||||||
|
//RIGHT is 0x20
|
||||||
|
//DOWN is 0x80
|
||||||
|
//LEFT is 0x08
|
||||||
|
//Add these bytes together to get the combination (all 4 held down is 0xAA
|
||||||
|
HWButton GetPanel(Key k,int pad)const{
|
||||||
|
return panelState[k-UP];
|
||||||
|
};
|
||||||
|
void EnableLogMessages(bool enabled){
|
||||||
|
logMessages=enabled;
|
||||||
|
}
|
||||||
private:
|
private:
|
||||||
|
static bool logMessages;
|
||||||
|
HWButton internal_panelState[4];
|
||||||
|
HWButton panelState[4]; //We store the 4 main panel states, similar to how PGE does.
|
||||||
//SMX "screen" is 12x21
|
//SMX "screen" is 12x21
|
||||||
//Each panel is 4x7
|
//Each panel is 4x7
|
||||||
static void SMXStateChangedCallback(int pad, SMXUpdateCallbackReason reason, void *pUser)
|
static void SMXStateChangedCallback(int pad, SMXUpdateCallbackReason reason, void *pUser)
|
||||||
@ -23,20 +34,64 @@ private:
|
|||||||
|
|
||||||
static void SMXLogCallback(const char *log)
|
static void SMXLogCallback(const char *log)
|
||||||
{
|
{
|
||||||
|
if(logMessages){
|
||||||
printf("-> %s\n", log);
|
printf("-> %s\n", log);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//The key enums are UP, DOWN, LEFT, RIGHT.
|
||||||
void SMXStateChanged(int pad, SMXUpdateCallbackReason reason)
|
void SMXStateChanged(int pad, SMXUpdateCallbackReason reason)
|
||||||
{
|
{
|
||||||
|
if(logMessages){
|
||||||
printf("Device %i state changed: %04x\n", pad, SMX_GetInputState(pad));
|
printf("Device %i state changed: %04x\n", pad, SMX_GetInputState(pad));
|
||||||
|
}
|
||||||
|
int16_t state(SMX_GetInputState(pad));
|
||||||
|
if(state&0x2&&!internal_panelState[UP-UP].bPressed){
|
||||||
|
internal_panelState[UP-UP]={true,false,true};
|
||||||
|
}else
|
||||||
|
if(!(state&0x2)&&!internal_panelState[UP-UP].bReleased){
|
||||||
|
internal_panelState[UP-UP]={false,true,false};
|
||||||
|
}
|
||||||
|
if(state&0x20&&!internal_panelState[RIGHT-UP].bPressed){
|
||||||
|
internal_panelState[RIGHT-UP]={true,false,true};
|
||||||
|
}else
|
||||||
|
if(!(state&0x20)&&!internal_panelState[RIGHT-UP].bReleased){
|
||||||
|
internal_panelState[RIGHT-UP]={false,true,false};
|
||||||
|
}
|
||||||
|
if(state&0x80&&!internal_panelState[DOWN-UP].bPressed){
|
||||||
|
internal_panelState[DOWN-UP]={true,false,true};
|
||||||
|
}else
|
||||||
|
if(!(state&0x80)&&!internal_panelState[DOWN-UP].bReleased){
|
||||||
|
internal_panelState[DOWN-UP]={false,true,false};
|
||||||
|
}
|
||||||
|
if(state&0x8&&!internal_panelState[LEFT-UP].bPressed){
|
||||||
|
internal_panelState[LEFT-UP]={true,false,true};
|
||||||
|
}else
|
||||||
|
if(!(state&0x8)&&!internal_panelState[LEFT-UP].bReleased){
|
||||||
|
internal_panelState[LEFT-UP]={false,true,false};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void OnAfterUserCreate()override{
|
virtual void OnAfterUserCreate()override{
|
||||||
SMX_Start( SMXStateChangedCallback, this );
|
SMX_Start( SMXStateChangedCallback, this );
|
||||||
};
|
};
|
||||||
|
|
||||||
|
virtual bool OnBeforeUserUpdate(float& fElapsedTime){
|
||||||
|
//We don't want the panel states changing in the middle of a frame, since the input polling is on a separate thread.
|
||||||
|
//Copy over the internal button states to the current panel state.
|
||||||
|
for(int i=0;i<4;i++){
|
||||||
|
panelState[i]=internal_panelState[i];
|
||||||
|
internal_panelState[i].bPressed=false;
|
||||||
|
internal_panelState[i].bReleased=false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
virtual void OnAfterUserUpdate(float fElapsedTime)override{
|
virtual void OnAfterUserUpdate(float fElapsedTime)override{
|
||||||
|
for(int i=0;i<4;i++){
|
||||||
|
panelState[i].bPressed=false;
|
||||||
|
panelState[i].bReleased=false;
|
||||||
|
}
|
||||||
std::string lightData;
|
std::string lightData;
|
||||||
//The light data for an SMX dance pad is outlined in the docs but the code used to transform the PGE's pixels to SMX pad's lights will be annotated here.
|
//The light data for an SMX dance pad is outlined in the docs but the code used to transform the PGE's pixels to SMX pad's lights will be annotated here.
|
||||||
//Both pads receive data sequentially, and for now we can mimic the data on both ends.
|
//Both pads receive data sequentially, and for now we can mimic the data on both ends.
|
||||||
@ -79,3 +134,5 @@ private:
|
|||||||
SMX_SetLights2( lightData.data(), lightData.size() );
|
SMX_SetLights2( lightData.data(), lightData.size() );
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
bool PGEX_SMX::logMessages=false;
|
@ -21,7 +21,6 @@ public:
|
|||||||
|
|
||||||
bool OnUserUpdate(float fElapsedTime) override
|
bool OnUserUpdate(float fElapsedTime) override
|
||||||
{
|
{
|
||||||
smx.GetPanel(RIGHT,0).bHeld;
|
|
||||||
// called once per frame
|
// called once per frame
|
||||||
for (int x = 0; x < ScreenWidth(); x++)
|
for (int x = 0; x < ScreenWidth(); x++)
|
||||||
for (int y = 0; y < ScreenHeight(); y++)
|
for (int y = 0; y < ScreenHeight(); y++)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user