Subversion Repositories Projects

Compare Revisions

Ignore whitespace Rev 190 → Rev 191

/MoteCtrl/Sources/main.c
New file
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 (www.mikrokopter.de)
* - ExternalControl implementation of the FlightControl
* - Ligi for RIDDIM, proof of external control concept
* - Documentation of the MK's SerialProtocol (www.mikrokopter.de/ucwiki/en/SerialProtocol)
* - Michael Laforest for the wiiuse API (www.wiiuse.net)
*
*
* http://www.mikrokopter.de/ucwiki/en/MoteCtrl
*/
 
/*
*****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 <www.gnu.org/licenses/>.
 
#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++) {
printf("*");
}
printf("\n");
}
 
 
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");
Sleep(1000);
return EXIT_FAILURE;
}
else { prettyText("Init & config of COM DONE!"); printf("\n\n"); }
 
//**********Wiimote init & config:
prettyText("Wiimote Init");
Sleep(1000);
 
tmp = init_wiimote (); //initialize wiimote
//was init_wiimote successfull?
if (tmp == EXIT_FAILURE ) {
prettyText("Wiimote Init FAILED!");
printf("exiting MoteCtrl...\n");
Sleep(1000);
return EXIT_FAILURE;
}
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
FlightCtrl.*/
 
//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?
 
case WIIUSE_EVENT:
//a generic event occured!
/*Call function, which does the following: transferring
the wiimote data to the ExternalControl struct: */
handle_event(mote[0]);
 
//Send the (by handle_event) updated ExternControl struct
//to the FlightCtrl:
SendOutData('b', 1, (unsigned char *) &ExternControl, sizeof(struct str_ExternControl));
break;
 
default:
break;
}
}
}
 
/* Some early tests
muh:
i=0;
while (1) {
//externcon typedeffen
SendOutData('b', 1, (unsigned char *) &ExternControl, sizeof(struct str_ExternControl));
//i++;
}
//sendStringToCom("#bR@T\r",6); //send reset
i=0;
while(i<255) {
tmp = getCharFromCom(&b);
if (tmp) {
printf("%c", b);
i++;
}
}
goto muh;
 
*/
 
 
return EXIT_SUCCESS;
}