Subversion Repositories Projects

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
178 Alpin 1
/*  
2
 *  *****MoteCtrl*****
3
 *      written by Andreas Benzin (aka Alpin)
4
 *
5
 *               lets you control your MikroKopter with a Wiimote!
6
 *
7
 *
8
 *      Copyright December 2008
9
 *
10
 *      Credits & Thx:
11
 *      - Holger & Ingo for the MikroKopter Project (www.mikrokopter.de)
12
 *      - ExternalControl implementation of the FlightControl
13
 *  - Ligi for RIDDIM, proof of external control concept
14
 *      - Documentation of the MK's SerialProtocol (www.mikrokopter.de/ucwiki/en/SerialProtocol)
15
 *      - Michael Laforest for the wiiuse API (www.wiiuse.net)
16
 *
17
 *
18
 *      http://www.mikrokopter.de/ucwiki/en/MoteCtrl
19
 */
20
 
21
/*
22
*****Use at your own risk! No warranty. Only for private usage.*****
23
 
24
#LICENSE:       Released under the GNU General Public License Version 2 or
25
                        (at your option) a later version of this license.
26
                        For further details see <www.gnu.org/licenses/>.
27
 
28
#DISCLAIMER: Use this project at your own risk!
29
                         No warrenty.
30
                         Only for private usage.
31
 
32
***** See READ_ME_FIRST.txt for further details about MoteCtrl *****
33
*/
34
 
35
/*
36
Compiler & Linker Porperties:
37
Set "Character Set"-CompilerFlag to "Not Set" or "Multi Byte Character Set" to
38
avoid Errors about Windows API functions that can handle Unicode paramters.
39
In Visual Studio: Properties of Project -> Configuration Properties -> General
40
*/
41
 
42
/*
43
When compiling, don't forget to link wiiuse.lib (interface to the wiiuse.dll)
44
In Visual Studio: Copy wiiuse.lib & wiiuse.dll to project directory.
45
Afterwards: Properties of Project -> Configuration Properties -> Linker
46
-> Input -> add "wiiuse.lib" to additional dependencies
47
*/
48
 
49
/*
50
To avoid problems with dependencies on other windows machines, link the used
51
windows DLLs statically to the project.
52
In Visual Studio: Properties of Project -> Config. Properties -> C/C++
53
-> Code Generation -> set "Runtime Library" to Multi-Threaded (/MT)
54
*/
55
 
56
/*Main.c merges all the resources provided by the header files to a functional
57
program. The follwing "includes" include all the needed and used headers (which
58
provide the resources, like fuctions, wrappers, structs, etc. main.c uses)
59
*/
60
 
61
/**********Main Header*********/
62
//OS libs:
63
#include <windows.h>    //Windows API, for API macros, constants, etc. (like stdlib.h)
64
#include <stdio.h>              //Standard I/O (printf for instance)
65
 
66
//MoteCtrl libs:
67
#include "pc_serial_port.h"     //interface with a PC's serial port
68
#include "fc_comm.h"            //encode & send data to FlightControl
69
#include "wiimote.h"            //interface with the wiimote connected via Bluetooth
70
 
71
//#include "main.h"
72
 
73
 
74
//Pretty Text output: (==fun ;)
75
void prettyText(char* string) {
76
        int printed;
77
        int i;
78
 
79
        //pretty text output:
80
        printed = printf("*****%s", string);
81
 
82
        for (i=0;i<(65-printed);i++) {
83
                printf("*");
84
        }
85
        printf("\n");
86
}
87
 
88
 
