Warning: opendir(/home/svn/Public/temp/wsvnDwPz1w/avrcam.h.r48) [function.opendir]: failed to open dir: Not a directory in /home/svn/Public/dl.php on line 38

Warning: Cannot modify header information - headers already sent by (output started at /home/svn/Public/dl.php:38) in /home/svn/Public/dl.php on line 238

Warning: Cannot modify header information - headers already sent by (output started at /home/svn/Public/dl.php:38) in /home/svn/Public/dl.php on line 239

Warning: Cannot modify header information - headers already sent by (output started at /home/svn/Public/dl.php:38) in /home/svn/Public/dl.php on line 240
/****************************************************************************** * AVRRA: The AVR Robotics API * avrcam.h - driver for AVRCam from JRobot.net. Uses serial1, Mega324P only * NOTE: serial1.h should not be used when using this file... * * Copyright (c) 2004-2008, Michael E. Ferguson * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * - Neither the name of AVRRA nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF * THE POSSIBILITY OF SUCH DAMAGE. *****************************************************************************/ // we now externally define this, and use it to include the file #ifdef TGT_HAS_CAMERA // Only one camera per robot (currently) #ifndef XR_VISION #define XR_VISION #include #include #include #include "utils.h" #include "serial.h" // this allows use of the AVRcamVIEW software to see tracking //#define AVR_CAM_INTERFACE // Vision driver modes of operation #define VMODE_NONE 0 #define VMODE_PING 1 #define VMODE_A 2 // A recieved, looking for C #define VMODE_C 3 #define VMODE_K 4 #define VMODE_N 5 #define VMODE_RAW 6 // pass a raw image #define VMODE_ET 7 // tracking enabled #define VMODE_TFRAME 8 // recieving a tracking frame. #define VMODE_TCOLOR 9 #define VMODE_TXMIN 10 #define VMODE_TXMAX 11 #define VMODE_TYMIN 12 #define VMODE_TYMAX 13 static int visionMode; typedef struct{ int color; int xmin; int xmax; int ymin; int ymax; }t_object; // tracked data t_object objects[8]; int numObjects; int newVisData; // tracking reception data int numObjRec; // #of objects to recieve // camera status int camStatus; #define CAM_ERROR 0 #define CAM_OK 1 #define CAM_TRACKING 2 static int rawPackets; /** Starts the vision system and serial port 1 */ void visionInit(){ // initialise visual system numObjects = 0; visionMode = VMODE_NONE; newVisData = 0; // start serial port 1 UBRR1H = 0; UBRR1L = 7; // enable rx and tx SetBit(UCSR1B, RXEN1); SetBit(UCSR1B, TXEN1); // enable interrupt on complete reception of a byte SetBit(UCSR1B, RXCIE1); } /** Sends a character out the serial port. */ void serial1Write(byte data){ while (bit_is_clear(UCSR1A, UDRE1)) ; UDR1 = data; } /** This will decide if camera is functioning. */ int pingCam(){ int timeouts=0; visionMode = VMODE_PING; camStatus = CAM_ERROR; serial1Write('P'); serial1Write('G'); serial1Write('\r'); // Wait max of half second while(timeouts<20){ delayms(25); if(camStatus > CAM_ERROR){ return 1; } timeouts++; } return 0; } /** Pass a raw camera image back to the AVRCamView program */ void passRawCam(){ if(camStatus==CAM_OK){ visionMode = VMODE_RAW; rawPackets = 0; serial1Write('D'); serial1Write('F'); serial1Write('\r'); // quick hack to make it work... //Print("ACK\r"); }else{ Print("NCK\r"); } } void passSegCam(){ // this function will send seg cam info back to pc } /** Enable tracking, interrupt driven response */ void enableTracking(){ visionMode = VMODE_ET; camStatus=CAM_TRACKING; serial1Write('E'); serial1Write('T'); serial1Write('\r'); numObjects = 0; newVisData = 0; } /** Disable tracking */ void disableTracking(){ visionMode = VMODE_NONE; camStatus=CAM_OK; serial1Write('D'); serial1Write('T'); serial1Write('\r'); #ifdef AVR_CAM_INTERFACE Print("ACK\r numObjects = 0;"); #endif } /** Set color map for AVRCAM */ void setColorMap(){ // 16 bytes for red, green and blue int bytes = 48; serial1Write('S'); serial1Write('M'); while(bytes > 0){ while(serialAvailable() == 0) ; serial1Write(serialRead()); bytes--; } // Send ACK Print("ACK\r"); } /** interrupt driven camera handler... */ ISR(USART1_RX_vect){ unsigned char c = UDR1; switch(visionMode){ case VMODE_RAW: // pass raw image upwards serialWrite(c); if(c == 0x0F){ rawPackets++; } if(rawPackets > 72){ visionMode = VMODE_NONE; } break; case VMODE_PING: // check to see if Ack or Nck. if(c == 'A'){ visionMode = VMODE_A; camStatus = CAM_OK; }else{ visionMode = VMODE_N; } serialWrite(c); break; case VMODE_A: case VMODE_N: // C recieved serialWrite(c); visionMode = VMODE_C; break; case VMODE_C: // K recieved serialWrite(c); visionMode = VMODE_K; break; case VMODE_K: // \r recieved serialWrite(c); visionMode = VMODE_NONE; break; case VMODE_ET: // beginning of ET if(c == 0x0A){ visionMode = VMODE_TFRAME; } #ifdef AVR_CAM_INTERFACE serialWrite(c); #endif break; case VMODE_TFRAME: // this is our number of tracked objects numObjRec = c; if(numObjRec > 8){ numObjRec = 0; visionMode = VMODE_ET; }else{ numObjects = 0; visionMode = VMODE_TCOLOR; } #ifdef AVR_CAM_INTERFACE serialWrite(c); #endif break; case VMODE_TCOLOR: objects[numObjects].color = c; visionMode = VMODE_TXMIN; #ifdef AVR_CAM_INTERFACE serialWrite(c); #endif break; case VMODE_TXMIN: objects[numObjects].xmin = c; visionMode = VMODE_TYMAX; #ifdef AVR_CAM_INTERFACE serialWrite(c); #endif break; case VMODE_TYMAX: objects[numObjects].ymax = c; visionMode = VMODE_TXMAX; #ifdef AVR_CAM_INTERFACE serialWrite(c); #endif break; case VMODE_TXMAX: objects[numObjects].xmax = c; visionMode = VMODE_TYMIN; #ifdef AVR_CAM_INTERFACE serialWrite(c); #endif break; case VMODE_TYMIN: objects[numObjects].ymin = c; if(numObjects < numObjRec){ numObjects++; visionMode = VMODE_TCOLOR; }else{ //sysMsg("gtf"); visionMode = VMODE_ET; newVisData = 1; } #ifdef AVR_CAM_INTERFACE serialWrite(c); #endif break; default: // do nothing with extra input break; } } #endif #endif