Laser Sensing Display for UI interfaces in the real world

Dependencies:   mbed

Fork of skinGames_forktest by Alvaro Cassinelli

Committer:
mbedalvaro
Date:
Fri Sep 21 10:02:35 2012 +0000
Revision:
30:d8af03f01cd4
Parent:
24:4e52031a495b
Child:
32:52273c3291fe
first commit. Not yet functional. Added ghost and pacman game modes, but the behaviour of these "rigid spots" is not implemented yet

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbedalvaro 30:d8af03f01cd4 1 #include "classLaserSensingTrajectory.h"
mbedalvaro 30:d8af03f01cd4 2
mbedalvaro 30:d8af03f01cd4 3 LaserSensingTrajectory::LaserSensingTrajectory(): lightTouched(false) {
mbedalvaro 30:d8af03f01cd4 4 }
mbedalvaro 30:d8af03f01cd4 5
mbedalvaro 30:d8af03f01cd4 6 LaserSensingTrajectory::~LaserSensingTrajectory() {
mbedalvaro 30:d8af03f01cd4 7 // lsdTrajectory.clear(); // there is no need to clear the vector, the destructor of this vector is called by default (and it's NOT a vector of pointers)
mbedalvaro 30:d8af03f01cd4 8 }
mbedalvaro 30:d8af03f01cd4 9
mbedalvaro 30:d8af03f01cd4 10
mbedalvaro 30:d8af03f01cd4 11 void LaserSensingTrajectory::setDelayMirrors(int delay) {
mbedalvaro 30:d8af03f01cd4 12 delayMirrorSamples=delay;
mbedalvaro 30:d8af03f01cd4 13 }
mbedalvaro 30:d8af03f01cd4 14
mbedalvaro 30:d8af03f01cd4 15 void LaserSensingTrajectory::addDelayMirrors(int add_delay) {
mbedalvaro 30:d8af03f01cd4 16 delayMirrorSamples+=add_delay;
mbedalvaro 30:d8af03f01cd4 17 }
mbedalvaro 30:d8af03f01cd4 18
mbedalvaro 30:d8af03f01cd4 19 void LaserSensingTrajectory::processSensedData() {
mbedalvaro 30:d8af03f01cd4 20 // Compute max and min intensity on the loop
mbedalvaro 30:d8af03f01cd4 21 maxI=0;
mbedalvaro 30:d8af03f01cd4 22 minI=255; // ratio has been normalized between 0 and 255
mbedalvaro 30:d8af03f01cd4 23 int auxSize=lsdTrajectory.size();
mbedalvaro 30:d8af03f01cd4 24
mbedalvaro 30:d8af03f01cd4 25 // Compute minimum and maximum intensities:
mbedalvaro 30:d8af03f01cd4 26 for (int i = 0; i < lsdTrajectory.size(); i++) {
mbedalvaro 30:d8af03f01cd4 27 unsigned char mesI=lsdTrajectory[i].intensity;
mbedalvaro 30:d8af03f01cd4 28 if (maxI<mesI) maxI=mesI;
mbedalvaro 30:d8af03f01cd4 29 if (minI>mesI) minI=mesI;
mbedalvaro 30:d8af03f01cd4 30 }
mbedalvaro 30:d8af03f01cd4 31
mbedalvaro 30:d8af03f01cd4 32 // Compute autoThreshold:
mbedalvaro 30:d8af03f01cd4 33 if (minI==0) autoThreshold=0; // (we consider that the saccade is FULL on something white)
mbedalvaro 30:d8af03f01cd4 34 else if (1.0*maxI/minI > MIN_CONTRAST_RATIO ) {
mbedalvaro 30:d8af03f01cd4 35 autoThreshold = (unsigned char) (1.0 * (maxI-minI) * THRESHOLD_FACTOR + minI); // THRESHOLD_FACTOR = 2/3 or 1/2 is a good value.
mbedalvaro 30:d8af03f01cd4 36 } else {// ... otherwise, we consider that the saccade is FULL on something white
mbedalvaro 30:d8af03f01cd4 37 autoThreshold=0;
mbedalvaro 30:d8af03f01cd4 38 }
mbedalvaro 30:d8af03f01cd4 39
mbedalvaro 30:d8af03f01cd4 40 // Segment the trajectory (only two levels for the time being, but we can have more - meaning different forces, real or even complex values to have different angle forces...):
mbedalvaro 30:d8af03f01cd4 41 // NOTE: if using 1 and -1 instead of 1 and 0, we can avoid having to add a "blob internal pressure"! -1 means a force towards the interior, and +1 outwards...
mbedalvaro 30:d8af03f01cd4 42 // This means that the loop will naturally become inside-out depending on the color of the main surface! (but will mantain its normal size). Much better and elegant solution than the
mbedalvaro 30:d8af03f01cd4 43 // idea of the blob "constant" internal pressure...
mbedalvaro 30:d8af03f01cd4 44 lightTouched=false;
mbedalvaro 30:d8af03f01cd4 45 // int counterLight=0;
mbedalvaro 30:d8af03f01cd4 46 for (int i = 0; i < lsdTrajectory.size(); i++) {
mbedalvaro 30:d8af03f01cd4 47 int delayedpoint=(i+auxSize+delayMirrorSamples)%auxSize; // this way we can have negative delayMirrorSamples if required (would be absurd though)
mbedalvaro 30:d8af03f01cd4 48 if (lsdTrajectory[delayedpoint].intensity>=autoThreshold) { // this means a WHITE zone:
mbedalvaro 30:d8af03f01cd4 49 lsdTrajectory[i].lightZone= -1;
mbedalvaro 30:d8af03f01cd4 50 // counterLight++;
mbedalvaro 30:d8af03f01cd4 51 } else { // something touched: DARK ZONE
mbedalvaro 30:d8af03f01cd4 52 lsdTrajectory[i].lightZone= 2;
mbedalvaro 30:d8af03f01cd4 53 lightTouched=true; // (for the whole loop)
mbedalvaro 30:d8af03f01cd4 54 }
mbedalvaro 30:d8af03f01cd4 55 }
mbedalvaro 30:d8af03f01cd4 56 //coko=counterLight;
mbedalvaro 30:d8af03f01cd4 57 // lightRatio=1.0*counterLight/lsdTrajectory.size();
mbedalvaro 30:d8af03f01cd4 58 }