Esempio n. 1
0
void OldNoiseBuffer::create(const OldNoiseParams &param,
		double first_x, double first_y, double first_z,
		double last_x, double last_y, double last_z,
		double samplelength_x, double samplelength_y, double samplelength_z)
{
	clear();
	
	m_start_x = first_x - samplelength_x;
	m_start_y = first_y - samplelength_y;
	m_start_z = first_z - samplelength_z;
	m_samplelength_x = samplelength_x;
	m_samplelength_y = samplelength_y;
	m_samplelength_z = samplelength_z;

	m_size_x = (last_x - m_start_x)/samplelength_x + 2;
	m_size_y = (last_y - m_start_y)/samplelength_y + 2;
	m_size_z = (last_z - m_start_z)/samplelength_z + 2;

	m_data = new double[m_size_x*m_size_y*m_size_z];

	for(int x=0; x<m_size_x; x++)
	for(int y=0; y<m_size_y; y++)
	for(int z=0; z<m_size_z; z++)
	{
		double xd = (m_start_x + (double)x*m_samplelength_x);
		double yd = (m_start_y + (double)y*m_samplelength_y);
		double zd = (m_start_z + (double)z*m_samplelength_z);
		double a = noise3d_param(param, xd,yd,zd);
		intSet(x,y,z, a);
	}
}
Esempio n. 2
0
bool I2CController::step(I2COp** result) {
	bool processing = true;

	*result = NULL;

	while (processing) {
		switch (state) {
		default:
		case I2C_STATE_ERROR:
			state = I2C_STATE_START;
			return true;
		case I2C_STATE_START_WAIT:
		case I2C_STATE_WRITE_ADDR_WAIT:
		case I2C_STATE_WRITE_DATA_WAIT:
		case I2C_STATE_READ_DATA_WAIT:
			if (intSet()) {
				state = (I2CState) (state + 1);
			} else {
				processing = false;
			}
			break;
		case I2C_STATE_START:
			if (pendingOps.getSize() > 0) {
				sendStart();
				state = I2C_STATE_START_WAIT;
			} else {
				processing = false;
			}
			break;
		case I2C_STATE_START_RESPONSE:
			switch (TW_STATUS) {
			case TW_REP_START:
			case TW_START:
				state = I2C_STATE_WRITE_ADDR;
				break;
			case TW_MT_ARB_LOST:
				state = I2C_STATE_START;
				break;
			default:
				state = I2C_STATE_ERROR;
				break;
			}
			break;
		case I2C_STATE_WRITE_ADDR:
			writeByte(
					(pendingOps.peek()->addr << 1)
							| (pendingOps.peek()->write ? TW_WRITE : TW_READ));
			state = I2C_STATE_WRITE_ADDR_WAIT;
			break;
		case I2C_STATE_WRITE_ADDR_RESPONSE:
			switch (TW_STATUS) {
			case TW_MT_SLA_ACK:
			case TW_MR_SLA_ACK:
				state = pendingOps.peek()->write ?
						I2C_STATE_WRITE_DATA : I2C_STATE_READ_DATA;
				break;
			case TW_MT_SLA_NACK:
			case TW_MR_SLA_NACK:
			case TW_MT_ARB_LOST:
				state = I2C_STATE_START;
				break;
			default:
				state = I2C_STATE_ERROR;
				break;
			}
			break;
		case I2C_STATE_WRITE_DATA:
			if (!pendingOps.getSize()) {
				state = I2C_STATE_START;
			} else if (!pendingOps.peek()->data.getSize()) {
				state = I2C_STATE_DATA_DONE;
			} else {
				writeByte(pendingOps.peek()->data.peek());
				state = I2C_STATE_WRITE_DATA_WAIT;
			}
			break;
		case I2C_STATE_WRITE_DATA_RESPONSE:
			switch (TW_STATUS) {
			case TW_MT_DATA_ACK:
				pendingOps.peek()->data.dequeue();
				state = I2C_STATE_WRITE_DATA;
				break;
			case TW_MT_DATA_NACK:
			case TW_MT_ARB_LOST:
				state = I2C_STATE_DATA_DONE;
				break;
			default:
				state = I2C_STATE_ERROR;
				break;
			}
			break;
		case I2C_STATE_READ_DATA:
			if (pendingOps.peek()->data.full()) {
				state = I2C_STATE_DATA_DONE;
			} else {
				requestByte(
						pendingOps.peek()->data.getSize()
								!= pendingOps.peek()->data.getBufferSize() - 1);
				state = I2C_STATE_READ_DATA_WAIT;
			}
			break;
		case I2C_STATE_READ_DATA_RESPONSE:
			switch (TW_STATUS) {
			case TW_MR_DATA_ACK:
				pendingOps.peek()->data.enqueue(readByte());
				state = I2C_STATE_READ_DATA;
				break;
			case TW_MR_DATA_NACK:
				pendingOps.peek()->data.enqueue(readByte());
				state = I2C_STATE_DATA_DONE;
				break;
			default:
				state = I2C_STATE_ERROR;
				break;
			}
			break;
		case I2C_STATE_DATA_DONE:
			pendingOps.dequeue(result);
		case I2C_STATE_CLOSE:
			if (!pendingOps.getSize())
				sendClose();
			if (state == I2C_STATE_DATA_DONE) {
				state = I2C_STATE_START;
				return true;
			} else {
				state = I2C_STATE_START;
				break;
			}
		}
	}
	return false;
}