Inital commit
This commit is contained in:
@@ -0,0 +1,39 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <Arduino.h>
|
||||||
|
|
||||||
|
#define NUM_KEYS 12
|
||||||
|
|
||||||
|
class Gamepad{
|
||||||
|
public:
|
||||||
|
enum Button {
|
||||||
|
B = 0x1,
|
||||||
|
Y = 0x2,
|
||||||
|
Select = 0x4,
|
||||||
|
Start = 0x8,
|
||||||
|
Up = 0x10,
|
||||||
|
Down = 0x20,
|
||||||
|
Left = 0x40,
|
||||||
|
Right = 0x80,
|
||||||
|
A = 0x100,
|
||||||
|
X = 0x200,
|
||||||
|
LeftShoulder = 0x400,
|
||||||
|
RightShoulder = 0x800
|
||||||
|
};
|
||||||
|
|
||||||
|
Gamepad(uint8_t latch, uint8_t clock, uint8_t data);
|
||||||
|
|
||||||
|
bool isPressed(Button button);
|
||||||
|
bool isPressedLast(Button button);
|
||||||
|
uint16_t getState();
|
||||||
|
uint16_t getLastState();
|
||||||
|
|
||||||
|
private:
|
||||||
|
uint16_t readCon();
|
||||||
|
|
||||||
|
uint16_t lastState = 0;
|
||||||
|
|
||||||
|
uint8_t latch;
|
||||||
|
uint8_t clock;
|
||||||
|
uint8_t data;
|
||||||
|
};
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
{
|
||||||
|
"name": "SNES-Gamepad",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "Read SNES-Gamepad",
|
||||||
|
"keywords": "shift, register, gamepad, snes",
|
||||||
|
"repository":
|
||||||
|
{
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://git.kleiax.de/PlatformIO-Libs/SNES-Gamepad.git"
|
||||||
|
},
|
||||||
|
"authors":
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"name": "Alexander Klein",
|
||||||
|
"email": "alex@kleiax.de",
|
||||||
|
"url": "https://www.kleiax.de/contact"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"license": "MIT",
|
||||||
|
"homepage": "https://www.kleiax.de/",
|
||||||
|
"frameworks": "*",
|
||||||
|
"platforms": "*"
|
||||||
|
}
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
#include "gamepad.h"
|
||||||
|
|
||||||
|
Gamepad::Gamepad(uint8_t latch, uint8_t clock, uint8_t data){
|
||||||
|
this->latch = latch;
|
||||||
|
this->clock = clock;
|
||||||
|
this->data = data;
|
||||||
|
|
||||||
|
pinMode(latch, OUTPUT);
|
||||||
|
digitalWrite(latch, LOW);
|
||||||
|
|
||||||
|
pinMode(clock, OUTPUT);
|
||||||
|
digitalWrite(clock, HIGH);
|
||||||
|
|
||||||
|
pinMode(data, OUTPUT);
|
||||||
|
digitalWrite(data, HIGH);
|
||||||
|
pinMode(data, INPUT);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t Gamepad::getState(){
|
||||||
|
return this->readCon();
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t Gamepad::readCon(){
|
||||||
|
uint16_t res = 0;
|
||||||
|
|
||||||
|
digitalWrite(this->latch, HIGH);
|
||||||
|
delayMicroseconds(12);
|
||||||
|
digitalWrite(this->latch, LOW);
|
||||||
|
delayMicroseconds(6);
|
||||||
|
|
||||||
|
for (uint8_t i = 0; i < NUM_KEYS; i++){
|
||||||
|
digitalWrite(this->clock, LOW);
|
||||||
|
delayMicroseconds(6);
|
||||||
|
res |= (!digitalRead(this->data) << i);
|
||||||
|
digitalWrite(this->clock, HIGH);
|
||||||
|
delayMicroseconds(6);
|
||||||
|
}
|
||||||
|
|
||||||
|
lastState = res;
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Gamepad::isPressed(Button button) {
|
||||||
|
if ((uint16_t) button & this->readCon())
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Gamepad::isPressedLast(Button button) {
|
||||||
|
if ((uint16_t) button & this->lastState)
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user