Library for PAT9125 on L476RG platform
Fork of pat9125_mbed by
pat9125_mbed.cpp@1:4b7c15d9c864, 2018-02-01 (annotated)
- 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?
User | Revision | Line number | New 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 | } |