Alvaro Cassinelli
/
skinGames_forktest
just a test
Fork of scoreLight_Advanced by
Diff: soundSpot.h
- Revision:
- 30:d8af03f01cd4
- Parent:
- 27:1ce994629ffc
- Child:
- 31:5f039cbddee8
--- a/soundSpot.h Wed Jun 20 03:25:49 2012 +0000 +++ b/soundSpot.h Fri Sep 21 10:02:35 2012 +0000 @@ -1,143 +1,143 @@ -#ifndef SOUNDSPOT_H -#define SOUNDSPOT_H - -//#define SEND_AS_BLOB // for test (sending positions in a single OSC blob chunk) -//#define SEND_AS_STRING -#define SEND_AS_POINTS - -// The global object OSC for sending/receiving messages: -#include "mbedOSC.h" -extern OSCMessage recMes; -extern OSCMessage sendMes; -extern OSCClass osc; - -extern DigitalOut myled2; // for tests... - -#include "classLaserSensingTrajectory.h" -#include "classRigidScafold.h" - - -#define min(a, b) (((a) < (b)) ? (a) : (b)) -#define max(a, b) (((a) > (b)) ? (a) : (b)) - -// This is a polymorphic class, and elasticLoop, livingSpot are derived classes that -// instantiate particular methods (update, etc). -class soundSpot { -protected: // (note: protected means that the child classes will have access to these variables/methods; private means that only this class members have access) - - // number of points of this blob: - int numPoints; // this in fact is equal to sensingTrajectory.size() for instance. - Timer measureSendPeriod; - -public: - - // CONSTRUCTOR AND DESTRUCTOR -------------------------------------------------------------------------------------------------------------- - soundSpot(); - // Destructor (virtual, because one can only delete an object of a derived type - // through a pointer to one of its base classes IF the base class has a virtual destructor) - virtual ~soundSpot();// { cout<<"Destroying Base";} - - // METHODS ------------------------------------------------------------------------------------------------------------- - // COMMON methods to all the kind of blobs: - // (1) properties of the visible loop: - void setColor(unsigned char c); - // (2) Sending modes: - void stopAllSending(void); - void resetAllSendingModes(void); - void initCommonVariables(); - void sendData(void); // send data common to all kind of blobs - - // VIRTUAL METHODS (common to all blobs, but each type of blob will implement it differently): - // Blob creation: - virtual void setRegionMotion(float mmix, float mmiy, float mmax, float mmay)=0; -// virtual void createBlob()=0; // note: the number of masses in the blob will be given from the scafold. -// virtual void createBlob(int _id, ElasticLoopMode _elasticBlobMode, vector2D _initPos)=0; - // Update: - virtual void update(void)=0; - virtual void computeBoundingBox(void)=0; // this is virtual because the displayed blob may be the scafold itself (in case of laser spot), or the elastic loop. - // Draw (on lsdTrajectory): - virtual void draw(void)=0; // NOTE: this method actually "renders" the trajectory using the laser renderer (not yet done) -// Send data through OSC: - virtual void sendDataSpecific(void)=0; // send data specific to each blob -// Some parameters (very different treatement for each type of blob): - virtual void speedFactor(float speedfactor=100.0)=0; - - // DATA -------------------------------------------------------------------------------------------------------------- - int identifier; //0, 1, 2... - char spotName[20]; //spot, elastic,... (this may be useful to set particular variables by forcing type cast (bad, but couldn't find a more elegant solution for the moment) - unsigned char blobColor, transientBlobColor; // transient blob color is the color of the blob when touching something for instance. - - // initial position and speed of the blob: - vector2Df startCenter; - vector2Df startSpeed; - - // Special fields: - vector2Df gravity; - - // SCAFOLD (rigid structure of points, with a center and methods to create it): - RigidScafold bluePrint; - - // LASER DISPLAY/SENSING-TRAJECTORY with DATA BUFFER for each blob: - LaserSensingTrajectory displaySensingBuffer; - -// the following are common to all kind of blobs, but the way these quantities are calculated (in the update() method) differs greatly: - vector2Df totalLightForce; - vector2Df recenteringVectorLoop; - float angleCorrectionForceLoop; - float angleRecenteringVector; // auxiliary variables for sending data (for the recenteringVectorLoop) - float normRecenteringVector; - - // Geometry/kinematics of the loop: - float cx, cy, w, h; - float area, approxArea; - float totalKineticEnergy; - - bool render; // when false, the blob is NOT RENDERED - bool standByMode; // when true, the blob is NOT UPDATED - - // something touched the blob: - bool searchActive; - bool firstTimeNoTouch; - //bool lightTouched; // belongs to the lsdTrajectory - int noTouchedCounter; - vector2Df randomForce; - - // the blob touched the wall limits (these variables are updated in the "update" method, and implemented differently for each blob) - bool blobWallCollision; - int wallCounter; - - // HARDWARE SENDING MODE (can be changed by serial or osc commands): - unsigned short periodSendingData; // max data rate for sending data (in ms) - bool sendSerial; - bool sendOSC; - bool sendingOnlyWhenTouch; // when this is "true", data will be send ONLY when something touches the blob (border or light touch). Note that the max speed of sending - // will be limited to periodSendingData. - // SENDING modes for things COMMON TO ALL THE KIND OF BLOBS: - // (d) Light sensing statistics: - bool sendingBlobMaxMin; // max and min intensities are calculated directly from the lsdTrajectory - bool sendingTouched; // when someone touches the blob (can be calculated directly from the lsdTrajectory) - bool sendingLightForce; // the total light force (note: this CANNOT be calculated on the lsdTrajectory, but on the update method, particular to each loop). - // (e) Recentering vector: (note: redundant with sendingLightForce, IF the correction angle is known). - bool sendingRecenteringVector; - bool sendingRecenteringAngle; - bool sendingRecenteringNorm; - - // SPECIFIC TO EACH BLOB (move this from here, use virtual methods to set their values): - // (a) anchor mass data: - bool sendingAnchorPosition; - bool sendingAnchorForce; // this is the total force on the anchor mass, not just the recentering force - bool sendingAnchorTouchWall; - // (b) data from blob points: - bool sendingLoopPositions; - bool sendingLoopForces;// this is not just the forces from light, but all the forces in each particle - bool sendingLoopForcesLight; - bool sendingLoopRegions; // from this we can detect "hits" - bool sendingLoopTouchWall; - // (c) Blob geometry/kinematics: - bool sendingBlobArea; - bool sendingKineticEnergy; - bool sendingBlobNormals; - bool sendingBlobAngles; // redundant with sendingBlobNormals, but simplified (only angle of normal) -}; - +#ifndef SOUNDSPOT_H +#define SOUNDSPOT_H + +//#define SEND_AS_BLOB // for test (sending positions in a single OSC blob chunk) +//#define SEND_AS_STRING +#define SEND_AS_POINTS + +// The global object OSC for sending/receiving messages: +#include "mbedOSC.h" +extern OSCMessage recMes; +extern OSCMessage sendMes; +extern OSCClass osc; + +extern DigitalOut myled2; // for tests... + +#include "classLaserSensingTrajectory.h" +#include "classRigidScafold.h" + + +#define min(a, b) (((a) < (b)) ? (a) : (b)) +#define max(a, b) (((a) > (b)) ? (a) : (b)) + +// This is a polymorphic class, and elasticLoop, livingSpot are derived classes that +// instantiate particular methods (update, etc). +class soundSpot { +protected: // (note: protected means that the child classes will have access to these variables/methods; private means that only this class members have access) + + // number of points of this blob: + int numPoints; // this in fact is equal to sensingTrajectory.size() for instance. + Timer measureSendPeriod; + +public: + + // CONSTRUCTOR AND DESTRUCTOR -------------------------------------------------------------------------------------------------------------- + soundSpot(); + // Destructor (virtual, because one can only delete an object of a derived type + // through a pointer to one of its base classes IF the base class has a virtual destructor) + virtual ~soundSpot();// { cout<<"Destroying Base";} + + // METHODS ------------------------------------------------------------------------------------------------------------- + // COMMON methods to all the kind of blobs: + // (1) properties of the visible loop: + void setColor(unsigned char c); + // (2) Sending modes: + void stopAllSending(void); + void resetAllSendingModes(void); + void initCommonVariables(); + void sendData(void); // send data common to all kind of blobs + + // VIRTUAL METHODS (common to all blobs, but each type of blob will implement it differently): + // Blob creation: + virtual void setRegionMotion(float mmix, float mmiy, float mmax, float mmay)=0; +// virtual void createBlob()=0; // note: the number of masses in the blob will be given from the scafold. +// virtual void createBlob(int _id, ElasticLoopMode _elasticBlobMode, vector2D _initPos)=0; + // Update: + virtual void update(void)=0; + virtual void computeBoundingBox(void)=0; // this is virtual because the displayed blob may be the scafold itself (in case of laser spot), or the elastic loop. + // Draw (on lsdTrajectory): + virtual void draw(void)=0; // NOTE: this method actually "renders" the trajectory using the laser renderer (not yet done) +// Send data through OSC: + virtual void sendDataSpecific(void)=0; // send data specific to each blob +// Some parameters (very different treatement for each type of blob): + virtual void speedFactor(float speedfactor=100.0)=0; + + // DATA -------------------------------------------------------------------------------------------------------------- + int identifier; //0, 1, 2... + char spotName[20]; //spot, elastic,... (this may be useful to set particular variables by forcing type cast (bad, but couldn't find a more elegant solution for the moment) + unsigned char blobColor, transientBlobColor; // transient blob color is the color of the blob when touching something for instance. + + // initial position and speed of the blob: + vector2Df startCenter; + vector2Df startSpeed; + + // Special fields: + vector2Df gravity; + + // SCAFOLD (rigid structure of points, with a center and methods to create it): + RigidScafold bluePrint; + + // LASER DISPLAY/SENSING-TRAJECTORY with DATA BUFFER for each blob: + LaserSensingTrajectory displaySensingBuffer; + +// the following are common to all kind of blobs, but the way these quantities are calculated (in the update() method) differs greatly: + vector2Df totalLightForce; + vector2Df recenteringVectorLoop; + float angleCorrectionForceLoop; + float angleRecenteringVector; // auxiliary variables for sending data (for the recenteringVectorLoop) + float normRecenteringVector; + + // Geometry/kinematics of the loop: + float cx, cy, w, h; + float area, approxArea; + float totalKineticEnergy; + + bool render; // when false, the blob is NOT RENDERED + bool standByMode; // when true, the blob is NOT UPDATED + + // something touched the blob: + bool searchActive; + bool firstTimeNoTouch; + //bool lightTouched; // belongs to the lsdTrajectory + int noTouchedCounter; + vector2Df randomForce; + + // the blob touched the wall limits (these variables are updated in the "update" method, and implemented differently for each blob) + bool blobWallCollision; + int wallCounter; + + // HARDWARE SENDING MODE (can be changed by serial or osc commands): + unsigned short periodSendingData; // max data rate for sending data (in ms) + bool sendSerial; + bool sendOSC; + bool sendingOnlyWhenTouch; // when this is "true", data will be send ONLY when something touches the blob (border or light touch). Note that the max speed of sending + // will be limited to periodSendingData. + // SENDING modes for things COMMON TO ALL THE KIND OF BLOBS: + // (d) Light sensing statistics: + bool sendingBlobMaxMin; // max and min intensities are calculated directly from the lsdTrajectory + bool sendingTouched; // when someone touches the blob (can be calculated directly from the lsdTrajectory) + bool sendingLightForce; // the total light force (note: this CANNOT be calculated on the lsdTrajectory, but on the update method, particular to each loop). + // (e) Recentering vector: (note: redundant with sendingLightForce, IF the correction angle is known). + bool sendingRecenteringVector; + bool sendingRecenteringAngle; + bool sendingRecenteringNorm; + + // SPECIFIC TO EACH BLOB (move this from here, use virtual methods to set their values): + // (a) anchor mass data: + bool sendingAnchorPosition; + bool sendingAnchorForce; // this is the total force on the anchor mass, not just the recentering force + bool sendingAnchorTouchWall; + // (b) data from blob points: + bool sendingLoopPositions; + bool sendingLoopForces;// this is not just the forces from light, but all the forces in each particle + bool sendingLoopForcesLight; + bool sendingLoopRegions; // from this we can detect "hits" + bool sendingLoopTouchWall; + // (c) Blob geometry/kinematics: + bool sendingBlobArea; + bool sendingKineticEnergy; + bool sendingBlobNormals; + bool sendingBlobAngles; // redundant with sendingBlobNormals, but simplified (only angle of normal) +}; + #endif \ No newline at end of file