/* set a parameter */ void AP_Tuning_Plane::set_value(uint8_t parm, float value) { switch(parm) { // special handling of dual-parameters case TUNING_RATE_ROLL_PI: set_value(TUNING_RATE_ROLL_P, value); set_value(TUNING_RATE_ROLL_I, value); break; case TUNING_RATE_PITCH_PI: set_value(TUNING_RATE_PITCH_P, value); set_value(TUNING_RATE_PITCH_I, value); break; default: AP_Float *f = get_param_pointer(parm); if (f != nullptr) { f->set_and_notify(value); } break; } }
/* reload a parameter */ void AP_Tuning_Plane::reload_value(uint8_t parm) { switch(parm) { // special handling of dual-parameters case TUNING_RATE_ROLL_PI: reload_value(TUNING_RATE_ROLL_P); reload_value(TUNING_RATE_ROLL_I); break; case TUNING_RATE_PITCH_PI: reload_value(TUNING_RATE_PITCH_P); reload_value(TUNING_RATE_PITCH_I); break; default: AP_Float *f = get_param_pointer(parm); if (f != nullptr) { f->load(); } break; } }
static gboolean read_file_info(const guchar *buffer, gsize size, FileInfo *info, GError **error) { guint expected_size, i; const guchar *p; gwy_clear(info, 1); p = buffer + MAGIC_SIZE; /* read structure variables from buffer */ for (i = 0; i < (HEADER_SIZE - MAGIC_SIZE)/8; i++) { gchar key[5]; guint32 value; key[4] = '\0'; memcpy(key, p, 4); p += 4; value = gwy_get_guint32_le(&p); if (!key[0]) continue; gwy_debug("%s: 0x%04x", key, value); /* Do not take values past the end of file and zeros into account at * all. The software seems to sometimes emit silly extra fields. */ if (!value || value >= size) continue; else if (gwy_strequal(key, "DESC")) info->desc_offset = value; else if (gwy_strequal(key, "DATE")) info->date_offset = value; else if (gwy_strequal(key, "PLET")) info->palette_offset = value; else if (gwy_strequal(key, "IMAG")) info->image_offset = value; else if (gwy_strequal(key, "HARD")) info->hard_offset = value; else if (gwy_strequal(key, "IMGP")) info->img_p_offset = value; else if (gwy_strequal(key, "SDES")) info->short_desc_offset = value; else if (gwy_strequal(key, "KEYS")) info->keys_offset = value; else { gwy_debug("Unknown field %s", key); } } /* Pixel image size */ if (!(p = get_param_pointer(buffer, size, info->image_offset, sizeof(guint16), "IMAG", error))) return FALSE; info->img_res = gwy_get_guint16_le(&p); if (err_DIMENSION(error, info->img_res)) return FALSE; /* Image data. It is the *same* pointer, just after the pixel size. */ info->image_data = (const guint16*)p; expected_size = (p - buffer) + info->img_res*info->img_res*sizeof(guint16); if (err_SIZE_MISMATCH(error, expected_size, size, FALSE)) return FALSE; /* Real image size */ if (!(p = get_param_pointer(buffer, size, info->hard_offset, sizeof(gfloat), "HARD", error))) return FALSE; info->real_size = gwy_get_gfloat_le(&p); if (!((info->real_size = fabs(info->real_size)) > 0)) { g_warning("Real size is 0.0, fixing to 1.0"); info->real_size = 1.0; } /* Value scale factor */ if (!(p = get_param_pointer(buffer, size, info->img_p_offset + 8, sizeof(gfloat), "IMGP", error))) return FALSE; info->z_scale = gwy_get_gfloat_le(&p); return TRUE; }