89
int main(int argc, char* argv[]) {
90
 
91
        //temps & counters
92
        int tmp;
93
        int tmp1;
94
        //int i;
95
 
96
        //Print title:
97
        printf("\n"); prettyText("*"); printf("*v0.1\n"
98
                "*\t****MoteCtrl****     written by Alpin\n"
99
                "*\tlets you control your MikroKopter with a Wiimote!\n*\n");
100
        prettyText("*"); printf("\n");
101
 
102
 
103
        //**********Serial COM Port init & config: 
104
        prettyText("COM Port init");
105
        printf("Serial COM Port you want to use to connect to the MikroKopter\n"
106
                "(only type the number then hit enter):\n");
107
 
108
        scanf_s("%d", &tmp);    //read a decimal from terminal
109
 
110
        tmp1 = init_com_port(tmp);      //initialize & config COM port tmp
111
 
112
        //init_com_port returned successfull?
113
        if( tmp1 == EXIT_FAILURE ) {
114
                printf("\n***COM%i Initilizaition/Configuration failed\n\n", tmp);
115
                prettyText("COM Port Init FAILED!");
116
                printf("exiting MoteCtrl...\n");
117
                Sleep(1000);
118
                return EXIT_FAILURE;
119
        }
120
        else { prettyText("Init & config of COM DONE!"); printf("\n\n"); }
121
 
122
 
123
        //**********Wiimote init & config: 
124
        prettyText("Wiimote Init");
125
        Sleep(1000);
126
 
127
        tmp = init_wiimote ();          //initialize wiimote
128
 
129
        //was init_wiimote successfull?
130
        if (tmp == EXIT_FAILURE ) {
131
                prettyText("Wiimote Init FAILED!");
132
                printf("exiting MoteCtrl...\n");
133
                Sleep(1000);
134
                return EXIT_FAILURE;
135
        }
136
        else { prettyText("Wiimote Init DONE!"); printf("\n\n"); }
137
 
138
        /* Does not work yet:
139
        if(mote[0]->exp.type == EXP_NUNCHUK) {printf("Nunchuck plugged in!"); }
140
        else { printf("No Nunchuck extension found!"); }
141
        */
142
 
143
 
144
        /***********Main: reading acc-values of wiimote, sending them as external-
145
        control data to the MikroKopter's FlightControl: */
146
 
147
        /* This is the Core of MotionCtrl, since it transfers the Wiimote data via the
148
        external control srtuct and the serial protocol encoding to the
149
        FlightCtrl.*/
150
 
151
        //Initialize entire ExternControl-struct with zeros
152
        SecureZeroMemory(&ExternControl, sizeof(struct str_ExternControl));
153
 
154
        //Activate the ExternalControl
155
        //gas = 0;      //init gas value
156
        ExternControl.Config = 1;
157
 
158
 
159
        //Main loop, "virtual" polling the wiimote events:
160
        while (1) {
161
                //wiiuse_poll returns the number of wiimotes, at which an event occured:
162
                if (wiiuse_poll(mote, MAX_WIIMOTES)) {
163
                        switch (mote[0]->event) {       //what type of event happened?
164
 
165
                                case WIIUSE_EVENT:
166
                                        //a generic event occured!
167
                                        /*Call function, which does the following: transferring
168
                                        the wiimote data to the ExternalControl struct: */
169
                                        handle_event(mote[0]);
170
 
171
                                        //Send the (by handle_event) updated ExternControl struct
172
                                        //to the FlightCtrl:
173
                                        SendOutData('b', 1, (unsigned char *) &ExternControl, sizeof(struct str_ExternControl));
174
                                        break;
175
 
176
                                default:
177
                                        break;
178
                        }
179
                }
180
        }
181
 
182
/* Some early tests
183
 
184
 
185
        muh:
186
        i=0;
187
        while (1) {
188
                //externcon typedeffen
189
        SendOutData('b', 1, (unsigned char *) &ExternControl, sizeof(struct str_ExternControl));
190
                //i++;
191
                }
192
        //sendStringToCom("#bR@T\r",6);         //send reset
193
        i=0;
194
        while(i<255) {
195
                tmp = getCharFromCom(&b);
196
                if (tmp) {
197
                        printf("%c", b);
198
                        i++;
199
                }
200
        }
201
        goto muh;
202
 
203
*/
204
 
205
 
206
        return EXIT_SUCCESS;
207
}