Ejemplo n.º 1
0
void WBState::drawGL()
{
	glDisable(GL_LIGHTING);
	glPointSize(2);
	glColor3f(1,1,0);
	glBegin(GL_POINTS);
	glVertex3f(pose.x,pose.y,pose.z);
	glEnd();
	glColor3f(0,0,1);
	int num=getNumSectors();
	for(int i=0;i<num;i++)sectors[i].drawGL();
}
Ejemplo n.º 2
0
double WBState::getClosestAngle(double ang)
{
double retangle, minimum=2*PI,val;
retangle=ang=Angle::makePositive(ang);

	int num=getNumSectors();
	for(int i=0;i<num;i++)
		{
			if((sectors[i].min<=ang)&&(sectors[i].max>=ang))return ang;
			if((sectors[i].min<ang)&&((val=ang-sectors[i].max)<minimum)){
				retangle=sectors[i].max;
				minimum=val;
				}
			if((sectors[i].max>ang)&&((val=sectors[i].min-ang)<minimum)){
				retangle=sectors[i].min;
				minimum=val;
				}

		}
	return retangle;
}
Ejemplo n.º 3
0
static void executeCommand(HarddiskIde* hd, UInt8 cmd)
{
    hd->statusReg &= ~(STATUS_DRQ | STATUS_ERR);
    hd->transferRead = 0;
    hd->transferWrite = 0;
    switch (cmd) {
    case 0xef: // Set Feature
        if (hd->featureReg != 0x03) {
            setError(hd, 0x04);
        }
        break;

    case 0xec: // ATA Identify Device
        if (diskReadSector(hd->diskId, hd->sectorData, -1, 0, 0, 0, NULL) != DSKE_OK) {
            setError(hd, 0x44);
            break;
        }
        hd->transferCount = 512/2;
        hd->sectorDataOffset = 0;
        hd->transferRead = 1;
        hd->statusReg |= STATUS_DRQ;
        break;

    case 0x91:
        break;

    case 0xf8: {
        UInt32 sectorCount = diskGetSectorsPerTrack(hd->diskId);
	    hd->sectorNumReg    = (UInt8)((sectorCount >>  0) & 0xff);
	    hd->cylinderLowReg  = (UInt8)((sectorCount >>  8) & 0xff);
	    hd->cylinderHighReg = (UInt8)((sectorCount >> 16) & 0xff);
	    hd->devHeadReg      = (UInt8)((sectorCount >> 24) & 0x0f);
        break;
    }
    case 0x30: { // Write Sector
        int sectorNumber = getSectorNumber(hd);
        int numSectors = getNumSectors(hd);
        if ((sectorNumber + numSectors) > diskGetSectorsPerTrack(hd->diskId)) {
            setError(hd, 0x14);
            break;
        }
        hd->transferSectorNumber = sectorNumber;
        hd->transferCount = 512/2 * numSectors;
        hd->sectorDataOffset = 0;
        hd->transferWrite = 1;
        hd->statusReg |= STATUS_DRQ;
        break;
    }
    case 0x20: { // Read Sector
        int sectorNumber = getSectorNumber(hd);
        int numSectors = getNumSectors(hd);
        int i;

        if ((sectorNumber + numSectors) > diskGetSectorsPerTrack(hd->diskId)) {
            setError(hd, 0x14);
            break;
        }
          
        for (i = 0; i < numSectors; i++) {
            if (diskReadSector(hd->diskId, hd->sectorData + i * 512, sectorNumber + i + 1, 0, 0, 0, NULL) != DSKE_OK) {
                break;
            }
        }
        if (i != numSectors) {
            setError(hd, 0x44);
            break;
        }

        hd->transferCount = 512/2 * numSectors;
        hd->sectorDataOffset = 0;
        hd->transferRead = 1;
        hd->statusReg |= STATUS_DRQ;
        break;
    }
    default: // all others
        setError(hd, 0x04);
    }
}