44#ifdef ARDUINO_ESP32P4_DEV
46#define IO_EXPANDER_3V3_POWER_EN 0
47#define IO_EXPANDER_5V0_POWER_EN 6
48#define IO_EXPANDER_P4_VCCA_POWER_EN 8
58 Serial.println(
"╔══════════════════════════════════════════╗");
59 Serial.println(
"║ AW86224 Haptic Driver Test ║");
60 Serial.println(
"╚══════════════════════════════════════════╝");
66 Serial.println(
"\n[TEST] Device Capabilities");
69 Serial.print(
" F0 Calibration: "); Serial.println(cap.hasF0Calibration ?
"Yes" :
"No");
70 Serial.print(
" VBAT Compensation: "); Serial.println(cap.hasVbatCompensation ?
"Yes" :
"No");
71 Serial.print(
" RTP Mode: "); Serial.println(cap.hasRTP ?
"Yes" :
"No");
72 Serial.print(
" Sequence: "); Serial.println(cap.hasSequence ?
"Yes" :
"No");
73 Serial.print(
" Break Effect: "); Serial.println(cap.hasBreakEffect ?
"Yes" :
"No");
74 Serial.print(
" Continuous Mode: "); Serial.println(cap.hasContinuousMode ?
"Yes" :
"No");
75 Serial.print(
" Max Effects: "); Serial.println(cap.maxEffectCount);
76 Serial.print(
" Max Sequence: "); Serial.println(cap.maxSequenceLength);
77 Serial.print(
" Max Duration: "); Serial.println(cap.maxDurationMs == 0 ?
"Unlimited" : String(cap.maxDurationMs));
78 Serial.println(
"[OK] Done");
83 Serial.println(
"\n=== Driver Initialization ===");
84 Serial.print(
"Wire: SDA="); Serial.print(
SENSOR_SDA); Serial.print(
", SCL="); Serial.println(
SENSOR_SCL);
86#ifdef ARDUINO_ESP32P4_DEV
89 SensorWireHelper::dumpDevices(Wire1);
93 Serial.println(
"Failed to find XL9555 - check your wiring!");
97 Serial.println(
"Sensor Expander Initialized");
109 SensorWireHelper::dumpDevices(Wire);
113 Serial.println(
"[FATAL] AW86224 init failed!");
114 while (1) delay(1000);
117 Serial.println(
"[OK] Driver initialized");
121 Serial.print(
" F0: "); Serial.print(
haptic.
getF0()); Serial.println(
" Hz");
122 Serial.print(
" VBAT: "); Serial.print(
haptic.
getVbat()); Serial.println(
" mV");
129 Serial.println(
"\n[TEST] playEffect() - HapticBase Interface");
130 Serial.println(
" Playing effect 1...");
133 Serial.println(
"[OK] Done");
138 Serial.println(
"\n[TEST] playEffect() - All Waveforms");
140 Serial.print(
" Effect "); Serial.print(
i); Serial.println(
"...");
144 Serial.println(
"[OK] Done");
149 Serial.println(
"\n[TEST] shortVibration()");
150 Serial.println(
" index=1, gain=0x80, loop=1");
152 Serial.println(
"[OK] Done");
157 Serial.println(
"\n[TEST] shortVibration() - Different Gains");
159 uint8_t gains[] = {0x20, 0x40, 0x60, 0x80, 0xA0, 0xC0, 0xFF};
160 for (
size_t i = 0;
i <
sizeof(gains);
i++) {
161 Serial.print(
" Gain 0x"); Serial.print(gains[
i], HEX); Serial.println(
"...");
165 Serial.println(
"[OK] Done");
170 Serial.println(
"\n[TEST] shortVibration() - Loop Count");
172 Serial.print(
" Loop "); Serial.print(
loop); Serial.println(
"...");
176 Serial.println(
"[OK] Done");
181 Serial.println(
"\n[TEST] continuousVibration() - HapticBase Interface");
182 Serial.println(
" Using unified interface: 2000ms blocking");
185 Serial.println(
"[OK] Done");
190 Serial.println(
"\n[TEST] longVibration() - Blocking Mode");
191 Serial.println(
" index=2, gain=0x80, duration=2000ms, blocking=true");
192 uint32_t start = millis();
194 uint32_t elapsed = millis() - start;
195 Serial.print(
"[OK] Done (elapsed: "); Serial.print(elapsed); Serial.println(
" ms)");
200 Serial.println(
"\n[TEST] longVibration() - Non-Blocking Mode");
201 Serial.println(
" index=2, gain=0x80, duration=5000ms, blocking=false");
203 Serial.println(
" Started! Use 's' to stop or wait...");
208 Serial.println(
"\n[TEST] Waveform Switching (Non-Blocking)");
209 Serial.println(
" Rapid switching between waveforms during vibration");
214 for (
int i = 0;
i < 3;
i++) {
217 Serial.print(
" Switch to waveform "); Serial.print(w); Serial.println(
"...");
224 Serial.println(
" Stopping...");
227 Serial.println(
"[OK] Done");
232 Serial.println(
"\n[TEST] setSequence() - HapticBase Interface");
237 Serial.println(
" Sequence set: [1, 2, 0]");
238 Serial.println(
" Playing sequence...");
241 Serial.println(
"[OK] Done");
246 Serial.println(
"\n[TEST] stop() - HapticBase Interface");
248 Serial.println(
" Started 5s vibration...");
250 Serial.println(
" Calling stop()...");
252 Serial.print(
" isPlaying: "); Serial.println(
haptic.
isPlaying() ?
"Yes" :
"No");
253 Serial.println(
"[OK] Done");
258 Serial.println(
"\n[TEST] getStatus() - HapticBase Interface");
260 const char *statusStr =
"UNKNOWN";
269 Serial.print(
" Status: "); Serial.println(statusStr);
270 Serial.println(
"[OK] Done");
275 Serial.println(
"\n[TEST] Intensity Sweep");
276 Serial.println(
" Gradually increasing intensity");
278 for (uint16_t gain = 0x20; gain <= 0xFF; gain += 0x20) {
279 Serial.print(
" Gain: 0x"); Serial.println(gain, HEX);
283 Serial.println(
"[OK] Done");
288 Serial.println(
"\n=== Auto Demo Sequence ===");
291 Serial.println(
"\n[1/12] Basic playEffect()...");
295 Serial.println(
"\n[2/12] Basic short vibration...");
299 Serial.println(
"\n[3/12] All waveforms (short)...");
301 Serial.print(
" Wave "); Serial.print(
i); Serial.println(
"...");
306 Serial.println(
"\n[4/12] Continuous vibration (HapticBase)...");
309 Serial.println(
"\n[5/12] Long vibration (2s)...");
312 Serial.println(
"\n[6/12] Intensity sweep...");
315 Serial.println(
"\n[7/12] Non-blocking long vibration (3s)...");
317 uint32_t start = millis();
323 Serial.println(
" Stopped by demo");
326 Serial.println(
"\n[8/12] Sequence test...");
330 Serial.println(
"\n[9/12] Status check...");
333 Serial.println(
"\n[10/12] Rapid waveform switching...");
336 Serial.println(
"\n[11/12] Gain test...");
339 Serial.println(
"\n[12/12] Final short vibration...");
342 Serial.println(
"\n=== Demo Complete ===");
347 Serial.println(
"\n========== Commands ==========");
348 Serial.println(
"Initialization:");
349 Serial.println(
" i - Re-initialize driver");
351 Serial.println(
"HapticBase Interface:");
352 Serial.println(
" e - playEffect(1)");
353 Serial.println(
" E - playEffect() all waveforms");
354 Serial.println(
" c - continuousVibration()");
355 Serial.println(
" S - setSequence() test");
356 Serial.println(
" p - stop() test");
357 Serial.println(
" t - getStatus()");
359 Serial.println(
"AW86224 Extended:");
360 Serial.println(
" 1 - Short vibration");
361 Serial.println(
" a - All waveforms (short)");
362 Serial.println(
" g - Different gains test");
363 Serial.println(
" l - Loop count test (1-5)");
364 Serial.println(
" 2 - Long vibration (blocking, 2s)");
365 Serial.println(
" L - Long vibration all waveforms");
366 Serial.println(
" n - Non-blocking long vibration (5s)");
367 Serial.println(
" w - Waveform switching");
369 Serial.println(
"Special Tests:");
370 Serial.println(
" x - Sweep: gradual intensity increase");
371 Serial.println(
" d - Auto demo sequence");
373 Serial.println(
"Info:");
374 Serial.println(
" k - Show capabilities");
375 Serial.println(
" v - Read voltage");
376 Serial.println(
" f - Read F0");
377 Serial.println(
" h - Help (this message)");
378 Serial.println(
"==============================");
383 Serial.begin(115200);
390 Serial.println(
"\n========== Quick Test ==========");
391 Serial.println(
"Running auto demo sequence...");
404 if (Serial.available()) {
405 char cmd = Serial.read();
449 Serial.print(
" Waveform "); Serial.print(
i); Serial.println(
", 1000ms...");
453 Serial.println(
"[OK] Done");
468 Serial.print(
"[VBAT] "); Serial.print(
haptic.
getVbat()); Serial.println(
" mV");
471 Serial.print(
"[F0] "); Serial.print(
haptic.
getF0()); Serial.println(
" Hz");
479 if (
cmd !=
'\n' &&
cmd !=
'\r' &&
cmd !=
' ') {
480 Serial.print(
"[?] Unknown: '"); Serial.print(
cmd); Serial.print(
" (0x"); Serial.print(
cmd, HEX); Serial.println(
")");
HapticStatus
Vibration playback status.
@ PLAYING
Currently playing.
@ CALIBRATING
Calibrating.
@ LRA
Linear Resonant Actuator.
void testShortVibrationGain()
void testShortVibrationLoop()
void testWaveformSwitching()
void testShortVibration()
void testIntensitySweep()
void testLongVibrationNonBlocking()
HapticDriver_AW86224 haptic
void testContinuousVibration()
void testLongVibrationBlocking()
AW86224/86225 Haptic Driver Class.
bool setSequence(uint8_t slot, HapticEffectId effect) override
Set a waveform in the sequence.
uint8_t getRamNum() const
Get number of loaded waveforms.
bool isPlaying() const override
Check if haptic is currently playing.
bool setGain(uint8_t gain) override
Set the gain/amplitude (0x00 to 0xFF).
uint32_t getVbat() override
Get the battery voltage.
bool stop() override
Stop haptic playback immediately.
uint32_t getF0() const override
Get the measured resonant frequency (F0).
int8_t getF0CaliData() const
Get F0 calibration data.
void vibrationUpdate() override
Update vibration state (for non-blocking mode).
void continuousVibration(uint32_t duration_ms, bool blocking=true) override
Play a continuous vibration for specified duration.
HapticActuatorType getActuatorType() const override
Get the actuator type.
bool playEffect(HapticEffectId effect) override
Play a haptic effect.
HapticStatus getStatus() const override
Get current playback status.
bool clearSequence() override
Clear the waveform sequence.
void shortVibration(uint8_t index, uint8_t gain=0x80, uint8_t loop=1)
Play a short vibration effect.
HapticCapabilities getCapabilities() const override
Get device capabilities.
const char * getChipName() const override
Get the chip name.
void longVibration(uint8_t index, uint8_t gain=0x80, uint32_t duration_ms=1000, bool blocking=true)
Play a long continuous vibration effect.
uint8_t getChipID() const override
Get the chip ID.
bool playSequence() override
Play the waveform sequence.
bool begin(SensorCommCustom::CustomCallback callback, uint8_t addr)
Initialize the sensor using custom callback interface.
bool begin(SensorCommCustom::CustomCallback cb, SensorCommCustomHal::CustomHalCallback hal_cb, uint8_t addr)
Initialize the sensor using custom callback interface.
void pinMode(uint8_t pin, uint8_t mode)
Set the direction of a GPIO pin.
void digitalWrite(uint8_t pin, bool value)
Write a digital value to an output pin.
Concrete driver for the XL9555 16‑bit I2C GPIO expander.
IoExpanderPCA9570 expander