package lejos.nxt.addon; import lejos.nxt.I2CPort; import lejos.nxt.I2CSensor; import java.awt.*; /* * WARNING: THIS CLASS IS SHARED BETWEEN THE classes AND pccomms PROJECTS. * DO NOT EDIT THE VERSION IN pccomms AS IT WILL BE OVERWRITTEN WHEN THE PROJECT IS BUILT. */ /** * Mindsensors NXTCam. * www.mindsensors.com * * Author Lawrie Griffiths * */ public class NXTCam extends I2CSensor { byte[] buf = new byte[4]; /** * Used by sortBy() to choose sorting criteria based on size (ordered largest to smallest). */ public static final char SIZE = 'A'; /** * Used by sortBy() to choose sorting criteria based on color id (ordered 0 to 7). */ public static final char COLOR = 'U'; /** * Used by sortBy() to choose no sorting of detected objects. */ public static final char NO_SORTING = 'X'; /** * Used by setTrackingMode() to choose object tracking. */ public static final char OBJECT_TRACKING = 'B'; /** * Used by setTrackingMode() to choose line tracking. */ public static final char LINE_TRACKING = 'L'; public NXTCam(I2CPort port) { super(port); port.setType(TYPE_LOWSPEED_9V); } /** * Get the number of objects being tracked * * @return number of objects (0 - 8) */ public int getNumberOfObjects() { int ret = getData(0x42, buf, 1); if(ret != 0) return -1; return (0xFF & buf[0]); } /** * Camera sorts objects it detects according to criteria, either color, size, * or no sorting at all. * @param sortType Use the class constants SIZE, COLOR, or NO_SORTING. */ public void sortBy(char sortType) { sendCommand(sortType); } /** * * @param enable true to enable, false to disable */ public void enableTracking(boolean enable) { if(enable) sendCommand('E'); else sendCommand('D'); } /** * Choose either object or line tracking mode. * @param mode Use either OBJECT_TRACKING or LINE_TRACKING */ public void setTrackingMode(char mode) { sendCommand(mode); } /** * Get the color number for a tracked object * * @param id the object number (starting at zero) * @return the color of the object (starting at zero) */ public int getObjectColor(int id) { int ret = getData(0x43 + (id * 5), buf, 1); if(ret != 0) return -1; return (0xFF & buf[0]); } /** * Get the rectangle containing a tracked object * * @param id the object number (starting at zero) * @return the rectangle */ public Rectangle getRectangle(int id) { for(int i=0;i<4;i++) buf[i] = 0; getData(0x44 + (id * 5), buf, 4); return new Rectangle(buf[0] & 0xFF, buf[1] & 0xFF, (buf[2] & 0xFF) - (buf[0] & 0xFF), (buf[3] & 0xFF) - (buf[1] & 0xFF)); } /** * Send a single byte command represented by a letter * @param cmd the letter that identifies the command */ public void sendCommand(char cmd) { sendData(0x41, (byte) cmd); } }