@Override
		public void update(Observable o, Object arg) {
			TouchPacket packet = (TouchPacket)arg;
			if(packet.id == 800) {
				// discard, special packet
				return;
			}
			// translate x and y...
			int x = (int)(((double)packet.x / 32768d) * (double)getWidth());
			int y = (int)(((double)packet.y / 32768d) * (double)getHeight());
			Point p = new Point(x,y);
                        
                        CalibrationPanel cp = CalibrationPanel.getInstance();
                        if(!cp.isDone()) {
                            cp.processTouch(p);
                            return;
                        }
                        CalibrationTranslator ct = cp.getTranslator();
                        p = ct.translate(p);

			if(packet.touch == 1 && this.pressed.containsKey((int)packet.id)) {
				// send drag
				Point pOld = this.pressed.get((int)packet.id);
				if(Math.abs(pOld.distance(p)) > 5) {
					this.touchDragged((int)packet.id, p);
					this.pressed.put((int)packet.id, p);
				}
			}
			else if(packet.touch == 1 && !this.pressed.containsKey((int)packet.id)) {
				this.pressed.put((int)packet.id, p);
				// send pressed
				this.touchPressed((int)packet.id, p);
			}
			else if(packet.touch == 0) {
				this.pressed.remove(new Integer((int)packet.id));
				// send release
				this.touchReleased((int)packet.id);
			}
		}