uint8_t isl28022_read()

in common/sensor/dev/isl28022.c [12:72]


uint8_t isl28022_read(uint8_t sensor_num, int *reading)
{
	if ((reading == NULL) ||
	    (sensor_config[SensorNum_SensorCfg_map[sensor_num]].init_args == NULL)) {
		return SENSOR_UNSPECIFIED_ERROR;
	}

	isl28022_init_arg *init_arg =
		(isl28022_init_arg *)sensor_config[SensorNum_SensorCfg_map[sensor_num]].init_args;
	if (init_arg->is_init == false) {
		printk("isl28022_read, device isn't initialized\n");
		return SENSOR_UNSPECIFIED_ERROR;
	}

	uint8_t retry = 5;
	I2C_MSG msg;
	uint8_t offset = sensor_config[SensorNum_SensorCfg_map[sensor_num]].offset;
	sensor_val *sval = (sensor_val *)reading;
	memset(sval, 0, sizeof(sensor_val));

	msg.bus = sensor_config[SensorNum_SensorCfg_map[sensor_num]].port;
	msg.slave_addr = sensor_config[SensorNum_SensorCfg_map[sensor_num]].slave_addr;
	msg.tx_len = 1;
	msg.rx_len = 2;
	msg.data[0] = offset;
	if (i2c_master_read(&msg, retry)) {
		/* read fail */
		return SENSOR_FAIL_TO_ACCESS;
	}

	if (offset == ISL28022_BUS_VOLTAGE_REG) {
		/* unsigned */
		uint16_t read_mv;

		if ((init_arg->config.fields.BRNG == 0b11) ||
		    (init_arg->config.fields.BRNG == 0b10)) {
			read_mv = ((msg.data[0] << 6) | (msg.data[1] >> 2)) * 4;
		} else if (init_arg->config.fields.BRNG == 0b01) {
			read_mv = ((msg.data[0] << 5) | (msg.data[1] >> 3)) * 4;
		} else {
			read_mv = (((msg.data[0] & BIT_MASK(7)) << 5) | (msg.data[1] >> 3)) * 4;
		}
		sval->integer = read_mv / 1000;
		sval->fraction = read_mv % 1000;
	} else if (offset == ISL28022_CURRENT_REG) {
		/* signed */
		float read_current =
			((int16_t)(msg.data[0] << 8) | msg.data[1]) * init_arg->current_LSB;
		sval->integer = read_current;
		sval->fraction = (read_current - sval->integer) * 1000;
	} else if (offset == ISL28022_POWER_REG) {
		/* unsigned */
		float read_power = ((msg.data[0] << 8) | msg.data[1]) * init_arg->current_LSB * 20;
		sval->integer = read_power;
		sval->fraction = ((read_power - sval->integer) * 1000);
	} else {
		return SENSOR_FAIL_TO_ACCESS;
	}

	return SENSOR_READ_SUCCESS;
}