diff -ruN crrcsim-0.9.10/documentation/input_method/walkera0701.txt crrcsim-0.9.10-w0701/documentation/input_method/walkera0701.txt
--- crrcsim-0.9.10/documentation/input_method/walkera0701.txt	1970-01-01 01:00:00.000000000 +0100
+++ crrcsim-0.9.10-w0701/documentation/input_method/walkera0701.txt	2009-06-19 09:49:13.000000000 +0200
@@ -0,0 +1,28 @@
+Cable:
+
+Walkera WK-0701 TX S-VIDEO connector to soundcard:
+
+
+ (back side of TX)
+      __   __              S-video:     
+     /  |_|  \             pin 2 (signal)    
+    / O 4 3 O \            pin 3 (GND)       
+   ( O 2   1 O )                             
+    \   ___   /      2 ______________________ Center pin of jack 3.5mm 
+     | [___] |                              
+      -------        3 ______________________ "Ground" of jack 3.5mm 
+
+
+No atenuators!  limiting resistor is already  inside TX.
+
+
+Select: Options-> Controls -> Input Method -> Audio, /dev/dsp
+                              Configure -> Radio type -> Walkera0701
+
+Select: View -> Toggle Test Mode
+
+By mixer software (alsamixer etc.) set up inpul level from soundcard. 
+
+Other method to connect walkera0701 to parport:  check  Walkera 0701
+joystick driver in 2.6.29 kernels.
+
diff -ruN crrcsim-0.9.10/src/GUI/crrc_calibmap.cpp crrcsim-0.9.10-w0701/src/GUI/crrc_calibmap.cpp
--- crrcsim-0.9.10/src/GUI/crrc_calibmap.cpp	2009-03-07 17:41:22.000000000 +0100
+++ crrcsim-0.9.10-w0701/src/GUI/crrc_calibmap.cpp	2009-06-16 13:48:04.000000000 +0200
@@ -45,7 +45,7 @@
 static char *radioTypes[] = {(char*)RadioTypeStrings[0], (char*)RadioTypeStrings[1],
                              (char*)RadioTypeStrings[2], (char*)RadioTypeStrings[3],
                              (char*)RadioTypeStrings[4], (char*)RadioTypeStrings[5],
-                             (char*)RadioTypeStrings[6],
+                             (char*)RadioTypeStrings[6], (char*)RadioTypeStrings[7],
                              NULL};
 
 static void CGUICalibMapCallback(puObject *obj);
diff -ruN crrcsim-0.9.10/src/mod_inputdev/inputdev.cpp crrcsim-0.9.10-w0701/src/mod_inputdev/inputdev.cpp
--- crrcsim-0.9.10/src/mod_inputdev/inputdev.cpp	2009-03-07 17:41:22.000000000 +0100
+++ crrcsim-0.9.10-w0701/src/mod_inputdev/inputdev.cpp	2009-06-16 14:34:16.000000000 +0200
@@ -61,7 +61,7 @@
 /**
  * Strings ordered like radio type enums in T_TX_Interface
  */
-const char* RadioTypeStrings[] = {"Futaba", "Airtronics", "Hitec", "JR", "Cockpit", "Walkera", "Custom"};
+const char* RadioTypeStrings[] = {"Futaba", "Airtronics", "Hitec", "JR", "Cockpit", "Walkera", "Custom", "Walkera0701"};
 
 /**
  * Strings ordered like input method enums in T_TX_Interface
@@ -587,6 +587,15 @@
       func[T_AxisMapper::RUDDER]    = 3;
       radio_type = rtype;
       break;
+
+    case WALKERA0701:
+      func[T_AxisMapper::ELEVATOR]  = 0; inv[T_AxisMapper::ELEVATOR]= 1;
+      func[T_AxisMapper::AILERON]   = 1; inv[T_AxisMapper::AILERON ]= 1;
+      func[T_AxisMapper::THROTTLE]  = 2; inv[T_AxisMapper::THROTTLE]= -1;
+      func[T_AxisMapper::RUDDER]    = 3; inv[T_AxisMapper::RUDDER  ]= 1;
+      radio_type = rtype;
+      printf ("mapper walkera\n");
+      break;
     
     case JR:
       func[T_AxisMapper::ELEVATOR]  = 2;
diff -ruN crrcsim-0.9.10/src/mod_inputdev/inputdev.h crrcsim-0.9.10-w0701/src/mod_inputdev/inputdev.h
--- crrcsim-0.9.10/src/mod_inputdev/inputdev.h	2009-03-07 17:41:23.000000000 +0100
+++ crrcsim-0.9.10-w0701/src/mod_inputdev/inputdev.h	2009-06-16 13:43:21.000000000 +0200
@@ -113,12 +113,12 @@
     * Available radio types. Ordered like RadioTypeStrings[]
     */
    enum { FUTABA = 0, AIRTRONICS = 1, HITEC = 2, 
-          JR = 3,     COCKPIT = 4,    WALKERA=5, CUSTOM = 6 };
+          JR = 3,     COCKPIT = 4,    WALKERA=5, CUSTOM = 6, WALKERA0701 = 7 };
    
    /**
     * Number of available radio types
     */
