static void imu_update_task(void *params)
{
    (void)params;
    int res;

    struct i2c_dev *i2c1 = i2c_get_device(I2C_1);

    i2c_init(i2c1, 400000);

    res = is9150_init(i2c1, IS_9150_ADDR << 1);
    pr_info("IMU: init res=");
    pr_info_int(res);
    pr_info("\r\n");
    (void)res;

    /* Clear the sensor data structures */
    memset(sensor_data, 0x00, sizeof(struct is9150_all_sensor_data) * 2);

    while(1) {
        res = is9150_read_all_sensors(fill_buf);
        if (!res)
            imu_update_buf_ptrs();
        vTaskDelay(1);
    }
}
int CAN_device_init(uint8_t channel, uint32_t baud)
{
	pr_info("Initializing CAN");
	pr_info_int(channel);
	pr_info_int_msg(" with baud rate ", baud);

	if (!initQueues()) {
		pr_info("CAN init queues failed\r\n");
		return 0;
	}

	switch (channel) {
	case 0:
		CAN_device_init_1(baud);
		break;
	case 1:
		CAN_device_init_2(baud);
		break;
	default:
		pr_info("CAN init device failed\r\n");
		return 0;
	}

	/* Clear out all filter values except 0.  It accepts all. */
	CAN_device_set_filter(channel, 0, 1, 0, 0, true);
	for (size_t i = 1; i < CAN_FILTER_COUNT; ++i)
		CAN_device_set_filter(channel, i, 0, 0, 0, false);

	pr_info("CAN init success!\r\n");
	return 1;
}
void updateSampleRates(LoggerConfig *loggerConfig, int *loggingSampleRate,
                       int *telemetrySampleRate, int *timebaseSampleRate)
{
    *loggingSampleRate = getHighestSampleRate(loggerConfig);
    *timebaseSampleRate = *loggingSampleRate;
    *timebaseSampleRate = getHigherSampleRate(BACKGROUND_SAMPLE_RATE, *timebaseSampleRate);
    *telemetrySampleRate = calcTelemetrySampleRate(loggerConfig, *loggingSampleRate);

    pr_info("timebase/logging/telemetry sample rate: ");
    pr_info_int(decodeSampleRate(*timebaseSampleRate));
    pr_info("/");
    pr_info_int(decodeSampleRate(*loggingSampleRate));
    pr_info("/");
    pr_info_int(decodeSampleRate(*telemetrySampleRate));
    pr_info("\r\n");
}
void WriteScriptPage(Serial *serial, unsigned int argc, char **argv){
	if (argc < 2){
		put_commandError(serial, ERROR_CODE_INVALID_PARAM);
		return;
	}

	unsigned int page = modp_atoi(argv[1]);
	char *scriptPage = "";
	if (argc >= 3) scriptPage = argv[2];

	if (page >=0 && page < SCRIPT_PAGES){
		if (argc >= 2) unescape(scriptPage);
		lockLua();
		vPortEnterCritical();
		pr_info_int(strlen(scriptPage));
		pr_info("=");
		pr_info(scriptPage);
		pr_info("\r\n");
		int result = flashScriptPage(page, scriptPage);
		vPortExitCritical();
		unlockLua();
		if (result == 0){
			put_commandOK(serial);
		}
		else{
			put_commandError(serial, result);
		}
	}
	else{
		put_commandError(serial, ERROR_CODE_INVALID_PARAM);
	}
}
int CAN_device_init(uint8_t channel, uint32_t baud)
{

    pr_info("CAN");
    pr_info_int(channel);
    pr_info(" init @ ");
    pr_info_int(baud);

    if (initQueues()) {
        switch (channel) {
        case 0:
            CAN_device_init_1(baud);
            break;
        }
        pr_info(" win\r\n");
        return 1;
    } else {
        pr_info(" fail\r\n");
        return 0;
    }
}
int main(int argc, char* argv[])
{

	LoggerConfig *config = getWorkingLoggerConfig();
	initApi();
	initialize_logger_config();
	setupMockSerial();
	imu_init(config);
	resetPredictiveTimer();

	int pt;

	pt = open("/dev/ptmx", O_RDWR | O_NOCTTY);
	if (pt < 0)
	{
		perror("open /dev/ptmx");
		return 1;
	}

	grantpt(pt);
	unlockpt(pt);

	fprintf(stderr, "RaceCapture/Pro simulator on: %s\n", ptsname(pt));

	char line[LINE_BUFFER_SIZE];
	memset(line, 0, LINE_BUFFER_SIZE);
	int messageCount = 0;
	while(1){
		size_t count = 0;
		line[0] = '\0';
		while (count < LINE_BUFFER_SIZE){
			char c;
			read(pt, &c, 1);
			line[count] = c;
			count++;
			if (c == '\r'){
				line[count] = '\0';
				break;
			}
		}

		printf("rx: (%zu): %s\r\n", strlen(line), line);
		mock_resetTxBuffer();
		process_api(getMockSerial(), line, strlen(line));
		char *txBuffer = mock_getTxBuffer();
		printf("tx:(%zu) %s\r\n", strlen(txBuffer), txBuffer);
		write(pt, txBuffer, strlen(txBuffer));
		pr_info_int(++messageCount);
		pr_info(" messages\r\n");
	}
	return 0;
}