void order_stats_accumulate_idx (struct order_stats **os, size_t nos, struct casereader *reader, int wt_idx, int val_idx) { struct ccase *cx; struct ccase *prev_cx = NULL; double prev_value = -DBL_MAX; double cc_i = 0; double c_i = 0; for (; (cx = casereader_read (reader)) != NULL; case_unref (cx)) { const double weight = (wt_idx == -1) ? 1.0 : case_data_idx (cx, wt_idx)->f; const double this_value = case_data_idx (cx, val_idx)->f; /* The casereader MUST be sorted */ assert (this_value >= prev_value); if ( prev_value == -DBL_MAX || prev_value == this_value) c_i += weight; if ( prev_value > -DBL_MAX && this_value > prev_value) { update_k_values (prev_cx, prev_value, c_i, cc_i, os, nos); c_i = weight; } case_unref (prev_cx); cc_i += weight; prev_value = this_value; prev_cx = case_ref (cx); } update_k_values (prev_cx, prev_value, c_i, cc_i, os, nos); case_unref (prev_cx); casereader_destroy (reader); }
int main(void) { //Sväng inte turn = 0; //Initiera spi, pwm och display spi_init(); pwm_init(); init_display(); update(); claw_out(); _delay_ms(500); claw_in(); //Aktivera global interrupts sei(); //Initiera regulator clear_pid(); init_pid(80, -80); //update_k_values(40, 12, 22); update_k_values(40, 170, 20); // Pekare till aktuell position i bufferten tmp_sensor_buffer_p = 0x00; // Flagga som avgör huruvida vi är i början av meddelande sensor_start = 1; // Anger aktuell längd av meddelandet tmp_sensor_buffer_len = 0x00; //Initiera standardsträng på display init_default_printf_string(); clear_screen(); update(); while(1) { uint8_t has_comm_data, has_sensor_data, comm_data, sensor_data; do_spi(&has_comm_data, &has_sensor_data, &comm_data, &sensor_data); //Undersök och hantera meddelanden från slavarna if(has_comm_data) decode_comm(comm_data); if(has_sensor_data) decode_sensor(sensor_data); //Vid manuell sväng eller 180 grader måste make_turn anropas if(!autonomous || turning_180) { if(turn_dir) { make_turn_flag = 1; make_turn(turn_dir); if(!make_turn_flag) { turn_dir = 0; stop_motors(); } } } //Kör regulatorn if (regulator_enable) { regulator(sensor_buffer[IR_RIGHT_FRONT] - sensor_buffer[IR_RIGHT_BACK], sensor_buffer[IR_LEFT_FRONT] - sensor_buffer[IR_LEFT_BACK], sensor_buffer[IR_RIGHT_FRONT] - sensor_buffer[IR_LEFT_FRONT], sensor_buffer[IR_RIGHT_BACK] - sensor_buffer[IR_LEFT_BACK]); regulator_enable = 0; } } }