irom void i2c_error_format_string(string_t *dst, i2c_error_t error) { string_cat(dst, ": i2c bus error: "); if(error < i2c_error_size) string_cat_ptr(dst, error_strings[error]); else string_cat(dst, "<unknown error>"); string_cat(dst, " (in bus state: "); if(state < i2c_state_size) string_cat_ptr(dst, state_strings[state]); else string_format(dst, "<unknown state %d>", state); string_cat(dst, ")"); }
irom void io_config_dump(string_t *dst, const config_t *cfg, int io_id, int pin_id, bool html) { const io_info_entry_t *info; io_data_entry_t *data; io_data_pin_entry_t *pin_data; const io_config_pin_entry_t *pin_config; const string_array_t *strings; int io, pin, value; io_error_t error; if(html) strings = &dump_strings.html; else strings = &dump_strings.plain; string_cat_ptr(dst, (*strings)[ds_id_header]); for(io = 0; io < io_id_size; io++) { if((io_id >= 0) && (io_id != io)) continue; info = &io_info[io]; data = &io_data[io]; string_cat_ptr(dst, (*strings)[ds_id_preline]); string_format_ptr(dst, (*strings)[ds_id_io], io, info->name, info->address); string_cat_ptr(dst, (*strings)[ds_id_postline]); if(!data->detected) { string_cat_ptr(dst, (*strings)[ds_id_preline]); string_cat_ptr(dst, (*strings)[ds_id_not_detected]); string_cat_ptr(dst, (*strings)[ds_id_postline]); continue; } for(pin = 0; pin < info->pins; pin++) { if((pin_id >= 0) && (pin_id != pin)) continue; pin_config = &cfg->io_config[io][pin]; pin_data = &data->pin[pin]; string_cat_ptr(dst, (*strings)[ds_id_preline]); string_format_ptr(dst, (*strings)[ds_id_pin], pin); string_cat_ptr(dst, (*strings)[ds_id_flags_1]); pin_string_from_flags(dst, pin_config); string_cat_ptr(dst, (*strings)[ds_id_flags_2]); string_cat_ptr(dst, (*strings)[ds_id_mode]); if((pin_config->mode != io_pin_disabled) && (pin_config->mode != io_pin_i2c) && (pin_config->mode != io_pin_uart)) if((error = io_read_pin_x(dst, info, pin_data, pin_config, pin, &value)) != io_ok) string_cat(dst, "\n"); else (void)0; else error = io_ok; switch(pin_config->mode) { case(io_pin_disabled): { string_cat_ptr(dst, (*strings)[ds_id_disabled]); break; } case(io_pin_input_digital): { if(error == io_ok) string_format_ptr(dst, (*strings)[ds_id_input], onoff(value)); else string_cat_ptr(dst, (*strings)[ds_id_error]); break; } case(io_pin_counter): { if(error == io_ok) string_format_ptr(dst, (*strings)[ds_id_counter], value, pin_config->speed); else string_cat_ptr(dst, (*strings)[ds_id_error]); break; } case(io_pin_trigger): { if(error == io_ok) { string_format_ptr(dst, (*strings)[ds_id_trigger_1], value, pin_config->speed, pin_config->shared.trigger.io.io, pin_config->shared.trigger.io.pin); trigger_type_to_string(pin_config->shared.trigger.trigger_mode, dst); string_cat_ptr(dst, (*strings)[ds_id_trigger_2]); } else string_cat_ptr(dst, (*strings)[ds_id_error]); break; } case(io_pin_output_digital): { if(error == io_ok) string_format_ptr(dst, (*strings)[ds_id_output], onoff(value)); else string_cat_ptr(dst, (*strings)[ds_id_error]); break; } case(io_pin_timer): { if(error == io_ok) string_format_ptr(dst, (*strings)[ds_id_timer], pin_config->direction == io_dir_up ? "up" : (pin_config->direction == io_dir_down ? "down" : "none"), pin_config->speed, pin_data->direction == io_dir_up ? "up" : (pin_data->direction == io_dir_down ? "down" : "none"), pin_data->speed, onoff(value)); else string_cat_ptr(dst, (*strings)[ds_id_error]); break; } case(io_pin_output_analog): { if(error == io_ok) string_format_ptr(dst, (*strings)[ds_id_analog_output], pin_config->shared.output_analog.lower_bound, pin_config->shared.output_analog.upper_bound, pin_config->speed, pin_data->direction == io_dir_up ? "up" : (pin_data->direction == io_dir_down ? "down" : "none"), value); else string_cat_ptr(dst, (*strings)[ds_id_error]); break; } case(io_pin_i2c): { if(pin_config->shared.i2c.pin_mode == io_i2c_sda) string_cat_ptr(dst, (*strings)[ds_id_i2c_sda]); else string_cat_ptr(dst, (*strings)[ds_id_i2c_scl]); break; } case(io_pin_uart): { string_cat_ptr(dst, (*strings)[ds_id_uart]); break; } case(io_pin_lcd): { string_cat_ptr(dst, (*strings)[ds_id_lcd]); string_cat(dst, "/"); io_string_from_lcd_mode(dst, pin_config->shared.lcd.pin_use); break; } default: { string_cat_ptr(dst, (*strings)[ds_id_unknown]); break; } } string_cat(dst, " [hw: "); io_string_from_ll_mode(dst, pin_config->llmode); string_cat(dst, "]"); if(info->get_pin_info_fn) { string_cat_ptr(dst, (*strings)[ds_id_info_1]); info->get_pin_info_fn(dst, info, pin_data, pin_config, pin); string_cat_ptr(dst, (*strings)[ds_id_info_2]); } string_cat_ptr(dst, (*strings)[ds_id_postline]); } } string_cat_ptr(dst, (*strings)[ds_id_footer]); }