Library for PAT9125 on L476RG platform

Fork of pat9125_mbed by PixArt Imaging

Committer:
pixus_mbed
Date:
Thu Feb 01 02:21:50 2018 +0000
Revision:
1:4b7c15d9c864
Parent:
0:3459848530ee
Merge pixart_lcm to pat9125_mbed.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
pixus_mbed 0:3459848530ee 1
pixus_mbed 0:3459848530ee 2 #include "pat9125_mbed.h"
pixus_mbed 0:3459848530ee 3 #define delay(ms) wait_ms(ms)
pixus_mbed 0:3459848530ee 4
pixus_mbed 0:3459848530ee 5 //define OTS state - X
pixus_mbed 0:3459848530ee 6 #define OTS_ROT_NO_CHANGE 0x00
pixus_mbed 0:3459848530ee 7 #define OTS_ROT_UP 0x01
pixus_mbed 0:3459848530ee 8 #define OTS_ROT_DOWN 0x02
pixus_mbed 0:3459848530ee 9
pixus_mbed 0:3459848530ee 10 //define downscale factor for rotation of shaft
pixus_mbed 0:3459848530ee 11 #define EXPECTED_COUNT_PER_ROUND 360
pixus_mbed 0:3459848530ee 12 #define REAL_AVG_COUNT_PER_ROUND 446 //base on: sensor Reg0x0d=0x65, shaft diameter=2mm, sensor-to-shaft distance=2mm
pixus_mbed 0:3459848530ee 13
pixus_mbed 0:3459848530ee 14 //define OTS state - Y
pixus_mbed 0:3459848530ee 15 #define OTS_BTN_NO_CHANGE 0x00
pixus_mbed 0:3459848530ee 16 #define OTS_BTN_RELEASE 0x01
pixus_mbed 0:3459848530ee 17 #define OTS_BTN_PRESS 0x02
pixus_mbed 0:3459848530ee 18
pixus_mbed 0:3459848530ee 19 #define LOW 0
pixus_mbed 0:3459848530ee 20 #define HIGH 1
pixus_mbed 0:3459848530ee 21 #define digitalRead(pin) *pin
pixus_mbed 0:3459848530ee 22
pixus_mbed 0:3459848530ee 23 static pat9125_mbed_state_s *gp_state ;
pixus_mbed 0:3459848530ee 24
pixus_mbed 0:3459848530ee 25 #define PIN_BTN_L gp_state->pBTN_L
pixus_mbed 0:3459848530ee 26 #define PIN_BTN_R gp_state->pBTN_R
pixus_mbed 0:3459848530ee 27 #define PIN_SEN_MOTION gp_state->pINT
pixus_mbed 0:3459848530ee 28
pixus_mbed 0:3459848530ee 29 #define PIN_RLED gp_state->pRLED
pixus_mbed 0:3459848530ee 30 #define PIN_GLED gp_state->pGLED
pixus_mbed 0:3459848530ee 31 #define digitalWrite(pin,level) *pin = level
pixus_mbed 0:3459848530ee 32 #define LED_RED_ON digitalWrite(PIN_RLED,LOW)
pixus_mbed 0:3459848530ee 33 #define LED_RED_OFF digitalWrite(PIN_RLED,HIGH)
pixus_mbed 0:3459848530ee 34 #define LED_GREEN_ON digitalWrite(PIN_GLED,LOW)
pixus_mbed 0:3459848530ee 35 #define LED_GREEN_OFF digitalWrite(PIN_GLED,HIGH)
pixus_mbed 0:3459848530ee 36 #define attachInterrupt(pin,b,c) //pin->enable_irq()
pixus_mbed 0:3459848530ee 37 #define digitalPinToInterrupt(pin) pin
pixus_mbed 0:3459848530ee 38 #define detachInterrupt(pin) //pin->disable_irq()
pixus_mbed 0:3459848530ee 39 //#define LCM_DisplayString_Reset gp_state->pLCM->LCM_DisplayString_Reset
pixus_mbed 0:3459848530ee 40 //#define LCM_DisplayDecimal(a,b,c,d) gp_state->pLCM->LCM_DisplayDecimal(a,b,c,d)
pixus_mbed 0:3459848530ee 41 //#define LCM_DisplayString(a,b,c) gp_state->pLCM->LCM_DisplayString(a,b,c)
pixus_mbed 0:3459848530ee 42
pixus_mbed 0:3459848530ee 43 #define I2C_RESET gp_state->p_i2c = gp_state->p_i2c->reset(); //workaround for nRF51 mbed
pixus_mbed 0:3459848530ee 44
pixus_mbed 0:3459848530ee 45
pixus_mbed 0:3459848530ee 46 static void LCM_DisplayString(unsigned char line, unsigned char position, const char *ptr)
pixus_mbed 0:3459848530ee 47 {
pixus_mbed 0:3459848530ee 48 if(gp_state->pLCM == NULL) return ;
pixus_mbed 0:3459848530ee 49 gp_state->pLCM->LCM_DisplayString(line, position, ptr);
pixus_mbed 0:3459848530ee 50 }
pixus_mbed 0:3459848530ee 51 static void LCM_DisplayDecimal(unsigned char line, unsigned char position, unsigned int hex_word, unsigned char digits)
pixus_mbed 0:3459848530ee 52 {
pixus_mbed 0:3459848530ee 53 if(gp_state->pLCM == NULL) return ;
pixus_mbed 0:3459848530ee 54 gp_state->pLCM->LCM_DisplayDecimal(line, position, hex_word, digits) ;
pixus_mbed 0:3459848530ee 55 }
pixus_mbed 0:3459848530ee 56 static void LCM_DisplayString_Reset(void)
pixus_mbed 0:3459848530ee 57 {
pixus_mbed 0:3459848530ee 58 if(gp_state->pLCM == NULL) return ;
pixus_mbed 0:3459848530ee 59 gp_state->pLCM->LCM_DisplayString_Reset();
pixus_mbed 0:3459848530ee 60 }
pixus_mbed 0:3459848530ee 61
pixus_mbed 0:3459848530ee 62 unsigned char xy2uart_enh=0;
pixus_mbed 0:3459848530ee 63
pixus_mbed 0:3459848530ee 64 //for OTS
pixus_mbed 0:3459848530ee 65 signed int deltaX16;
pixus_mbed 0:3459848530ee 66 signed int deltaY16;
pixus_mbed 0:3459848530ee 67 unsigned char OTS_ROT_Status;
pixus_mbed 0:3459848530ee 68 unsigned char OTS_BTN_Status;
pixus_mbed 0:3459848530ee 69
pixus_mbed 0:3459848530ee 70 signed long x_sum=0;
pixus_mbed 0:3459848530ee 71 signed long ds_x_sum=0;
pixus_mbed 0:3459848530ee 72 signed long pre_dsCountX=0;
pixus_mbed 0:3459848530ee 73 unsigned int OTS_BTN_Press_Cnt=0;
pixus_mbed 0:3459848530ee 74
pixus_mbed 0:3459848530ee 75 volatile unsigned char MotionPinEventTriggered=0;
pixus_mbed 0:3459848530ee 76
pixus_mbed 0:3459848530ee 77 // Register write function
pixus_mbed 0:3459848530ee 78 void OTS_Write_Reg(unsigned char address, unsigned char value)
pixus_mbed 0:3459848530ee 79 {
pixus_mbed 0:3459848530ee 80 int ret ;
pixus_mbed 0:3459848530ee 81 char data_write[2];
pixus_mbed 0:3459848530ee 82
pixus_mbed 0:3459848530ee 83 data_write[0] = address;
pixus_mbed 0:3459848530ee 84 data_write[1] = value;
pixus_mbed 0:3459848530ee 85 ret = gp_state->p_i2c->write(gp_state->slave_id, data_write, 2, 0);
pixus_mbed 0:3459848530ee 86 }
pixus_mbed 0:3459848530ee 87
pixus_mbed 0:3459848530ee 88 // Register Read function
pixus_mbed 0:3459848530ee 89 unsigned char OTS_Read_Reg(unsigned char address)
pixus_mbed 0:3459848530ee 90 {
pixus_mbed 0:3459848530ee 91 unsigned char rdata = 0;
pixus_mbed 0:3459848530ee 92 gp_state->p_i2c->write(gp_state->slave_id, (char *)&address, 1, 0);
pixus_mbed 0:3459848530ee 93 gp_state->p_i2c->read(gp_state->slave_id, (char *)&rdata, 1, 0);
pixus_mbed 0:3459848530ee 94
pixus_mbed 0:3459848530ee 95 return(rdata);
pixus_mbed 0:3459848530ee 96 }
pixus_mbed 0:3459848530ee 97
pixus_mbed 0:3459848530ee 98 // Register write & read back check function
pixus_mbed 0:3459848530ee 99 void OTS_WriteRead_Reg(unsigned char address, unsigned char wdata)
pixus_mbed 0:3459848530ee 100 {
pixus_mbed 0:3459848530ee 101 unsigned char rdata;
pixus_mbed 0:3459848530ee 102 do
pixus_mbed 0:3459848530ee 103 {
pixus_mbed 0:3459848530ee 104 OTS_Write_Reg(address, wdata); // Write data to specified address
pixus_mbed 0:3459848530ee 105 rdata = OTS_Read_Reg(address); // Read back previous written data
pixus_mbed 0:3459848530ee 106 } while(rdata != wdata); // Check if the data is correctly written
pixus_mbed 0:3459848530ee 107
pixus_mbed 0:3459848530ee 108 }
pixus_mbed 0:3459848530ee 109
pixus_mbed 0:3459848530ee 110 boolean OTS_Sensor_Init(void)
pixus_mbed 0:3459848530ee 111 {
pixus_mbed 0:3459848530ee 112 unsigned char sensor_pid=0;
pixus_mbed 0:3459848530ee 113 boolean read_id_ok=false;
pixus_mbed 0:3459848530ee 114
pixus_mbed 0:3459848530ee 115 // Read sensor_pid in address 0x00 to check if the serial link is valid, PID should be 0x31
pixus_mbed 0:3459848530ee 116 sensor_pid = OTS_Read_Reg(0x00);
pixus_mbed 0:3459848530ee 117 if(sensor_pid == 0x31)
pixus_mbed 0:3459848530ee 118 {
pixus_mbed 0:3459848530ee 119 read_id_ok = true;
pixus_mbed 0:3459848530ee 120
pixus_mbed 0:3459848530ee 121 //PAT9125 sensor recommended settings as below:
pixus_mbed 0:3459848530ee 122 OTS_Write_Reg(0x7F, 0x00); // switch to bank0, not allowed to perform OTS_WriteRead_Reg
pixus_mbed 0:3459848530ee 123 OTS_Write_Reg(0x06, 0x97); // Software Reset (i.e. set bit7 to 1), then it will reset to 0 automatically
pixus_mbed 0:3459848530ee 124
pixus_mbed 0:3459848530ee 125 I2C_RESET;
pixus_mbed 0:3459848530ee 126
pixus_mbed 0:3459848530ee 127 delay(1); // delay 1ms
pixus_mbed 0:3459848530ee 128 OTS_Write_Reg(0x06, 0x17); // ensure the sensor has left the reset state.
pixus_mbed 0:3459848530ee 129
pixus_mbed 0:3459848530ee 130 OTS_WriteRead_Reg(0x09, 0x5A); // disable write protect
pixus_mbed 0:3459848530ee 131 OTS_WriteRead_Reg(0x0D, 0x65); // set X-axis resolution (depends on application)
pixus_mbed 0:3459848530ee 132 OTS_WriteRead_Reg(0x0E, 0xFF); // set Y-axis resolution (depends on application)
pixus_mbed 0:3459848530ee 133 OTS_WriteRead_Reg(0x19, 0x04); // set 12-bit X/Y data format (depends on application)
pixus_mbed 0:3459848530ee 134 //OTS_WriteRead_Reg(0x4B, 0x04); // ONLY for VDD=VDDA=1.7~1.9V: for power saving
pixus_mbed 0:3459848530ee 135
pixus_mbed 0:3459848530ee 136 OTS_WriteRead_Reg(0x09, 0x00); // enable write protect
pixus_mbed 0:3459848530ee 137 }
pixus_mbed 0:3459848530ee 138
pixus_mbed 0:3459848530ee 139 return read_id_ok;
pixus_mbed 0:3459848530ee 140 }
pixus_mbed 0:3459848530ee 141
pixus_mbed 0:3459848530ee 142 // Read motion
pixus_mbed 0:3459848530ee 143 void OTS_Read_Motion(signed int *dx16, signed int *dy16)
pixus_mbed 0:3459848530ee 144 {
pixus_mbed 0:3459848530ee 145 int shift = (sizeof(signed int) << 3) - 12 ;
pixus_mbed 0:3459848530ee 146 signed int deltaX_l=0, deltaY_l=0, deltaXY_h=0;
pixus_mbed 0:3459848530ee 147 signed int deltaX_h=0, deltaY_h=0;
pixus_mbed 0:3459848530ee 148 char motion = OTS_Read_Reg(0x02) ;
pixus_mbed 0:3459848530ee 149 if(motion & 0x80) //check motion bit in bit7
pixus_mbed 0:3459848530ee 150 {
pixus_mbed 0:3459848530ee 151 deltaX_l = OTS_Read_Reg(0x03);
pixus_mbed 0:3459848530ee 152 deltaY_l = OTS_Read_Reg(0x04);
pixus_mbed 0:3459848530ee 153 deltaXY_h = OTS_Read_Reg(0x12);
pixus_mbed 0:3459848530ee 154
pixus_mbed 0:3459848530ee 155 deltaX_h = (deltaXY_h<<4) & 0xF00;
pixus_mbed 0:3459848530ee 156 deltaX_h = (deltaX_h << shift) >> shift ;
pixus_mbed 0:3459848530ee 157 //if(deltaX_h & 0x800) deltaX_h |= 0xfffff000; // 12-bit data convert to 16-bit
pixus_mbed 0:3459848530ee 158
pixus_mbed 0:3459848530ee 159 deltaY_h = (deltaXY_h<<8) & 0xF00;
pixus_mbed 0:3459848530ee 160 //if(deltaY_h & 0x800) deltaY_h |= 0xfffff000; // 12-bit data convert to 16-bit
pixus_mbed 0:3459848530ee 161 deltaY_h = (deltaY_h << shift) >> shift ;
pixus_mbed 0:3459848530ee 162
pixus_mbed 0:3459848530ee 163 }
pixus_mbed 0:3459848530ee 164 *dx16 = -(deltaX_h | deltaX_l); //inverse the data (depends on sensor's orientation and application)
pixus_mbed 0:3459848530ee 165 *dy16 = -(deltaY_h | deltaY_l); //inverse the data (depends on sensor's orientation and application)
pixus_mbed 0:3459848530ee 166 }
pixus_mbed 0:3459848530ee 167
pixus_mbed 0:3459848530ee 168 void OTS_Reset_Variables(void)
pixus_mbed 0:3459848530ee 169 {
pixus_mbed 0:3459848530ee 170 //reset variables
pixus_mbed 0:3459848530ee 171 x_sum=0;
pixus_mbed 0:3459848530ee 172 ds_x_sum=0;
pixus_mbed 0:3459848530ee 173 pre_dsCountX=0;
pixus_mbed 0:3459848530ee 174
pixus_mbed 0:3459848530ee 175 OTS_BTN_Press_Cnt=0;
pixus_mbed 0:3459848530ee 176 LCM_DisplayString_Reset();
pixus_mbed 0:3459848530ee 177 }
pixus_mbed 0:3459848530ee 178
pixus_mbed 0:3459848530ee 179 unsigned char Detect_Rotation(signed long dsCountX)
pixus_mbed 0:3459848530ee 180 {
pixus_mbed 0:3459848530ee 181 #define EVENT_NUM_PER_ROUND 360//10
pixus_mbed 0:3459848530ee 182 #define EVENT_COUNT_TH (EXPECTED_COUNT_PER_ROUND / EVENT_NUM_PER_ROUND) //360/10=36 //360/360=1
pixus_mbed 0:3459848530ee 183
pixus_mbed 0:3459848530ee 184 signed long diff_count = 0;
pixus_mbed 0:3459848530ee 185 unsigned char OutRotState = OTS_ROT_NO_CHANGE;
pixus_mbed 0:3459848530ee 186
pixus_mbed 0:3459848530ee 187 diff_count = dsCountX - pre_dsCountX;
pixus_mbed 0:3459848530ee 188 if( diff_count >= EVENT_COUNT_TH )
pixus_mbed 0:3459848530ee 189 {
pixus_mbed 0:3459848530ee 190 pre_dsCountX = dsCountX;
pixus_mbed 0:3459848530ee 191 OutRotState = OTS_ROT_UP;
pixus_mbed 0:3459848530ee 192 }
pixus_mbed 0:3459848530ee 193 else if( diff_count <= (-EVENT_COUNT_TH) )
pixus_mbed 0:3459848530ee 194 {
pixus_mbed 0:3459848530ee 195 pre_dsCountX = dsCountX;
pixus_mbed 0:3459848530ee 196 OutRotState = OTS_ROT_DOWN;
pixus_mbed 0:3459848530ee 197 }
pixus_mbed 0:3459848530ee 198
pixus_mbed 0:3459848530ee 199 return OutRotState;
pixus_mbed 0:3459848530ee 200 }
pixus_mbed 0:3459848530ee 201
pixus_mbed 0:3459848530ee 202 signed long OTS_Resolution_Downscale(signed int delta_count)
pixus_mbed 0:3459848530ee 203 {
pixus_mbed 0:3459848530ee 204 x_sum += delta_count;
pixus_mbed 0:3459848530ee 205 return (x_sum * EXPECTED_COUNT_PER_ROUND / REAL_AVG_COUNT_PER_ROUND);
pixus_mbed 0:3459848530ee 206 }
pixus_mbed 0:3459848530ee 207
pixus_mbed 0:3459848530ee 208 unsigned char OTS_Detect_Rotation(signed int dx16, signed int dy16)
pixus_mbed 0:3459848530ee 209 {
pixus_mbed 0:3459848530ee 210 ds_x_sum = OTS_Resolution_Downscale(dx16);
pixus_mbed 0:3459848530ee 211 LCM_DisplayDecimal(1,12,ds_x_sum,4);//show downscale value
pixus_mbed 0:3459848530ee 212
pixus_mbed 0:3459848530ee 213 return Detect_Rotation(ds_x_sum);
pixus_mbed 0:3459848530ee 214 }
pixus_mbed 0:3459848530ee 215
pixus_mbed 0:3459848530ee 216 unsigned char OTS_Detect_Pressing(signed int dx16, signed int dy16)
pixus_mbed 0:3459848530ee 217 {
pixus_mbed 0:3459848530ee 218 #define PRESS 1
pixus_mbed 0:3459848530ee 219 #define RELEASE 0
pixus_mbed 0:3459848530ee 220
pixus_mbed 0:3459848530ee 221 #define DX_ROTATE_TH 2
pixus_mbed 0:3459848530ee 222 #define DY_VALID_TH 1
pixus_mbed 0:3459848530ee 223 #define ACCY_PRESS_TH 5
pixus_mbed 0:3459848530ee 224 #define DY_RELEASE_TH (-2)
pixus_mbed 0:3459848530ee 225
pixus_mbed 0:3459848530ee 226 unsigned char OutBtnState = OTS_BTN_NO_CHANGE;
pixus_mbed 0:3459848530ee 227 static signed long AccY = 0;
pixus_mbed 0:3459848530ee 228 static unsigned char State = RELEASE; //0:release, 1:press
pixus_mbed 0:3459848530ee 229
pixus_mbed 0:3459848530ee 230 if((dx16 >= DX_ROTATE_TH)||(dx16 <= (-DX_ROTATE_TH)))
pixus_mbed 0:3459848530ee 231 {
pixus_mbed 0:3459848530ee 232 AccY = 0;
pixus_mbed 0:3459848530ee 233 }
pixus_mbed 0:3459848530ee 234 else
pixus_mbed 0:3459848530ee 235 {
pixus_mbed 0:3459848530ee 236 if(State == PRESS)
pixus_mbed 0:3459848530ee 237 {
pixus_mbed 0:3459848530ee 238 if(dy16 <= DY_RELEASE_TH)
pixus_mbed 0:3459848530ee 239 {
pixus_mbed 0:3459848530ee 240 State = RELEASE;
pixus_mbed 0:3459848530ee 241 OutBtnState = OTS_BTN_RELEASE;
pixus_mbed 0:3459848530ee 242 }
pixus_mbed 0:3459848530ee 243 }
pixus_mbed 0:3459848530ee 244 else
pixus_mbed 0:3459848530ee 245 {
pixus_mbed 0:3459848530ee 246 if(dy16 < DY_VALID_TH)
pixus_mbed 0:3459848530ee 247 {
pixus_mbed 0:3459848530ee 248 AccY = 0;
pixus_mbed 0:3459848530ee 249 }
pixus_mbed 0:3459848530ee 250 else
pixus_mbed 0:3459848530ee 251 {
pixus_mbed 0:3459848530ee 252 AccY += dy16;
pixus_mbed 0:3459848530ee 253 if(AccY >= ACCY_PRESS_TH)
pixus_mbed 0:3459848530ee 254 {
pixus_mbed 0:3459848530ee 255 AccY = 0;
pixus_mbed 0:3459848530ee 256 State = PRESS;
pixus_mbed 0:3459848530ee 257 OutBtnState = OTS_BTN_PRESS;
pixus_mbed 0:3459848530ee 258 }
pixus_mbed 0:3459848530ee 259 }
pixus_mbed 0:3459848530ee 260 }
pixus_mbed 0:3459848530ee 261 }
pixus_mbed 0:3459848530ee 262
pixus_mbed 0:3459848530ee 263 return OutBtnState;
pixus_mbed 0:3459848530ee 264 }
pixus_mbed 0:3459848530ee 265
pixus_mbed 0:3459848530ee 266 //-----------------------------------------------------------------------
pixus_mbed 0:3459848530ee 267 void OTS_MotionPin_ISR(void)
pixus_mbed 0:3459848530ee 268 {
pixus_mbed 0:3459848530ee 269 detachInterrupt(digitalPinToInterrupt(PIN_SEN_MOTION));
pixus_mbed 0:3459848530ee 270 MotionPinEventTriggered=1;
pixus_mbed 0:3459848530ee 271 }
pixus_mbed 0:3459848530ee 272
pixus_mbed 0:3459848530ee 273 //-----------------------------------------------------------------------
pixus_mbed 0:3459848530ee 274
pixus_mbed 0:3459848530ee 275 /*
pixus_mbed 0:3459848530ee 276 SerialEvent occurs whenever a new data comes in the hardware serial RX. This routine is run between each time loop() runs, so using delay inside loop can delay response.
pixus_mbed 0:3459848530ee 277 Multiple bytes of data may be available.
pixus_mbed 0:3459848530ee 278
pixus_mbed 0:3459848530ee 279 Host Command Supported:
pixus_mbed 0:3459848530ee 280 Read and write sensor register
pixus_mbed 0:3459848530ee 281 Sensor read = "r aa", aa must be hex value, example "r 0f" means read register 0x0f.
pixus_mbed 0:3459848530ee 282 Sensor write = "w aa bb", aa and bb must be hex value, example "w 02 00" means write register 0x02 with value 0x00.
pixus_mbed 0:3459848530ee 283 */
pixus_mbed 0:3459848530ee 284 #include <string>
pixus_mbed 0:3459848530ee 285 #include <algorithm>
pixus_mbed 0:3459848530ee 286 #include <cctype>
pixus_mbed 0:3459848530ee 287 #include <locale>
pixus_mbed 0:3459848530ee 288
pixus_mbed 0:3459848530ee 289 #define String string
pixus_mbed 0:3459848530ee 290 #define VERSRION "2.40" //PAT9125 FW version
pixus_mbed 0:3459848530ee 291
pixus_mbed 0:3459848530ee 292
pixus_mbed 0:3459848530ee 293 void serialProcess(String input);
pixus_mbed 0:3459848530ee 294 bool IsParamValid(char *param, String str_pre, bool hex =false);
pixus_mbed 0:3459848530ee 295 void PrintHex8(uint8_t data);
pixus_mbed 0:3459848530ee 296 bool IsDigit(char *p, bool hex);
pixus_mbed 0:3459848530ee 297 typedef unsigned char byte ;
pixus_mbed 0:3459848530ee 298 String strRead;
pixus_mbed 0:3459848530ee 299 char hexChar[3];
pixus_mbed 0:3459848530ee 300
pixus_mbed 0:3459848530ee 301 void println()
pixus_mbed 0:3459848530ee 302 {
pixus_mbed 0:3459848530ee 303 if(gp_state->p_pc == NULL) return ;
pixus_mbed 0:3459848530ee 304 gp_state->p_pc->printf("\n");
pixus_mbed 0:3459848530ee 305 }
pixus_mbed 0:3459848530ee 306
pixus_mbed 0:3459848530ee 307 void println(String str)
pixus_mbed 0:3459848530ee 308 {
pixus_mbed 0:3459848530ee 309 if(gp_state->p_pc == NULL) return ;
pixus_mbed 0:3459848530ee 310 const char * c = str.c_str();
pixus_mbed 0:3459848530ee 311 gp_state->p_pc->printf(c);
pixus_mbed 0:3459848530ee 312 gp_state->p_pc->printf("\n");
pixus_mbed 0:3459848530ee 313 }
pixus_mbed 0:3459848530ee 314 void print(String str)
pixus_mbed 0:3459848530ee 315 {
pixus_mbed 0:3459848530ee 316 if(gp_state->p_pc == NULL) return ;
pixus_mbed 0:3459848530ee 317 const char * c = str.c_str();
pixus_mbed 0:3459848530ee 318 gp_state->p_pc->printf(c);
pixus_mbed 0:3459848530ee 319 }
pixus_mbed 0:3459848530ee 320 void print(signed int value)
pixus_mbed 0:3459848530ee 321 {
pixus_mbed 0:3459848530ee 322 if(gp_state->p_pc == NULL) return ;
pixus_mbed 0:3459848530ee 323 gp_state->p_pc->printf("%d",value);
pixus_mbed 0:3459848530ee 324 }
pixus_mbed 0:3459848530ee 325
pixus_mbed 0:3459848530ee 326
pixus_mbed 0:3459848530ee 327 string trim(const string& src, const string& c)
pixus_mbed 0:3459848530ee 328 {
pixus_mbed 0:3459848530ee 329 int p2 = src.find_last_not_of(c);
pixus_mbed 0:3459848530ee 330 if (p2 == string::npos) {
pixus_mbed 0:3459848530ee 331 return string();
pixus_mbed 0:3459848530ee 332 }
pixus_mbed 0:3459848530ee 333 int p1 = src.find_first_not_of(c);
pixus_mbed 0:3459848530ee 334 if (p1 == string::npos) {
pixus_mbed 0:3459848530ee 335 p1 = 0;
pixus_mbed 0:3459848530ee 336 }
pixus_mbed 0:3459848530ee 337
pixus_mbed 0:3459848530ee 338 return src.substr(p1, (p2-p1)+1);
pixus_mbed 0:3459848530ee 339 }
pixus_mbed 0:3459848530ee 340
pixus_mbed 0:3459848530ee 341 void toCharArray(char *buffer, string s)
pixus_mbed 0:3459848530ee 342 {
pixus_mbed 0:3459848530ee 343 strcpy(buffer, s.c_str());
pixus_mbed 0:3459848530ee 344 }
pixus_mbed 0:3459848530ee 345
pixus_mbed 0:3459848530ee 346 void serialEvent()
pixus_mbed 0:3459848530ee 347 {
pixus_mbed 0:3459848530ee 348 if(gp_state->p_pc == NULL) return ;
pixus_mbed 0:3459848530ee 349 while (gp_state->p_pc->readable())
pixus_mbed 0:3459848530ee 350 {
pixus_mbed 0:3459848530ee 351 // get the new byte:
pixus_mbed 0:3459848530ee 352 char inChar = (char)gp_state->p_pc->getc() ; //Serial.read();
pixus_mbed 0:3459848530ee 353 // if the incoming character is a newline, set a flag
pixus_mbed 0:3459848530ee 354 // so the main loop can do something about it:
pixus_mbed 0:3459848530ee 355 if ((inChar == '\n') || (inChar == '\r'))
pixus_mbed 0:3459848530ee 356 {
pixus_mbed 0:3459848530ee 357 //strRead.trim();
pixus_mbed 0:3459848530ee 358 strRead = trim(strRead, " ");
pixus_mbed 0:3459848530ee 359 strRead += " "; // for tokenizing
pixus_mbed 0:3459848530ee 360 serialProcess(strRead);
pixus_mbed 0:3459848530ee 361 strRead = "";
pixus_mbed 0:3459848530ee 362 }
pixus_mbed 0:3459848530ee 363 else if (inChar != 0xf0)
pixus_mbed 0:3459848530ee 364 {
pixus_mbed 0:3459848530ee 365 // add it to the inputString:
pixus_mbed 0:3459848530ee 366 strRead += inChar;
pixus_mbed 0:3459848530ee 367 }
pixus_mbed 0:3459848530ee 368 }
pixus_mbed 0:3459848530ee 369 }
pixus_mbed 0:3459848530ee 370
pixus_mbed 0:3459848530ee 371 void serialProcess(String input)
pixus_mbed 0:3459848530ee 372 {
pixus_mbed 0:3459848530ee 373 int val;
pixus_mbed 0:3459848530ee 374 int i, j;
pixus_mbed 0:3459848530ee 375 String output;
pixus_mbed 0:3459848530ee 376 unsigned char Address,Value;
pixus_mbed 0:3459848530ee 377
pixus_mbed 0:3459848530ee 378 // ====================================================
pixus_mbed 0:3459848530ee 379 // Single command goes here
pixus_mbed 0:3459848530ee 380 // NOTE: All command compare must have " " at the back
pixus_mbed 0:3459848530ee 381 // ====================================================
pixus_mbed 0:3459848530ee 382 if (input == "pxi ")
pixus_mbed 0:3459848530ee 383 {
pixus_mbed 0:3459848530ee 384 println("PixArt-PAT9125");
pixus_mbed 0:3459848530ee 385 }
pixus_mbed 0:3459848530ee 386 else if (input == "ver ")
pixus_mbed 0:3459848530ee 387 {
pixus_mbed 0:3459848530ee 388 println(VERSRION);
pixus_mbed 0:3459848530ee 389 }
pixus_mbed 0:3459848530ee 390 else if (input == "xy2uart_on ")
pixus_mbed 0:3459848530ee 391 {
pixus_mbed 0:3459848530ee 392 xy2uart_enh=1;
pixus_mbed 0:3459848530ee 393 println("Sensor XY Output Enable");
pixus_mbed 0:3459848530ee 394 }
pixus_mbed 0:3459848530ee 395 else if (input == "xy2uart_off ")
pixus_mbed 0:3459848530ee 396 {
pixus_mbed 0:3459848530ee 397 xy2uart_enh=0;
pixus_mbed 0:3459848530ee 398 println("Sensor XY Output Disable");
pixus_mbed 0:3459848530ee 399 }
pixus_mbed 0:3459848530ee 400 // ====================================================
pixus_mbed 0:3459848530ee 401 // Command with parameters goes here, like r 00, w 48 00
pixus_mbed 0:3459848530ee 402 // ====================================================
pixus_mbed 0:3459848530ee 403 else if (input != " ") // not empty string, then proceed to decode the command
pixus_mbed 0:3459848530ee 404 {
pixus_mbed 0:3459848530ee 405 char buff[50];
pixus_mbed 0:3459848530ee 406 //input.toCharArray(buff, input.length());
pixus_mbed 0:3459848530ee 407 toCharArray(buff, input);
pixus_mbed 0:3459848530ee 408
pixus_mbed 0:3459848530ee 409 // Get the command
pixus_mbed 0:3459848530ee 410 char *tok = strtok(buff, " ");
pixus_mbed 0:3459848530ee 411 if (!tok)
pixus_mbed 0:3459848530ee 412 {
pixus_mbed 0:3459848530ee 413 println("empty command");
pixus_mbed 0:3459848530ee 414 return;
pixus_mbed 0:3459848530ee 415 }
pixus_mbed 0:3459848530ee 416
pixus_mbed 0:3459848530ee 417 // Get parameters, up to 4 parameters, if more than that, individual command will need to extract it on their own
pixus_mbed 0:3459848530ee 418 char *param[4];
pixus_mbed 0:3459848530ee 419 for (val = 0; val < 4; val++)
pixus_mbed 0:3459848530ee 420 {
pixus_mbed 0:3459848530ee 421 param[val] = strtok(NULL, " ");
pixus_mbed 0:3459848530ee 422 if (!param[val]) // break if we reach the end
pixus_mbed 0:3459848530ee 423 break;
pixus_mbed 0:3459848530ee 424 }
pixus_mbed 0:3459848530ee 425
pixus_mbed 0:3459848530ee 426 // switch for command
pixus_mbed 0:3459848530ee 427 String str = String(tok);
pixus_mbed 0:3459848530ee 428 if ((str == "r") || (str == "w"))
pixus_mbed 0:3459848530ee 429 {
pixus_mbed 0:3459848530ee 430 // Address is the first byte
pixus_mbed 0:3459848530ee 431 if (!IsParamValid(param[0], "Error (r/w): address"))
pixus_mbed 0:3459848530ee 432 {
pixus_mbed 0:3459848530ee 433 return;
pixus_mbed 0:3459848530ee 434 }
pixus_mbed 0:3459848530ee 435 // convert to integer
pixus_mbed 0:3459848530ee 436 Address = strtol(param[0], NULL, 16);
pixus_mbed 0:3459848530ee 437 if (Address > 0x7F)
pixus_mbed 0:3459848530ee 438 {
pixus_mbed 0:3459848530ee 439 println("Error (r/w): address > 0x7F");
pixus_mbed 0:3459848530ee 440 return;
pixus_mbed 0:3459848530ee 441 }
pixus_mbed 0:3459848530ee 442
pixus_mbed 0:3459848530ee 443 if (str == "w")
pixus_mbed 0:3459848530ee 444 {
pixus_mbed 0:3459848530ee 445 // Value is second byte
pixus_mbed 0:3459848530ee 446 if (!IsParamValid(param[1], "Error (w): value"))
pixus_mbed 0:3459848530ee 447 {
pixus_mbed 0:3459848530ee 448 return;
pixus_mbed 0:3459848530ee 449 }
pixus_mbed 0:3459848530ee 450 // convert to integer
pixus_mbed 0:3459848530ee 451 Value = strtol(param[1], NULL, 16);
pixus_mbed 0:3459848530ee 452 if (Value > 0xFF)
pixus_mbed 0:3459848530ee 453 {
pixus_mbed 0:3459848530ee 454 println("Error (w): value > 0xFF");
pixus_mbed 0:3459848530ee 455 return;
pixus_mbed 0:3459848530ee 456 }
pixus_mbed 0:3459848530ee 457
pixus_mbed 0:3459848530ee 458 OTS_Write_Reg(Address, Value);
pixus_mbed 0:3459848530ee 459 }
pixus_mbed 0:3459848530ee 460
pixus_mbed 0:3459848530ee 461 print("ADDR ");
pixus_mbed 0:3459848530ee 462 PrintHex8(Address);
pixus_mbed 0:3459848530ee 463 print(" ");
pixus_mbed 0:3459848530ee 464 PrintHex8(OTS_Read_Reg(Address));
pixus_mbed 0:3459848530ee 465 println();
pixus_mbed 0:3459848530ee 466 }
pixus_mbed 0:3459848530ee 467 else
pixus_mbed 0:3459848530ee 468 {
pixus_mbed 0:3459848530ee 469 println("Bad command");
pixus_mbed 0:3459848530ee 470 }
pixus_mbed 0:3459848530ee 471 }
pixus_mbed 0:3459848530ee 472 }
pixus_mbed 0:3459848530ee 473
pixus_mbed 0:3459848530ee 474 // Check if param is not given or not hexa, print the error as well
pixus_mbed 0:3459848530ee 475 bool IsParamValid(char *param, String str_pre, bool hex)
pixus_mbed 0:3459848530ee 476 {
pixus_mbed 0:3459848530ee 477 if (!param)
pixus_mbed 0:3459848530ee 478 {
pixus_mbed 0:3459848530ee 479 print(str_pre);
pixus_mbed 0:3459848530ee 480 println(" not given");
pixus_mbed 0:3459848530ee 481 return false;
pixus_mbed 0:3459848530ee 482 }
pixus_mbed 0:3459848530ee 483 if (!IsDigit(param, hex))
pixus_mbed 0:3459848530ee 484 {
pixus_mbed 0:3459848530ee 485 print(str_pre);
pixus_mbed 0:3459848530ee 486 if (hex)
pixus_mbed 0:3459848530ee 487 println(" not hex");
pixus_mbed 0:3459848530ee 488 else
pixus_mbed 0:3459848530ee 489 println(" not digit");
pixus_mbed 0:3459848530ee 490 return false;
pixus_mbed 0:3459848530ee 491 }
pixus_mbed 0:3459848530ee 492 return true;
pixus_mbed 0:3459848530ee 493 }
pixus_mbed 0:3459848530ee 494
pixus_mbed 0:3459848530ee 495 // Check whether is hexa for given char
pixus_mbed 0:3459848530ee 496 bool IsDigit(char *p, bool hex)
pixus_mbed 0:3459848530ee 497 {
pixus_mbed 0:3459848530ee 498 for (int i; i < strlen(p); i++)
pixus_mbed 0:3459848530ee 499 {
pixus_mbed 0:3459848530ee 500 if (hex)
pixus_mbed 0:3459848530ee 501 {
pixus_mbed 0:3459848530ee 502 if (!isxdigit(p[i]))
pixus_mbed 0:3459848530ee 503 return false;
pixus_mbed 0:3459848530ee 504 }
pixus_mbed 0:3459848530ee 505 else if (!isdigit(p[i]))
pixus_mbed 0:3459848530ee 506 return false;
pixus_mbed 0:3459848530ee 507 }
pixus_mbed 0:3459848530ee 508 return true;
pixus_mbed 0:3459848530ee 509 }
pixus_mbed 0:3459848530ee 510
pixus_mbed 0:3459848530ee 511 void Hex8(uint8_t data)
pixus_mbed 0:3459848530ee 512 {
pixus_mbed 0:3459848530ee 513 byte first ;
pixus_mbed 0:3459848530ee 514 first = (data >> 4) | 48;
pixus_mbed 0:3459848530ee 515 if (first > 57) hexChar[0] = first + (byte)39;
pixus_mbed 0:3459848530ee 516 else hexChar[0] = first ;
pixus_mbed 0:3459848530ee 517
pixus_mbed 0:3459848530ee 518 first = (data & 0x0F) | 48;
pixus_mbed 0:3459848530ee 519 if (first > 57) hexChar[1] = first + (byte)39;
pixus_mbed 0:3459848530ee 520 else hexChar[1] = first;
pixus_mbed 0:3459848530ee 521 }
pixus_mbed 0:3459848530ee 522
pixus_mbed 0:3459848530ee 523 // Print in hex with leading zero
pixus_mbed 0:3459848530ee 524 void PrintHex8(uint8_t data)
pixus_mbed 0:3459848530ee 525 {
pixus_mbed 0:3459848530ee 526 Hex8(data);
pixus_mbed 0:3459848530ee 527
pixus_mbed 0:3459848530ee 528 print(hexChar);
pixus_mbed 0:3459848530ee 529 }
pixus_mbed 0:3459848530ee 530
pixus_mbed 0:3459848530ee 531
pixus_mbed 0:3459848530ee 532 //-----------------------------------------------------------------------
pixus_mbed 0:3459848530ee 533 void loop()
pixus_mbed 0:3459848530ee 534 {
pixus_mbed 0:3459848530ee 535
pixus_mbed 0:3459848530ee 536 if(digitalRead(PIN_BTN_L) == LOW)//or reset whenever idle_timer timeout
pixus_mbed 0:3459848530ee 537 {
pixus_mbed 0:3459848530ee 538 OTS_Reset_Variables();
pixus_mbed 0:3459848530ee 539 }
pixus_mbed 0:3459848530ee 540
pixus_mbed 0:3459848530ee 541 if(MotionPinEventTriggered==1)
pixus_mbed 0:3459848530ee 542 {
pixus_mbed 0:3459848530ee 543 MotionPinEventTriggered=0;//clear flag after read 'Motion Status and Data'
pixus_mbed 0:3459848530ee 544 OTS_Read_Motion(&deltaX16,&deltaY16);
pixus_mbed 0:3459848530ee 545
pixus_mbed 0:3459848530ee 546 if(deltaX16 || deltaY16)
pixus_mbed 0:3459848530ee 547 {
pixus_mbed 0:3459848530ee 548 OTS_ROT_Status = OTS_Detect_Rotation(deltaX16,deltaY16);
pixus_mbed 0:3459848530ee 549 OTS_BTN_Status = OTS_Detect_Pressing(deltaX16,deltaY16);
pixus_mbed 0:3459848530ee 550
pixus_mbed 0:3459848530ee 551 if(OTS_ROT_Status == OTS_ROT_UP)
pixus_mbed 0:3459848530ee 552 {
pixus_mbed 0:3459848530ee 553 LED_RED_ON;
pixus_mbed 0:3459848530ee 554 LCM_DisplayString(1,8,"Up ");
pixus_mbed 0:3459848530ee 555 }
pixus_mbed 0:3459848530ee 556 else if(OTS_ROT_Status == OTS_ROT_DOWN)
pixus_mbed 0:3459848530ee 557 {
pixus_mbed 0:3459848530ee 558 LED_GREEN_ON;
pixus_mbed 0:3459848530ee 559 LCM_DisplayString(1,8,"Dn ");
pixus_mbed 0:3459848530ee 560 }
pixus_mbed 0:3459848530ee 561
pixus_mbed 0:3459848530ee 562 if(OTS_BTN_Status == OTS_BTN_PRESS)
pixus_mbed 0:3459848530ee 563 {
pixus_mbed 0:3459848530ee 564 OTS_BTN_Press_Cnt++;
pixus_mbed 0:3459848530ee 565 if(OTS_BTN_Press_Cnt > 999)
pixus_mbed 0:3459848530ee 566 {
pixus_mbed 0:3459848530ee 567 OTS_BTN_Press_Cnt=0;
pixus_mbed 0:3459848530ee 568 }
pixus_mbed 0:3459848530ee 569 LCM_DisplayString(2,8,"Pre");
pixus_mbed 0:3459848530ee 570 LCM_DisplayDecimal(2,12,OTS_BTN_Press_Cnt,4);
pixus_mbed 0:3459848530ee 571 }
pixus_mbed 0:3459848530ee 572 else if(OTS_BTN_Status == OTS_BTN_RELEASE)
pixus_mbed 0:3459848530ee 573 {
pixus_mbed 0:3459848530ee 574 LCM_DisplayString(2,8,"Rel");
pixus_mbed 0:3459848530ee 575 }
pixus_mbed 0:3459848530ee 576 }
pixus_mbed 0:3459848530ee 577
pixus_mbed 0:3459848530ee 578 if(xy2uart_enh == 1)
pixus_mbed 0:3459848530ee 579 {
pixus_mbed 0:3459848530ee 580 //output to UART
pixus_mbed 0:3459848530ee 581 print("DX:\t");print(deltaX16);print("\t");
pixus_mbed 0:3459848530ee 582 print("DY:\t");print(deltaY16);print("\t");
pixus_mbed 0:3459848530ee 583 print("\n");
pixus_mbed 0:3459848530ee 584 }
pixus_mbed 0:3459848530ee 585
pixus_mbed 0:3459848530ee 586 //re-enable interrupt for MOTION pin
pixus_mbed 0:3459848530ee 587 attachInterrupt(digitalPinToInterrupt(PIN_SEN_MOTION), OTS_MotionPin_ISR, LOW);
pixus_mbed 0:3459848530ee 588
pixus_mbed 0:3459848530ee 589 }
pixus_mbed 0:3459848530ee 590
pixus_mbed 0:3459848530ee 591 if(digitalRead(PIN_SEN_MOTION) == HIGH)
pixus_mbed 0:3459848530ee 592 {
pixus_mbed 0:3459848530ee 593 LED_GREEN_OFF;
pixus_mbed 0:3459848530ee 594 LED_RED_OFF;
pixus_mbed 0:3459848530ee 595 }
pixus_mbed 0:3459848530ee 596
pixus_mbed 0:3459848530ee 597 }
pixus_mbed 0:3459848530ee 598 pat9125_mbed::pat9125_mbed(pat9125_mbed_state_s *state)
pixus_mbed 0:3459848530ee 599 {
pixus_mbed 0:3459848530ee 600 gp_state = state ;
pixus_mbed 0:3459848530ee 601 gp_state->sen_status = OTS_Sensor_Init();
pixus_mbed 0:3459848530ee 602 print("OTS_Sensor_Init\n");
pixus_mbed 0:3459848530ee 603 gp_state->pINT->fall(&OTS_MotionPin_ISR); //interrupt at low state
pixus_mbed 0:3459848530ee 604 }
pixus_mbed 0:3459848530ee 605
pixus_mbed 0:3459848530ee 606 void pat9125_mbed::task()
pixus_mbed 0:3459848530ee 607 {
pixus_mbed 0:3459848530ee 608 if(digitalRead(PIN_SEN_MOTION) == LOW)
pixus_mbed 0:3459848530ee 609 {
pixus_mbed 0:3459848530ee 610 //gp_state->p_pc->printf("Motion Low\n");
pixus_mbed 0:3459848530ee 611 MotionPinEventTriggered = 1 ;
pixus_mbed 0:3459848530ee 612 }
pixus_mbed 0:3459848530ee 613 loop();
pixus_mbed 0:3459848530ee 614 serialEvent();
pixus_mbed 0:3459848530ee 615 }