Trim down paj7620 library. A lot.

This commit is contained in:
Neale Pickett 2020-12-08 21:34:55 -07:00
parent 15302ef6d8
commit 7c167d218d
2 changed files with 499 additions and 0 deletions

374
paj7620.cpp Normal file
View File

@ -0,0 +1,374 @@
/*
* paj7620.cpp
* A library for Grove-Guesture 1.0
*
* Copyright (c) 2015 seeed technology inc.
* Website : www.seeed.cc
* Author : Wuruibin & Xiangnan
* Modified Time: June 2015
*
* The MIT License (MIT)
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
#include "paj7620.h"
#include <Arduino.h>
#include <Wire.h>
/** neale 2020-12-08
*
* I went through these registers to see which ones were actually required to make the thing work.
* It wasn't very many.
* This does sort of screw with the accuracy of the proximity detection,
* I think that's somewhere at the start of bank 1.
* There may be other stuff this screws with that I'm not testing.
*
* Notably, though, a lot of these values were the defaults specified in the datasheet.
* I think somebody just copied everything over and nobody's ever bothered to check what's actually needed.
* Well, I'm almost out of RAM, so I checked.
*/
unsigned char initRegisterArray[][2] = {
/* Bank 0 */
// {0xEF, 0x00}, // Select bank 0
// {0x32, 0x29},
// {0x33, 0x01},
// {0x34, 0x00},
// {0x35, 0x01},
// {0x36, 0x00},
// {0x37, 0x07},
// {0x38, 0x17},
// {0x39, 0x06},
// {0x3A, 0x12},
// {0x3F, 0x00},
// {0x40, 0x02},
// {0x41, 0xFF},
// {0x42, 0x01},
// {0x46, 0x2D},
// {0x47, 0x0F},
// {0x48, 0x3C},
// {0x49, 0x00},
// {0x4A, 0x1E},
// {0x4B, 0x00},
// {0x4C, 0x20},
// {0x4D, 0x00},
// {0x4E, 0x1A},
// {0x4F, 0x14},
// {0x50, 0x00},
// {0x51, 0x10},
// {0x52, 0x00},
// {0x5C, 0x02},
// {0x5D, 0x00},
// {0x5E, 0x10},
// {0x5F, 0x3F},
// {0x60, 0x27},
// {0x61, 0x28},
// {0x62, 0x00},
// {0x63, 0x03},
// {0x64, 0xF7},
// {0x65, 0x03},
// {0x66, 0xD9},
// {0x67, 0x03},
// {0x68, 0x01},
// {0x69, 0xC8},
// {0x6A, 0x40},
// {0x6D, 0x04},
// {0x6E, 0x00},
// {0x6F, 0x00},
// {0x70, 0x80},
// {0x71, 0x00},
// {0x72, 0x00},
// {0x73, 0x00},
// {0x74, 0xF0},
// {0x75, 0x00},
// {0x80, 0x42},
// {0x81, 0x44},
// {0x82, 0x04},
// {0x83, 0x20},
// {0x84, 0x20},
// {0x85, 0x00},
// {0x86, 0x10},
// {0x87, 0x00},
// {0x88, 0x05},
// {0x89, 0x18},
// {0x8A, 0x10},
// {0x8B, 0x01},
// {0x8C, 0x37},
// {0x8D, 0x00},
// {0x8E, 0xF0},
// {0x8F, 0x81},
// {0x90, 0x06},
// {0x91, 0x06},
// {0x92, 0x1E},
// {0x93, 0x0D},
// {0x94, 0x0A},
// {0x95, 0x0A},
// {0x96, 0x0C},
// {0x97, 0x05},
// {0x98, 0x0A},
// {0x99, 0x41},
// {0x9A, 0x14},
// {0x9B, 0x0A},
// {0x9C, 0x3F},
// {0x9D, 0x33},
// {0x9E, 0xAE},
// {0x9F, 0xF9},
// {0xA0, 0x48},
// {0xA1, 0x13},
// {0xA2, 0x10},
// {0xA3, 0x08},
// {0xA4, 0x30},
// {0xA5, 0x19},
// {0xA6, 0x10},
// {0xA7, 0x08},
// {0xA8, 0x24},
// {0xA9, 0x04},
// {0xAA, 0x1E},
// {0xAB, 0x1E},
// {0xCC, 0x19},
// {0xCD, 0x0B},
// {0xCE, 0x13},
// {0xCF, 0x64},
// {0xD0, 0x21},
// {0xD1, 0x0F},
// {0xD2, 0x88},
// {0xE0, 0x01},
// {0xE1, 0x04},
// {0xE2, 0x41},
// {0xE3, 0xD6},
// {0xE4, 0x00},
// {0xE5, 0x0C},
// {0xE6, 0x0A},
// {0xE7, 0x00},
// {0xE8, 0x00},
// {0xE9, 0x00},
// {0xEE, 0x07},
/* Bank 1 */
{0xEF, 0x01}, // Select bank 1
// {0x00, 0x1E},
// {0x01, 0x1E},
// {0x04, 0x02}, // Setting this inverts the notion of left and right
// {0x05, 0x00},
// {0x06, 0xB0},
// {0x07, 0x04},
// {0x08, 0x0D},
// {0x09, 0x0E},
// {0x0A, 0x9C},
// {0x0B, 0x04},
// {0x0C, 0x05},
// {0x0D, 0x0F},
// {0x0E, 0x02},
// {0x0F, 0x12},
// {0x10, 0x02},
// {0x11, 0x02},
// {0x12, 0x00},
// {0x13, 0x01},
// {0x14, 0x05},
// {0x15, 0x07},
// {0x16, 0x05},
// {0x17, 0x07},
// {0x18, 0x01},
// {0x19, 0x04},
// {0x1A, 0x05},
// {0x1B, 0x0C},
// {0x1C, 0x2A},
// {0x1D, 0x01},
// {0x1E, 0x00},
// {0x21, 0x00},
// {0x22, 0x00},
// {0x23, 0x00},
// {0x25, 0x01},
// {0x26, 0x00},
// {0x27, 0x39},
// {0x28, 0x7F},
// {0x29, 0x08},
// {0x30, 0x03},
// {0x31, 0x00},
// {0x32, 0x1A},
// {0x33, 0x1A},
// {0x34, 0x07},
// {0x35, 0x07},
// {0x36, 0x01},
// {0x37, 0xFF},
// {0x38, 0x36},
// {0x39, 0x07},
// {0x3A, 0x00},
// {0x3E, 0xFF},
// {0x3F, 0x00},
// {0x40, 0x77},
// {0x41, 0x40},
// {0x42, 0x00},
// {0x43, 0x30},
// {0x44, 0xA0},
// {0x45, 0x5C},
// {0x46, 0x00},
// {0x47, 0x00},
// {0x48, 0x58},
// {0x4A, 0x1E},
// {0x4B, 0x1E},
// {0x4C, 0x00},
// {0x4D, 0x00},
// {0x4E, 0xA0},
// {0x4F, 0x80},
// {0x50, 0x00},
// {0x51, 0x00},
// {0x52, 0x00},
// {0x53, 0x00},
// {0x54, 0x00},
// {0x57, 0x80},
// {0x59, 0x10},
// {0x5A, 0x08},
// {0x5B, 0x94},
// {0x5C, 0xE8},
// {0x5D, 0x08},
// {0x5E, 0x3D},
// {0x5F, 0x99},
// {0x60, 0x45},
// {0x61, 0x40},
// {0x63, 0x2D},
// {0x64, 0x02},
// {0x65, 0x96},
// {0x66, 0x00},
// {0x67, 0x97},
// {0x68, 0x01},
// {0x69, 0xCD},
// {0x6A, 0x01},
// {0x6B, 0xB0},
// {0x6C, 0x04},
// {0x6D, 0x2C},
// {0x6E, 0x01},
// {0x6F, 0x32},
// {0x71, 0x00},
{0x72, 0x01},
// {0x73, 0x35},
// {0x74, 0x00},
// {0x75, 0x33},
// {0x76, 0x31},
// {0x77, 0x01},
// {0x7C, 0x84},
// {0x7D, 0x03},
// {0x7E, 0x01},
};
/****************************************************************
* Function Name: paj7620WriteReg
* Description: PAJ7620 Write reg cmd
* Parameters: addr:reg address; cmd:function data
* Return: error code; success: return 0
****************************************************************/
uint8_t paj7620WriteReg(uint8_t addr, uint8_t cmd) {
char i = 1;
Wire.beginTransmission(PAJ7620_ID); // start transmission to device
//write cmd
Wire.write(addr); // send register address
Wire.write(cmd); // send value to write
i = Wire.endTransmission(); // end transmission
return i;
}
/****************************************************************
* Function Name: paj7620ReadReg
* Description: PAJ7620 read reg data
* Parameters: addr:reg address;
* qty:number of data to read, addr continuously increase;
* data[]:storage memory start address
* Return: error code; success: return 0
****************************************************************/
uint8_t paj7620ReadReg(uint8_t addr, uint8_t qty, uint8_t data[]) {
uint8_t error;
Wire.beginTransmission(PAJ7620_ID);
Wire.write(addr);
error = Wire.endTransmission();
if (0 != error) {
return error; //return error code
}
Wire.requestFrom((int)PAJ7620_ID, (int)qty);
while (Wire.available()) {
*data = Wire.read();
data++;
}
return 0;
}
/****************************************************************
* Function Name: paj7620SelectBank
* Description: PAJ7620 select register bank
* Parameters: BANK0, BANK1
* Return: none
****************************************************************/
void paj7620SelectBank(bank_e bank) {
switch (bank) {
case BANK0:
paj7620WriteReg(PAJ7620_REGITER_BANK_SEL, PAJ7620_BANK0);
break;
case BANK1:
paj7620WriteReg(PAJ7620_REGITER_BANK_SEL, PAJ7620_BANK1);
break;
default:
break;
}
}
/****************************************************************
* Function Name: paj7620Init
* Description: PAJ7620 REG INIT
* Parameters: none
* Return: error code; success: return 0
****************************************************************/
uint8_t paj7620Init(void) {
//Near_normal_mode_V5_6.15mm_121017 for 940nm
int i = 0;
uint8_t error;
uint8_t data0 = 0, data1 = 0;
//wakeup the sensor
delayMicroseconds(700); //Wait 700us for PAJ7620U2 to stabilize
Wire.begin();
paj7620SelectBank(BANK0);
paj7620SelectBank(BANK0);
error = paj7620ReadReg(0, 1, &data0);
if (error) {
return error;
}
error = paj7620ReadReg(1, 1, &data1);
if (error) {
return error;
}
if ((data0 != 0x20) || (data1 != 0x76)) {
return 0xff;
}
for (i = 0; i < INIT_REG_ARRAY_SIZE; i++) {
paj7620WriteReg(initRegisterArray[i][0], initRegisterArray[i][1]);
}
paj7620SelectBank(BANK0); //gesture flage reg in Bank0
return 0;
}

