I emptied the main ino. It is almost a empty setup with empty loop, so I definitely think the problem comes from the classes (they are not used anymore in the main, and the result is still the same). Here is the SRTmouse.h :
#ifndef SRTmouse
#define SRTmouse
#include <Mouse.h>
class SRTMouse_
{
private:
int XMousePin;
int YMousePin;
int SwitchMousePin;
int analogcenter;
int threshold ;
bool onlyShowValue; //use this to calibrate the joystick. Disables the mouse behaviour.
bool invertX; //invert X axis. Default is false.
bool invertY; //invert Y axis. Default is false.
bool invertXY; //invert X and Y axis. Default is false
int thresholdUser;
int MouseSensitivity;
bool keyPressed = false;
unsigned long keyPressedTime =0;
unsigned keyPressedDelay=100;
unsigned delayNextPress = 300;
bool MouseMode = true;
unsigned long lastMove =0;
void Arrow(unsigned long currentMillis);
protected:
bool mouseMode = true;
public:
SRTMouse_(
int XMousePinUser,
int YMousePinUser,
int SwitchMousePinUser,
bool onlyShowValueUser, //use this to calibrate the joystick. Disables the mouse behaviour.
bool invertXUser, //invert X axis. Default is false.
bool invertYUser, //invert Y axis. Default is false.
bool invertXYUser, //invert X and Y axis. Default is false
int thresholdUser,
int MouseSensitivityUser);
void set();
void begin();
bool getMouseMode();
bool lastClickState = false;
unsigned int startedToClick = 0;
int configMouseDelay = 300;
unsigned clickPressed = 15;
unsigned long lastClick = 0;
bool setAction(long currentmillis);
void setMouse(bool sendData, unsigned long currentmillis);
int xReading, yReading;
int readAxis(int thisAxis
);
};
#endif
And the SRTmouse.cpp :
#include "SRTmouse.h"
//#include <WProgram.h>
#include <Mouse.h>
#define TopSpeed 5
#include <Keyboard.h>
//v1.1
bool SRTMouse_::getMouseMode(){
return mouseMode;
}
SRTMouse_::SRTMouse_(
int XMousePinUser,
int YMousePinUser,
int SwitchMousePinUser,
bool onlyShowValue, //use this to calibrate the joystick. Disables the mouse behaviour.
bool invertX, //invert X axis. Default is false.
bool invertY, //invert Y axis. Default is false.
bool invertXY,
int thresholdUser,
int MouseSensitivityUser
){
XMousePin=XMousePinUser;
YMousePin=YMousePinUser;
SwitchMousePin=SwitchMousePinUser;
threshold = thresholdUser;
MouseSensitivity =MouseSensitivityUser;
startedToClick = 0;
configMouseDelay = 400;
}
void SRTMouse_::begin(){
pinMode(XMousePin, INPUT);
pinMode(YMousePin, INPUT);
pinMode(SwitchMousePin, INPUT_PULLUP);
Mouse.begin();
Keyboard.begin();
}
bool SRTMouse_::setAction(long time){
return true;
}
int SRTMouse_::readAxis(int thisAxis) {
int reading = analogRead(thisAxis);
if (abs(reading - SRTMouse_::analogcenter) < SRTMouse_::threshold) {
reading = analogcenter;
}
reading = map(reading, 0, 1023, 0, SRTMouse_::MouseSensitivity);
int distance = reading - SRTMouse_::MouseSensitivity / 2;
if (distance == SRTMouse_::MouseSensitivity / 2) {
distance = distance + TopSpeed;
}
if (distance == -SRTMouse_::MouseSensitivity / 2) {
distance = distance - TopSpeed;
}
return distance;
}
void SRTMouse_::Arrow(unsigned long currentMillis){
int Xreading = analogRead(XMousePin) - 512;
int Yreading = analogRead(YMousePin) - 512;
if (invertXY) {
Xreading = analogRead(YMousePin) - 512;
Yreading = analogRead(XMousePin) - 512;
}
if (invertY) {
Yreading = map(Yreading, -512, 511, 511, -512);
}
if (abs(Xreading) < threshold) {
Xreading = 0;
}
if (abs(Yreading) < threshold) {
Yreading = 0;
}
Xreading = 0.5 * (Xreading - Yreading);
Yreading = 0.5 * (Xreading + Yreading);
if (currentMillis - keyPressedTime > keyPressedDelay) {
Keyboard.releaseAll();
}
if (Xreading == Yreading) {
return;
}
if (currentMillis - keyPressedTime > delayNextPress) {
keyPressed = false;
}
if (!keyPressed && !onlyShowValue) {
if (Xreading > 0) {
if (Yreading > 0) {
if (invertX) {
Keyboard.press(KEY_LEFT_ARROW);
}
else {
Keyboard.press(KEY_RIGHT_ARROW);
}
keyPressed = true;
keyPressedTime = currentMillis;
setAction(currentMillis);
}
else {
if (!invertY) {
Keyboard.press(KEY_UP_ARROW);
}
else {
Keyboard.press(KEY_DOWN_ARROW);
}
keyPressed = true;
keyPressedTime = currentMillis;
setAction(currentMillis);
}
}
else {
if (Yreading > 0) {
if (!invertY) {
Keyboard.press(KEY_DOWN_ARROW);
}
else {
Keyboard.press(KEY_UP_ARROW);
}
keyPressed = true;
keyPressedTime = currentMillis;
setAction(currentMillis);
}
else {
if (invertX) {
Keyboard.press(KEY_RIGHT_ARROW);
}
else {
Keyboard.press(KEY_LEFT_ARROW);
}
keyPressed = true;
keyPressedTime = currentMillis;
SRTMouse_::setAction(currentMillis);
}
}
}
}
void SRTMouse_::setMouse(bool sendData, unsigned long currentMillis){
if (!invertXY) {
xReading = readAxis(SRTMouse_::XMousePin);
yReading = readAxis(SRTMouse_::YMousePin);
}
else {
xReading = readAxis(SRTMouse_::YMousePin);
yReading = readAxis(SRTMouse_::XMousePin);
}
if (invertX) {
xReading = map(xReading, -MouseSensitivity, MouseSensitivity, MouseSensitivity, -MouseSensitivity);
}
if (invertY) {
yReading = map(yReading, -MouseSensitivity, MouseSensitivity, MouseSensitivity, -MouseSensitivity);
}
if (getMouseMode() && !onlyShowValue) {
if (currentMillis - lastMove > 20) { //20 is the refreshRate
Mouse.move(xReading, yReading, 0);
lastMove = currentMillis;
}
}
else {
SRTMouse_::Arrow(currentMillis);
}
if (sendData) {
if (SRTMouse_::getMouseMode()) {
Serial.print("Mouse Mode. ");
}
else {
Serial.print("Arrow Mode. ");
}
Serial.print("Mouse Position : ");
Serial.print(analogRead(XMousePin));
Serial.print(", ");
Serial.print(analogRead(YMousePin));
if (!digitalRead(SwitchMousePin)) {
}
Serial.println(".");
Serial.print(startedToClick);
}
if (!digitalRead(SwitchMousePin) && lastClickState == false) { //si on est enfoncé alors qu'avant on ne l'était pas, on note le temps de départ
startedToClick = currentMillis;
lastClickState = true;
}
if (digitalRead(SwitchMousePin) && lastClickState == true) { //si on détecte un relâchement
if ( currentMillis - startedToClick > configMouseDelay) { // si on était enfoncé depuis longtemps :
mouseMode = !mouseMode;
Keyboard.releaseAll();
}
else {if(!onlyShowValue){ // si on n'était pas enfoncé depuis longtemps :
if (mouseMode) {
Mouse.press();
}
else {
Keyboard.press(KEY_RETURN);
}}
lastClick = currentMillis;
}
setAction(currentMillis);
lastClickState = false;
}
if (currentMillis - lastClick > clickPressed) {
if (mouseMode) {
Mouse.release();
}
else {
Keyboard.release(KEY_RETURN);
}
}
}