UAVX Multicopter Flight Controller.

Dependencies:   mbed

Committer:
gke
Date:
Fri Feb 18 22:28:05 2011 +0000
Revision:
0:62a1c91a859a
Child:
2:90292f8bd179
First release

Who changed what in which revision?

UserRevisionLine numberNew contents of line
gke 0:62a1c91a859a 1 // ===============================================================================================
gke 0:62a1c91a859a 2 // = UAVXArm Quadrocopter Controller =
gke 0:62a1c91a859a 3 // = Copyright (c) 2008 by Prof. Greg Egan =
gke 0:62a1c91a859a 4 // = Original V3.15 Copyright (c) 2007 Ing. Wolfgang Mahringer =
gke 0:62a1c91a859a 5 // = http://code.google.com/p/uavp-mods/ http://uavp.ch =
gke 0:62a1c91a859a 6 // ===============================================================================================
gke 0:62a1c91a859a 7
gke 0:62a1c91a859a 8 // This is part of UAVXArm.
gke 0:62a1c91a859a 9
gke 0:62a1c91a859a 10 // UAVXArm is free software: you can redistribute it and/or modify it under the terms of the GNU
gke 0:62a1c91a859a 11 // General Public License as published by the Free Software Foundation, either version 3 of the
gke 0:62a1c91a859a 12 // License, or (at your option) any later version.
gke 0:62a1c91a859a 13
gke 0:62a1c91a859a 14 // UAVXArm is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without
gke 0:62a1c91a859a 15 // even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
gke 0:62a1c91a859a 16 // See the GNU General Public License for more details.
gke 0:62a1c91a859a 17
gke 0:62a1c91a859a 18 // You should have received a copy of the GNU General Public License along with this program.
gke 0:62a1c91a859a 19 // If not, see http://www.gnu.org/licenses/
gke 0:62a1c91a859a 20
gke 0:62a1c91a859a 21 #include "UAVXArm.h"
gke 0:62a1c91a859a 22
gke 0:62a1c91a859a 23 // transfers to Flash seem to be ~35KByte/Sec
gke 0:62a1c91a859a 24
gke 0:62a1c91a859a 25 void CheckSDCardValid(void);
gke 0:62a1c91a859a 26
gke 0:62a1c91a859a 27 void CreateLogfile(void);
gke 0:62a1c91a859a 28 void CloseLogfile(void);
gke 0:62a1c91a859a 29 void TxLogChar(uint8);
gke 0:62a1c91a859a 30
gke 0:62a1c91a859a 31 void WritePXImagefile(void);
gke 0:62a1c91a859a 32 boolean ReadPXImagefile(void);
gke 0:62a1c91a859a 33
gke 0:62a1c91a859a 34 int8 ReadPX(uint16);
gke 0:62a1c91a859a 35 int16 Read16PX(uint16);
gke 0:62a1c91a859a 36 int32 Read32PX(uint16);
gke 0:62a1c91a859a 37 void WritePX(uint16, int8);
gke 0:62a1c91a859a 38 void Write16PX(uint16, int16);
gke 0:62a1c91a859a 39 void Write32PX(uint16, int32);
gke 0:62a1c91a859a 40
gke 0:62a1c91a859a 41 FILE *pxfile = NULL;
gke 0:62a1c91a859a 42 FILE *newpxfile = NULL;
gke 0:62a1c91a859a 43
gke 0:62a1c91a859a 44 const int PX_LENGTH = 2048;
gke 0:62a1c91a859a 45 int8 PX[PX_LENGTH], PXNew[PX_LENGTH];
gke 0:62a1c91a859a 46
gke 0:62a1c91a859a 47 void CheckSDCardValid(void) {
gke 0:62a1c91a859a 48 /*
gke 0:62a1c91a859a 49 FILE *testfile;
gke 0:62a1c91a859a 50
gke 0:62a1c91a859a 51 testfile = fopen("/SDCard/OK", "w");
gke 0:62a1c91a859a 52 F.SDCardValid = testfile != NULL;
gke 0:62a1c91a859a 53 if ( F.SDCardValid ) fclose(testfile);
gke 0:62a1c91a859a 54 */
gke 0:62a1c91a859a 55 F.SDCardValid = SDCard.initialise_card() != 0;
gke 0:62a1c91a859a 56
gke 0:62a1c91a859a 57
gke 0:62a1c91a859a 58 } // CheckSDCardValid
gke 0:62a1c91a859a 59
gke 0:62a1c91a859a 60 void WritePXImagefile(void) {
gke 0:62a1c91a859a 61 static uint16 a;
gke 0:62a1c91a859a 62 static int32 CheckSum;
gke 0:62a1c91a859a 63 static int8 v, i;
gke 0:62a1c91a859a 64
gke 0:62a1c91a859a 65 UpdateRTC();
gke 0:62a1c91a859a 66
gke 0:62a1c91a859a 67 if ( F.PXImageStale ) {
gke 0:62a1c91a859a 68 if ( F.SDCardValid )
gke 0:62a1c91a859a 69 newpxfile = fopen("/SDCard/Params.txt", "w");
gke 0:62a1c91a859a 70 else
gke 0:62a1c91a859a 71 newpxfile = fopen("/local/Params.txt", "w");
gke 0:62a1c91a859a 72
gke 0:62a1c91a859a 73 if ( newpxfile != NULL ) {
gke 0:62a1c91a859a 74 CheckSum = 0;
gke 0:62a1c91a859a 75 for ( a = 0; a < PX_LENGTH; a++ ) {
gke 0:62a1c91a859a 76 v = PX[a];
gke 0:62a1c91a859a 77 CheckSum += (int32)v;
gke 0:62a1c91a859a 78 fprintf(newpxfile, "%i \r\n", v);
gke 0:62a1c91a859a 79 }
gke 0:62a1c91a859a 80 fprintf(newpxfile, "%li \r\n ", -CheckSum );
gke 0:62a1c91a859a 81
gke 0:62a1c91a859a 82 i=0;
gke 0:62a1c91a859a 83 while ( RTCString[i] != 0 )
gke 0:62a1c91a859a 84 fprintf(newpxfile, "%c", RTCString[i++]);
gke 0:62a1c91a859a 85 fprintf(newpxfile, "\r\n");
gke 0:62a1c91a859a 86
gke 0:62a1c91a859a 87 F.PXImageStale = false;
gke 0:62a1c91a859a 88 fclose(newpxfile);
gke 0:62a1c91a859a 89 }
gke 0:62a1c91a859a 90 }
gke 0:62a1c91a859a 91
gke 0:62a1c91a859a 92 } // WritePXIMagefile
gke 0:62a1c91a859a 93
gke 0:62a1c91a859a 94 boolean ReadPXImagefile(void) {
gke 0:62a1c91a859a 95 static uint16 a;
gke 0:62a1c91a859a 96 static int8 r;
gke 0:62a1c91a859a 97 static int32 v, CheckSum;
gke 0:62a1c91a859a 98 static boolean OK;
gke 0:62a1c91a859a 99
gke 0:62a1c91a859a 100 if ( F.SDCardValid )
gke 0:62a1c91a859a 101 pxfile = fopen("/SDCard/Params.txt", "r");
gke 0:62a1c91a859a 102 else
gke 0:62a1c91a859a 103 pxfile = fopen("/local/Params.txt", "r");
gke 0:62a1c91a859a 104
gke 0:62a1c91a859a 105
gke 0:62a1c91a859a 106 OK = false;
gke 0:62a1c91a859a 107 if ( pxfile != NULL ) {
gke 0:62a1c91a859a 108 CheckSum = 0;
gke 0:62a1c91a859a 109 a = 0;
gke 0:62a1c91a859a 110 for ( a = 0; a < PX_LENGTH ; a++ ) {
gke 0:62a1c91a859a 111 r = fscanf(pxfile, "%i ", &v);
gke 0:62a1c91a859a 112 CheckSum += v;
gke 0:62a1c91a859a 113 PXNew[a] = (int8)v;
gke 0:62a1c91a859a 114 }
gke 0:62a1c91a859a 115 r = fscanf(pxfile, "%li ", &v);
gke 0:62a1c91a859a 116 CheckSum += (int32)v;
gke 0:62a1c91a859a 117 OK = CheckSum == 0;
gke 0:62a1c91a859a 118
gke 0:62a1c91a859a 119 fclose(pxfile);
gke 0:62a1c91a859a 120
gke 0:62a1c91a859a 121 if ( OK ) {
gke 0:62a1c91a859a 122 for ( a = 0; a < PX_LENGTH; a++ )
gke 0:62a1c91a859a 123 PX[a] = PXNew[a];
gke 0:62a1c91a859a 124 F.PXImageStale = false;
gke 0:62a1c91a859a 125 }
gke 0:62a1c91a859a 126 }
gke 0:62a1c91a859a 127
gke 0:62a1c91a859a 128 return( OK );
gke 0:62a1c91a859a 129
gke 0:62a1c91a859a 130 } // ReadPXImagefile
gke 0:62a1c91a859a 131
gke 0:62a1c91a859a 132
gke 0:62a1c91a859a 133 void CreateLogfile(void) {
gke 0:62a1c91a859a 134 static uint8 i;
gke 0:62a1c91a859a 135
gke 0:62a1c91a859a 136 UpdateRTC();
gke 0:62a1c91a859a 137 if ( F.SDCardValid )
gke 0:62a1c91a859a 138 strftime(RTCLogfile, 32, "/SDCard/L%H-%M.log", RTCTime );
gke 0:62a1c91a859a 139 else
gke 0:62a1c91a859a 140 strftime(RTCLogfile, 32, "/local/L%H-%M.log", RTCTime );
gke 0:62a1c91a859a 141
gke 0:62a1c91a859a 142 logfile = fopen(RTCLogfile, "w");
gke 0:62a1c91a859a 143
gke 0:62a1c91a859a 144 LogfileIsOpen = logfile != NULL;
gke 0:62a1c91a859a 145 if ( LogfileIsOpen ) {
gke 0:62a1c91a859a 146 i=0;
gke 0:62a1c91a859a 147 while ( RTCString[i] != 0 )
gke 0:62a1c91a859a 148 TxLogChar(RTCString[i++]);
gke 0:62a1c91a859a 149 TxLogChar(CR);
gke 0:62a1c91a859a 150 TxLogChar(LF);
gke 0:62a1c91a859a 151 }
gke 0:62a1c91a859a 152 LogChars = 0;
gke 0:62a1c91a859a 153
gke 0:62a1c91a859a 154 } // CreateLogfile
gke 0:62a1c91a859a 155
gke 0:62a1c91a859a 156 void CloseLogfile(void) {
gke 0:62a1c91a859a 157 fclose(logfile);
gke 0:62a1c91a859a 158 } // CloseLog
gke 0:62a1c91a859a 159
gke 0:62a1c91a859a 160 void TxLogChar(uint8 ch) {
gke 0:62a1c91a859a 161
gke 0:62a1c91a859a 162 #ifndef SUPPRESS_SDCARD
gke 0:62a1c91a859a 163 if ( LogfileIsOpen )
gke 0:62a1c91a859a 164 fprintf(logfile, "%c", ch);
gke 0:62a1c91a859a 165 #endif // !SUPPRESS_SDCARD
gke 0:62a1c91a859a 166 } // TxLogChar
gke 0:62a1c91a859a 167
gke 0:62a1c91a859a 168
gke 0:62a1c91a859a 169 int8 ReadPX(uint16 a) {
gke 0:62a1c91a859a 170 static int8 b;
gke 0:62a1c91a859a 171 b = PX[a];
gke 0:62a1c91a859a 172 return(b);
gke 0:62a1c91a859a 173 } // ReadPX
gke 0:62a1c91a859a 174
gke 0:62a1c91a859a 175 int16 Read16PX(uint16 a) {
gke 0:62a1c91a859a 176 static i16u Temp16;
gke 0:62a1c91a859a 177
gke 0:62a1c91a859a 178 Temp16.b0 = ReadPX(a);
gke 0:62a1c91a859a 179 Temp16.b1 = ReadPX(a + 1);
gke 0:62a1c91a859a 180
gke 0:62a1c91a859a 181 return ( Temp16.i16 );
gke 0:62a1c91a859a 182 } // Read16P
gke 0:62a1c91a859a 183
gke 0:62a1c91a859a 184 int32 Read32PX(uint16 a) {
gke 0:62a1c91a859a 185 static i32u Temp32;
gke 0:62a1c91a859a 186
gke 0:62a1c91a859a 187 Temp32.b0 = ReadPX(a);
gke 0:62a1c91a859a 188 Temp32.b1 = ReadPX(a + 1);
gke 0:62a1c91a859a 189 Temp32.b2 = ReadPX(a + 2);
gke 0:62a1c91a859a 190 Temp32.b3 = ReadPX(a + 3);
gke 0:62a1c91a859a 191
gke 0:62a1c91a859a 192 return ( Temp32.i32 );
gke 0:62a1c91a859a 193 } // Read32P
gke 0:62a1c91a859a 194
gke 0:62a1c91a859a 195 void WritePX(uint16 a, int8 d) {
gke 0:62a1c91a859a 196 if ( PX[a] != d ) {
gke 0:62a1c91a859a 197 PX[a] = d;
gke 0:62a1c91a859a 198 F.PXImageStale = true;
gke 0:62a1c91a859a 199 }
gke 0:62a1c91a859a 200 } // WritePX
gke 0:62a1c91a859a 201
gke 0:62a1c91a859a 202 void Write16PX(uint16 a, int16 d) {
gke 0:62a1c91a859a 203 static i16u Temp16;
gke 0:62a1c91a859a 204
gke 0:62a1c91a859a 205 Temp16.i16 = d;
gke 0:62a1c91a859a 206 WritePX(a, Temp16.b0);
gke 0:62a1c91a859a 207 WritePX(a + 1, Temp16.b1);
gke 0:62a1c91a859a 208
gke 0:62a1c91a859a 209 } // Write16P
gke 0:62a1c91a859a 210
gke 0:62a1c91a859a 211 void Write32PX(uint16 a, int32 d) {
gke 0:62a1c91a859a 212 static i32u Temp32;
gke 0:62a1c91a859a 213
gke 0:62a1c91a859a 214 Temp32.i32 = d;
gke 0:62a1c91a859a 215 WritePX(a, Temp32.b0);
gke 0:62a1c91a859a 216 WritePX(a + 1, Temp32.b1);
gke 0:62a1c91a859a 217 WritePX(a + 2, Temp32.b2);
gke 0:62a1c91a859a 218 WritePX(a + 3, Temp32.b3);
gke 0:62a1c91a859a 219
gke 0:62a1c91a859a 220 } // Write16PX
gke 0:62a1c91a859a 221