Compileren+van+ARDrone+SDK+example

Compileren van ARDrone SDK example voor windows xp Het heeft heel wat voeten in de aarde gehad maar na lang zoeken hebben we de jusite formule gevonden om tot een succesvolle compilatie te komen. Deze tutorial maakt gebruik van Visual Studio 2008 op een windows XP machine en ARDrone SDK 1.7.

Referenties:

[|ARDrone API forum] [|ARDrone - compile windows SDK 1.5 in VS2010]

__Benodigdheden__
Installeer de volgende componenten:
 * Visual Studio 2008 express (gratis download)
 * Microsoft Windows SDK ([|hier downloaden])
 * Microsoft DirectX SDK ([|hier downloaden])

Downloaden en uitpakken van volgende libraries in eenzelfde directory (in deze tutorial gebruiken we bijvoorbeeld C:\ar_drone_SDK\ ):
 * SDL library (nodig voor het weergeven van video) ([|hier downloaden])
 * Pthread voor win32 library ([|hier downloaden]; alleen nodig voor windows xp of eerdere versies)
 * ARDrone SDK source 1.7 ([|hier downloaden]; je moet je eerst registreren vooralleer je kan downloaden)

Als het goed is zou je in het werkdirectory (bijvoorbeeld C:\ar_drone_SDK\ ) de volgende mappen moeten hebben:
 * ARDroneLib (ARDrone SDK 1.7)
 * ControlEngine (ARDrone SDK 1.7)
 * Docs (ARDrone SDK 1.7)
 * Examples (ARDrone SDK 1.7)
 * Pre-built.2 (Pthread)
 * pthreads.2 (Pthread: niet noodzakelijk)
 * QueueUserAPCEx (Pthread: niet noodzakelijk)
 * SDL-1.2.14

__Aan de slag__
Open __C:\ar_drone_SDK\Examples\Win32\VCProjects\ARDrone\ARDrone.sln__ met Visual Studio 2008

__Zorg dat VS2008 alle directories kan vinden__

 * !!!Belangrijk**: kijk ook alle directories na of ze bestaan, verschillen in versies hebben hier vaak invloed op (aangezien de versies vaak in mapnamen worden opgenomen)

//Macro's:// Onder de tab property_manager, dubbel klik op ARDrone_propperties (ARDroneAPI -> Debug | win32 -> ARDrone_propperties). Onder common_properties in het nieuwe venster, selecteer user macros. Zorg dat de link van ARDroneLibDir verwijst naar __C:\ar_drone_SDK\ARDroneLib__ Zorg dat de link van Win32ClientDir verwijst naar __C:\ar_drone_SDK\Examples\Win32\sdk_demo\Sources__

//VC++ Directories// Tools -> options -> Projects and Solutions -> VC++ Directories: Voeg volgende Directories toe aan "include files" Voeg volgende Directories toe aan "library files"
 * C:\ar_drone_SDK\SDL-1.2.14\include
 * C:\ar_drone_SDK\\Pre-built.2\include
 * C:\Program Files\Microsoft SDKs\Windows\v7.0A\Include
 * C:\Program Files\Microsoft DirectX SDK (June 2010)\Include
 * C:\ar_drone_SDK\ARDroneLib
 * C:\ar_drone_SDK\\SDL-1.2.14\lib
 * C:\ar_drone_SDK\Pre-built.2\lib
 * C:\Program Files\Microsoft SDKs\Windows\v7.0A\Lib
 * C:\Program Files\Microsoft DirectX SDK (June 2010)\Lib\x86

__Compilatie errors en bugs repareren__

 * !!! Belangrijk**: Bij het compileren altijd //Rebuild Solution// gebruiken i.p.v. //Build Solution//

**Hierbij een lijst van alle problemen (en oplossingen) die wij tegenkwamen bij het compileren van het voorbeeldprogramma gemaakt door Parrot**

