]> git.defcon.no Git - rctxduino/blobdiff - source/RCTXDuino/RCTXDuino.pde
New tuning of PPM timer constants. These values are tuned to give max range, and...
[rctxduino] / source / RCTXDuino / RCTXDuino.pde
index 5254bb67a3748c03345a63be32f9541f78d612c4..0bc85626db0fc0992c86333e0fbb1029ae1a0151 100644 (file)
@@ -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<MAX_INPUTS; current_input++) {
 
     Serial.print("Input #");
     Serial.print(current_input);
@@ -694,6 +703,7 @@ void serial_debug()
 
   Serial.println();
 }
+
 void dr_inputselect( int no, int in )
 {
        if ( model.dr[menu_substate] < 0 ) model.dr[menu_substate] = 4;
@@ -794,7 +804,7 @@ void ui_handler()
   {
     case VALUES:
       int current_input;
-      for (current_input=0; current_input<=7; current_input++) {
+      for (current_input=0; current_input<MAX_INPUTS; current_input++) {
         // In channel value display, do a simple calc
         // of the LCD row & column location. With 8 channels
         // we can fit eight channels as percentage values on
@@ -1003,6 +1013,10 @@ void ui_handler()
           // Run in wolfram to see result, adjust the 1.0 factor to inc/red effect.
           // Problem: -100 to 100 is terribly bad presicion, esp. considering that
           // the values started as 0...1024, and we have 1000usec to "spend" on channels.
+                 
+                 // NEW IDEA provided my ivarf @ hig: use bezier curves og hermite curves!
+                 // Looks like a promising idea, but the implementation is still a bitt off
+                 // on the time-horizon :P
           if ( check_key(KEY_UP ) ) { 
             menu_mainstate = DUALRATES; 
             return;