ir_remote_t ev3_infrared_sensor_get_remote()

in ev3-api/src/ev3api_sensor.c [367:425]


ir_remote_t ev3_infrared_sensor_get_remote(sensor_port_t port) {
	ir_remote_t result;
	ER ercd;

//	lazy_initialize();
	CHECK_PORT(port);
	CHECK_COND(ev3_sensor_get_type(port) == INFRARED_SENSOR, E_OBJ);

	uint8_t val[4];
	uart_sensor_fetch_data(port, IR_REMOTE, &val, 4 * sizeof(uint8_t));
	for (int i = 0; i < 4; i++) {
		switch(val[i])
		{
		case 0:  // no buttons pressed
			result.channel[i] = 0;
			continue;
		case 1:  // red up
			result.channel[i] = IR_RED_UP_BUTTON;
			continue;
		case 2:  // red down
			result.channel[i] = IR_RED_DOWN_BUTTON;
			continue;
		case 3:  // blue up
			result.channel[i] = IR_BLUE_UP_BUTTON;
			continue;
		case 4:  // blue down
			result.channel[i] = IR_BLUE_DOWN_BUTTON;
			continue;
		case 5:  // red up and blue up
			result.channel[i] = IR_RED_UP_BUTTON + IR_BLUE_UP_BUTTON;
			continue;
		case 6:  // red up and blue down
			result.channel[i] = IR_RED_UP_BUTTON + IR_BLUE_DOWN_BUTTON;
			continue;
		case 7:  // red down and blue up
			result.channel[i] = IR_RED_DOWN_BUTTON + IR_BLUE_UP_BUTTON;
			continue;
		case 8:  // red down and blue down
			result.channel[i] = IR_RED_DOWN_BUTTON + IR_BLUE_DOWN_BUTTON;
			continue;
		case 9:  // beacon mode on
			result.channel[i] = IR_BEACON_BUTTON;
			continue;
		case 10: // red up and red down
			result.channel[i] = IR_RED_UP_BUTTON + IR_RED_DOWN_BUTTON;
			continue;
		case 11: // blue up and blue down
			result.channel[i] = IR_BLUE_UP_BUTTON + IR_BLUE_DOWN_BUTTON;
		}
	}
	return result;

error_exit:
	syslog(LOG_WARNING, "%s(): ercd %d", __FUNCTION__, ercd);
	for (int i = 0; i < 4; i++) {
		result.channel[i] = 0;
	}
	return result;
}