in file //vp_os_signal_dep.h// zorg dat USE_PTHREAD_FOR_WIN32 gedeclareerd is i.p.v USE_WINDOWS_CONDITION_VARIABLES: code //#define USE_WINDOWS_CONDITION_VARIABLES code
 * 1) define USE_PTHREAD_FOR_WIN32

in file //vp_stages_o_sdl.h// verander: #include  door: #include 

in de //Solution Explorer// verwijder je één van de //uvlc_codec.c// files. Er staan twee van deze files in de lijst met verschillende code inhoud. Verwijder de //uvlc_codec.c// file uit de solution waar: void uvlc_codec_alloc( video_controller_t* controller ) __**NIET**__ in terug te vinden is.

in de overgebleven //uvlc_codec.c// file voeg boven: void uvlc_codec_alloc( video_controller_t* controller ) volgende code toe: code int clz3(unsigned long x) { /* Barbarian counting method if no instrinsic is available */ int i; const int L=sizeof(x)*8-1; const unsigned long mask = ( 1 << L ); if (x==0) { return L+1; } for (i=0;ivoid uvlc_encode( video_stream_t* const stream, int32_t level, int32_t run, int32_t not_last ) volgend codeblok toe: code int clz2(unsigned long x) { /* Barbarian counting method if no instrinsic is available */ int i; const int L=sizeof(x)*8-1; const unsigned long mask = ( 1 << L ); if (x==0) { return L+1; } for (i=0;i

in file //video_mem32.c// voeg onder de laatste //include// de volgende code toe: code unsigned long bswap2(unsigned long x) { return _byteswap_ulong(x); } code verander in de rest van de file bswap door bswap2 (met behulp van find and replace)

in file //time.c// verander //gettimeofday// in //gettimeofday2// in heel de file (functie + functie calls)

in //ardrone_navdata_file.c// verander //gettimeofday// in //gettimeofday3// in heel de file (functie + functie calls)

in file //config_wifi.c// zet de volgende regels code in commentaar (deze worden niet gebruikt in win32): code //#include 

//#include 

//heel codeblok in commentaar /*   struct ifaddrs * ifAddrStructHead = NULL; struct ifaddrs * ifAddrStruct = NULL; struct in_addr tmpAddr; bool_t found = FALSE;

getifaddrs(&ifAddrStruct); ifAddrStructHead = ifAddrStruct;

while (!found && (ifAddrStruct != NULL)) {       // Looking for WIFI interface's IP address corresponding to WIFI_BASE_ADDR if (ifAddrStruct->ifa_addr->sa_family == AF_INET) {           tmpAddr = ((struct sockaddr_in *)ifAddrStruct->ifa_addr)->sin_addr; if ( (ntohl(tmpAddr.s_addr) & 0xFFFFFF00) == WIFI_BASE_ADDR ) {               inet_ntop(AF_INET, &tmpAddr, config.localHost, VP_COM_NAME_MAXSIZE); memcpy(config.itfName, ifAddrStruct->ifa_name, strlen(ifAddrStruct->ifa_name)); tmpAddr.s_addr = htonl ( ntohl(tmpAddr.s_addr) - ( ( ( ntohl(tmpAddr.s_addr) & 0xFF ) - 1 ) % 5 ) ); memcpy(config.server, inet_ntoa(tmpAddr), strlen(inet_ntoa(tmpAddr))); tmpAddr = ((struct sockaddr_in *)ifAddrStruct->ifa_netmask)->sin_addr; inet_ntop(AF_INET, &tmpAddr, config.netmask, VP_COM_NAME_MAXSIZE); tmpAddr = ((struct sockaddr_in *)ifAddrStruct->ifa_broadaddr)->sin_addr; inet_ntop(AF_INET, &tmpAddr, config.broadcast, VP_COM_NAME_MAXSIZE); found = TRUE; }       }        ifAddrStruct = ifAddrStruct->ifa_next; }

if (ifAddrStructHead != NULL) {     freeifaddrs(ifAddrStructHead); }   */ code

in file //ardrone_control.c// verander de code aan het begin van de functie: <span style="font-family: 'Courier New',Courier,monospace;">ardrone_control_connect_to_drone zodat je het volgende krijgt: code C_RESULT ardrone_control_connect_to_drone {   int res_open_socket;

int timeout_windows=1000;/*milliseconds*/
 * 1) ifdef _WIN32
 * 1) endif

