BasebandStatsView::BasebandStatsView() { add_children({ { &text_stats, } }); }
Custom_couple* add_custom_parents( Custom_person* Cp_ptr ) { Custom_couple* Cc_ptr ; int siblings[MAX_CHILDREN] ; Custom_person* mCp_ptr = NULL ; /* pointer to male parent */ Custom_person* fCp_ptr = NULL ; /* pointer to female parent */ Person* pptr ; Couple* cptr ; int parents ; int father, mother ; int ref ; /* temporary reference */ short child ; /* loop counter */ short children ; /* number of siblings, inc original */ char* child_refs_ptr ; /* pointer to references */ short base_position_y ; /* y position of original child */ short upper_limit, lower_limit ; short leftest_sibling_x, rightest_sibling_x ; short highest_position_y ; short father_x, mother_x ; GRECT box_father, box_mother ; short parent_box_bottom ; short block ; /* block number for get_[p/c]data_ptr */ BOOLEAN fail = FALSE ; Cc_ptr = new_custom_couple() ; if( Cc_ptr == NULL ) return Cc_ptr ; pptr = get_pdata_ptr( Cp_ptr->reference, &block ) ; assert( pptr != NULL ) ; parents = pptr->parents ; assert( parents != 0 ) ; Cc_ptr->reference = parents ; Cp_ptr->parent_number = Cc_ptr->list_number ; cptr = get_cdata_ptr( parents, &block ) ; child_refs_ptr = cptr->children ; assert( child_refs_ptr ) ; /* Force temporary father number in order that */ /* auto_fname will work for add children. */ /* Note that male_reference is wrongly used, it */ /* will later be replaced with list number. */ Cc_ptr->male_number = couples[parents].male_reference ; /* if person has auto fname, their size will change */ /* with the addition of their father. Adjust their */ /* position to allow for this if they are coupled. */ if( cptr->male_reference != 0 && ( Cp_ptr->attributes & FNAME_AUTO_BIT || ( (Cp_ptr->attributes & FNAME_BITS) == 0 && custom_tree.attributes & FNAME_AUTO_BIT ) ) ) { Custom_couple* xCc_ptr ; short old_edge_x ; /* active edge of person's box */ short x_correction ; short reversed = FALSE ; short not_reversed = FALSE ; short coupling_index = 0 ; BOOLEAN left_partner = FALSE ; if( Cp_ptr->couplings_drawn != 0 ) { while( *(Cp_ptr->coupling_list + coupling_index) ) { xCc_ptr = get_Cc_ptr( *(Cp_ptr->coupling_list + coupling_index) ) ; assert( xCc_ptr ) ; if( xCc_ptr->status & CUST_REVERSED ) reversed = TRUE ; else not_reversed = TRUE ; coupling_index++ ; } /* check if adjustment is possible, i.e. all */ /* couplings on same side */ if( reversed && !not_reversed || not_reversed && !reversed ) { if( !reversed && xCc_ptr->male_number == Cp_ptr->list_number ) left_partner = TRUE ; if( left_partner ) old_edge_x = rect_end( &(Cp_ptr->box) ) ; else old_edge_x = Cp_ptr->box.g_x ; } } Cp_ptr->box = calculate_box( Cp_ptr->reference, Cp_ptr->x, Cp_ptr->y, Cp_ptr->attributes, Cp_ptr->font_ptr, Cp_ptr->parent_number ) ; if( Cp_ptr->couplings_drawn != 0 ) { if( left_partner ) x_correction = old_edge_x - rect_end( &(Cp_ptr->box) ) ; else x_correction = old_edge_x - Cp_ptr->box.g_x ; Cp_ptr->x += x_correction ; Cp_ptr->box.g_x += x_correction ; } } child = 0 ; while( ( ref = form_ref( &child_refs_ptr ) ) && ( child < MAX_CHILDREN ) ) { siblings[child] = ref ; child++ ; } siblings[child] = 0 ; children = child ; /* find current person in sibling array */ child = 0 ; while( siblings[child] != Cp_ptr->reference ) child++ ; Cc_ptr->child_numbers = (int*) checked_malloc( (children + 1) * sizeof( int ) ) ; if( Cc_ptr->child_numbers == NULL ) { Cp_ptr->parent_number = 0 ; remove_custom_coupling( Cc_ptr ) ; return NULL ; } Cc_ptr->child_numbers[child] = Cp_ptr->list_number ; Cc_ptr->child_numbers[children] = 0 ; /* terminate list */ upper_limit = Cp_ptr->box.g_x + Cp_ptr->box.g_w / 2 ; leftest_sibling_x = upper_limit ; /* initialise limits to centre of original */ rightest_sibling_x = upper_limit ; lower_limit = Cp_ptr->box.g_x ; base_position_y = Cp_ptr->box.g_y - Cp_ptr->box.g_h / 2 ; highest_position_y = Cp_ptr->box.g_y ; /* add any children to the left */ if( child >= 1 ) fail = add_children( siblings, child-1, Cc_ptr, FALSE, upper_limit, lower_limit, base_position_y, &leftest_sibling_x, &highest_position_y) ; else leftest_sibling_x = Cp_ptr->x ; if( fail ) { Cp_ptr->parent_number = 0 ; remove_custom_coupling( Cc_ptr ) ; return NULL ; } /* add any children to the right */ if( child+1 < children ) fail = add_children( siblings, child+1, Cc_ptr, TRUE, upper_limit, lower_limit, base_position_y, &rightest_sibling_x, &highest_position_y) ; else rightest_sibling_x = Cp_ptr->x ; if( fail ) { if( child >= 1 ) while( --child >= 0 ) remove_custom_person( get_Cp_ptr( Cc_ptr->child_numbers[child] ) ) ; Cp_ptr->parent_number = 0 ; remove_custom_coupling( Cc_ptr ) ; return NULL ; } if( father = couples[parents].male_reference ) box_father = get_box_size( father, 0, 0, custom_tree.attributes, NULL, 0 ) ; if( mother = couples[parents].female_reference ) box_mother = get_box_size( mother, 0, 0, custom_tree.attributes, NULL, 0 ) ; if( father ) Cc_ptr->y = highest_position_y - box_father.g_h - generation_gap ; else Cc_ptr->y = highest_position_y - box_mother.g_h - generation_gap ; Cc_ptr->x = (leftest_sibling_x + rightest_sibling_x) / 2 ; if( father && mother ) { father_x = Cc_ptr->x - box_father.g_w / 2 - couple_gap ; mother_x = Cc_ptr->x + box_mother.g_w / 2 + couple_gap ; } else { father_x = Cc_ptr->x ; mother_x = Cc_ptr->x ; } if( father ) { mCp_ptr = add_custom_person( father, father_x, Cc_ptr->y, NULL, 0 ) ; if( mCp_ptr != NULL ) { mCp_ptr->couplings_drawn = 1 ; Cc_ptr->male_number = mCp_ptr->list_number ; mCp_ptr->coupling_list = (int *) checked_malloc( 2 * sizeof( int ) ) ; if( mCp_ptr->coupling_list != NULL ) { *(mCp_ptr->coupling_list) = Cc_ptr->list_number ; *(mCp_ptr->coupling_list + 1) = 0 ; /* terminate list */ } else fail = TRUE ; parent_box_bottom = rect_bottom( &(mCp_ptr->box) ) ; } else fail = TRUE ; } if( !fail && mother ) { fCp_ptr = add_custom_person( mother, mother_x, Cc_ptr->y, NULL, 0 ) ; if( fCp_ptr != NULL ) { fCp_ptr->couplings_drawn = 1 ; Cc_ptr->female_number = fCp_ptr->list_number ; fCp_ptr->coupling_list = (int *) checked_malloc( 2 * sizeof( int ) ) ; if( fCp_ptr->coupling_list != NULL ) { *(fCp_ptr->coupling_list) = Cc_ptr->list_number ; *(fCp_ptr->coupling_list + 1) = 0 ; /* terminate list */ } else fail = TRUE ; } else fail = TRUE ; if( father ) { if( rect_bottom( &(fCp_ptr->box) ) > parent_box_bottom ) parent_box_bottom = rect_bottom( &(fCp_ptr->box) ) ; } else parent_box_bottom = rect_bottom( &(fCp_ptr->box) ) ; } Cc_ptr->hline_x0 = leftest_sibling_x ; Cc_ptr->hline_x1 = rightest_sibling_x ; Cc_ptr->hline_y = parent_box_bottom + generation_gap / 2 ; if( fail ) { /* remove children */ child = 0 ; while( child < children ) { if( Cc_ptr->child_numbers[child] != Cp_ptr->list_number ) remove_custom_person( get_Cp_ptr( Cc_ptr->child_numbers[child] ) ) ; child++ ; } if( mCp_ptr ) remove_custom_person( mCp_ptr ) ; if( fCp_ptr ) remove_custom_person( fCp_ptr ) ; Cp_ptr->parent_number = 0 ; remove_custom_coupling( Cc_ptr ) ; Cc_ptr = NULL ; } return Cc_ptr ; }
Custom_couple* add_custom_coupling( Custom_person* Cp_ptr, short side ) { Custom_couple* Cc_ptr ; Custom_couple* sCc_ptr ; Custom_person* sCp_ptr ; /* spouse Cp pointer */ Custom_person* cCp_ptr ; /* child Cp pointer */ Person* pptr ; Couple* cptr ; BOOLEAN male ; /* sex of pre-existing partner */ short block ; int couple_reference = 0 ; int* new_coupling_list ; int* couple_list_ptr ; int* new_list_ptr ; char* coup_ptr ; int couple_ref ; /* Couple reference number */ int spouse_reference ; GRECT spouse_box ; short spouse_x ; short child_y ; int* child_number_ptr ; char* child_ptr ; int progeny[MAX_CHILDREN+1] ; int* prog_list_ptr ; short number_of_children ; short nearest_x ; short furthest_x ; short highest_y ; short parent_box_bottom ; Cc_ptr = new_custom_couple() ; if( Cc_ptr == NULL ) return Cc_ptr ; pptr = get_pdata_ptr( Cp_ptr->reference, &block ) ; coup_ptr = pptr->couplings ; new_coupling_list = (int *) checked_malloc( ( Cp_ptr->couplings_drawn + 2 ) * sizeof( int ) ) ; if( new_coupling_list == NULL ) { remove_custom_coupling( Cc_ptr ) ; return NULL ; } new_list_ptr = new_coupling_list ; /* find couple to add */ if( Cp_ptr->couplings_drawn != 0 ) { assert( Cp_ptr->coupling_list != NULL ) ; /* find first undrawn coupling */ while( couple_ref = form_ref( &coup_ptr ), couple_ref != 0 && couple_reference == 0 ) { BOOLEAN used ; couple_list_ptr = Cp_ptr->coupling_list ; used = FALSE ; while( *couple_list_ptr != 0 && couple_reference == 0 ) { sCc_ptr = get_Cc_ptr( *couple_list_ptr++) ; if( couple_ref == sCc_ptr->reference ) used = TRUE ; } if( !used ) couple_reference = couple_ref ; else couple_list_ptr++ ; } couple_list_ptr = Cp_ptr->coupling_list ; while( *couple_list_ptr ) *new_list_ptr++ = *couple_list_ptr++ ; free( Cp_ptr->coupling_list ) ; } else couple_reference = form_ref( &coup_ptr ) ; /* initialise some values */ *new_list_ptr++ = Cc_ptr->list_number ; *new_list_ptr++ = 0 ; Cc_ptr->reference = couple_reference ; Cp_ptr->coupling_list = new_coupling_list ; Cp_ptr->couplings_drawn++ ; Cc_ptr->y = Cp_ptr->y ; /* ascertain sex of existing */ /* partner and ref of spouse, if */ /* any */ if( couples[couple_reference].male_reference == Cp_ptr->reference ) { male = TRUE ; Cc_ptr->male_number = Cp_ptr->list_number ; spouse_reference = couples[couple_reference].female_reference ; } else { male = FALSE ; Cc_ptr->female_number = Cp_ptr->list_number ; spouse_reference = couples[couple_reference].male_reference ; } /* if spouse, add them to tree and */ /* calculate lowest point of couple */ if( spouse_reference != 0 ) { if( male && side == CUST_LEFT || !male && side == CUST_RIGHT ) Cc_ptr->status |= CUST_REVERSED ; spouse_box = get_box_size( spouse_reference, 0, 0, custom_tree.attributes, NULL, 0 ) ; if( side == RIGHT ) Cc_ptr->x = rect_end( &(Cp_ptr->box) ) + couple_gap ; else Cc_ptr->x = Cp_ptr->box.g_x - couple_gap ; if( side == RIGHT ) spouse_x = Cc_ptr->x + spouse_box.g_w / 2 + couple_gap ; else spouse_x = Cc_ptr->x - spouse_box.g_w / 2 - couple_gap ; sCp_ptr = add_custom_person( spouse_reference, spouse_x, Cc_ptr->y, NULL, 0 ) ; if( sCp_ptr != NULL ) { sCp_ptr->couplings_drawn = 1 ; if( male ) Cc_ptr->female_number = sCp_ptr->list_number ; else Cc_ptr->male_number = sCp_ptr->list_number ; sCp_ptr->coupling_list = (int *) checked_malloc( 2 * sizeof( int ) ) ; if( sCp_ptr->coupling_list != NULL ) { *(sCp_ptr->coupling_list) = Cc_ptr->list_number ; *(sCp_ptr->coupling_list + 1) = 0 ; /* terminate list */ } } if( rect_bottom( &(sCp_ptr->box) ) > rect_bottom( &(Cp_ptr->box) ) ) parent_box_bottom = rect_bottom( &(sCp_ptr->box) ) ; else parent_box_bottom = rect_bottom( &(Cp_ptr->box) ) ; } /* else if no spouse set bottom of */ /* couple to bottom of person and */ /* set spouse number to 0 */ else { Cc_ptr->x = Cp_ptr->x ; parent_box_bottom = rect_bottom( &(Cp_ptr->box) ) ; if( male ) Cc_ptr->female_number = 0 ; else Cc_ptr->male_number = 0 ; } /* set hline_y even if there are no */ /* children yet, ready for updating */ Cc_ptr->hline_y = parent_box_bottom + generation_gap / 2 ; Cc_ptr->hline_x0 = Cc_ptr->x ; Cc_ptr->hline_x1 = Cc_ptr->x ; /* if any children, add them to */ /* tree and couple list */ cptr = get_cdata_ptr( Cc_ptr->reference, &block ) ; if( child_ptr = cptr->children, child_ptr != NULL ) { prog_list_ptr = progeny ; number_of_children = 0 ; while( *prog_list_ptr++ = form_ref( &child_ptr ) ) { number_of_children++ ; } Cc_ptr->child_numbers = (int *) checked_malloc( ( number_of_children + 1 ) * sizeof( int ) ) ; if( Cc_ptr->child_numbers != NULL ) { int previous_last_number ; previous_last_number = custom_tree.end_person->list_number ; child_y = Cc_ptr->y + generation_gap ; /* measure width of children and add them at an arbitrary x position (i.e. 0) */ highest_y = child_y ; /* initialise to too low value */ add_children( progeny, 0, Cc_ptr, TRUE, 0, 0, child_y, &furthest_x, &highest_y) ; prog_list_ptr = progeny ; child_number_ptr = Cc_ptr->child_numbers ; while( *prog_list_ptr ) { *child_number_ptr++ = get_cust_person_by_ref( *prog_list_ptr++, previous_last_number ) ; } *child_number_ptr = 0 ; child_number_ptr = Cc_ptr->child_numbers ; cCp_ptr = get_Cp_ptr( Cc_ptr->child_numbers[0] ) ; nearest_x = cCp_ptr->x ; while( *child_number_ptr ) { cCp_ptr = get_Cp_ptr( *child_number_ptr++ ) ; cCp_ptr->x += Cc_ptr->x - ( nearest_x + furthest_x ) / 2 ; cCp_ptr->box.g_x += Cc_ptr->x - ( nearest_x + furthest_x ) / 2 ; cCp_ptr->y += Cc_ptr->hline_y + generation_gap / 2 - highest_y ; cCp_ptr->box.g_y += Cc_ptr->hline_y + generation_gap / 2 - highest_y ; } cCp_ptr = get_Cp_ptr( Cc_ptr->child_numbers[0] ) ; Cc_ptr->hline_x0 = cCp_ptr->x ; if( custom_display.x_start <= custom_tree.org_x ) { if( Cc_ptr->x - 1 < custom_display.x_start ) custom_display.x_start = Cc_ptr->x - 1 ; } cCp_ptr = get_Cp_ptr( Cc_ptr->child_numbers[number_of_children - 1] ) ; Cc_ptr->hline_x1 = cCp_ptr->x ; } } return Cc_ptr ; }
ReceiverView::ReceiverView( NavigationView& nav, ReceiverModel& receiver_model ) : receiver_model(receiver_model) { add_children({ { &button_done, &field_frequency, &field_lna, //&options_baseband_bandwidth, &field_vga, &options_modulation, //&options_baseband_oversampling, &field_vregmode, &field_volume, &view_frequency_options, &view_rf_gain_options, &waterfall, } }); button_done.on_select = [&nav](Button&){ nav.pop(); }; field_frequency.set_value(receiver_model.tuning_frequency()); field_frequency.set_step(receiver_model.frequency_step()); field_frequency.on_change = [this](rf::Frequency f) { this->on_tuning_frequency_changed(f); }; field_frequency.on_edit = [this, &nav]() { // TODO: Provide separate modal method/scheme? auto new_view = new FrequencyKeypadView { nav, this->receiver_model.tuning_frequency() }; new_view->on_changed = [this](rf::Frequency f) { this->on_tuning_frequency_changed(f); this->field_frequency.set_value(f); }; nav.push(new_view); }; field_frequency.on_show_options = [this]() { this->on_show_options_frequency(); }; field_lna.set_value(receiver_model.lna()); field_lna.on_change = [this](int32_t v) { this->on_lna_changed(v); }; field_lna.on_show_options = [this]() { this->on_show_options_rf_gain(); }; /* options_baseband_bandwidth.set_by_value(receiver_model.baseband_bandwidth()); options_baseband_bandwidth.on_change = [this](size_t n, OptionsField::value_t v) { (void)n; this->on_baseband_bandwidth_changed(v); }; */ field_vga.set_value(receiver_model.vga()); field_vga.on_change = [this](int32_t v_db) { this->on_vga_changed(v_db); }; options_modulation.set_by_value(receiver_model.modulation()); options_modulation.on_change = [this](size_t n, OptionsField::value_t v) { (void)n; this->on_modulation_changed(v); }; /* options_baseband_oversampling.set_by_value(receiver_model.baseband_oversampling()); options_baseband_oversampling.on_change = [this](size_t n, OptionsField::value_t v) { (void)n; this->on_baseband_oversampling_changed(v); }; */ field_vregmode.set_value(0); field_vregmode.on_change = [](int32_t v) { gpio_vregmode.write(v); gpio_vregmode.output(); led_rx.write(v); }; field_volume.set_value((receiver_model.headphone_volume() - wolfson::wm8731::headphone_gain_range.max).decibel() + 99); field_volume.on_change = [this](int32_t v) { this->on_headphone_volume_changed(v); }; view_frequency_options.hidden(true); view_frequency_options.set_step(receiver_model.frequency_step()); view_frequency_options.on_change_step = [this](rf::Frequency f) { this->on_frequency_step_changed(f); }; view_rf_gain_options.hidden(true); view_rf_gain_options.set_rf_amp(receiver_model.rf_amp()); view_rf_gain_options.on_change_rf_amp = [this](bool enable) { this->on_rf_amp_changed(enable); }; receiver_model.enable(); }