Subversion Repositories Projects

Compare Revisions

Ignore whitespace Rev 190 → Rev 191

0,0 → 1,207
* *****MoteCtrl*****
* written by AndreasB (aka Alpin)
* lets you control your MikroKopter with a Wiimote!
* Copyright December 2008
* Credits & Thx:
* - Holger & Ingo for the MikroKopter Project (
* - ExternalControl implementation of the FlightControl
* - Ligi for RIDDIM, proof of external control concept
* - Documentation of the MK's SerialProtocol (
* - Michael Laforest for the wiiuse API (
*****Use at your own risk! No warranty. Only for private usage.*****
#LICENSE: Released under the GNU General Public License Version 2 or
(at your option) a later version of this license.
For further details see <>.
#DISCLAIMER: Use this project at your own risk!
No warrenty.
Only for private usage.
***** See READ_ME_FIRST.txt for further details about MoteCtrl *****
Compiler & Linker Porperties:
Set "Character Set"-CompilerFlag to "Not Set" or "Multi Byte Character Set" to
avoid Errors about Windows API functions that can handle Unicode paramters.
In Visual Studio: Properties of Project -> Configuration Properties -> General
When compiling, don't forget to link wiiuse.lib (interface to the wiiuse.dll)
In Visual Studio: Copy wiiuse.lib & wiiuse.dll to project directory.
Afterwards: Properties of Project -> Configuration Properties -> Linker
-> Input -> add "wiiuse.lib" to additional dependencies
To avoid problems with dependencies on other windows machines, link the used
windows DLLs statically to the project.
In Visual Studio: Properties of Project -> Config. Properties -> C/C++
-> Code Generation -> set "Runtime Library" to Multi-Threaded (/MT)
/*Main.c merges all the resources provided by the header files to a functional
program. The follwing "includes" include all the needed and used headers (which
provide the resources, like fuctions, wrappers, structs, etc. main.c uses)
/**********Main Header*********/
//OS libs:
#include <windows.h> //Windows API, for API macros, constants, etc. (like stdlib.h)
#include <stdio.h> //Standard I/O (printf for instance)
//MoteCtrl libs:
#include "pc_serial_port.h" //interface with a PC's serial port
#include "fc_comm.h" //encode & send data to FlightControl
#include "wiimote.h" //interface with the wiimote connected via Bluetooth
//#include "main.h"
//Pretty Text output: (==fun ;)
void prettyText(char* string) {
int printed;
int i;
//pretty text output:
printed = printf("*****%s", string);
for (i=0;i<(65-printed);i++) {
int main(int argc, char* argv[]) {
//temps & counters
int tmp;
int tmp1;
//int i;
//Print title:
printf("\n"); prettyText("*"); printf("*v0.1\n"
"*\t****MoteCtrl**** written by Alpin\n"
"*\tlets you control your MikroKopter with a Wiimote!\n*\n");
prettyText("*"); printf("\n");
//**********Serial COM Port init & config:
prettyText("COM Port init");
printf("Serial COM Port you want to use to connect to the MikroKopter\n"
"(only type the number then hit enter):\n");
scanf_s("%d", &tmp); //read a decimal from terminal
tmp1 = init_com_port(tmp); //initialize & config COM port tmp
//init_com_port returned successfull?
if( tmp1 == EXIT_FAILURE ) {
printf("\n***COM%i Initilizaition/Configuration failed\n\n", tmp);
prettyText("COM Port Init FAILED!");
printf("exiting MoteCtrl...\n");
else { prettyText("Init & config of COM DONE!"); printf("\n\n"); }
//**********Wiimote init & config:
prettyText("Wiimote Init");
tmp = init_wiimote (); //initialize wiimote
//was init_wiimote successfull?
if (tmp == EXIT_FAILURE ) {
prettyText("Wiimote Init FAILED!");
printf("exiting MoteCtrl...\n");
else { prettyText("Wiimote Init DONE!"); printf("\n\n"); }
/* Does not work yet:
if(mote[0]->exp.type == EXP_NUNCHUK) {printf("Nunchuck plugged in!"); }
else { printf("No Nunchuck extension found!"); }
/***********Main: reading acc-values of wiimote, sending them as external-
control data to the MikroKopter's FlightControl: */
/* This is the Core of MotionCtrl, since it transfers the Wiimote data via the
external control srtuct and the serial protocol encoding to the
//Initialize entire ExternControl-struct with zeros
SecureZeroMemory(&ExternControl, sizeof(struct str_ExternControl));
//Activate the ExternalControl
//gas = 0; //init gas value
ExternControl.Config = 1;
//Main loop, "virtual" polling the wiimote events:
while (1) {
//wiiuse_poll returns the number of wiimotes, at which an event occured:
if (wiiuse_poll(mote, MAX_WIIMOTES)) {
switch (mote[0]->event) { //what type of event happened?
//a generic event occured!
/*Call function, which does the following: transferring
the wiimote data to the ExternalControl struct: */
//Send the (by handle_event) updated ExternControl struct
//to the FlightCtrl:
SendOutData('b', 1, (unsigned char *) &ExternControl, sizeof(struct str_ExternControl));
/* Some early tests
while (1) {
//externcon typedeffen
SendOutData('b', 1, (unsigned char *) &ExternControl, sizeof(struct str_ExternControl));
//sendStringToCom("#bR@T\r",6); //send reset
while(i<255) {
tmp = getCharFromCom(&b);
if (tmp) {
printf("%c", b);
goto muh;