#include <SPI.h>
#include <Wire.h>
#include <Entropy.h>
#include <array>
#include "DFRobot_GestureFaceDetection.h"
#include "eyes/eyes.h"
#include "eyes/EyeController.h"
#include "GC9A01A_Display.h"
#define NUM_EYES 1 // If only 1 eye, use the first SPI bus for the eye
#define DEVICE_ID 0x72 // Sensor gfd ID
DFRobot_GestureFaceDetection_I2C gfd(DEVICE_ID);
#include "eyes/240x240/hazel.h"
#define NUM_EYE_PATTERNS 1
#define EYE_PATTERN(left, right) { left }
std::array<std::array<EyeDefinition, NUM_EYES>, NUM_EYE_PATTERNS> eyeDefinitions{{
EYE_PATTERN (hazel::eye, hazel::eye),
}};
GC9A01A_Config eyeInfo[] = { // Define the pins used for each display
// CS DC MOSI SCK RST ROT MIRROR USE_FB ASYNC
{10, 9, 11, 13, 8, 0, true, true, true}, // left eye -> mirror: true
};
constexpr uint32_t EYE_DURATION_MS{3000};
constexpr uint32_t SPI_SPEED{30000000};
EyeController<NUM_EYES, GC9A01A_Display> *eyes{};
uint16_t eyeNr = 0;
uint16_t faceNr = 0;
uint16_t faceScore = 0;
float faceX = 0.0f;
float faceY = 0.0f;
//------------------------------------------------
void setup() {
delay(2000);
Serial.begin(115200);
Entropy.Initialize();
randomSeed(Entropy.random());
gfd.begin(&Wire);
gfd.setFaceDetectThres(60);
gfd.setGestureDetectThres(60);
gfd.setDetectThres(100);
initEyes(true, true, false); // bool: autoMove, autoBlink, staticPupils
}
//------------------------------------------------
void loop() {
eyes->updateDefinitions( eyeDefinitions.at(eyeNr) );
faceNr = gfd.getFaceNumber();
faceScore = gfd.getFaceScore();
faceX = gfd.getFaceLocationX(); // gfd-X-Coord: hard left = 0, hard right = 640
faceY = gfd.getFaceLocationY(); // gfd-Y-Coord: fully up = 0, fully down = 640
if ( faceNr > 0 && faceScore > 50 ) {
eyes->setAutoMove(false);
float targetX = (faceX-320.0f)/320.0f; // the target x location for the eye(s), in the range -1.0 (hard left) to 1.0 (hard right)
float targetY = (faceY-320.0f)/320.0f; // the target y location for the eye(s), in the range -1.0 (fully up) to 1.0 (fully down)
Serial.print ("targetX: ");
Serial.print (targetX);
Serial.print (" targetY: ");
Serial.println (targetY);
eyes->setTargetPosition(targetX,targetY);
}
else { eyes->setAutoMove(true); }
eyes->renderFrame();
}