-   enum { NR_OF_RADIO_TYPES = 7 };
+   enum { NR_OF_RADIO_TYPES = 8 };
 
    /**
     * Loads configuration from <code>cfgfile</code>.
diff -ruN crrcsim-0.9.10/src/mod_inputdev/inputdev_audio/inputdev_audio.cpp crrcsim-0.9.10-w0701/src/mod_inputdev/inputdev_audio/inputdev_audio.cpp
--- crrcsim-0.9.10/src/mod_inputdev/inputdev_audio/inputdev_audio.cpp	2009-03-07 17:41:23.000000000 +0100
+++ crrcsim-0.9.10-w0701/src/mod_inputdev/inputdev_audio/inputdev_audio.cpp	2009-06-17 09:11:57.000000000 +0200
@@ -6,6 +6,10 @@
  *   Copyright (C) 2005 - Joel Lienard
  *   Copyright (C) 2008 - Olivier Bordes
  *
+ *   modifications for walkera 0701 PCM  
+ *   Copyright (C) 2009 - Peter Popovec
+ *   http://zub.fei.tuke.sk/walkera-wk0701/
+ *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation.
@@ -31,6 +35,7 @@
  */
 
 #include "inputdev_audio.h"
+#include "../../global.h"
 
 #include <stdio.h>
 #include <cstdlib>
@@ -247,20 +252,19 @@
 #if PORTAUDIO > 0
   static float vals[11];
   int i,n;
-  
   /*
    * there is no need to update values more than 50 times a second
    * then lest check here every (SAMPLE_RATE/50) recorded samples
    */
 
   Pa_Sleep (1); // not sure this is usefull
