// camera.cc // buzz - Programme du robot Efrei Robotique I1-I2 2003 // Copyright (C) 2003 Nicolas Schodet // #include "camera.h" #include "erreur/erreur.h" #include "kernel/pbus.h" #include "config/config.h" #include #include #include // Debug. #include // #include #define CAM_FILE "/dev/robotcam" // Constructeur. Camera::Camera () { // Taille par défaut. m_w = 352; m_h = 288; m_cut = 0; // Ouvre le périphérique. m_fd = open (CAM_FILE, O_RDONLY); if (m_fd == -1) throw ErreurFatale ("Impossible d'ouvrir le périphérique de la" " camera.\n"); // Paramètre la camera. sccb_io param; Config rc ("rc/camera"); int addr, data; while (!rc.eof ()) { if (rc.isId ("width")) { rc.getId (); m_w = rc.getNum (); cout << "camera width " << m_w << endl; } else if (rc.isId ("height")) { rc.getId (); m_h = rc.getNum (); cout << "camera height " << m_h << endl; } else if (rc.isId ("cut")) { rc.getId (); m_cut = rc.getNum (); cout << "camera cut " << m_cut << endl; } else if (rc.isId ("setup")) { rc.getId (); addr = rc.getNum (); data = rc.getNum (); param.addr = addr; param.data = data; cout << "camera sccbwrite 0x" << hex << addr << " 0x" << data << endl; ioctl (m_fd, CAM_SCCBWRITE, ¶m); } } // Affiche les paramètres. cout << hex << "camera sccbdump"; for (addr = 0; addr < 0x50; ++addr) { if (!(addr % 16)) cout << endl; param.addr = addr; ioctl (m_fd, CAM_SCCBREAD, ¶m); data = param.data; cout << setw (2) << setfill ('0') << data << ' '; } cout << endl << dec; // Paramètre la taille de frame. ioctl (m_fd, CAM_SETHCOUNT, &m_w); m_frameSize = m_w * m_h + m_cut; ioctl (m_fd, CAM_SETFRAMESIZE, &m_frameSize); } // Destructeur. Camera::~Camera () { // Ferme le périphérique de camera. close (m_fd); } // Lit une image. int Camera::read (unsigned char *image) const { int r; // Lit les données sur la camera. if (m_cut) r = ::read (m_fd, image, m_cut); if (!m_cut || r) r = ::read (m_fd, image, m_frameSize - m_cut); cout << "camera read " << r << endl; return r; }