Jesús Torres
/
ADNS9500
Interface to access to Avago ADNS-9500 laser mouse sensors.
Diff: sample.cpp
- Revision:
- 6:1969574dee8b
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sample.cpp Wed Jun 13 23:59:47 2012 +0000 @@ -0,0 +1,121 @@ +/* + * sample.hpp - Example of access to Avago ADNS-9500 laser mouse sensors + * + * Copyright 2012 Jesus Torres <jmtorres@ull.es> + * + * 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 <stdint.h> + +#include "adns9500.hpp" + +#define USE_MOTION_BURST +//#define FRAME_CAPTURE + +const char* FIRMWARE_FILENAME = "/local/adns9500.fw"; +LocalFileSystem local("local"); + +Ticker printData; +adns9500::ADNS9500 sensor(p11, p12, p13, p15, adns9500::MAX_SPI_FREQUENCY, p14); + +bool motionTriggered = false; +bool printDataTriggered = false; + +int motionCallbackCounter = 0; + +void printDataCallback() +{ + printDataTriggered = true; +} + +void motionCallback() +{ + motionTriggered = true; + motionCallbackCounter++; +} + +int main() +{ + int dataReadCounter = 0; + float totalMotionDx = 0.0; + float totalMotionDy = 0.0; + +#if defined (USE_MOTION_BURST) + adns9500::MotionData data; + sensor.attach(&motionCallback); +#elif defined (FRAME_CAPTURE) + uint8_t frame[adns9500::NUMBER_OF_PIXELS_PER_FRAME]; +#else + sensor.attach(&motionCallback); +#endif + + sensor.reset(); + +#if ! defined (FRAME_CAPTURE) + // Firmware upload + int crc = sensor.sromDownload(FIRMWARE_FILENAME); + printf("Firmware CRC: 0x%x (%s)\r\n", crc, FIRMWARE_FILENAME); +#endif + + // Enable laser + sensor.enableLaser(); + printf("Laser enabled\r\n"); + +#if ! defined (FRAME_CAPTURE) + printData.attach_us(&printDataCallback, 500); +#endif + + while(true) { + if (motionTriggered) { + motionTriggered = false; + +#if defined (USE_MOTION_BURST) + sensor.getMotionData(data); + totalMotionDx += data.dxMM; + totalMotionDy += data.dyMM; +#else + float dx, dy; + sensor.getMotionDeltaMM(dx, dy); + totalMotionDx += dx; + totalMotionDy += dy; +#endif + dataReadCounter++; + } + + if (printDataTriggered) { + printDataTriggered = false; +#if defined (USE_MOTION_BURST) + printf("Motion burst: %f, %f, quality=%d, average=%f, maximum=%d, minimum=%d, " + "shutter=%d, periodo=%d, read=%d, irq=%d\r\n", + totalMotionDx, totalMotionDy, + data.surfaceQuality, data.averagePixel, data.maximumPixel, data.minimumPixel, + data.shutter, data.framePeriod, dataReadCounter, + motionCallbackCounter); +#else + printf("Motion delta: %f, %f, read=%d, irq=%d\r\n", + totalMotionDx, totalMotionDy, dataReadCounter, motionCallbackCounter); +#endif + } + +#if defined (FRAME_CAPTURE) + printf("FRAME:%d:", dataReadCounter); + sensor.captureFrame(frame); + for(uint8_t *p = frame; p != frame + sizeof(frame); ++p) + printf("%x", *p); + printf("\r\n"); + dataReadCounter++; +#endif + } +}