/*! \brief ECU specific std button handler \param widget is a pointer to the widget the user modified \param data is unused \returns TRUE */ G_MODULE_EXPORT gboolean ecu_std_button_handler(GtkWidget *widget, gpointer data) { gint handler = 0; gchar *tmpbuf = NULL; gfloat tmpf = 0.0; const gchar *dest = NULL; ENTER(); handler = (MS2StdHandler)(GINT)OBJ_GET(widget,"handler"); switch ((MS2StdHandler)handler) { case GET_CURR_TPS: tmpbuf = (gchar *)OBJ_GET(widget,"source"); lookup_current_value_f(tmpbuf,&tmpf); dest = (const gchar *)OBJ_GET(widget,"dest_widget"); tmpbuf = g_strdup_printf("%.0f",tmpf); gtk_entry_set_text(GTK_ENTRY(lookup_widget_f(dest)),tmpbuf); g_signal_emit_by_name(lookup_widget_f(dest),"activate",NULL); g_free(tmpbuf); break; default: MTXDBG(CRITICAL,_("ERROR handler NOT found for widget %s, command aborted! BUG!!!\n"),glade_get_widget_name(widget)); break; } EXIT(); return TRUE; }
/*! \brief Resets the TTM buttons to defaults */ G_MODULE_EXPORT void reset_ttm_buttons(void) { GtkWidget *widget = NULL; ENTER(); widget = lookup_widget_f("toothlogger_disable_radio_button"); if (GTK_IS_WIDGET(widget)) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget),TRUE); widget = lookup_widget_f("triggerlogger_disable_radio_button"); if (GTK_IS_WIDGET(widget)) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget),TRUE); widget = lookup_widget_f("compositelogger_disable_radio_button"); if (GTK_IS_WIDGET(widget)) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget),TRUE); }
/*! \brief shows the sensor calibration help text \param widget is the button the user clicked on \param data is unused \returns TRUE */ G_MODULE_EXPORT gboolean show_sensor_calibration_help(GtkWidget *widget, gpointer data) { GtkWidget *window; GtkWidget *view; gchar * text = NULL; GtkTextBuffer *buffer; ENTER(); window = gtk_window_new(GTK_WINDOW_TOPLEVEL); view = gtk_text_view_new (); gtk_text_view_set_editable(GTK_TEXT_VIEW(view),FALSE); gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(view),FALSE); gtk_container_set_border_width(GTK_CONTAINER(view),5); gtk_container_add(GTK_CONTAINER(window),view); buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view)); text = g_strdup("MAP Sensor Calibration\n\nFor the MPX4115 use 10.6 and 121.7\nMPX4250 10.0 260.0\nMPXH6300 1.1 315.5\nGM 3-BAR 1.1 315.5\nMPXH6400 3.5 416.5\n\n(GM 3-bar data from Dave Hartnell, http://www.not2fast.com/electronics/component_docs/MAP_12223861.pdf)\n\n Sensor type vLo pLo vHi pHi vRef\n MPX4115 0.204 v 15 kPa 4.794 v 115 kPa 5.100 v\n MPX4250 0.204 v 20 kPa 4.896 v 250 kPa 5.100 v\n MPXH6300 0.306 v 20 kPa 4.913 v 304 kPa 5.100 v\n GM 3-BAR 0.631 v 40 kPa 4.914 v 304 kPa 5.100 v\n MPXH6400 0.200 v 20 kPa 4.800 v 400 kPa 5.000 v\n\nIn general, use values derived from these equations:\n\n m = (pHi-pLo)/(vHi-vLo)\n pv1 = pLo - m * vLo\n pv2 = pv1 + m * vRef\n\nReferences:\n http://www.freescale.com/files/sensors/doc/data_sheet/MPX4115A.pdf\n http://www.freescale.com/files/sensors/doc/data_sheet/MPX4250A.pdf\n http://www.freescale.com/files/sensors/doc/data_sheet/MPXH6300A.pdf\n http://www.freescale.com/files/sensors/doc/data_sheet/MPXH6400A.pdf\n\nBarometer Sensor Calibration\n\nIf your system has an external barometer sensor, separate from the MAP sensor,\nthen use these values to calibrate it properly. If you have a standard MS installation, then copy your MAP sensor values here.\n\nBarometric Correction Calibration\n\nCorrection for barometric effects is performed using the linear function below.\n\n correction = correction_0 + (rate * barometer) / 100\n'At total vacuum' contains the total correction at a barometer reading of 0 kPa (you are on the moon).\nThe 'Rate' contains the percentage per 100 kPa to scale the barometer value.\nUsing the default values of 147 and -47, we see that for a barometer of 100 kPa,\nwe have 100% correction.\ncorrection = 147 + (-47*100) / 100 = 100%\n "); gtk_text_buffer_set_text (buffer, text, -1); g_free(text); gtk_window_set_transient_for(GTK_WINDOW(window),GTK_WINDOW(lookup_widget_f("main_window"))); gtk_widget_show(window); EXIT(); return TRUE; }
G_MODULE_EXPORT gboolean select_file_for_ecu_restore(GtkWidget *widget, gpointer data) { MtxFileIO *fileio = NULL; gchar *filename = NULL; extern gconstpointer *global_data; if (!DATA_GET(global_data,"interrogated")) return FALSE; fileio = g_new0(MtxFileIO ,1); fileio->external_path = g_strdup("MTX_ecu_snapshots"); fileio->parent = lookup_widget_f("main_window"); fileio->on_top = TRUE; fileio->title = g_strdup("Restore your ECU Settings from which file"); fileio->action = GTK_FILE_CHOOSER_ACTION_OPEN; fileio->shortcut_folders = g_strdup("ecu_snapshots,MTX_ecu_snapshots"); filename = choose_file(fileio); if (filename == NULL) { update_logbar_f("tools_view","warning",_("NO FILE chosen for ECU restore\n"),FALSE,FALSE,FALSE); return FALSE; } update_logbar_f("tools_view",NULL,_("Full Restore of ECU Initiated\n"),FALSE,FALSE,FALSE); restore_all_ecu_settings(filename); g_free(filename); free_mtxfileio(fileio); return TRUE; }
/*! \brief revert_to_previous_data() reverts the VEX import by using the backup of the internal datastructures. */ G_MODULE_EXPORT void revert_to_previous_data(void) { gint canID=0; gint page=0; gint offset=0; gint total = 0; guchar *data = NULL; GModule *module = NULL; PostFunction *pf = NULL; GArray *pfuncs = NULL; guint8 **ecu_data_backup = NULL; /* Called to back out a load of a VEtable from VEX import */ Firmware_Details *firmware = NULL; firmware = DATA_GET(global_data,"firmware"); ecu_data_backup = firmware->ecu_data_backup; for (page=0;page<firmware->total_pages;page++) { if (!firmware->page_params[page]->dl_by_default) continue; if (firmware->chunk_support) { total = firmware->page_params[page]->length; data = g_new0(guchar,total); for (offset=0;offset<total;offset++) data[offset]=ms_get_ecu_data_backup(canID,page,offset,MTX_U08); ms_chunk_write(canID,page,0,total,data); } else { for (offset = 0;offset<firmware->page_params[page]->length;offset++) { if (ms_get_ecu_data_backup(canID,page,offset,MTX_U08) != ms_get_ecu_data(canID,page,offset,MTX_U08)) { ms_send_to_ecu(canID,page,offset,MTX_U08,ecu_data_backup[page][offset], FALSE); } } } } module = g_module_open(NULL,G_MODULE_BIND_LAZY); pfuncs = g_array_new(FALSE,TRUE,sizeof(PostFunction *)); pf = g_new0(PostFunction,1); pf->name = g_strdup("update_ecu_controls_pf"); if (module) g_module_symbol(module,pf->name,(void *)&pf->function); pf->w_arg = FALSE; pfuncs = g_array_append_val(pfuncs,pf); g_module_close(module); io_cmd_f(NULL,pfuncs); gtk_widget_set_sensitive(lookup_widget_f("tools_undo_vex_button"),FALSE); update_logbar_f("tools_view","warning",_("Reverting to previous settings....\n"),FALSE,FALSE,FALSE); io_cmd_f(firmware->burn_all_command,NULL); }
G_MODULE_EXPORT void select_table_for_import(gint table_num) { MtxFileIO *fileio = NULL; gchar *filename = NULL; GIOChannel *iochannel = NULL; Firmware_Details *firmware = NULL; firmware = DATA_GET(global_data,"firmware"); if (!DATA_GET(global_data,"interrogated")) return; if ((table_num < 0) || (table_num >= firmware->total_tables)) return; fileio = g_new0(MtxFileIO ,1); fileio->external_path = g_strdup("MTX_VexFiles"); fileio->parent = lookup_widget_f("main_window"); fileio->on_top = TRUE; fileio->title = g_strdup("Select your VEX file to import"); fileio->action = GTK_FILE_CHOOSER_ACTION_OPEN; filename = choose_file(fileio); if (filename == NULL) { update_logbar_f("tools_view","warning",_("NO FILE chosen for VEX import\n"),FALSE,FALSE,FALSE); return; } iochannel = g_io_channel_new_file(filename, "r+",NULL); if (!iochannel) { update_logbar_f("tools_view","warning",_("File open FAILURE! \n"),FALSE,FALSE,FALSE); return; } update_logbar_f("tools_view",NULL,_("VEX File Closed\n"),FALSE,FALSE,FALSE); gtk_entry_set_text(GTK_ENTRY(lookup_widget_f("tools_vex_comment_entry")),""); single_table_import(iochannel,table_num); g_io_channel_shutdown(iochannel,TRUE,NULL); g_io_channel_unref(iochannel); free_mtxfileio(fileio); return; }
/*! \brief resets the ms2 ttm's zoom value */ G_MODULE_EXPORT void ms2_ttm_reset_zoom(void) { GtkWidget *widget = NULL; ENTER(); widget = lookup_widget_f("ttm_zoom"); if (GTK_IS_WIDGET(widget)) gtk_range_set_value(GTK_RANGE(widget),1.0); EXIT(); return; }
G_MODULE_EXPORT gboolean select_vex_for_export(GtkWidget *widget, gpointer data) { MtxFileIO *fileio = NULL; gchar *filename = NULL; GIOChannel *iochannel = NULL; struct tm *tm = NULL; time_t *t = NULL; Firmware_Details *firmware = NULL; firmware = DATA_GET(global_data,"firmware"); if (!DATA_GET(global_data,"interrogated")) return FALSE; t = g_malloc(sizeof(time_t)); time(t); tm = localtime(t); g_free(t); fileio = g_new0(MtxFileIO ,1); fileio->external_path = g_strdup("MTX_VexFiles"); fileio->title = g_strdup("Save your VEX file"); fileio->parent = lookup_widget_f("main_window"); fileio->on_top = TRUE; fileio->default_filename= g_strdup("VEX_Backup.vex"); fileio->default_filename= g_strdup_printf("%s-%.4i%.2i%.2i%.2i%.2i.vex",g_strdelimit(firmware->name," ,",'_'),tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min); fileio->default_extension= g_strdup("vex"); fileio->action = GTK_FILE_CHOOSER_ACTION_SAVE; filename = choose_file(fileio); if (filename == NULL) { update_logbar_f("tools_view","warning",_("NO FILE chosen for VEX export\n"),FALSE,FALSE,FALSE); return FALSE; } iochannel = g_io_channel_new_file(filename, "a+",NULL); if (!iochannel) { update_logbar_f("tools_view","warning",_("File open FAILURE! \n"),FALSE,FALSE,FALSE); return FALSE; } if (vex_comment == NULL) update_logbar_f("tools_view",NULL,_("VEX File Opened. VEX Comment undefined, exporting without one.\n"),FALSE,FALSE,FALSE); else update_logbar_f("tools_view",NULL,_("VEX File Opened. VEX Comment already stored.\n"),FALSE,FALSE,FALSE); all_table_export(iochannel); g_io_channel_shutdown(iochannel,TRUE,NULL); g_io_channel_unref(iochannel); free_mtxfileio(fileio); return TRUE; }
/*! \brief all_table_import() is called to import Tables from a file. There currently exists a big problem in that newer firmwares (msns-extra and MS-II) have multiple tables per page and the VEX 1.0 spec does NOT account for that. \param iochannel pointer to the output channel to read the data from. */ G_MODULE_EXPORT gboolean all_table_import(GIOChannel *iochannel) { gboolean go=TRUE; GIOStatus status = G_IO_STATUS_NORMAL; Vex_Import *vex = NULL; if (!iochannel) { dbg_func_f(CRITICAL,g_strdup(__FILE__": all_table_import()\n\tIOChannel undefined, returning!!\n")); return FALSE; } vex = g_new0(Vex_Import, 1); vex->table = -1; /*reset_import_flags();*/ status = g_io_channel_seek_position(iochannel,0,G_SEEK_SET,NULL); if (status != G_IO_STATUS_NORMAL) dbg_func_f(CRITICAL,g_strdup(__FILE__": all_table_import()\n\tError seeking to beginning of the file\n")); /* process lines while we can */ while (go) { status = process_vex_line(vex,iochannel); if ((status == G_IO_STATUS_EOF)||(status == G_IO_STATUS_ERROR)) { go = FALSE; break; } /* This check means we got 1 whole ve/spark table, so we feed * it to the ECU clear the data structure and start over... */ if ((status != G_IO_STATUS_EOF) & (vex->got_page) & (vex->got_load) & (vex->got_rpm) & (vex->got_ve)) { feed_import_data_to_ecu(vex); dealloc_vex_struct(vex); vex = g_new0(Vex_Import, 1); vex->table = -1; } } dealloc_vex_struct(vex); gtk_widget_set_sensitive(lookup_widget_f("tools_undo_vex_button"),TRUE); if (status == G_IO_STATUS_ERROR) { dbg_func_f(CRITICAL,g_strdup_printf(__FILE__": all_table_import()\n\tRead was unsuccessful. %i %i %i %i \n",vex->got_page, vex->got_load, vex->got_rpm, vex->got_ve)); return FALSE; } return TRUE; }
G_MODULE_EXPORT gboolean select_file_for_ecu_backup(GtkWidget *widget, gpointer data) { MtxFileIO *fileio = NULL; gchar *filename = NULL; struct tm *tm = NULL; time_t *t = NULL; extern gconstpointer *global_data; Firmware_Details *firmware = NULL; firmware = DATA_GET(global_data,"firmware"); if (!DATA_GET(global_data,"interrogated")) return FALSE; t = g_malloc(sizeof(time_t)); time(t); tm = localtime(t); g_free(t); fileio = g_new0(MtxFileIO ,1); fileio->external_path = g_strdup("MTX_ecu_snapshots"); fileio->title = g_strdup("Save your ECU Settings to file"); fileio->parent = lookup_widget_f("main_window"); fileio->on_top = TRUE; fileio->default_filename = g_strdup_printf("%s-%.4i_%.2i_%.2i-%.2i%.2i.ecu",g_strdelimit(firmware->name," ,",'_'),tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min); fileio->default_extension = g_strdup("ecu"); fileio->action = GTK_FILE_CHOOSER_ACTION_SAVE; fileio->shortcut_folders = g_strdup("MTX_ecu_snapshots"); filename = choose_file(fileio); if (filename == NULL) { update_logbar_f("tools_view","warning",_("NO FILE chosen for ECU Backup\n"),FALSE,FALSE,FALSE); return FALSE; } update_logbar_f("tools_view",NULL,_("Full Backup of ECU Initiated\n"),FALSE,FALSE,FALSE); backup_all_ecu_settings(filename); update_logbar_f("tools_view",NULL,_("Full Backup File Closed\n"),FALSE,FALSE,FALSE); g_free(filename); free_mtxfileio(fileio); return TRUE; }
/*! \brief ECU specific plugin handler for combo boxes \param widget is the pointer to the combo box \param data is unused \returns TRUE */ G_MODULE_EXPORT gboolean jimstim_rpm_value_changed(GtkWidget *widget, gpointer data) { gchar *tmpbuf = NULL; gchar *widget_name = NULL; GtkWidget *entry = NULL; gint val = 0; printf("slider moved!\n"); widget_name = OBJ_GET(widget,"special"); g_return_val_if_fail(widget_name,FALSE); entry = lookup_widget_f(widget_name); g_return_val_if_fail(entry,FALSE); val = (GINT)gtk_range_get_value(GTK_RANGE(widget)); if (GTK_IS_ENTRY(entry)) { tmpbuf = g_strdup_printf("%i",val); gtk_entry_set_text(GTK_ENTRY(entry),tmpbuf); g_signal_emit_by_name(entry,"activate"); g_free(tmpbuf); } return TRUE; }
/*! \brief ECU specific plugin handler for combo boxes \param widget is the pointer to the combo box \param data is unused \returns TRUE */ G_MODULE_EXPORT gboolean ecu_combo_handler(GtkWidget *widget, gpointer data) { gint canID = 0; gint page = 0; gint offset = 0; gint bitval = 0; gint bitmask = 0; gint bitshift = 0; gint dl_type = 0; gint last_rpm = 0; gint dload_val = 0; DataSize size = MTX_U08; GtkTreeIter iter; GtkTreeModel *model = NULL; gchar *tmpbuf = NULL; GtkWidget *partner = NULL; gboolean state = FALSE; MSCommonStdHandler handler = 0; get_essential_bits_f(widget, &canID, &page, &offset, &bitval, &bitmask, &bitshift); dl_type = (GINT) OBJ_GET(widget,"dl_type"); handler = (GINT) OBJ_GET(widget,"handler"); size = (DataSize)OBJ_GET(widget,"size"); state = gtk_combo_box_get_active_iter(GTK_COMBO_BOX(widget),&iter); model = gtk_combo_box_get_model(GTK_COMBO_BOX(widget)); if (!state) { /* Not selected by combo popdown button, thus is being edited. * Do a model scan to see if we actually hit the jackpot or * not, and get the iter for it... */ if (!search_model_f(model,widget,&iter)) return FALSE; } gtk_tree_model_get(model,&iter,BITVAL_COL,&bitval,-1); switch ((JimStimStdHandler)handler) { case RPM_MODE: partner = lookup_widget_f((const gchar *)OBJ_GET(widget,"special")); g_return_val_if_fail(partner,FALSE); tmpbuf = (gchar *)gtk_entry_get_text(GTK_ENTRY(partner)); last_rpm = (GINT)g_strtod(tmpbuf,NULL); if (bitval == 255) /* manual mode */ { gtk_widget_set_sensitive(lookup_widget_f("JS_manual_rpm_frame"),FALSE); dload_val = 65535; } else { gtk_widget_set_sensitive(lookup_widget_f("JS_manual_rpm_frame"),TRUE); dload_val = last_rpm; } break; default: printf("ERROR, case not handled, jimstim ecu combo button handler!\n"); break; } ms_send_to_ecu_f(canID, page, offset, MTX_U16, dload_val, FALSE); return TRUE; }
/*! \brief General purpose handler to hide/show Sensor calibrate window \param widget is a pointer to the widget clicked \param data is unused \returns TRUE */ G_MODULE_EXPORT gboolean show_ms2_afr_calibrator_window(GtkWidget *widget, gpointer data) { static GtkWidget *window = NULL; GtkWidget *item = NULL; GtkWidget *item2 = NULL; GladeXML *main_xml = NULL; GladeXML *xml = NULL; Firmware_Details *firmware = NULL; gboolean (*populate_afr_calibrator_combo_f)(GtkWidget *) = NULL; ENTER(); firmware = (Firmware_Details *)DATA_GET(global_data,"firmware"); main_xml = (GladeXML *)DATA_GET(global_data,"main_xml"); if ((!main_xml) || (DATA_GET(global_data,"leaving"))) { EXIT(); return TRUE; } if (!GTK_IS_WIDGET(window)) { xml = glade_xml_new(main_xml->filename,"ms2_afr_calibrator_window",NULL); window = glade_xml_get_widget(xml,"ms2_afr_calibrator_window"); glade_xml_signal_autoconnect(xml); item = glade_xml_get_widget(xml,"ego_sensor_combo"); register_widget_f("afr_calibrate_ego_sensor_combo",item); if (get_symbol_f("populate_afr_calibrator_combo",(void **)&populate_afr_calibrator_combo_f)) populate_afr_calibrator_combo_f(item); item2 = glade_xml_get_widget(xml,"generic_wideband_frame"); OBJ_SET(item,"generic_controls",item2); item = glade_xml_get_widget(xml,"voltage1_entry"); register_widget_f("voltage1_entry",item); OBJ_SET_FULL(item,"raw_lower",g_strdup("0"),g_free); OBJ_SET_FULL(item,"raw_upper",g_strdup("5"),g_free); OBJ_SET(item,"precision",GINT_TO_POINTER(1)); item = glade_xml_get_widget(xml,"voltage2_entry"); register_widget_f("voltage2_entry",item); OBJ_SET_FULL(item,"raw_lower",g_strdup("0"),g_free); OBJ_SET_FULL(item,"raw_upper",g_strdup("5"),g_free); OBJ_SET(item,"precision",GINT_TO_POINTER(1)); item = glade_xml_get_widget(xml,"afr1_entry"); register_widget_f("afr1_entry",item); OBJ_SET_FULL(item,"raw_lower",g_strdup("0"),g_free); OBJ_SET_FULL(item,"raw_upper",g_strdup("99"),g_free); OBJ_SET(item,"precision",GINT_TO_POINTER(1)); item = glade_xml_get_widget(xml,"afr2_entry"); register_widget_f("afr2_entry",item); OBJ_SET_FULL(item,"raw_lower",g_strdup("0"),g_free); OBJ_SET_FULL(item,"raw_upper",g_strdup("99"),g_free); OBJ_SET(item,"precision",GINT_TO_POINTER(1)); gtk_window_set_transient_for(GTK_WINDOW(window),GTK_WINDOW(lookup_widget_f("main_window"))); gtk_widget_show(GTK_WIDGET(window)); EXIT(); return TRUE; } #if GTK_MINOR_VERSION >= 18 if (gtk_widget_get_visible(GTK_WIDGET(window))) #else if (GTK_WIDGET_VISIBLE(GTK_WIDGET(window))) #endif gtk_widget_hide(GTK_WIDGET(window)); else gtk_widget_show(GTK_WIDGET(window)); EXIT(); return TRUE; }
/*! \brief updates the ms2 user_outputs controls which are a bit special purpose \param widget is the pointer to the widget to update */ G_MODULE_EXPORT void update_ms2_user_outputs(GtkWidget *widget) { GtkTreeModel *model = NULL; DataSize size = MTX_U08; GtkTreeIter iter; gint tmpi = 0; gint t_bitval = 0; gboolean valid = FALSE; gfloat * multiplier = NULL; gfloat * adder = NULL; gchar *lower = NULL; gchar *upper = NULL; gchar *range = NULL; gchar *tempc_range = NULL; gchar *tempf_range = NULL; gchar *tempk_range = NULL; gchar *tmpbuf = NULL; gchar *tmpstr = NULL; gint bitmask = 0; gint bitshift = 0; gfloat tmpf = 0.0; gfloat tmpf2 = 0.0; gfloat value = 0.0; gboolean temp_dep = FALSE; gint i = 0; gint precision = 0; void *eval = NULL; GtkWidget *tmpwidget = NULL; ENTER(); /*printf("update_ms2_user_outputs widget %s %p\n",glade_get_widget_name(widget),(void *)widget);*/ get_essential_bits_f(widget, NULL, NULL, NULL, NULL, &bitmask, &bitshift); value = convert_after_upload_f(widget); tmpi = ((GINT)value & bitmask) >> bitshift; model = gtk_combo_box_get_model(GTK_COMBO_BOX(widget)); valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(model),&iter); i = 0; while (valid) { gtk_tree_model_get(GTK_TREE_MODEL(model),&iter,UO_BITVAL_COL,&t_bitval,-1); if (tmpi == t_bitval) { /* Get the rest of the data from the combo */ gtk_tree_model_get(GTK_TREE_MODEL(model),&iter, UO_TEMP_DEP_COL,&temp_dep, UO_SIZE_COL,&size, UO_RAW_LOWER_COL,&lower, UO_RAW_UPPER_COL,&upper, UO_RANGE_COL,&range, UO_RANGE_TEMPC_COL,&tempc_range, UO_RANGE_TEMPF_COL,&tempf_range, UO_RANGE_TEMPK_COL,&tempk_range, UO_PRECISION_COL,&precision, UO_FROMECU_MULT_COL,&multiplier, UO_FROMECU_ADD_COL,&adder,-1); /* if (temp_dep) { printf("THIS WIDGET IS TEMP DEPENDENT\n"); printf("raw_lower %s, raw_upper %s in treemodel\n",lower,upper); if (multiplier) printf("multiplier %f\n",*multiplier); if (adder) printf("adder %f\n",*adder); printf("size %i, precision %i, temp_dep %i\n",(gint)size,precision,(gint)temp_dep); } */ tmpbuf = (gchar *)OBJ_GET(widget,"range_label"); if (tmpbuf) tmpwidget = lookup_widget_f(tmpbuf); if (GTK_IS_LABEL(tmpwidget)) { if (temp_dep) { OBJ_SET(tmpwidget,"widget_temp",DATA_GET(global_data,"mtx_temp_units")); OBJ_SET(tmpwidget,"c_label",tempc_range); OBJ_SET(tmpwidget,"f_label",tempf_range); OBJ_SET(tmpwidget,"k_label",tempk_range); bind_to_lists_f(tmpwidget,"temperature"); gtk_label_set_text(GTK_LABEL(tmpwidget),tempf_range); convert_temps_f(tmpwidget,DATA_GET(global_data,"mtx_temp_units")); } else { remove_from_lists_f("temperature",tmpwidget); OBJ_SET(tmpwidget,"widget_temp",NULL); OBJ_SET(tmpwidget,"temp_dep",NULL); /*OBJ_SET(tmpwidget,"c_label",NULL); OBJ_SET(tmpwidget,"f_label",NULL); OBJ_SET(tmpwidget,"k_label",NULL); */ gtk_label_set_text(GTK_LABEL(tmpwidget),range); } } tmpbuf = (gchar *)OBJ_GET(widget,"thresh_widget"); if (tmpbuf) tmpwidget = lookup_widget_f(tmpbuf); if (GTK_IS_WIDGET(tmpwidget)) { if (temp_dep) { OBJ_SET(tmpwidget,"widget_temp",DATA_GET(global_data,"mtx_temp_units")); OBJ_SET(tmpwidget,"temp_dep",GINT_TO_POINTER(temp_dep)); bind_to_lists_f(tmpwidget,"temperature"); } else { OBJ_SET(tmpwidget,"widget_temp",NULL); OBJ_SET(tmpwidget,"temp_dep",NULL); remove_from_lists_f("temperature",tmpwidget); } OBJ_SET(tmpwidget,"size",GINT_TO_POINTER(size)); OBJ_SET(tmpwidget,"precision",GINT_TO_POINTER(precision)); OBJ_SET(tmpwidget,"raw_lower",lower); OBJ_SET(tmpwidget,"raw_upper",upper); if (multiplier) OBJ_SET(tmpwidget,"fromecu_mult",multiplier); else OBJ_SET(tmpwidget,"fromecu_mult",NULL); if (adder) OBJ_SET(tmpwidget,"fromecu_add",adder); else OBJ_SET(tmpwidget,"fromecu_add",NULL); //convert_temps_f(tmpwidget,DATA_GET(global_data,"mtx_temp_units")); update_widget_f(tmpwidget,NULL); } tmpbuf = (gchar *)OBJ_GET(widget,"hyst_widget"); if (tmpbuf) tmpwidget = lookup_widget_f(tmpbuf); if (GTK_IS_WIDGET(tmpwidget)) { OBJ_SET(tmpwidget,"size",GINT_TO_POINTER(size)); OBJ_SET(tmpwidget,"precision",GINT_TO_POINTER(precision)); OBJ_SET(tmpwidget,"raw_lower",lower); OBJ_SET(tmpwidget,"raw_upper",upper); if (multiplier) OBJ_SET(tmpwidget,"fromecu_mult",multiplier); else OBJ_SET(tmpwidget,"fromecu_mult",NULL); if (adder) OBJ_SET(tmpwidget,"fromecu_add",adder); else OBJ_SET(tmpwidget,"fromecu_add",NULL); update_widget_f(tmpwidget,NULL); } g_free(range); } valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(model), &iter); i++; } EXIT(); return; }
/*! \brief When the user selects the OK button the new table is calculated packaged up, dumped to a file as well as being sent to the ECU to live a long and happy life \param widget is the OK button the user clicked \param data is unused \returns TRUE on success, FALSE otherwise */ G_MODULE_EXPORT gboolean afr_calibrate_calc_and_dl(GtkWidget *widget, gpointer data) { static gdouble diywbBv[] = { 0.00, 1.40, 1.45, 1.50, 1.55, 1.60, 1.65, 1.70, 1.75, 1.80, 1.85, 1.90, 1.95, 2.00, 2.05, 2.10, 2.15, 2.20, 2.25, 2.30, 2.35, 2.40, 2.45, 2.50, 2.55, 2.60, 2.65, 2.70, 2.75, 2.80, 2.85, 2.90, 4.00, 5.01 }; static gdouble diywbBa[] = { 7.42, 10.08, 10.23, 10.38, 10.53, 10.69, 10.86, 11.03, 11.20, 11.38, 11.57, 11.76, 11.96, 12.17, 12.38, 12.60, 12.83, 13.07, 13.31, 13.57, 13.84, 14.11, 14.40, 14.70, 15.25, 15.84, 16.48, 17.18, 17.93, 18.76, 19.66, 20.66, 40.00, 60.00 }; static gdouble lbwbBv[] = {0.00, 2.05, 4.21, 4.98, 5.01}; static gdouble lbwbBa[] = {1.00, 11.00, 14.70, 16.00, 99.00}; static gdouble teSVoutBv[] = { 1.024, 1.076, 1.126, 1.177, 1.227, 1.278, 1.330, 1.380, 1.431, 1.481, 1.532, 1.581, 1.626, 1.672, 1.717, 1.761, 1.802, 1.842, 1.883, 1.926, 1.971, 2.015, 2.053, 2.104, 2.150, 2.192, 2.231, 2.267, 2.305, 2.347, 2.398, 2.455, 2.514, 2.556, 2.602, 2.650, 2.698, 2.748, 2.797, 2.846, 2.900, 2.945, 2.991, 3.037, 3.083, 3.129, 3.175, 3.221, 3.266, 3.313, 3.359, 3.404, 3.451, 3.496, 3.542, 3.587, 3.634, 3.680, 3.725, 3.772, 3.817, 3.863, 3.910, 3.955, 4.001 }; static gdouble teSVoutBa[] = { 8.95, 9.11, 9.26, 9.41, 9.56, 9.71, 9.87, 10.02, 10.17, 10.32, 10.47, 10.63, 10.78, 10.93, 11.08, 11.24, 11.39, 11.54, 11.69, 11.86, 12.04, 12.23, 12.39, 12.62, 12.83, 13.03, 13.21, 13.4, 13.59, 13.82, 14.1, 14.43, 14.83, 15.31, 15.85, 16.47, 17.15, 17.9, 18.7, 19.57, 20.5, 21.5, 22.59, 23.78, 25.1, 26.54, 28.14, 29.9, 31.87, 34.11, 36.81, 40.27, 45.1, 52.38, 63.92, 82.66, 99.0, 99.0, 99.0, 99.0, 99.0, 99.0, 99.0, 99.0, 99.0}; static gdouble aemLinBv[] = { 0.00, 0.16, 0.31, 0.47, 0.62, 0.78, 0.94, 1.09, 1.25, 1.40, 1.56, 1.72, 1.87, 2.03, 2.18, 2.34, 2.50, 2.65, 2.81, 2.96, 3.12, 3.27, 3.43, 3.59, 3.74, 3.90, 4.05, 4.21, 4.37, 4.52, 4.68, 4.83, 4.99, 5.01 }; static gdouble aemLinBa[] = { 9.72, 10.01, 10.35, 10.64, 10.98, 11.27, 11.55, 11.90, 12.18, 12.47, 12.81, 13.10, 13.44, 13.73, 14.01, 14.35, 14.64, 14.93, 15.27, 15.56, 15.84, 16.18, 16.47, 16.81, 17.10, 17.39, 17.73, 18.01, 18.36, 18.64, 18.93, 19.27, 19.56, 99.00 }; static gdouble aemNonBv[] = { 0.00, 0.16, 0.31, 0.47, 0.62, 0.78, 0.94, 1.09, 1.25, 1.40, 1.56, 1.72, 1.87, 2.03, 2.18, 2.34, 2.50, 2.65, 2.81, 2.96, 3.12, 3.27, 3.43, 3.59, 3.74, 3.90, 4.05, 4.21, 4.37, 4.52, 4.68, 4.83, 4.99, 5.01 }; static gdouble aemNonBa[] = { 8.41, 8.52, 8.64, 8.81, 8.98, 9.09, 9.26, 9.44, 9.61, 9.78, 9.95, 10.12, 10.29, 10.47, 10.69, 10.92, 11.15, 11.38, 11.67, 11.95, 12.24, 12.58, 12.92, 13.27, 13.67, 14.13, 14.64, 15.21, 15.84, 16.53, 17.27, 18.19, 19.44, 99.00 }; static gdouble fjoBv[] = { 0.000, 0.811, 0.816, 1.256, 1.325, 1.408, 1.447, 1.667, 1.784, 1.804, 1.872, 1.984, 2.023, 2.126, 2.209, 2.268, 2.414, 2.454, 2.473, 2.502, 2.522, 2.581, 2.610, 2.717, 2.766, 2.820, 2.908, 2.933, 2.977, 3.021, 3.079, 3.099, 3.104, 5.000 }; static gdouble fjoBa[] = { 0.000, 9.996, 10.011, 11.113, 11.290, 11.481, 11.569, 12.142, 12.451, 12.510, 12.730, 13.024, 13.142, 13.465, 13.715, 13.892, 14.377, 14.524, 14.597, 14.759, 14.876, 15.273, 15.479, 16.302, 16.714, 17.170, 18.008, 18.243, 18.684, 19.184, 19.801, 19.977, 20.007, 29.400 }; static gdouble zeitronixBv[] = { 0.000, 0.150, 0.310, 0.460, 0.620, 0.780, 0.930, 1.090, 1.240, 1.400, 1.560, 1.710, 1.870, 2.020, 2.180, 2.340, 2.500, 2.650, 2.800, 2.960, 3.000, 3.120, 3.270, 5.010 }; static gdouble zeitronixBa[] = { 0.000, 9.700, 9.900, 10.100, 10.300, 10.500, 10.700, 11.000, 11.400, 11.700, 12.100, 12.400, 12.800, 13.200, 13.700, 14.200, 14.700, 15.600, 16.900, 18.500, 18.800, 19.900, 21.200, 99.000 }; static gdouble genericBv[4] = { 0.0, 1.0, 4.0, 5.01 }; static gdouble genericBa[4] = { 0.0, 9.7, 19.7, 99.0 }; gdouble *Bv = NULL; gdouble *Ba = NULL; gdouble voltage = 0.0; gdouble deltaVoltage = 0.0; gdouble vPct = 0.0; gint nB = 0; gint iV = 0; gint adcCount = 0; gchar * filename = NULL; gdouble afr = 0.0; gdouble (*Fv)(gint adc) = NULL; gboolean NB = FALSE; guint8 table[nADC]; time_t tim; FILE *f = NULL; Firmware_Details *firmware = NULL; extern gconstpointer *global_data; firmware = DATA_GET(global_data,"firmware"); #define USE_TABLE(prefix) \ Bv = prefix ## Bv; \ Ba = prefix ## Ba; \ nB = (sizeof(prefix ## Bv) / sizeof(gdouble)); #define USE_FUNC(prefix) \ Fv = prefix ## Fv switch (afr_enum) { case narrowBand: NB = TRUE; USE_FUNC(NB); break; case diyWB: USE_TABLE(diywb); break; case dynojetLinear: USE_FUNC (djWBlin); break; case fjo: USE_TABLE(fjo); break; case aemLinear: USE_TABLE(aemLin); break; case aemNonLinear: USE_TABLE(aemNon); break; case twintec: USE_FUNC (inno05); break; case techEdgeLinear: USE_FUNC (teWBlin); break; case techEdgeNonLinear: USE_TABLE(teSVout); break; case innovate12: USE_FUNC (inno12); break; case innovate05: USE_FUNC (inno05); break; case innovateLC1: USE_FUNC (innoLC1); break; case lambdaBoy: USE_TABLE(lbwb); break; case zeitronix: USE_TABLE(zeitronix); break; case genericWB: genericBv[1] = g_ascii_strtod(gtk_entry_get_text(GTK_ENTRY(lookup_widget_f("voltage1_entry"))),NULL); genericBv[2] = g_ascii_strtod(gtk_entry_get_text(GTK_ENTRY(lookup_widget_f("voltage2_entry"))),NULL); genericBa[1] = g_ascii_strtod(gtk_entry_get_text(GTK_ENTRY(lookup_widget_f("afr1_entry"))),NULL); genericBa[2] = g_ascii_strtod(gtk_entry_get_text(GTK_ENTRY(lookup_widget_f("afr2_entry"))),NULL); USE_TABLE(generic); break; default: printf(_("default case, shouldn't have gotten here. afr_enum is %i"),afr_enum); break; } filename = g_build_filename(HOME(), "afrtable.log",NULL); f = fopen(filename, "w"); g_free(filename); iV = 0; afr = 0.0; time(&tim); fprintf(f, "//------------------------------------------------------------------------------\n"); fprintf(f, "//-- Generated by MegaTunix %s", ctime(&tim)); fprintf(f, "//-- This file merely records what was sent to your MS-II, and may be --\n"); fprintf(f, "//-- deleted at any time. --\n"); fprintf(f, "//-- Selected type: %-57s--\n", afr_name); fprintf(f, "//------------------------------------------------------------------------------\n"); fprintf(f, "#ifndef GCC_BUILD\n"); fprintf(f, "#pragma ROM_VAR EGO_ROM\n"); fprintf(f, "#endif\n"); fprintf(f, "const unsigned char egofactor_table[%d] EEPROM_ATTR = {\n", nADC); fprintf(f, " // afr adcCount voltage\n"); for (adcCount = 0; adcCount < nADC; adcCount++) { voltage = adcCount / (nADC-1.0) * 5.0; if (NB) { afr = 0.0; table[adcCount] = (adcCount > nADC/5.0) ? 0 : (gint16)(nADC/5.0 - adcCount); } else { if (Fv) afr = Fv(adcCount); else { /* Use curve data from tabular expression of transfer function.*/ while (voltage > Bv[iV]) iV++; deltaVoltage = Bv[iV] - Bv[iV-1]; if (fabs(deltaVoltage) < 1e-10) /* Curve data is crap.*/ afr = 999.0; else { vPct = 1.0 - (Bv[iV] - voltage) / deltaVoltage; afr = vPct * (Ba[iV] - Ba[iV-1]) + Ba[iV-1]; } } table[adcCount] = (guint8)(afr*10.0+0.5); } fprintf(f, " %4d%c // %7.3f %4d %6.3f\n", table[adcCount], (adcCount<nADC-1)?',':' ', afr, adcCount, voltage); } fprintf(f, "};\n"); fprintf(f, "#ifndef GCC_BUILD\n"); fprintf(f, "#pragma ROM_VAR DEFAULT\n"); fprintf(f, "#endif\n"); fprintf(f, "//------------------------------------------------------------------------------\n"); fclose(f); ms_table_write(firmware->ego_table_page, firmware->page_params[firmware->ego_table_page]->length, (guint8 *)table); return TRUE; }
/*! \brief ECU specific toggle button handler \param widget is a pointer to the widget the user modified \param data is unused \returns TRUE */ G_MODULE_EXPORT gboolean ecu_toggle_button_handler(GtkWidget *widget, gpointer data) { extern MS2_TTMon_Data *ttm_data; gint handler = -1; ENTER(); handler = (GINT)OBJ_GET(widget,"handler"); if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget))) { /* It's pressed (or checked) */ switch ((MS2ToggleHandler)handler) { case START_TOOTHMON_LOGGER: ttm_data->stop = FALSE; OBJ_SET(ttm_data->darea,"io_cmd_function",(gpointer)"ms2_e_read_toothmon"); gtk_widget_set_sensitive(GTK_WIDGET(lookup_widget_f("triggerlogger_buttons_table")),FALSE); gtk_widget_set_sensitive(GTK_WIDGET(lookup_widget_f("compositelogger_buttons_table")),FALSE); bind_ttm_to_page((GINT)OBJ_GET(widget,"page")); io_cmd_f("ms2_e_read_toothmon",NULL); break; case START_TRIGMON_LOGGER: ttm_data->stop = FALSE; OBJ_SET(ttm_data->darea,"io_cmd_function",(gpointer)"ms2_e_read_trigmon"); gtk_widget_set_sensitive(GTK_WIDGET(lookup_widget_f("toothlogger_buttons_table")),FALSE); gtk_widget_set_sensitive(GTK_WIDGET(lookup_widget_f("compositelogger_buttons_table")),FALSE); bind_ttm_to_page((GINT)OBJ_GET(widget,"page")); io_cmd_f("ms2_e_read_trigmon",NULL); break; case START_COMPOSITEMON_LOGGER: ttm_data->stop = FALSE; OBJ_SET(ttm_data->darea,"io_cmd_function",(gpointer)"ms2_e_read_compositemon"); alter_widget_state_f(GTK_WIDGET(lookup_widget_f("toothlogger_buttons_table")),NULL); alter_widget_state_f(GTK_WIDGET(lookup_widget_f("triggerlogger_buttons_table")),NULL); bind_ttm_to_page((GINT)OBJ_GET(widget,"page")); io_cmd_f("ms2_e_read_compositemon",NULL); break; case STOP_TOOTHMON_LOGGER: ttm_data->stop = TRUE; gtk_widget_set_sensitive(GTK_WIDGET(lookup_widget_f("triggerlogger_buttons_table")),TRUE); gtk_widget_set_sensitive(GTK_WIDGET(lookup_widget_f("compositelogger_buttons_table")),TRUE); break; case STOP_TRIGMON_LOGGER: ttm_data->stop = TRUE; alter_widget_state_f(GTK_WIDGET(lookup_widget_f("toothlogger_buttons_table")),NULL); alter_widget_state_f(GTK_WIDGET(lookup_widget_f("compositelogger_buttons_table")),NULL); break; case STOP_COMPOSITEMON_LOGGER: ttm_data->stop = TRUE; alter_widget_state_f(GTK_WIDGET(lookup_widget_f("toothlogger_buttons_table")),NULL); alter_widget_state_f(GTK_WIDGET(lookup_widget_f("triggerlogger_buttons_table")),NULL); break; default: MTXDBG(CRITICAL,_("Default case reached, i.e. handler not found in global, common or ECU plugins for widget %s, BUG!\n"),glade_get_widget_name(widget)); break; } } EXIT(); return TRUE; }
/*! \brief updates the ms2 user_outputs controls which are a bit special purpose \param widget is the pointer to the widget to update */ G_MODULE_EXPORT void update_ms2_user_outputs(GtkWidget *widget) { GtkTreeModel *model = NULL; DataSize size = MTX_U08; GtkTreeIter iter; gint tmpi = 0; gint t_bitval = 0; gboolean valid = FALSE; gfloat * multiplier = NULL; gfloat * adder = NULL; gchar *lower = NULL; gchar *upper = NULL; gchar *range = NULL; gchar *tmpbuf = NULL; gint bitmask = 0; gint bitshift = 0; gfloat tmpf = 0.0; gfloat tmpf2 = 0.0; gfloat value = 0.0; gint i = 0; gint precision = 0; void *eval = NULL; GtkWidget *tmpwidget = NULL; ENTER(); get_essential_bits_f(widget, NULL, NULL, NULL, NULL, &bitmask, &bitshift); value = convert_after_upload_f(widget); tmpi = ((GINT)value & bitmask) >> bitshift; model = gtk_combo_box_get_model(GTK_COMBO_BOX(widget)); valid = gtk_tree_model_get_iter_first(GTK_TREE_MODEL(model),&iter); i = 0; while (valid) { gtk_tree_model_get(GTK_TREE_MODEL(model),&iter,UO_BITVAL_COL,&t_bitval,-1); if (tmpi == t_bitval) { /* Get the rest of the data from the combo */ gtk_tree_model_get(GTK_TREE_MODEL(model),&iter,UO_SIZE_COL,&size,UO_RAW_LOWER_COL,&lower,UO_RAW_UPPER_COL,&upper,UO_RANGE_COL,&range,UO_PRECISION_COL,&precision,UO_FROMECU_MULT_COL,&multiplier,UO_FROMECU_ADD_COL,&adder,-1); tmpbuf = (gchar *)OBJ_GET(widget,"range_label"); if (tmpbuf) tmpwidget = lookup_widget_f(tmpbuf); if (GTK_IS_LABEL(tmpwidget)) gtk_label_set_text(GTK_LABEL(tmpwidget),range); tmpbuf = (gchar *)OBJ_GET(widget,"thresh_widget"); if (tmpbuf) tmpwidget = lookup_widget_f(tmpbuf); if (GTK_IS_WIDGET(tmpwidget)) { OBJ_SET(tmpwidget,"size",GINT_TO_POINTER(size)); OBJ_SET(tmpwidget,"precision",GINT_TO_POINTER(precision)); OBJ_SET(tmpwidget,"raw_lower",lower); OBJ_SET(tmpwidget,"raw_upper",upper); if (multiplier) OBJ_SET(tmpwidget,"fromecu_mult",multiplier); else OBJ_SET(tmpwidget,"fromecu_mult",NULL); if (adder) OBJ_SET(tmpwidget,"fromecu_add",adder); else OBJ_SET(tmpwidget,"fromecu_add",NULL); update_widget_f(tmpwidget,NULL); } tmpbuf = (gchar *)OBJ_GET(widget,"hyst_widget"); if (tmpbuf) tmpwidget = lookup_widget_f(tmpbuf); if (GTK_IS_WIDGET(tmpwidget)) { OBJ_SET(tmpwidget,"size",GINT_TO_POINTER(size)); OBJ_SET(tmpwidget,"precision",GINT_TO_POINTER(precision)); OBJ_SET(tmpwidget,"raw_lower",lower); OBJ_SET(tmpwidget,"raw_upper",upper); if (multiplier) OBJ_SET(tmpwidget,"fromecu_mult",multiplier); else OBJ_SET(tmpwidget,"fromecu_mult",NULL); if (adder) OBJ_SET(tmpwidget,"fromecu_add",adder); else OBJ_SET(tmpwidget,"fromecu_add",NULL); update_widget_f(tmpwidget,NULL); } g_free(range); g_free(lower); g_free(upper); } valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(model), &iter); i++; } EXIT(); return; }
/*! \brief General purpose handler to hide/show tps calibrate window \param widget is the pointer to the TPS caliobration window \param data is unused */ G_MODULE_EXPORT gboolean show_tps_calibrator_window(GtkWidget *widget, gpointer data) { static GtkWidget *window = NULL; GtkWidget *item = NULL; GladeXML *main_xml = NULL; GladeXML *xml = NULL; Firmware_Details *firmware = NULL; GList ***ecu_widgets = NULL; void (*update_widget_f)(gpointer, gpointer) = NULL; ENTER(); if (!update_widget_f) get_symbol_f("update_widget",(void **)&update_widget_f); ecu_widgets = (GList ***)DATA_GET(global_data,"ecu_widgets"); firmware = (Firmware_Details *)DATA_GET(global_data,"firmware"); main_xml = (GladeXML *)DATA_GET(global_data,"main_xml"); if ((!main_xml) || (DATA_GET(global_data,"leaving"))) { EXIT(); return TRUE; } if (!GTK_IS_WIDGET(window)) { xml = glade_xml_new(main_xml->filename,"calibrate_tps_window",NULL); window = glade_xml_get_widget(xml,"calibrate_tps_window"); glade_xml_signal_autoconnect(xml); item = glade_xml_get_widget(xml,"tpsMin_entry"); register_widget_f("tpsMin_entry",item); OBJ_SET(item,"handler",GINT_TO_POINTER(GENERIC)); OBJ_SET(item,"dl_type",GINT_TO_POINTER(IMMEDIATE)); OBJ_SET(item,"last_value",GINT_TO_POINTER(-G_MAXINT)); OBJ_SET(item,"page",GINT_TO_POINTER(0)); if (firmware->capabilities & PIS) OBJ_SET(item,"offset",GINT_TO_POINTER(2676)); else OBJ_SET(item,"offset",GINT_TO_POINTER(518)); OBJ_SET(item,"size",GINT_TO_POINTER(MTX_S16)); OBJ_SET_FULL(item,"raw_lower",g_strdup("0"),g_free); if (firmware->capabilities & PIS) { OBJ_SET_FULL(item,"raw_upper",g_strdup("255"),g_free); OBJ_SET(item,"precision",GINT_TO_POINTER(0)); ecu_widgets[0][2676] = g_list_prepend( ecu_widgets[0][2676], (gpointer)item); } else { OBJ_SET_FULL(item,"raw_upper",g_strdup("2047"),g_free); OBJ_SET(item,"precision",GINT_TO_POINTER(0)); ecu_widgets[0][518] = g_list_prepend( ecu_widgets[0][518], (gpointer)item); } item = glade_xml_get_widget(xml,"tpsMax_entry"); register_widget_f("tpsMax_entry",item); OBJ_SET(item,"handler",GINT_TO_POINTER(GENERIC)); OBJ_SET(item,"dl_type",GINT_TO_POINTER(IMMEDIATE)); OBJ_SET(item,"last_value",GINT_TO_POINTER(-G_MAXINT)); OBJ_SET(item,"page",GINT_TO_POINTER(0)); if (firmware->capabilities & PIS) OBJ_SET(item,"offset",GINT_TO_POINTER(2678)); else OBJ_SET(item,"offset",GINT_TO_POINTER(520)); OBJ_SET(item,"size",GINT_TO_POINTER(MTX_S16)); OBJ_SET_FULL(item,"raw_lower",g_strdup("0"),g_free); if (firmware->capabilities & PIS) { OBJ_SET_FULL(item,"raw_upper",g_strdup("255"),g_free); OBJ_SET(item,"precision",GINT_TO_POINTER(0)); ecu_widgets[0][2678] = g_list_prepend( ecu_widgets[0][2678], (gpointer)item); /* Force them to update */ g_list_foreach(ecu_widgets[0][2676],update_widget_f,NULL); g_list_foreach(ecu_widgets[0][2678],update_widget_f,NULL); } else { OBJ_SET_FULL(item,"raw_upper",g_strdup("2047"),g_free); OBJ_SET(item,"precision",GINT_TO_POINTER(0)); ecu_widgets[0][520] = g_list_prepend( ecu_widgets[0][520], (gpointer)item); /* Force them to update */ g_list_foreach(ecu_widgets[0][518],update_widget_f,NULL); g_list_foreach(ecu_widgets[0][520],update_widget_f,NULL); } item = glade_xml_get_widget(xml,"get_tps_button_min"); OBJ_SET(item,"handler",GINT_TO_POINTER(GET_CURR_TPS)); if (firmware->capabilities & PIS) OBJ_SET_FULL(item,"source",g_strdup("status_adc_tps"),g_free); else OBJ_SET_FULL(item,"source",g_strdup("tpsADC"),g_free); OBJ_SET_FULL(item,"dest_widget",g_strdup("tpsMin_entry"),g_free); item = glade_xml_get_widget(xml,"get_tps_button_max"); OBJ_SET(item,"handler",GINT_TO_POINTER(GET_CURR_TPS)); if (firmware->capabilities & PIS) OBJ_SET_FULL(item,"source",g_strdup("status_adc_tps"),g_free); else OBJ_SET_FULL(item,"source",g_strdup("tpsADC"),g_free); OBJ_SET_FULL(item,"dest_widget",g_strdup("tpsMax_entry"),g_free); gtk_window_set_transient_for(GTK_WINDOW(window),GTK_WINDOW(lookup_widget_f("main_window"))); gtk_widget_show(GTK_WIDGET(window)); EXIT(); return TRUE; } #if GTK_MINOR_VERSION >=18 if (gtk_widget_get_visible(GTK_WIDGET(window))) #else if (GTK_WIDGET_VISIBLE(GTK_WIDGET(window))) #endif gtk_widget_hide(GTK_WIDGET(window)); else gtk_widget_show(GTK_WIDGET(window)); EXIT(); return TRUE; }
/*! \brief General purpose handler to hide/show Sensor calibrate window \param widget is a pointer to the widget clicked \param data is unused \returns TRUE */ G_MODULE_EXPORT gboolean show_ms2_therm_table_generator_window(GtkWidget *widget, gpointer data) { static GtkWidget *window = NULL; static GtkWidget *chooser = NULL; GtkWidget *item = NULL; GladeXML *main_xml = NULL; GladeXML *xml = NULL; Firmware_Details *firmware = NULL; ENTER(); firmware = (Firmware_Details *)DATA_GET(global_data,"firmware"); main_xml = (GladeXML *)DATA_GET(global_data,"main_xml"); g_return_val_if_fail(firmware,FALSE); g_return_val_if_fail(main_xml,FALSE); if (DATA_GET(global_data,"leaving")) { EXIT(); return TRUE; } if (!GTK_IS_WIDGET(window)) { xml = glade_xml_new(main_xml->filename,"table_generator_window",NULL); window = glade_xml_get_widget(xml,"table_generator_window"); glade_xml_signal_autoconnect(xml); /* Default to params not a file */ chooser = glade_xml_get_widget(xml,"import_filechooser_button"); register_widget_f("import_filechooser_button",chooser); item = glade_xml_get_widget(xml,"use_params_rbutton"); register_widget_f("use_params_rbutton",item); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(item),TRUE); g_signal_emit_by_name(item,"toggled",NULL); item = glade_xml_get_widget(xml,"sensor_combo"); gtk_combo_box_set_active(GTK_COMBO_BOX(item),0); register_widget_f("thermister_sensor_combo",item); item = glade_xml_get_widget(xml,"temp_label"); register_widget_f("temp_label",item); if (firmware->capabilities & PIS) gtk_widget_destroy(glade_xml_get_widget(xml,"bias_resistor_table")); else { item = glade_xml_get_widget(xml,"bias_entry"); register_widget_f("bias_entry",item); OBJ_SET_FULL(item,"raw_lower",g_strdup("0"),g_free); OBJ_SET_FULL(item,"raw_upper",g_strdup("100000"),g_free); OBJ_SET(item,"precision",GINT_TO_POINTER(1)); } item = glade_xml_get_widget(xml,"temp1_entry"); register_widget_f("temp1_entry",item); OBJ_SET_FULL(item,"raw_lower",g_strdup("-40"),g_free); OBJ_SET_FULL(item,"raw_upper",g_strdup("300"),g_free); OBJ_SET(item,"precision",GINT_TO_POINTER(1)); item = glade_xml_get_widget(xml,"temp2_entry"); register_widget_f("temp2_entry",item); OBJ_SET_FULL(item,"raw_lower",g_strdup("-40"),g_free); OBJ_SET_FULL(item,"raw_upper",g_strdup("300"),g_free); OBJ_SET(item,"precision",GINT_TO_POINTER(1)); item = glade_xml_get_widget(xml,"temp3_entry"); register_widget_f("temp3_entry",item); OBJ_SET_FULL(item,"raw_lower",g_strdup("-40"),g_free); OBJ_SET_FULL(item,"raw_upper",g_strdup("300"),g_free); OBJ_SET(item,"precision",GINT_TO_POINTER(1)); item = glade_xml_get_widget(xml,"resistance1_entry"); register_widget_f("resistance1_entry",item); OBJ_SET_FULL(item,"raw_lower",g_strdup("0"),g_free); OBJ_SET_FULL(item,"raw_upper",g_strdup("500000"),g_free); OBJ_SET(item,"precision",GINT_TO_POINTER(1)); item = glade_xml_get_widget(xml,"resistance2_entry"); register_widget_f("resistance2_entry",item); OBJ_SET_FULL(item,"raw_lower",g_strdup("0"),g_free); OBJ_SET_FULL(item,"raw_upper",g_strdup("500000"),g_free); OBJ_SET(item,"precision",GINT_TO_POINTER(1)); item = glade_xml_get_widget(xml,"resistance3_entry"); register_widget_f("resistance3_entry",item); OBJ_SET_FULL(item,"raw_lower",g_strdup("0"),g_free); OBJ_SET_FULL(item,"raw_upper",g_strdup("500000"),g_free); OBJ_SET(item,"precision",GINT_TO_POINTER(1)); item = glade_xml_get_widget(xml,"celsius_rbutton"); OBJ_SET_FULL(item,"temp_label",g_strdup("Temperature(\302\260 C)"),g_free); register_widget_f("thermister_celsius_rbutton",item); item = glade_xml_get_widget(xml,"fahrenheit_rbutton"); OBJ_SET_FULL(item,"temp_label",g_strdup("Temperature(\302\260 F)"),g_free); register_widget_f("thermister_fahrenheit_rbutton",item); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(item),TRUE); g_signal_emit_by_name(item,"toggled",NULL); item = glade_xml_get_widget(xml,"kelvin_rbutton"); OBJ_SET_FULL(item,"temp_label",g_strdup("Temperature(\302\260 K)"),g_free); register_widget_f("thermister_kelvin_rbutton",item); gtk_window_set_transient_for(GTK_WINDOW(window),GTK_WINDOW(lookup_widget_f("main_window"))); gtk_widget_show(GTK_WIDGET(window)); EXIT(); return TRUE; } #if GTK_MINOR_VERSION >= 18 if (gtk_widget_get_visible(GTK_WIDGET(window))) #else if (GTK_WIDGET_VISIBLE(GTK_WIDGET(window))) #endif gtk_widget_hide(GTK_WIDGET(window)); else { gtk_file_chooser_unselect_all(GTK_FILE_CHOOSER(chooser)); gtk_widget_show(GTK_WIDGET(window)); } EXIT(); return TRUE; }
/*! \brief General purpose handler to hide/show Battery calibrate window \param widget is a pointer to the widget clicked \param data is unused \returns TRUE */ G_MODULE_EXPORT gboolean show_battery_calibrator_window(GtkWidget *widget, gpointer data) { static GtkWidget *window = NULL; GtkWidget *item = NULL; GladeXML *main_xml = NULL; GladeXML *xml = NULL; gfloat *tmpf = NULL; Firmware_Details *firmware = NULL; GList ***ecu_widgets; void (*update_widget_f)(gpointer, gpointer) = NULL; ENTER(); if (!update_widget_f) get_symbol_f("update_widget",(void **)&update_widget_f); ecu_widgets = (GList ***)DATA_GET(global_data,"ecu_widgets"); firmware = (Firmware_Details *)DATA_GET(global_data,"firmware"); main_xml = (GladeXML *)DATA_GET(global_data,"main_xml"); if ((!main_xml) || (DATA_GET(global_data,"leaving"))) { EXIT(); return TRUE; } if (!GTK_IS_WIDGET(window)) { xml = glade_xml_new(main_xml->filename,"battery_calibration_window",NULL); window = glade_xml_get_widget(xml,"battery_calibration_window"); glade_xml_signal_autoconnect(xml); item = glade_xml_get_widget(xml,"batt0_entry"); register_widget_f("batt0_entry",item); OBJ_SET(item,"page",GINT_TO_POINTER(0)); OBJ_SET(item,"offset",GINT_TO_POINTER(522)); OBJ_SET(item,"handler",GINT_TO_POINTER(GENERIC)); OBJ_SET(item,"dl_type",GINT_TO_POINTER(IMMEDIATE)); OBJ_SET(item,"last_value",GINT_TO_POINTER(-G_MAXINT)); OBJ_SET(item,"precision",GINT_TO_POINTER(1)); OBJ_SET(item,"size",GINT_TO_POINTER(MTX_S16)); tmpf = g_new0(gfloat, 1); *tmpf = 0.1; OBJ_SET_FULL(item,"fromecu_mult",tmpf,g_free); ecu_widgets[0][522] = g_list_prepend( ecu_widgets[0][522], (gpointer)item); item = glade_xml_get_widget(xml,"battmax_entry"); register_widget_f("battmax_entry",item); OBJ_SET(item,"page",GINT_TO_POINTER(0)); OBJ_SET(item,"offset",GINT_TO_POINTER(524)); OBJ_SET(item,"handler",GINT_TO_POINTER(GENERIC)); OBJ_SET(item,"dl_type",GINT_TO_POINTER(IMMEDIATE)); OBJ_SET(item,"last_value",GINT_TO_POINTER(-G_MAXINT)); OBJ_SET(item,"precision",GINT_TO_POINTER(1)); OBJ_SET(item,"size",GINT_TO_POINTER(MTX_S16)); tmpf = g_new0(gfloat, 1); *tmpf = 0.1; OBJ_SET_FULL(item,"fromecu_mult",tmpf,g_free); ecu_widgets[0][524] = g_list_prepend( ecu_widgets[0][524], (gpointer)item); /* Force them to update */ g_list_foreach(ecu_widgets[0][522],update_widget_f,NULL); g_list_foreach(ecu_widgets[0][524],update_widget_f,NULL); item = glade_xml_get_widget(xml,"get_data_button"); OBJ_SET(item,"handler",GINT_TO_POINTER(READ_VE_CONST)); OBJ_SET_FULL(item,"bind_to_list",g_strdup("get_data_buttons"),g_free); item = glade_xml_get_widget(xml,"burn_data_button"); OBJ_SET(item,"handler",GINT_TO_POINTER(BURN_FLASH)); OBJ_SET_FULL(item,"bind_to_list",g_strdup("burners"),g_free); bind_to_lists_f(item,"burners"); gtk_window_set_transient_for(GTK_WINDOW(window),GTK_WINDOW(lookup_widget_f("main_window"))); gtk_widget_show(GTK_WIDGET(window)); EXIT(); return TRUE; } #if GTK_MINOR_VERSION >= 18 if (gtk_widget_get_visible(GTK_WIDGET(window))) #else if (GTK_WIDGET_VISIBLE(GTK_WIDGET(window))) #endif gtk_widget_hide(GTK_WIDGET(window)); else gtk_widget_show(GTK_WIDGET(window)); EXIT(); return TRUE; }