125
paj7620.h Normal file
View File

@ -0,0 +1,125 @@
/*
* paj7620.h
* A library for Grove-Guesture 1.0
*
* Copyright (c) 2015 seeed technology inc.
* Website : www.seeed.cc
* Author : Wuruibin & Xiangnan
* Modified Time: June 2015
*
* The MIT License (MIT)
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
#include <stdint.h>
#ifndef __PAJ7620_H__
#define __PAJ7620_H__
#define BIT(x) 1 << x
// REGISTER DESCRIPTION
#define PAJ7620_VAL(val, maskbit) ( val << maskbit )
#define PAJ7620_ADDR_BASE 0x00
// REGISTER BANK SELECT
#define PAJ7620_REGITER_BANK_SEL (PAJ7620_ADDR_BASE + 0xEF) //W
// DEVICE ID
#define PAJ7620_ID 0x73
// REGISTER BANK 0
#define PAJ7620_ADDR_SUSPEND_CMD (PAJ7620_ADDR_BASE + 0x3) //W
#define PAJ7620_ADDR_GES_PS_DET_MASK_0 (PAJ7620_ADDR_BASE + 0x41) //RW
#define PAJ7620_ADDR_GES_PS_DET_MASK_1 (PAJ7620_ADDR_BASE + 0x42) //RW
#define PAJ7620_ADDR_GES_PS_DET_FLAG_0 (PAJ7620_ADDR_BASE + 0x43) //R
#define PAJ7620_ADDR_GES_PS_DET_FLAG_1 (PAJ7620_ADDR_BASE + 0x44) //R
#define PAJ7620_ADDR_STATE_INDICATOR (PAJ7620_ADDR_BASE + 0x45) //R
#define PAJ7620_ADDR_PS_HIGH_THRESHOLD (PAJ7620_ADDR_BASE + 0x69) //RW
#define PAJ7620_ADDR_PS_LOW_THRESHOLD (PAJ7620_ADDR_BASE + 0x6A) //RW
#define PAJ7620_ADDR_PS_APPROACH_STATE (PAJ7620_ADDR_BASE + 0x6B) //R
#define PAJ7620_ADDR_PS_RAW_DATA (PAJ7620_ADDR_BASE + 0x6C) //R
// REGISTER BANK 1
#define PAJ7620_ADDR_PS_GAIN (PAJ7620_ADDR_BASE + 0x44) //RW
#define PAJ7620_ADDR_IDLE_S1_STEP_0 (PAJ7620_ADDR_BASE + 0x67) //RW
#define PAJ7620_ADDR_IDLE_S1_STEP_1 (PAJ7620_ADDR_BASE + 0x68) //RW
#define PAJ7620_ADDR_IDLE_S2_STEP_0 (PAJ7620_ADDR_BASE + 0x69) //RW
#define PAJ7620_ADDR_IDLE_S2_STEP_1 (PAJ7620_ADDR_BASE + 0x6A) //RW
#define PAJ7620_ADDR_OP_TO_S1_STEP_0 (PAJ7620_ADDR_BASE + 0x6B) //RW
#define PAJ7620_ADDR_OP_TO_S1_STEP_1 (PAJ7620_ADDR_BASE + 0x6C) //RW
#define PAJ7620_ADDR_OP_TO_S2_STEP_0 (PAJ7620_ADDR_BASE + 0x6D) //RW
#define PAJ7620_ADDR_OP_TO_S2_STEP_1 (PAJ7620_ADDR_BASE + 0x6E) //RW
#define PAJ7620_ADDR_OPERATION_ENABLE (PAJ7620_ADDR_BASE + 0x72) //RW
// PAJ7620_REGITER_BANK_SEL
#define PAJ7620_BANK0 PAJ7620_VAL(0,0)
#define PAJ7620_BANK1 PAJ7620_VAL(1,0)
// PAJ7620_ADDR_SUSPEND_CMD
#define PAJ7620_I2C_WAKEUP PAJ7620_VAL(1,0)
#define PAJ7620_I2C_SUSPEND PAJ7620_VAL(0,0)
// PAJ7620_ADDR_OPERATION_ENABLE
#define PAJ7620_ENABLE PAJ7620_VAL(1,0)
#define PAJ7620_DISABLE PAJ7620_VAL(0,0)
typedef enum {
BANK0 = 0,
BANK1,
} bank_e;
#define GES_LEFT_FLAG PAJ7620_VAL(1,0)
#define GES_RIGHT_FLAG PAJ7620_VAL(1,1)
#define GES_UP_FLAG PAJ7620_VAL(1,2)
#define GES_DOWN_FLAG PAJ7620_VAL(1,3)
#define GES_FORWARD_FLAG PAJ7620_VAL(1,4)
#define GES_BACKWARD_FLAG PAJ7620_VAL(1,5)
#define GES_CLOCKWISE_FLAG PAJ7620_VAL(1,6)
#define GES_COUNT_CLOCKWISE_FLAG PAJ7620_VAL(1,7)
#define GES_WAVE_FLAG PAJ7620_VAL(1,0)
/*
enum {
// REGISTER 0
GES_RIGHT_FLAG = BIT(0),
GES_LEFT_FLAG = BIT(1),
GES_UP_FLAG = BIT(2),
GES_DOWN_FLAG = BIT(3),
GES_FORWARD_FLAG = BIT(4),
GES_BACKWARD_FLAG = BIT(5),
GES_CLOCKWISE_FLAG = BIT(6),
GES_COUNT_CLOCKWISE_FLAG = BIT(7),
//REGISTER 1
GES_WAVE_FLAG = BIT(0),
};
*/
#define INIT_REG_ARRAY_SIZE (sizeof(initRegisterArray)/sizeof(initRegisterArray[0]))
uint8_t paj7620Init(void);
uint8_t paj7620WriteReg(uint8_t addr, uint8_t cmd);
uint8_t paj7620ReadReg(uint8_t addr, uint8_t qty, uint8_t data[]);
void paj7620SelectBank(bank_e bank);
#endif