Prof Greg Egan
/
UAVXArm-GKE
UAVX Multicopter Flight Controller.
nonvolatile.c
- Committer:
- gke
- Date:
- 2011-04-26
- Revision:
- 2:90292f8bd179
- Parent:
- 0:62a1c91a859a
File content as of revision 2:90292f8bd179:
// =============================================================================================== // = UAVXArm Quadrocopter Controller = // = Copyright (c) 2008 by Prof. Greg Egan = // = Original V3.15 Copyright (c) 2007 Ing. Wolfgang Mahringer = // = http://code.google.com/p/uavp-mods/ = // =============================================================================================== // This is part of UAVXArm. // UAVXArm is free software: you can redistribute it and/or modify it under the terms of the GNU // General Public License as published by the Free Software Foundation, either version 3 of the // License, or (at your option) any later version. // UAVXArm is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without // even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. // See the GNU General Public License for more details. // You should have received a copy of the GNU General Public License along with this program. // If not, see http://www.gnu.org/licenses/ #include "UAVXArm.h" // transfers to Flash seem to be ~35KByte/Sec void CheckSDCardValid(void); void CreateLogfile(void); void CloseLogfile(void); void TxLogChar(uint8); void WritePXImagefile(void); boolean ReadPXImagefile(void); int8 ReadPX(uint16); int16 Read16PX(uint16); int32 Read32PX(uint16); void WritePX(uint16, int8); void Write16PX(uint16, int16); void Write32PX(uint16, int32); FILE *pxfile = NULL; FILE *newpxfile = NULL; const int PX_LENGTH = 2048; int8 PX[PX_LENGTH], PXNew[PX_LENGTH]; void CheckSDCardValid(void) { F.SDCardValid = SDCard.initialise_card() != 0; } // CheckSDCardValid void WritePXImagefile(void) { static uint16 a; static int32 CheckSum; static int8 v, i; UpdateRTC(); if ( F.PXImageStale ) { if ( F.SDCardValid ) newpxfile = fopen("/SDCard/Params.txt", "w"); else newpxfile = fopen("/local/Params.txt", "w"); if ( newpxfile != NULL ) { CheckSum = 0; for ( a = 0; a < PX_LENGTH; a++ ) { v = PX[a]; CheckSum += (int32)v; fprintf(newpxfile, "%i \r\n", v); } fprintf(newpxfile, "%li \r\n ", -CheckSum ); i=0; while ( RTCString[i] != 0 ) fprintf(newpxfile, "%c", RTCString[i++]); fprintf(newpxfile, "\r\n"); F.PXImageStale = false; fclose(newpxfile); } } } // WritePXIMagefile boolean ReadPXImagefile(void) { static uint16 a; static int32 v, CheckSum; static boolean OK; if ( F.SDCardValid ) pxfile = fopen("/SDCard/Params.txt", "r"); else pxfile = fopen("/local/Params.txt", "r"); OK = false; if ( pxfile != NULL ) { CheckSum = 0; a = 0; for ( a = 0; a < PX_LENGTH ; a++ ) { r = fscanf(pxfile, "%i ", &v); CheckSum += v; PXNew[a] = (int8)v; } r = fscanf(pxfile, "%li ", &v); CheckSum += (int32)v; OK = CheckSum == 0; fclose(pxfile); if ( OK ) { for ( a = 0; a < PX_LENGTH; a++ ) PX[a] = PXNew[a]; F.PXImageStale = false; } } return( OK ); } // ReadPXImagefile void CreateLogfile(void) { #ifndef SUPPRESS_SDCARD static int16 i; UpdateRTC(); if ( F.SDCardValid ) strftime(RTCLogfile, 32, "/SDCard/L%H-%M.log", RTCTime ); else strftime(RTCLogfile, 32, "/local/L%H-%M.log", RTCTime ); logfile = fopen(RTCLogfile, "w"); LogfileIsOpen = logfile != NULL; if ( LogfileIsOpen ) { i = 0; while ( RTCString[i] != 0 ) TxLogChar(RTCString[i++]); TxLogChar(CR); TxLogChar(LF); } LogChars = 0; #endif // !SUPPRESS_SDCARD } // CreateLogfile void CloseLogfile(void) { fclose(logfile); } // CloseLog void TxLogChar(uint8 ch) { #ifndef SUPPRESS_SDCARD if ( LogfileIsOpen ) { LogfileIsOpen = fprintf(logfile, "%c", ch) > 0; if ( !LogfileIsOpen ) CloseLogfile(); } #endif // !SUPPRESS_SDCARD } // TxLogChar int8 ReadPX(uint16 a) { static int8 b; b = PX[a]; return(b); } // ReadPX int16 Read16PX(uint16 a) { static i16u Temp16; Temp16.b0 = ReadPX(a); Temp16.b1 = ReadPX(a + 1); return ( Temp16.i16 ); } // Read16P int32 Read32PX(uint16 a) { static i32u Temp32; Temp32.b0 = ReadPX(a); Temp32.b1 = ReadPX(a + 1); Temp32.b2 = ReadPX(a + 2); Temp32.b3 = ReadPX(a + 3); return ( Temp32.i32 ); } // Read32P void WritePX(uint16 a, int8 d) { if ( PX[a] != d ) { PX[a] = d; F.PXImageStale = true; } } // WritePX void Write16PX(uint16 a, int16 d) { static i16u Temp16; Temp16.i16 = d; WritePX(a, Temp16.b0); WritePX(a + 1, Temp16.b1); } // Write16P void Write32PX(uint16 a, int32 d) { static i32u Temp32; Temp32.i32 = d; WritePX(a, Temp32.b0); WritePX(a + 1, Temp32.b1); WritePX(a + 2, Temp32.b2); WritePX(a + 3, Temp32.b3); } // Write16PX