PMT9123 OTS on Nucleo (Initial Release)
Dependencies: Pixart_9123_Nucleo_Library mbed
Fork of PMT9123_OTS_NUCLEO_Program by
Diff: main.cpp
- Revision:
- 0:384ce9819ea6
diff -r 000000000000 -r 384ce9819ea6 main.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp Thu May 11 17:32:14 2017 +0000
@@ -0,0 +1,270 @@
+/* mbed Microcontroller Library
+ * Copyright (c) 2006-2013 ARM Limited
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "mbed.h"
+#include "OTC.h"
+#include <string>
+#include <ctype.h>
+using namespace std;
+
+// Function prototypes
+void serialEvent();
+void serialProcess(string input);
+bool IsParamValid(char *param, bool hex = true);
+bool IsDigit(char *p, bool hex);
+void Hex8(uint8_t data);
+void PrintHex8(uint8_t data);
+
+Serial pc(USBTX,USBRX);//tx, rx
+I2C i2c(I2C_SDA, I2C_SCL);
+
+DigitalOut led1(LED1);
+DigitalOut pwm(D9);
+PwmOut mypwm(D9);
+
+// OTS object declaration
+Pixart_OTS *m_OTS = NULL;
+
+// Serial string
+string strRead = "";
+
+// LED PWM setting
+#define LED_PERIOD_US 3000 // 3ms
+#define LED_MAX_DC 100
+// LED brightness control value in us
+int16_t LED_on_time_us = 0;
+int16_t Counts;
+int16_t max_on_period;
+
+// LED control
+void LED_control(int16_t value)
+{
+ int16_t led_on_time;
+
+ LED_on_time_us += value;
+ led_on_time = LED_on_time_us;
+
+ if (LED_on_time_us < 5) // hysterisis so that the LED stay off
+ led_on_time = 0;
+ else if (LED_on_time_us > max_on_period)
+ led_on_time = LED_on_time_us = max_on_period;
+
+ mypwm.pulsewidth_us(led_on_time);
+}
+
+// Reset count and LED
+void ClearCount()
+{
+ Counts = 0;
+ pc.printf("Count = 0\n");
+ LED_on_time_us = 0;
+ LED_control(0);
+}
+
+void GetData(int16_t value)
+{
+ Counts += value;
+ pc.printf("Count = %d\n", Counts);
+
+ // Change brightness
+ LED_control(value);
+}
+
+// main() runs in its own thread in the OS
+// (note the calls to Thread::wait below for delays)
+int main() {
+
+ pc.format(8, Serial::None, 1);
+ pc.baud(115200);
+ pc.attach(&serialEvent);
+ i2c.frequency(400000);
+
+ // LED control
+ max_on_period = LED_MAX_DC*LED_PERIOD_US/100;
+ mypwm.period_us(LED_PERIOD_US);
+ LED_on_time_us = 0; // start with 0, which is off
+ LED_control(0);
+
+ Counts = 0; // restart count to zero
+
+ bool Result = false;
+ // Set to polling at 4ms
+ m_OTS = new Pixart_OTS(&i2c,4,GetData,Result);
+
+ if(Result == true)
+ {
+ pc.printf("Initial Pixart OTS successful\n\r");
+ }
+ else
+ {
+ pc.printf("Initial Pixart OTS fail\n\r");
+ }
+
+
+ while (true)
+ {
+ ;
+ }
+}
+
+void serialEvent() {
+ char inChar;
+
+ while (pc.readable())
+ {
+ // get the new byte:
+ inChar = (char)pc.getc();
+ //pc.putc(inChar);
+ // if the incoming character is a newline, set a flag
+ // so the main loop can do something about it:
+ if ((inChar == '\n') || (inChar == '\r'))
+ {
+ //strRead.trim();
+ strRead += " "; // for tokenizing
+ serialProcess(strRead);
+ strRead = "";
+ }
+ else if (inChar != 0xf0)
+ // add it to the strRead
+ strRead += inChar;
+ }
+}
+
+// Macro define for easily reading
+#define IsEqual(a,b) (!strcmp((a),(b)))
+
+void serialProcess(string input)
+{
+ int val;
+ unsigned char Address,Value;
+
+ //pc.printf("cmd = %s\n", input);
+ // ====================================================
+ // Single command goes here
+ // NOTE: All command compare must have " " at the back
+ // ====================================================
+ if (input == "c ")
+ {
+ ClearCount();
+ }
+ // ====================================================
+ // Command with parameters goes here, like r 00, w 48 00
+ // ====================================================
+ else if (input != " ") // not empty string, then proceed to decode the command
+ {
+ char buff[40];
+ size_t l = input.copy(buff, input.length(), 0);
+ buff[l] = '\0';
+
+ // Get the command
+ char *tok = strtok(buff, " ");
+ if (!tok)
+ {
+ pc.printf("empty command\n");
+ return;
+ }
+
+ // Get parameters, up to 4 parameters, if more than that, individual command will need to extract it on their own
+ char *param[4];
+ for (val = 0; val < 4; val++)
+ {
+ param[val] = strtok(NULL, " ");
+ if (!param[val]) // break if we reach the end
+ break;
+ }
+
+ // convert the first parameter into decimal first, as it is most commonly used
+ val = strtol(param[0], NULL, 10);
+
+ // switch for command
+ if ((IsEqual(tok,"r")) || (IsEqual(tok,"w")))
+ {
+ // Address is the first byte
+ if (!IsParamValid(param[0]))
+ {
+ return;
+ }
+ // convert to integer
+ Address = strtol(param[0], NULL, 16);
+ if (Address > 0x7F)
+ {
+ pc.printf("Error (r/w): address > 0x7F\n");
+ return;
+ }
+
+ if ((IsEqual(tok,"w")))
+ {
+ // Value is second byte
+ if (!IsParamValid(param[1]))
+ {
+ return;
+ }
+ // convert to integer
+ Value = strtol(param[1], NULL, 16);
+ if (Value > 0xFF)
+ {
+ pc.printf("Error (w): value > 0xFF\n");
+ return;
+ }
+
+ val = m_OTS->Register_Write(Address, Value);
+ }
+ else
+ {
+ val = m_OTS->Register_Read(Address);
+ }
+
+ pc.printf("ADDR %02X %02X\n", Address, val);
+ }
+ else
+ {
+ pc.printf("Bad command : ");
+ pc.printf("%s\n", tok);
+ }
+ }
+}
+
+// Check if param is not given or not hexa, print the error as well
+bool IsParamValid(char *param, bool hex)
+{
+ if (!param)
+ {
+ return false;
+ }
+ if (!IsDigit(param, hex))
+ {
+ pc.printf("Error : arg invalid\n");
+ return false;
+ }
+ return true;
+}
+
+// Check whether is hexa for given char
+bool IsDigit(char *p, bool hex)
+{
+ for (int i; i < strlen(p); i++)
+ {
+ if (hex)
+ {
+ if (!isxdigit(p[i]))
+ return false;
+ }
+ else if (!isdigit(p[i]))
+ return false;
+ }
+ return true;
+}
+

Low Power Right Angle Optical Track Sensor PMT9123