struct timeval tv;   //WIN32 heeft ook deze declaratie nodig

//... code

in file //vp_stages_io_file.c// onder de functie: <span style="font-family: 'Courier New',Courier,monospace;">vp_stages_input_file_stage_transform(vp_stages_input_file_config_t *cfg, vp_api_io_data_t *in, vp_api_io_data_t *out) <span style="font-family: Arial,Helvetica,sans-serif;">v erplaats de functie oproep (eerste lijn) <span style="font-family: 'Courier New',Courier,monospace;">vp_os_mutex_lock(&out->lock); __onder__ de declaratie van de lokale variabelen binnen deze funtie.

in file //video_controller.c// voeg de declaratie: <span style="font-family: 'Courier New',Courier,monospace;">video_macroblock_t * macroblock_root; toe onder: code static void video_realloc_buffers( video_controller_t* controller, int32_t num_prev_blockline )

{ int32_t i, j;  int16_t* cache; video_gob_t* gob; video_macroblock_t* mb; code en verander wat verder in dezelfde functie: <span style="font-family: 'Courier New',Courier,monospace;">video_macroblock_t * macroblock_root = gob->macroblocks; in: <span style="font-family: 'Courier New',Courier,monospace;">macroblock_root = gob->macroblocks;

voeg de file config_keys.c handmatig toe aan de solution onder ARDroneAPI -> Fichiers sources. deze file is terug te vinden onder __C:\ar_drone_SDK\ARDroneLib\Soft\Lib\ardrone_tool__

voeg onderaan de file //ardrone_navdata_control.c// de volgende functies toe: code C_RESULT ardrone_general_navdata_init( void* data ) {   return C_OK; }

C_RESULT ardrone_general_navdata_process( const navdata_unpacked_t* const navdata ) {   return C_OK; }

C_RESULT ardrone_general_navdata_release( void ) {   return C_OK; } code

Vervang de codec files in __C:\ar_drone_SDK\ARDroneLib\VLIB\P264__ door de volgende files: [] Vergeet niet om alle files nadien opnieuw toe te voegen aan VS2008!!! voor meer informatie rond deze aanpassing: zie het volgende topic: [|ARDrone API forum]

in file //ardrone_navdata_client.c// verander: <span style="font-family: 'Courier New',Courier,monospace;">int sizeinit = 5; navdata_write( (void*)&navdata_socket, (int8_t*)"__Init__", &sizeinit ); in<span style="font-family: 'Courier New',Courier,monospace;">: <span style="font-family: 'Courier New',Courier,monospace;">int sizeinit = 5; navdata_write( (void*)&navdata_socket, (int8_t*)"__\1\0\0\0__", &sizeinit );

in file //video_com_stage.c// verander: <span style="font-family: 'Courier New',Courier,monospace;">sizeinit = strlen("__Init__"); <span style="font-family: 'Courier New',Courier,monospace;">vp_com_write_socket(&cfg->socket,"__Init__",&sizeinit); in: <span style="font-family: 'Courier New',Courier,monospace;">sizeinit = strlen("__\1\0\0\0__"); <span style="font-family: 'Courier New',Courier,monospace;">vp_com_write_socket(&cfg->socket,"__\1\0\0\0__",&sizeinit);

Om de applicatie onder windows xp werkende te krijgen moet het bestand **pthreadVC2.dll** (in **C:\ar_drone_SDK\Pre-built.2\lib** ) naar
 * C:\WINDOWS\System32\** gekopieerd worden.

Dit zou normaal moeten volstaan om een volledig werkend testprogramma gecompileerd te krijgen.