/*
  ZenDrive.h

  Copyright (c) 2021, Valentin Boulanger

  This library is a part of the ZenDrive simulator firmware.
  Version : 1.0.0
*/

#ifndef ZENDRIVE_h
#define ZENDRIVE_h

#include "HID.h"

#if ARDUINO < 10606
#error The ZenDrive library requires Arduino IDE 1.6.6 or greater. Please update your IDE.
#endif

#if ARDUINO > 10606
#if !defined(USBCON)
#error The ZenDrive library can only be used with a USB MCU (e.g. Arduino Leonardo, Arduino Micro, etc.).
#endif
#endif

#if !defined(_USING_HID)

#warning "Using legacy HID core (non pluggable)"

#else

//================================================================================
//================================================================================
//  ZenDrive Simulator (Gamepad)

class ZenDrive_
{
private:

  // Gearshift module
  uint8_t  speeds;                    // (NEUTRAL;SPEED1;SPEED2;SPEED3;SPEED4;SPEED5;SPEED6;SPEEDR)
	uint8_t	 handbrake;

  //Pedals module
	uint8_t	 clutch;
	uint8_t	 brake;
	uint8_t	 accelerator;

  //Steering wheel module
	uint16_t	 wheelCommands;             // (BLINKER LEFT;BLINKER RIGHT;WARNING;LIGHTS;HEAD LIGHTS;FOGLIGHTS;STARTER;HORN;CRUISE;CRUISE +;CRUISE -;NOT USED;NOT USED;NOT USED;NOT USED;NOT USED)
  int8_t   steering;

public:
	ZenDrive_();

	void begin();
	void end();

  // Gearshift module
  bool gearshiftNeedRefresh = false;
  int currentSpeed = 0;
  void switchNeutral();
  void switchSpeed1();
  void switchSpeed2();
  void switchSpeed3();
  void switchSpeed4();
  void switchSpeed5();
  void switchSpeed6();
  void switchSpeedR();
	void setHandbrake(int8_t value);

  // Pedals module
  bool pedalsNeedRefresh = false;
	void setClutch(int8_t value);
	void setBrake(int8_t value);
	void setAccelerator(int8_t value);

  // Steering wheel module
  bool wheelNeedRefresh = false;
  bool isBlinkerLeft = false;
  void setBlinkerLeft(bool value);
  bool isBlinkerRight = false;
  void setBlinkerRight(bool value);
  bool isWarning = false;
  void setWarning(bool value);
  bool isLights = false;
  bool isRoadLights = false;
  void switchLightsOn();
  void switchRoadLights();
  void switchLightsOff();
  bool isHeadLights = false;
  void setHeadLights(bool value);
  bool isFogLights = false;
  void setFogLights(bool value);
  bool isStarter = false;
  void setStarter(bool value);
  bool isHorn = false;
  void setHorn(bool value);
  void activeCruise();
  void increaseCruise();
  void decreaseCruise();
	void setDirection(uint8_t value);

	void sendGearshiftStates();
  void sendPedalsStates();
  void sendWheelStates();
};
extern ZenDrive_ ZenDrive;

#endif
#endif
