X-Git-Url: https://git.defcon.no/?a=blobdiff_plain;f=source%2FRCTXDuino%2FRCTXDuino.pde;h=0bc85626db0fc0992c86333e0fbb1029ae1a0151;hb=12dcaa4691c9b1b2f7c8873b51ff01f34886a5de;hp=5254bb67a3748c03345a63be32f9541f78d612c4;hpb=88e0716888b769522dfabb9d7af68d3757e7a53c;p=rctxduino diff --git a/source/RCTXDuino/RCTXDuino.pde b/source/RCTXDuino/RCTXDuino.pde index 5254bb6..0bc8562 100644 --- a/source/RCTXDuino/RCTXDuino.pde +++ b/source/RCTXDuino/RCTXDuino.pde @@ -83,10 +83,10 @@ volatile bool do_channel = true; // Is next operation a channel or a sepa // The timing here (and/or in the ISR) needs to be tweaked to provide valid // RC PPM signals accepted by standard RC RX'es and the Microcopter... -#define framelength 21000 // Max length of frame -#define seplength 300 // Lenght of a channel separator -#define chmax 1550 // Max lenght of channel pulse -#define chmin 620 // Min length of channel +#define framelength 21500 // Max length of frame +#define seplength 250 // Lenght of a channel separator +#define chmax 1600 // Max lenght of channel pulse +#define chmin 480 // Min length of channel #define chwidht (chmax - chmin)// Useable time of channel pulse // ----------------- Menu/IU related stuffs -------------------- @@ -215,7 +215,7 @@ void model_defaults( void ) // data format changes. // NOTE: This means that stored model conficuration is reset // to defaults when the EEPROM version/format changes. - model.channels = 6; + model.channels = 8; model.rev[0] = model.rev[1] = model.rev[2] = model.rev[3] = model.rev[4] = model.rev[5] = model.rev[6] = model.rev[7] = false; model.dr[0] = model.dr[1] = model.dr[2] = model.dr[3] = 0; @@ -298,7 +298,7 @@ void mplx_select(int pin) void calibrate() { - int i, r0, r1, r2, adc_in; + int i, adc_in; int num_calibrations = 200; lcd.clear(); @@ -539,14 +539,13 @@ void serial_dump_model ( void ) void scan_keys ( void ) { - int i, r0, r1, r2; boolean key_in; // To get more inputs, another 4051 analog multiplexer is used, // but this time it is used for digital inputs. 8 digital inputs // on one input line, as long as proper debouncing and filtering // is done in hardware :P - for (i=0; i<=7; i++) { + for (int i=0; i<=7; i++) { // To be able to detect that a key has changed state, preserve the previous.. prev_keys[i] = keys[i]; @@ -570,27 +569,35 @@ void process_inputs(void ) model.raw[current_input] = adc_in; // New format on stick values + // The calculations happen around the center point, the values + // need to arrive at 0...100 of the range "center-to-edge", + // and must end up as negative on the ... negative side of center. + if ( adc_in < input_cal.center[current_input] ) { + // The stick is on the negative side, so the range is + // from the lowest possible value to center, and we must + // make this a negative percentage value. max = input_cal.min[current_input]; min = input_cal.center[current_input]; fact = -100; } else { + // The stick is at center, or on the positive side. + // Thus, the range is from center to max, and + // we need positive percentages. min = input_cal.center[current_input]; max = input_cal.max[current_input]; fact = 100; } + // Calculate the percentage that the current stick position is at + // in the given range, referenced to or from center, depending :P model.stick[current_input] = fact * ((float)adc_in - min ) / (max - min); + + // If this input is configured to be reversed, simply do a sign-flip :D if ( model.rev[current_input] ) model.stick[current_input] *= -1; - // Old format on stick values... - /* - model.stick[current_input] = ((float)adc_in - (float)input_cal.min[current_input]) / (float)(input_cal.max[current_input]-input_cal.min[current_input]); - if ( model.rev[current_input] ) model.stick[current_input] = 1.0f - model.stick[current_input]; - */ - // Dual-rate calculation :D // This is very repetitive code. It should be fast, but it may waste code-space. float dr_val; @@ -655,9 +662,11 @@ void ISR_timer(void) // range in half, and finally dividing by 100, we should get the ratio value. // Some loss of presicion occurs, perhaps the algo' should be reconsidered :P long next_timer = (( chwidht * ((model.stick[cchannel]+100)/200) ) + chmin); - // Do sanity-check of next_timer compared to chmax ... + // Do sanity-check of next_timer compared to chmax and chmin... while ( chmax < next_timer ) next_timer--; while ( next_timer < chmin ) next_timer++; + + // Update the sum of elapsed time sum += next_timer; // Done with channel separator and value, @@ -672,7 +681,7 @@ void ISR_timer(void) void serial_debug() { int current_input; - for (current_input=0; current_input<=7; current_input++) { + for (current_input=0; current_input