-
   n=AudioData.SamplesCounter;
   if (n-AudioData.LastSamplesCounter>SAMPLE_RATE/50)
   {
 
     AudioData.LastSamplesCounter = n;                         // lets update values
-    if(get_data(vals,&n))
+
+    if( Global::TXInterface->map->WALKERA0701 == Global::TXInterface->map->radioType() ? get_data_w0701(vals,&n):get_data(vals,&n))
     {
       for(i=0;i<11;i++)
         values[i]=vals[i];
@@ -516,6 +520,146 @@
 }
 
 
+#define RESERVE 40
+#define SYNC_PULSE 1306
+#define BIN0_PULSE 288
+#define BIN1_PULSE 438
+#define ANALOG_MIN_PULSE 318
+#define ANALOG_MAX_PULSE 878
+#define ANALOG_DELTA 80
+#define BIN_SAMPLE ((BIN0_PULSE + BIN1_PULSE) / 2)
+#define NO_SYNC 25
+
+int
+T_TX_InterfaceAudio::get_data_w0701 (float *values, int *nvalues)
+{
+  float x, px, max, min, moy;
+  int nval = AudioData.frameSize;
+  int i, j, k, chanel = 0;
+  int nibbles[26], crc1, crc2;
+  float dt_up = 0, dt_down = 0, val;
+  float *sig = AudioData.recordedSamples;
+
+  max= -100000;
+  min=  100000;
+  
+  for(i = 0; i < nval; i++)
+  {
+    x = sig[i];
+    if (x > max)
+      max = x;
+    if (x < min)
+      min = x;
+  }
+  moy = (max + min) / 2;
+  x = 0;
+  
+  chanel = 0;
+  j = (AudioData.frameIndex + 1024) % AudioData.frameSize;
+  for (i = 0; i < nval; i++)
+    {
+      px = x;
+      x = sig[j++];
+      if (j == AudioData.frameSize)
+	j = 0;
+
+      if ((x > moy) && (px < moy)) // rising edge
+	{
+	  dt_up =  j - (moy - px) / (x - px);
+	  if(dt_up < dt_down)
+	    dt_up += 1024;
+	  val = dt_up - dt_down;
+	  val = (val * 1000000) / SAMPLE_RATE;
+	  if (abs(val - SYNC_PULSE) < RESERVE ) 
+	    {
+	      chanel = 0;
+	      synchro_index = j;	//for OSCILLO  synchro
+//	      printf("DEBUG SYNC %f\n",val);
+	      continue;
+	    }
+	  if (val > (ANALOG_MIN_PULSE - RESERVE) && val < (ANALOG_MAX_PULSE + RESERVE))
+	    {
+	      if (chanel < NO_SYNC){
+		  val = val - ANALOG_MIN_PULSE + ANALOG_DELTA/2;
+                  if(val < 0)
+		    val = 0;
+		  nibbles[chanel++] |= (int) (val / ANALOG_DELTA);
+              }
+// 	      printf("DEBUG Analog = %d %f\n",(int)(val/80),val + ANALOG_MIN_PULSE - ANALOG_DELTA/2);
+	      continue;
+	    }
+	  chanel = NO_SYNC;  
+//	  printf ("DEBUG bad analog A=%f\n", val);
+	  continue;
+	}
+
+      if ((x < moy) && (px > moy)) // falling edge
+	{
+	  dt_down = j - (px - moy ) / (px - x);
+	  if(dt_down < dt_up)
+	    dt_down += 1024;
+	  val = dt_down - dt_up;
+	  val = (val * 1000000) / SAMPLE_RATE;
+	  if (val > (BIN0_PULSE - RESERVE) && val < (BIN1_PULSE + RESERVE))
+	    {
+	      if (chanel < NO_SYNC)
+		nibbles[chanel] = (val > BIN_SAMPLE) * 8;
+
+	      if (chanel == 24) // all nibbles
+		{
+
+		  for (crc1 = crc2 = k = 0; k < 10; k++)
+		    {
+		      crc1 += nibbles[k] & 7;
+		      crc2 += (nibbles[k] & 8) >> 3;
+		    }
+		  if ((nibbles[10] & 7) != (crc1 & 7))
+		    continue;
+		  if (((nibbles[10] & 8) >> 3) != (((crc1 >> 3) + crc2) & 1))
+                    continue;
+
+		  for (crc1 = crc2 =0, k = 11; k < 23; k++)
+		    {
+		      crc1 += nibbles[k] & 7;
+		      crc2 += (nibbles[k] & 8) >> 3;
+		    }
+		  if ((nibbles[23] & 7) != (crc1 & 7))
+		    continue;
+		  if (((nibbles[23] & 8) >> 3) != (((crc1 >> 3) + crc2) & 1))
+                    continue;
+
+		  values[0] = ((nibbles[0] & 7) * 256 + nibbles[1] * 16 + nibbles[2]) >> 2;
+		  values[0] *= ((nibbles[0] >> 2) & 2) - 1;
+		  values[1] = (nibbles[2] & 1) << 8 | (nibbles[3] << 4) | nibbles[4];
+		  values[1] *= (nibbles[2] & 2) - 1;
+		  values[2] = ((nibbles[5] & 7) * 256 + nibbles[6] * 16 + nibbles[7]) >> 2;
+		  values[2] *= ((nibbles[5] >> 2) & 2) - 1;
+		  values[3] =  (nibbles[7] & 1) << 8 | (nibbles[8] << 4) | nibbles[9];
+		  values[3] *= (nibbles[7] & 2) - 1;
+		  values[4] = ((nibbles[11] & 7) * 256 + nibbles[12] * 16 +  nibbles[13]) >> 2;
+		  values[4] *= ((nibbles[11] >> 2) & 2) - 1;
+		  values[5] = (nibbles[13] & 1) << 8 | (nibbles[14] << 4) | nibbles[15];
+		  values[5] *= (nibbles[13] & 2) - 1;
+		  values[6] = ((nibbles[16] & 7) * 256 + nibbles[17] * 16 + nibbles[18]) >> 2;
+		  values[6] *= ((nibbles[16] >> 2) & 2) - 1;
+		  values[7] = (nibbles[18] & 1) << 8 | (nibbles[19] << 4) | nibbles[20];
+		  values[7] *= (nibbles[18] & 2) - 1;
+		  for (k = 0; k < 8; k++)
+		    values[k] /= 512;
+		  *nvalues = 8;
+		  return 1;
+		}
+//              printf("DEBUG BIN[%d] %d %f\n",chanel,val > BIN_SAMPLE,val);
+	      continue;
+	    }
+	  chanel = NO_SYNC;
+//	  printf ("DEBUG Bad bin=%f\n", val);
+	}
+    }
+  return 0;
+}
+
+
 /**
  * \brief Re-open the audio interface
  *
diff -ruN crrcsim-0.9.10/src/mod_inputdev/inputdev_audio/inputdev_audio.h crrcsim-0.9.10-w0701/src/mod_inputdev/inputdev_audio/inputdev_audio.h
--- crrcsim-0.9.10/src/mod_inputdev/inputdev_audio/inputdev_audio.h	2009-03-07 17:41:23.000000000 +0100
+++ crrcsim-0.9.10-w0701/src/mod_inputdev/inputdev_audio/inputdev_audio.h	2009-06-16 13:10:37.000000000 +0200
@@ -130,6 +130,7 @@
     int   audio_rc_close();
     int   get_data_from_audio_interface(float *values);
     int   get_data(float *values, int *nvalues);
+    int   get_data_w0701(float *values, int *nvalues);
 };
 
 #endif
