+int cmd_do_can_change_timing(cmd_io_t *cmd_io, const struct cmd_des *des, char *param[])
+{
+ int opchar;
+ uint32_t controller_id, brp, prop_seg, phase_seg1, phase_seg2, sjw;
+
+ if ((opchar = cmd_opchar_check(cmd_io, des, param)) < 0)
+ return opchar;
+
+ if (opchar == ':')
+ {
+ if (!(sscanf(param[1], "%u:%u %u %u %u %u", &controller_id, &brp, &prop_seg, &phase_seg1, &phase_seg2, &sjw) == 6))
+ {
+ rpp_sci_printf("Unable to parse arguments\n");
+ return 1;
+ }
+
+ if (controller_id < 1 || controller_id > 3)
+ return -CMDERR_BADPAR;
+
+ can_config.ctrl[controller_id-1].baudrate = 0;
+ can_config.ctrl[controller_id-1].timing_config = &can_timing[controller_id-1];
+ can_config.ctrl[controller_id-1].timing_config->brp = brp;
+ can_config.ctrl[controller_id-1].timing_config->phase_seg1 = phase_seg1;
+ can_config.ctrl[controller_id-1].timing_config->phase_seg2 = phase_seg2;
+ can_config.ctrl[controller_id-1].timing_config->prop_seg = prop_seg;
+ can_config.ctrl[controller_id-1].timing_config->sjw = sjw;
+ can_config.ctrl[controller_id-1].timing_calc_method = RPP_CAN_TIMING_CALC_MANUAL;
+ }
+ else
+ {
+ if (!(sscanf(param[1], "%u", &controller_id) == 1))
+
+ if (controller_id < 1 || controller_id > 3)
+ return -CMDERR_BADPAR;
+
+ if (can_config.ctrl[controller_id-1].timing_config != NULL) {
+ rpp_sci_printf("brp: %u\r\nprop_seg: %u tQ\r\nphase_seg1: %u tQ\r\nphase_seg2: %u tQ\r\nsjw: %u tQ\r\nsample_pt: %u ns\r\nerror: %u\r\n tQ: %u ns\r\n",
+ can_config.ctrl[controller_id-1].timing_config->brp,
+ can_config.ctrl[controller_id-1].timing_config->prop_seg,
+ can_config.ctrl[controller_id-1].timing_config->phase_seg1,
+ can_config.ctrl[controller_id-1].timing_config->phase_seg2,
+ can_config.ctrl[controller_id-1].timing_config->sjw,
+ can_config.ctrl[controller_id-1].timing_config->sampl_pt,
+ can_config.ctrl[controller_id-1].timing_config->error,
+ can_config.ctrl[controller_id-1].timing_config->tq
+ );
+
+ }
+ else {
+ rpp_sci_printf("CAN timing has not yet been manualy specified.\r\n");
+ }
+ }
+
+ return 0;
+}
+
+