Racelogic / Mbed 2 deprecated VIPS_LTC_RAW_IMU

Dependencies:   BufferedSerial FatFileSystemCpp mbed

Committer:
AndyA
Date:
Thu Aug 05 13:44:45 2021 +0000
Revision:
35:7ecf25d9c414
Parent:
34:c864a0c67dbf
Child:
36:fff2a71bbf86
filter working

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AndyA 23:5c237f04327d 1 /*
AndyA 23:5c237f04327d 2 Settings file options
AndyA 23:5c237f04327d 3
AndyA 23:5c237f04327d 4 On startup system will look for settings.txt on the built in mbed drive.
AndyA 23:5c237f04327d 5
AndyA 23:5c237f04327d 6 This file should be ascii text with one option per line.
AndyA 23:5c237f04327d 7 The following options supported:
AndyA 23:5c237f04327d 8
AndyA 23:5c237f04327d 9 Output_Format=n
AndyA 23:5c237f04327d 10 Sets the serial output format.
AndyA 23:5c237f04327d 11 n = 0 - VIPS
AndyA 23:5c237f04327d 12 n = 1 - FreeD
AndyA 23:5c237f04327d 13
AndyA 23:5c237f04327d 14
AndyA 23:5c237f04327d 15 FIZ_Format=n
AndyA 23:5c237f04327d 16 Sets the FIZ reader to use
AndyA 23:5c237f04327d 17 n = 0 - Preston
AndyA 23:5c237f04327d 18 n = 1 - Fuji passive listen mode (skycam)
AndyA 23:5c237f04327d 19 n = 2 - Fuji active mode
AndyA 32:bfb385d35097 20 n = 3 - Canon
AndyA 23:5c237f04327d 21
AndyA 23:5c237f04327d 22 FreeD_Port=pppp
AndyA 23:5c237f04327d 23 Sets the UDP port for FreeD network output.
AndyA 23:5c237f04327d 24 Data is sent as a UDP broadcast on the select port number.
AndyA 23:5c237f04327d 25 A port number of 0 disables UDP output.
AndyA 23:5c237f04327d 26
AndyA 23:5c237f04327d 27 IP_addr=aaa.bbb.ccc.ddd
AndyA 23:5c237f04327d 28 Subnet=aaa.bbb.ccc.ddd
AndyA 23:5c237f04327d 29 Gateway=aaa.bbb.ccc.ddd
AndyA 23:5c237f04327d 30 Set the IPv4 address to use for the ethernet interface.
AndyA 23:5c237f04327d 31 All 3 values must be set for a static address to be used otherwise DHCP will be used.
AndyA 23:5c237f04327d 32
AndyA 34:c864a0c67dbf 33
AndyA 34:c864a0c67dbf 34 FilterOrder=n
AndyA 34:c864a0c67dbf 35 FilterFreq=m.mm
AndyA 34:c864a0c67dbf 36 FilterRate=r.rr
AndyA 34:c864a0c67dbf 37 Low pass filter settings for channels that have it enabled.
AndyA 34:c864a0c67dbf 38 Filter is of order n with a cut off at m Hz assuming input data rate is at r Hz
AndyA 34:c864a0c67dbf 39 Filter order must be set to enable filters.
AndyA 34:c864a0c67dbf 40 Frequency default is 10Hz
AndyA 34:c864a0c67dbf 41 Rate default is 100Hz
AndyA 34:c864a0c67dbf 42
AndyA 34:c864a0c67dbf 43 FilterXY=1
AndyA 34:c864a0c67dbf 44 FilterZ=1
AndyA 34:c864a0c67dbf 45 FilterRoll=1
AndyA 34:c864a0c67dbf 46 FilterPitch=1
AndyA 34:c864a0c67dbf 47 FilterYaw=1
AndyA 34:c864a0c67dbf 48 Enable channels to low pass filter. All filters use the settings given above.
AndyA 34:c864a0c67dbf 49 A value of 1 enables the filter. A value of 0 or skipping the line disables the filter.
AndyA 34:c864a0c67dbf 50
AndyA 34:c864a0c67dbf 51 NOTE-The filter will add latency so a filtered channel will be delayed relative to an unfiltered one.
AndyA 34:c864a0c67dbf 52
AndyA 34:c864a0c67dbf 53
AndyA 23:5c237f04327d 54 All settings are case sensitive.
AndyA 23:5c237f04327d 55 Do NOT include spaces in the options lines.
AndyA 23:5c237f04327d 56 All options default to a value of 0 is omitted from the file.
AndyA 23:5c237f04327d 57
AndyA 23:5c237f04327d 58 */
AndyA 23:5c237f04327d 59
AndyA 23:5c237f04327d 60
AndyA 23:5c237f04327d 61
AndyA 23:5c237f04327d 62
AndyA 0:97661408d0f9 63 #include "mbed.h"
AndyA 0:97661408d0f9 64 #include "LTCApp.h"
AndyA 22:0dd9c1b5664a 65 #include "EthernetInterface.h"
AndyA 0:97661408d0f9 66
AndyA 22:0dd9c1b5664a 67 //#define enableUSBStick
AndyA 15:830fc953edd9 68 //#define enableFakePPF
AndyA 15:830fc953edd9 69
AndyA 15:830fc953edd9 70 // delay transmit to n ms after the frame
AndyA 15:830fc953edd9 71 // comment out rather than set to 0 to disable
AndyA 15:830fc953edd9 72 //#define Delay_TX_By 10
AndyA 14:76083dc18b0d 73
AndyA 14:76083dc18b0d 74 #ifdef enableUSBStick
AndyA 14:76083dc18b0d 75 #include "MSCFileSystem.h"
AndyA 14:76083dc18b0d 76 MSCFileSystem msc("msc");
AndyA 14:76083dc18b0d 77 #endif
AndyA 9:7214e3c3e5f8 78
AndyA 0:97661408d0f9 79 BufferedSerial pc(USBTX, USBRX);
AndyA 0:97661408d0f9 80 VIPSSerial VIPS(p28, p27);
AndyA 16:a8d3a0dbe4bf 81 RawSerial COM1(p13, p14);
AndyA 16:a8d3a0dbe4bf 82 FIZReader *FIZPort;
AndyA 0:97661408d0f9 83
AndyA 11:ef7f6591b776 84 DigitalOut led1(LED1);
AndyA 0:97661408d0f9 85 DigitalOut led2(LED2);
AndyA 0:97661408d0f9 86 DigitalOut led3(LED3);
AndyA 0:97661408d0f9 87 DigitalOut frameToggle(LED4);
AndyA 0:97661408d0f9 88
AndyA 0:97661408d0f9 89 LTCDecode LTCInput(p7);
AndyA 0:97661408d0f9 90 InterruptIn PPFin(p29);
AndyA 0:97661408d0f9 91 InterruptIn Syncin(p8);
AndyA 0:97661408d0f9 92
AndyA 11:ef7f6591b776 93 DigitalIn logButton(p17,PullDown);
AndyA 11:ef7f6591b776 94
AndyA 15:830fc953edd9 95 DigitalOut RedLED(p18); // red
AndyA 11:ef7f6591b776 96 DigitalOut GreenLED(p19);
AndyA 11:ef7f6591b776 97 DigitalOut BlueLED(p20);
AndyA 11:ef7f6591b776 98
AndyA 11:ef7f6591b776 99 #define LED_OFF 1
AndyA 11:ef7f6591b776 100 #define LED_ON 0
AndyA 14:76083dc18b0d 101
JamieB 27:498cce52fe5f 102 #define setRED() ({GreenLED=LED_OFF;BlueLED = LED_OFF;RedLED = LED_ON;})
JamieB 27:498cce52fe5f 103 #define setGREEN() ({GreenLED=LED_ON;BlueLED = LED_OFF;RedLED = LED_OFF;})
JamieB 27:498cce52fe5f 104 #define setBLUE() ({GreenLED=LED_OFF;BlueLED = LED_ON;RedLED = LED_OFF;})
JamieB 27:498cce52fe5f 105 #define setOFF() ({GreenLED=LED_OFF;BlueLED = LED_OFF;RedLED = LED_OFF;})
AndyA 9:7214e3c3e5f8 106
AndyA 9:7214e3c3e5f8 107 frameclock movieTime;
AndyA 9:7214e3c3e5f8 108
AndyA 0:97661408d0f9 109 // clock to time everything with
AndyA 0:97661408d0f9 110 Timer inputTimer;
AndyA 12:06050debf014 111 Timeout resetTimeout;
AndyA 16:a8d3a0dbe4bf 112 Timeout filteringTimeout;
AndyA 16:a8d3a0dbe4bf 113 Timeout BypassTimeout;
AndyA 0:97661408d0f9 114
AndyA 15:830fc953edd9 115 #ifdef enableFakePPF
AndyA 15:830fc953edd9 116 Ticker FakePPF;
AndyA 15:830fc953edd9 117 #endif
AndyA 15:830fc953edd9 118
AndyA 9:7214e3c3e5f8 119 float logButtonDownTime;
AndyA 9:7214e3c3e5f8 120 float logButtonUpTime;
AndyA 9:7214e3c3e5f8 121 int logButtonLastState;
AndyA 9:7214e3c3e5f8 122
AndyA 16:a8d3a0dbe4bf 123 bool bypassMode = false;
AndyA 9:7214e3c3e5f8 124 bool logging = false;
AndyA 9:7214e3c3e5f8 125 FILE *logFile = NULL;
AndyA 9:7214e3c3e5f8 126
AndyA 9:7214e3c3e5f8 127
AndyA 0:97661408d0f9 128 // Time since last frame event, used for position output interpolation
AndyA 0:97661408d0f9 129 Timer TimeSinceLastFrame;
AndyA 0:97661408d0f9 130 uint32_t TimeSinceLastFrameWrap;
AndyA 0:97661408d0f9 131
AndyA 0:97661408d0f9 132 // used to start PPS at the correct point
AndyA 0:97661408d0f9 133 Timeout PPSsyncTimer;
AndyA 0:97661408d0f9 134
AndyA 15:830fc953edd9 135 Timeout OutputDelayTimer;
AndyA 15:830fc953edd9 136
AndyA 0:97661408d0f9 137 // used to generate PPS edges
AndyA 0:97661408d0f9 138 Ticker PPSOutputTimer;
AndyA 0:97661408d0f9 139
AndyA 0:97661408d0f9 140 frameRates detectedRate;
AndyA 0:97661408d0f9 141 bool ppsRunning = false; // set when PPS start has been scheduled
AndyA 0:97661408d0f9 142 volatile bool ppsActive = false; // set when PPS is actuallt going (up to 1 second later)
AndyA 0:97661408d0f9 143
AndyA 0:97661408d0f9 144 volatile bool PPSHigh;
AndyA 0:97661408d0f9 145 bool resync = false;
AndyA 0:97661408d0f9 146 bool resyncDone = false;
AndyA 0:97661408d0f9 147 uint32_t resyncPeriod;
AndyA 0:97661408d0f9 148 bool OKToCheckSync = false;
AndyA 0:97661408d0f9 149 volatile uint32_t VBOXTicks = 0; // time at the NEXT PPS edge
AndyA 0:97661408d0f9 150 uint32_t lastPPSSecondStart;
AndyA 0:97661408d0f9 151
AndyA 0:97661408d0f9 152 #define _longPPMTrackLen_ 20
AndyA 0:97661408d0f9 153 float PPMErrors[_longPPMTrackLen_];
AndyA 0:97661408d0f9 154 float PPMTrackTotal;
AndyA 0:97661408d0f9 155 int PPMTrackIndex;
AndyA 0:97661408d0f9 156 float PPMHighAcc;
AndyA 0:97661408d0f9 157 float remainingClockError;
AndyA 0:97661408d0f9 158 bool ppmCorrection;
AndyA 0:97661408d0f9 159
AndyA 22:0dd9c1b5664a 160 enum SerialOutput {mode_VIPS, mode_FreeD};
JamieB 29:b0eaeefa4e63 161 enum FIZFormats {formatPreston, formatFujiPassive, formatFujiActive, formatCanon};
JamieB 20:ce1d8fbff68f 162
AndyA 22:0dd9c1b5664a 163 UserSettings_t UserSettings;
AndyA 9:7214e3c3e5f8 164
AndyA 1:dd1f7e162f91 165 struct outputFormat_s {
AndyA 1:dd1f7e162f91 166 uint32_t header; // 2 byte header + 2 byte length
AndyA 1:dd1f7e162f91 167 uint32_t mask;
AndyA 1:dd1f7e162f91 168 uint32_t time;
AndyA 1:dd1f7e162f91 169 double x;
AndyA 1:dd1f7e162f91 170 double y;
AndyA 1:dd1f7e162f91 171 float z;
AndyA 8:961bb15570a1 172 uint8_t beacons;
AndyA 8:961bb15570a1 173 uint8_t solutionType;
AndyA 8:961bb15570a1 174 uint16_t kfStatus;
AndyA 1:dd1f7e162f91 175 float roll;
AndyA 1:dd1f7e162f91 176 float pitch;
AndyA 1:dd1f7e162f91 177 float yaw;
AndyA 2:a79201e302d7 178 uint8_t accuracy[4];
AndyA 3:14d241e29be3 179 uint32_t focus;
AndyA 3:14d241e29be3 180 uint16_t iris;
AndyA 3:14d241e29be3 181 uint16_t zoom;
AndyA 1:dd1f7e162f91 182 uint16_t checksum;
AndyA 1:dd1f7e162f91 183 } __attribute__((packed)) ;
AndyA 0:97661408d0f9 184
AndyA 1:dd1f7e162f91 185 struct outputFormat_s packetOut;
JamieB 20:ce1d8fbff68f 186 struct D1MsgFormat_s fdPacket;
AndyA 1:dd1f7e162f91 187
AndyA 32:bfb385d35097 188 volatile bool EthTxNow = false;
AndyA 32:bfb385d35097 189
AndyA 16:a8d3a0dbe4bf 190 void filterOff(void)
AndyA 16:a8d3a0dbe4bf 191 {
AndyA 16:a8d3a0dbe4bf 192 VIPS.EnableSmoothing(false);
AndyA 16:a8d3a0dbe4bf 193 pc.puts("FilterTimeout");
AndyA 16:a8d3a0dbe4bf 194 }
AndyA 16:a8d3a0dbe4bf 195
AndyA 16:a8d3a0dbe4bf 196 /***************************
AndyA 16:a8d3a0dbe4bf 197 *
AndyA 16:a8d3a0dbe4bf 198 * Input format is
AndyA 16:a8d3a0dbe4bf 199 * enable filter $RLFIZ FILTER ON\n
AndyA 16:a8d3a0dbe4bf 200 * disable filter $RLFIZ FILTER OFF\n
AndyA 16:a8d3a0dbe4bf 201 *
AndyA 16:a8d3a0dbe4bf 202 * Filter mode auto exits after 30 seconds
AndyA 16:a8d3a0dbe4bf 203 *
AndyA 16:a8d3a0dbe4bf 204 ****************************/
AndyA 16:a8d3a0dbe4bf 205
AndyA 16:a8d3a0dbe4bf 206 const int C1InputBufferSize = 20;
AndyA 16:a8d3a0dbe4bf 207 char C1InputBuffer[C1InputBufferSize];
AndyA 16:a8d3a0dbe4bf 208 int C1InputPtr = 0;
AndyA 16:a8d3a0dbe4bf 209
AndyA 16:a8d3a0dbe4bf 210 void parseC1Input(void)
AndyA 16:a8d3a0dbe4bf 211 {
AndyA 16:a8d3a0dbe4bf 212 if (C1InputBuffer[1] != 'R')
AndyA 16:a8d3a0dbe4bf 213 return;
AndyA 16:a8d3a0dbe4bf 214 if (C1InputBuffer[2] != 'L')
AndyA 16:a8d3a0dbe4bf 215 return;
AndyA 16:a8d3a0dbe4bf 216 if (C1InputBuffer[3] != 'F')
AndyA 16:a8d3a0dbe4bf 217 return;
AndyA 16:a8d3a0dbe4bf 218 if (C1InputBuffer[4] != 'I')
AndyA 16:a8d3a0dbe4bf 219 return;
AndyA 16:a8d3a0dbe4bf 220 if (C1InputBuffer[5] != 'Z')
AndyA 16:a8d3a0dbe4bf 221 return;
AndyA 16:a8d3a0dbe4bf 222
AndyA 16:a8d3a0dbe4bf 223 if (C1InputBuffer[7] == 'F') {
AndyA 16:a8d3a0dbe4bf 224 if (C1InputBuffer[8] != 'I')
AndyA 16:a8d3a0dbe4bf 225 return;
AndyA 16:a8d3a0dbe4bf 226 if (C1InputBuffer[9] != 'L')
AndyA 16:a8d3a0dbe4bf 227 return;
AndyA 16:a8d3a0dbe4bf 228 // 10 = T, 11 = E, 12=R, 13= space, 14 = O, 15 = N or F
AndyA 16:a8d3a0dbe4bf 229 if (C1InputBuffer[14] != 'O')
AndyA 16:a8d3a0dbe4bf 230 return;
AndyA 16:a8d3a0dbe4bf 231
AndyA 16:a8d3a0dbe4bf 232 if (C1InputBuffer[15] == 'N') {
AndyA 16:a8d3a0dbe4bf 233 VIPS.EnableSmoothing(true);
AndyA 16:a8d3a0dbe4bf 234 filteringTimeout.attach(callback(&filterOff),30.0f);
AndyA 16:a8d3a0dbe4bf 235 pc.puts("FilterOn\n");
AndyA 16:a8d3a0dbe4bf 236 return;
AndyA 16:a8d3a0dbe4bf 237 } else {
AndyA 16:a8d3a0dbe4bf 238 VIPS.EnableSmoothing(false);
AndyA 16:a8d3a0dbe4bf 239 filteringTimeout.detach();
AndyA 16:a8d3a0dbe4bf 240 pc.puts("FilterOFF\n");
AndyA 16:a8d3a0dbe4bf 241 return;
AndyA 16:a8d3a0dbe4bf 242 }
AndyA 16:a8d3a0dbe4bf 243 } // if F
AndyA 16:a8d3a0dbe4bf 244
AndyA 16:a8d3a0dbe4bf 245 }
AndyA 16:a8d3a0dbe4bf 246
AndyA 16:a8d3a0dbe4bf 247
AndyA 16:a8d3a0dbe4bf 248 void ExitBypass(void)
AndyA 16:a8d3a0dbe4bf 249 {
AndyA 16:a8d3a0dbe4bf 250 VIPS.EnableBypass(false);
AndyA 16:a8d3a0dbe4bf 251 bypassMode = false;
AndyA 16:a8d3a0dbe4bf 252 }
AndyA 16:a8d3a0dbe4bf 253
AndyA 16:a8d3a0dbe4bf 254
AndyA 16:a8d3a0dbe4bf 255 void vipsBypassRx(char byte)
AndyA 16:a8d3a0dbe4bf 256 {
AndyA 16:a8d3a0dbe4bf 257 COM1.putc(byte);
AndyA 16:a8d3a0dbe4bf 258 }
AndyA 16:a8d3a0dbe4bf 259
AndyA 16:a8d3a0dbe4bf 260
AndyA 16:a8d3a0dbe4bf 261 void onOutputSerialRx(void)
AndyA 16:a8d3a0dbe4bf 262 {
AndyA 16:a8d3a0dbe4bf 263 static bool got0x07 = false;
AndyA 16:a8d3a0dbe4bf 264 led1=!led1;
AndyA 16:a8d3a0dbe4bf 265 while (COM1.readable()) {
AndyA 16:a8d3a0dbe4bf 266 if (bypassMode) {
AndyA 16:a8d3a0dbe4bf 267 VIPS.bypassTx(COM1.getc());
AndyA 16:a8d3a0dbe4bf 268 BypassTimeout.attach(&ExitBypass,5);
AndyA 16:a8d3a0dbe4bf 269 } else {
AndyA 16:a8d3a0dbe4bf 270 C1InputBuffer[C1InputPtr] = COM1.getc();
AndyA 16:a8d3a0dbe4bf 271 pc.putc(C1InputBuffer[C1InputPtr]);
AndyA 16:a8d3a0dbe4bf 272 if (C1InputPtr == 0) {
AndyA 16:a8d3a0dbe4bf 273 if (got0x07) {
AndyA 16:a8d3a0dbe4bf 274 got0x07 = false;
AndyA 16:a8d3a0dbe4bf 275 if ((C1InputBuffer[0] >= 5) && (C1InputBuffer[0] <=11)) {
AndyA 16:a8d3a0dbe4bf 276 VIPS.bypassTx(0x07);
AndyA 16:a8d3a0dbe4bf 277 VIPS.bypassTx(C1InputBuffer[0]);
AndyA 16:a8d3a0dbe4bf 278 bypassMode = true;
AndyA 16:a8d3a0dbe4bf 279 BypassTimeout.attach(&ExitBypass,5);
AndyA 16:a8d3a0dbe4bf 280 }
AndyA 16:a8d3a0dbe4bf 281 } else if (C1InputBuffer[0] == '$')
AndyA 16:a8d3a0dbe4bf 282 C1InputPtr = 1;
AndyA 16:a8d3a0dbe4bf 283 else if (C1InputBuffer[0] == 0x07)
AndyA 16:a8d3a0dbe4bf 284 got0x07 = true;
AndyA 16:a8d3a0dbe4bf 285 } else if (C1InputBuffer[C1InputPtr] == '\n') {
AndyA 16:a8d3a0dbe4bf 286 parseC1Input();
AndyA 16:a8d3a0dbe4bf 287 C1InputPtr = 0;
AndyA 16:a8d3a0dbe4bf 288 } else {
AndyA 16:a8d3a0dbe4bf 289 C1InputPtr++;
AndyA 16:a8d3a0dbe4bf 290 if (C1InputPtr == C1InputBufferSize)
AndyA 16:a8d3a0dbe4bf 291 C1InputPtr = 0;
AndyA 16:a8d3a0dbe4bf 292 }
AndyA 16:a8d3a0dbe4bf 293 }
AndyA 16:a8d3a0dbe4bf 294 }
AndyA 16:a8d3a0dbe4bf 295 }
AndyA 16:a8d3a0dbe4bf 296
AndyA 16:a8d3a0dbe4bf 297
AndyA 16:a8d3a0dbe4bf 298
AndyA 16:a8d3a0dbe4bf 299
AndyA 1:dd1f7e162f91 300 void prepPacketOut()
AndyA 1:dd1f7e162f91 301 {
AndyA 1:dd1f7e162f91 302 uint8_t bytes[4];
AndyA 1:dd1f7e162f91 303 bytes[0]=0x24;
AndyA 3:14d241e29be3 304 bytes[1]=0xd9;
AndyA 1:dd1f7e162f91 305 *(uint16_t*)(bytes+2) = sizeof(struct outputFormat_s);
AndyA 1:dd1f7e162f91 306 packetOut.header = *(uint32_t*)bytes;
AndyA 8:961bb15570a1 307 packetOut.mask = 0x0446;
AndyA 3:14d241e29be3 308 packetOut.accuracy[0] = 0;
AndyA 3:14d241e29be3 309 packetOut.accuracy[1] = 0;
AndyA 3:14d241e29be3 310 packetOut.accuracy[2] = 0;
AndyA 3:14d241e29be3 311 packetOut.accuracy[3] = 0;
AndyA 1:dd1f7e162f91 312 }
AndyA 1:dd1f7e162f91 313
AndyA 15:830fc953edd9 314 void onOutputTxTime(void)
AndyA 15:830fc953edd9 315 {
AndyA 22:0dd9c1b5664a 316 switch (UserSettings.SerialOutMode) {
JamieB 24:16fd010a71d0 317 case mode_FreeD: {
JamieB 24:16fd010a71d0 318 char *dataPtr = (char *)&fdPacket;
AndyA 22:0dd9c1b5664a 319 for (int byte=0; byte<sizeof(struct D1MsgFormat_s); byte++)
AndyA 22:0dd9c1b5664a 320 COM1.putc(*(dataPtr+byte));
JamieB 24:16fd010a71d0 321 }
JamieB 24:16fd010a71d0 322 break;
AndyA 22:0dd9c1b5664a 323 case mode_VIPS:
JamieB 24:16fd010a71d0 324 default: {
JamieB 24:16fd010a71d0 325 char *dataPtr = (char *)&packetOut;
AndyA 22:0dd9c1b5664a 326 for (int byte=0; byte<sizeof(struct outputFormat_s); byte++)
AndyA 22:0dd9c1b5664a 327 COM1.putc(*(dataPtr+byte));
JamieB 24:16fd010a71d0 328 }
JamieB 24:16fd010a71d0 329 break;
JamieB 20:ce1d8fbff68f 330 }
JamieB 20:ce1d8fbff68f 331 }
AndyA 17:5ce3fe98e76d 332
AndyA 22:0dd9c1b5664a 333 void createFreeDPacket(position *posPtr)
JamieB 20:ce1d8fbff68f 334 {
JamieB 20:ce1d8fbff68f 335 if (posPtr) {
JamieB 20:ce1d8fbff68f 336 fdPacket.header = 0xD1;
JamieB 20:ce1d8fbff68f 337 fdPacket.id = 0xFF - posPtr->ID;
JamieB 27:498cce52fe5f 338 set24bitValue(fdPacket.yaw, (int)(((posPtr->yaw > 180)? posPtr->yaw - 360 : posPtr->yaw) *32768)); ;
JamieB 25:7002be632308 339 set24bitValue(fdPacket.pitch, (int)(posPtr->pitch *32768));
JamieB 25:7002be632308 340 set24bitValue(fdPacket.roll, (int)(posPtr->roll *32768));
JamieB 25:7002be632308 341 // fdPacket.yaw = (int)(posPtr->yaw *32768);
JamieB 25:7002be632308 342 // fdPacket.pitch = (int)(posPtr->pitch *32768);
JamieB 25:7002be632308 343 // fdPacket.roll = (int)(posPtr->roll *32768);
JamieB 25:7002be632308 344 set24bitValue(fdPacket.x, (int)(posPtr->X *64000));
JamieB 25:7002be632308 345 set24bitValue(fdPacket.y, (int)(posPtr->Y *64000));
JamieB 25:7002be632308 346 set24bitValue(fdPacket.z, (int)(posPtr->Height *64000));
JamieB 25:7002be632308 347 // fdPacket.x = (int)(posPtr->X *64000);
JamieB 25:7002be632308 348 // fdPacket.y = (int)(posPtr->Y)*64000;
JamieB 25:7002be632308 349 // fdPacket.z = (int)(posPtr->Height *64000);
AndyA 22:0dd9c1b5664a 350 if (posPtr->KFStatus < 0x200) {
AndyA 22:0dd9c1b5664a 351 led2 = 0;
AndyA 22:0dd9c1b5664a 352 RedLED = LED_ON;
AndyA 22:0dd9c1b5664a 353 } else {
AndyA 22:0dd9c1b5664a 354 led2 = 1;
AndyA 22:0dd9c1b5664a 355 RedLED = LED_OFF;
AndyA 22:0dd9c1b5664a 356 }
JamieB 20:ce1d8fbff68f 357 } else {
JamieB 20:ce1d8fbff68f 358 fdPacket.header = 0xD1;
JamieB 20:ce1d8fbff68f 359 fdPacket.id = 0xFF - posPtr->ID;
JamieB 25:7002be632308 360 set24bitValue(fdPacket.yaw, 0);
JamieB 25:7002be632308 361 set24bitValue(fdPacket.pitch, 0);
JamieB 25:7002be632308 362 set24bitValue(fdPacket.roll, 0);
JamieB 25:7002be632308 363 set24bitValue(fdPacket.x, 0);
JamieB 25:7002be632308 364 set24bitValue(fdPacket.y, 0);
JamieB 25:7002be632308 365 set24bitValue(fdPacket.z, 0);
AndyA 22:0dd9c1b5664a 366 led2 = 1;
AndyA 22:0dd9c1b5664a 367 RedLED = LED_OFF;
JamieB 20:ce1d8fbff68f 368 }
JamieB 20:ce1d8fbff68f 369 uint32_t temp_focus;
JamieB 20:ce1d8fbff68f 370 uint16_t temp_iris, temp_zoom; //can't directly address bitfield
JamieB 20:ce1d8fbff68f 371 FIZPort->getMostRecent(&temp_focus, &temp_iris, &temp_zoom);
JamieB 25:7002be632308 372 set24bitValue(fdPacket.focus, temp_focus);
JamieB 25:7002be632308 373 set24bitValue(fdPacket.zoom, temp_zoom);
JamieB 20:ce1d8fbff68f 374 fdPacket.checksum = GetFdCRC((void *)&fdPacket);
JamieB 25:7002be632308 375 //pc.puts("\r\n'");
AndyA 22:0dd9c1b5664a 376 }
JamieB 20:ce1d8fbff68f 377
AndyA 22:0dd9c1b5664a 378 void sendFreeDpacket()
AndyA 22:0dd9c1b5664a 379 {
JamieB 20:ce1d8fbff68f 380 #ifdef Delay_TX_By
JamieB 20:ce1d8fbff68f 381 OutputDelayTimer.attach_us(&onOutputTxTime,Delay_TX_By*1000);
JamieB 20:ce1d8fbff68f 382 #else
JamieB 20:ce1d8fbff68f 383 onOutputTxTime();// COM1.write(&packetOut, sizeof(struct outputFormat_s));
JamieB 20:ce1d8fbff68f 384 #endif
JamieB 20:ce1d8fbff68f 385 if (logging) {
JamieB 20:ce1d8fbff68f 386 if (!fwrite(&fdPacket, sizeof(struct D1MsgFormat_s), 1, logFile)) { // write failed
JamieB 20:ce1d8fbff68f 387 GreenLED = LED_OFF;
JamieB 20:ce1d8fbff68f 388 logging = false;
JamieB 20:ce1d8fbff68f 389 fclose(logFile);
JamieB 20:ce1d8fbff68f 390 logFile = NULL;
JamieB 20:ce1d8fbff68f 391 }
JamieB 20:ce1d8fbff68f 392 }
AndyA 15:830fc953edd9 393 }
AndyA 15:830fc953edd9 394
AndyA 15:830fc953edd9 395
JamieB 20:ce1d8fbff68f 396 void sendVIPSPacket(position *posPtr)
AndyA 1:dd1f7e162f91 397 {
AndyA 0:97661408d0f9 398 if (posPtr) {
AndyA 1:dd1f7e162f91 399 packetOut.x = posPtr->X;
AndyA 1:dd1f7e162f91 400 packetOut.y = posPtr->Y;
AndyA 1:dd1f7e162f91 401 packetOut.z = posPtr->Height;
AndyA 8:961bb15570a1 402 packetOut.beacons = posPtr->beacons;
AndyA 8:961bb15570a1 403 packetOut.solutionType = posPtr->solutionType;
AndyA 9:7214e3c3e5f8 404 packetOut.kfStatus = posPtr->KFStatus;
AndyA 1:dd1f7e162f91 405 packetOut.roll = posPtr->roll;
AndyA 1:dd1f7e162f91 406 packetOut.pitch = posPtr->pitch;
AndyA 1:dd1f7e162f91 407 packetOut.yaw = posPtr->yaw;
AndyA 2:a79201e302d7 408 packetOut.accuracy[3] = posPtr->ID;
AndyA 22:0dd9c1b5664a 409 if (packetOut.kfStatus < 0x200) {
AndyA 22:0dd9c1b5664a 410 led2 = 0;
AndyA 22:0dd9c1b5664a 411 RedLED = LED_ON;
AndyA 22:0dd9c1b5664a 412 } else {
AndyA 22:0dd9c1b5664a 413 led2 = 1;
AndyA 22:0dd9c1b5664a 414 RedLED = LED_OFF;
AndyA 22:0dd9c1b5664a 415 }
AndyA 6:61274e214f46 416 } else {
AndyA 6:61274e214f46 417 packetOut.x = 0;
AndyA 6:61274e214f46 418 packetOut.y = 0;
AndyA 6:61274e214f46 419 packetOut.z = 0;
AndyA 6:61274e214f46 420 packetOut.roll = 0;
AndyA 6:61274e214f46 421 packetOut.pitch = 0;
AndyA 6:61274e214f46 422 packetOut.yaw = 0;
AndyA 6:61274e214f46 423 packetOut.accuracy[3] = 0;
AndyA 8:961bb15570a1 424 packetOut.beacons = 0;
AndyA 8:961bb15570a1 425 packetOut.solutionType = 0;
AndyA 9:7214e3c3e5f8 426 packetOut.kfStatus = 0;
AndyA 22:0dd9c1b5664a 427 led2 = 1;
AndyA 22:0dd9c1b5664a 428 RedLED = LED_OFF;
AndyA 0:97661408d0f9 429 }
AndyA 9:7214e3c3e5f8 430 packetOut.time = movieTime.getTimeMS();
AndyA 16:a8d3a0dbe4bf 431 FIZPort->getMostRecent(&packetOut.focus, &packetOut.iris, &packetOut.zoom);
AndyA 6:61274e214f46 432 VIPSSerial::getCRC((void *)&packetOut, sizeof(struct outputFormat_s)-2, (void *)&packetOut.checksum);
AndyA 15:830fc953edd9 433
AndyA 15:830fc953edd9 434 #ifdef Delay_TX_By
AndyA 15:830fc953edd9 435 OutputDelayTimer.attach_us(&onOutputTxTime,Delay_TX_By*1000);
AndyA 15:830fc953edd9 436 #else
AndyA 17:5ce3fe98e76d 437 onOutputTxTime();// COM1.write(&packetOut, sizeof(struct outputFormat_s));
AndyA 15:830fc953edd9 438 #endif
AndyA 9:7214e3c3e5f8 439 if (logging) {
AndyA 9:7214e3c3e5f8 440 if (!fwrite(&packetOut, sizeof(struct outputFormat_s), 1, logFile)) { // write failed
AndyA 15:830fc953edd9 441 GreenLED = LED_OFF;
AndyA 9:7214e3c3e5f8 442 logging = false;
AndyA 9:7214e3c3e5f8 443 fclose(logFile);
AndyA 9:7214e3c3e5f8 444 logFile = NULL;
AndyA 0:97661408d0f9 445 }
AndyA 0:97661408d0f9 446 }
AndyA 0:97661408d0f9 447 }
AndyA 0:97661408d0f9 448
AndyA 22:0dd9c1b5664a 449 void UDPTxFreeD()
AndyA 22:0dd9c1b5664a 450 {
AndyA 32:bfb385d35097 451 EthTxNow = true;
AndyA 22:0dd9c1b5664a 452 }
AndyA 22:0dd9c1b5664a 453
JamieB 20:ce1d8fbff68f 454 void sendPosition(position *posPtr)
JamieB 20:ce1d8fbff68f 455 {
AndyA 32:bfb385d35097 456 static bool NoDataWarn = true;
JamieB 25:7002be632308 457 if (!posPtr) {
AndyA 32:bfb385d35097 458 if (NoDataWarn) { // only warn once per dropout
AndyA 32:bfb385d35097 459 pc.puts("No VIPS Data\r\n");
AndyA 32:bfb385d35097 460 NoDataWarn = false;
AndyA 32:bfb385d35097 461 }
AndyA 32:bfb385d35097 462 } else
AndyA 32:bfb385d35097 463 NoDataWarn= true;
JamieB 25:7002be632308 464
JamieB 25:7002be632308 465
AndyA 32:bfb385d35097 466 // FreeD could be output by two different methods so calculate first if needed rather than at Tx.
AndyA 22:0dd9c1b5664a 467 if ((UserSettings.SerialOutMode==mode_FreeD) || UserSettings.UDPPort)
AndyA 22:0dd9c1b5664a 468 createFreeDPacket(posPtr);
AndyA 22:0dd9c1b5664a 469
AndyA 32:bfb385d35097 470 // Network is faster so send that first.
AndyA 22:0dd9c1b5664a 471 if (UserSettings.UDPPort) {
AndyA 22:0dd9c1b5664a 472 UDPTxFreeD();
AndyA 22:0dd9c1b5664a 473 }
AndyA 22:0dd9c1b5664a 474
AndyA 22:0dd9c1b5664a 475 switch (UserSettings.SerialOutMode) {
AndyA 22:0dd9c1b5664a 476 case mode_FreeD:
AndyA 22:0dd9c1b5664a 477 sendFreeDpacket();
AndyA 22:0dd9c1b5664a 478 break;
AndyA 22:0dd9c1b5664a 479 case mode_VIPS:
AndyA 22:0dd9c1b5664a 480 default:
AndyA 22:0dd9c1b5664a 481 sendVIPSPacket(posPtr);
AndyA 22:0dd9c1b5664a 482 break;
JamieB 20:ce1d8fbff68f 483 }
JamieB 20:ce1d8fbff68f 484 }
JamieB 20:ce1d8fbff68f 485
JamieB 20:ce1d8fbff68f 486
AndyA 0:97661408d0f9 487 //called once per frame to output the current postition
AndyA 1:dd1f7e162f91 488 void framePositionOutput()
AndyA 1:dd1f7e162f91 489 {
AndyA 14:76083dc18b0d 490 led3 = !led3;
AndyA 9:7214e3c3e5f8 491 uint32_t outputTime = TimeSinceLastFrame.read_us();
AndyA 0:97661408d0f9 492 TimeSinceLastFrame.reset();
AndyA 9:7214e3c3e5f8 493 sendPosition(VIPS.sendPositionForTime(outputTime));
AndyA 16:a8d3a0dbe4bf 494 FIZPort->requestCurrent();
AndyA 0:97661408d0f9 495 }
AndyA 0:97661408d0f9 496
AndyA 9:7214e3c3e5f8 497 int getNextFileNumber()
AndyA 1:dd1f7e162f91 498 {
AndyA 14:76083dc18b0d 499
AndyA 14:76083dc18b0d 500 #ifdef enableUSBStick
AndyA 9:7214e3c3e5f8 501 static unsigned int fileNbr = 0;
AndyA 9:7214e3c3e5f8 502 char fileName[32];
AndyA 9:7214e3c3e5f8 503 FILE *filePtr = NULL;
JamieB 20:ce1d8fbff68f 504 pc.puts("DiskInit\r\n");
JamieB 20:ce1d8fbff68f 505 if (!msc.disk_initialize()) {
JamieB 20:ce1d8fbff68f 506 pc.puts("DiskInit failed/r/n");
JamieB 20:ce1d8fbff68f 507 return fileNbr;
JamieB 20:ce1d8fbff68f 508 }
AndyA 14:76083dc18b0d 509
AndyA 9:7214e3c3e5f8 510 do {
AndyA 9:7214e3c3e5f8 511 if (filePtr != NULL)
AndyA 9:7214e3c3e5f8 512 fclose(filePtr);
JamieB 20:ce1d8fbff68f 513 pc.printf("Looking to see if %d exists\r\n",fileNbr);
AndyA 15:830fc953edd9 514 sprintf(fileName,"/msc/VIPS%04u.bin",fileNbr);
AndyA 9:7214e3c3e5f8 515 filePtr = fopen(fileName,"rb");
AndyA 15:830fc953edd9 516 if (filePtr) fileNbr++;
AndyA 9:7214e3c3e5f8 517 } while (filePtr != NULL);
JamieB 20:ce1d8fbff68f 518 pc.puts("File not found\r\n");
AndyA 15:830fc953edd9 519 return fileNbr;
AndyA 14:76083dc18b0d 520 #else
AndyA 14:76083dc18b0d 521 return 0;
AndyA 15:830fc953edd9 522 #endif
AndyA 0:97661408d0f9 523 }
AndyA 0:97661408d0f9 524
AndyA 9:7214e3c3e5f8 525 FILE *nextBinaryFile(void)
AndyA 1:dd1f7e162f91 526 {
AndyA 14:76083dc18b0d 527 #ifdef enableUSBStick
AndyA 15:830fc953edd9 528 // pc.puts("DiskInit\r\n");
AndyA 15:830fc953edd9 529 // int initResult = msc.disk_initialize();
AndyA 15:830fc953edd9 530 // pc.printf("Init returned %d\r\n",initResult);
AndyA 14:76083dc18b0d 531
AndyA 15:830fc953edd9 532 // if (msc.disk_initialize()==) {
AndyA 15:830fc953edd9 533 // pc.puts("DiskInit failed/r/n");
AndyA 15:830fc953edd9 534 // return NULL;
AndyA 15:830fc953edd9 535 // }
AndyA 9:7214e3c3e5f8 536 char fileName[32];
AndyA 9:7214e3c3e5f8 537 int file = getNextFileNumber();
AndyA 9:7214e3c3e5f8 538 sprintf(fileName,"/msc/VIPS%04u.bin",file);
AndyA 15:830fc953edd9 539 // pc.printf("Opending output file %s\r\n",fileName);
AndyA 9:7214e3c3e5f8 540 return fopen(fileName,"wb");
AndyA 14:76083dc18b0d 541 #else
AndyA 15:830fc953edd9 542 pc.puts("Disk support disabled\r\n");
AndyA 15:830fc953edd9 543 return NULL;
AndyA 14:76083dc18b0d 544 #endif
AndyA 9:7214e3c3e5f8 545 }
AndyA 7:87aea27cc68b 546
AndyA 0:97661408d0f9 547
AndyA 0:97661408d0f9 548 volatile bool NewFramePulse= false;
AndyA 0:97661408d0f9 549 volatile int framesIn = 0;
AndyA 1:dd1f7e162f91 550 void OnPPFInputStartup(void)
AndyA 1:dd1f7e162f91 551 {
AndyA 0:97661408d0f9 552 framesIn++;
AndyA 0:97661408d0f9 553 }
AndyA 0:97661408d0f9 554
AndyA 0:97661408d0f9 555 volatile int SyncInCount = 0;
AndyA 1:dd1f7e162f91 556 void OnSyncInputStartup(void)
AndyA 1:dd1f7e162f91 557 {
AndyA 0:97661408d0f9 558 SyncInCount++;
AndyA 0:97661408d0f9 559 }
AndyA 0:97661408d0f9 560
AndyA 0:97661408d0f9 561
AndyA 1:dd1f7e162f91 562 void OnPPFInput(void)
AndyA 1:dd1f7e162f91 563 {
AndyA 14:76083dc18b0d 564 frameToggle=!frameToggle;
AndyA 9:7214e3c3e5f8 565 movieTime.nextFrame();
AndyA 0:97661408d0f9 566 NewFramePulse = true;
AndyA 0:97661408d0f9 567 }
AndyA 0:97661408d0f9 568
AndyA 14:76083dc18b0d 569 void OnResetTimeout()
AndyA 14:76083dc18b0d 570 {
AndyA 12:06050debf014 571 NVIC_SystemReset();
AndyA 14:76083dc18b0d 572 }
AndyA 12:06050debf014 573
AndyA 0:97661408d0f9 574
JamieB 20:ce1d8fbff68f 575 void readSettingsFile()
JamieB 20:ce1d8fbff68f 576 {
AndyA 34:c864a0c67dbf 577
AndyA 34:c864a0c67dbf 578 UserSettings.FIZmode = formatPreston;
AndyA 34:c864a0c67dbf 579 UserSettings.SerialOutMode = mode_VIPS;
AndyA 34:c864a0c67dbf 580 UserSettings.UDPPort = 0;
AndyA 34:c864a0c67dbf 581 UserSettings.IPAddress[0] = 0;
AndyA 34:c864a0c67dbf 582 UserSettings.Gateway[0] = 0;
AndyA 34:c864a0c67dbf 583 UserSettings.Subnet[0] = 0;
AndyA 34:c864a0c67dbf 584 UserSettings.FilterOrder = 0;
AndyA 34:c864a0c67dbf 585 UserSettings.FilterFreq = 10;
AndyA 34:c864a0c67dbf 586 UserSettings.FilterRate = 100;
AndyA 34:c864a0c67dbf 587 UserSettings.FilterXY = false;
AndyA 34:c864a0c67dbf 588 UserSettings.FilterZ = false;
AndyA 34:c864a0c67dbf 589 UserSettings.FilterRoll = false;
AndyA 34:c864a0c67dbf 590 UserSettings.FilterPitch = false;
AndyA 34:c864a0c67dbf 591 UserSettings.FilterYaw = false;
AndyA 34:c864a0c67dbf 592
JamieB 20:ce1d8fbff68f 593 LocalFileSystem localFS("local");
JamieB 20:ce1d8fbff68f 594 FILE *LSFile= fopen("/local/settings.txt","r");
JamieB 20:ce1d8fbff68f 595 char lineBuffer[64];
JamieB 20:ce1d8fbff68f 596 int valueIn;
AndyA 34:c864a0c67dbf 597 float floatIn;
JamieB 20:ce1d8fbff68f 598 if (LSFile) {
JamieB 20:ce1d8fbff68f 599 while (!feof(LSFile)) {
JamieB 20:ce1d8fbff68f 600 if (fgets(lineBuffer, 64, LSFile)) {
JamieB 20:ce1d8fbff68f 601 if (sscanf(lineBuffer,"Output_Format=%d",&valueIn) == 1) {
JamieB 20:ce1d8fbff68f 602 pc.printf("Got Output_Format value from file of %d\r\n",valueIn);
AndyA 22:0dd9c1b5664a 603 UserSettings.SerialOutMode = valueIn;
JamieB 20:ce1d8fbff68f 604 }
JamieB 20:ce1d8fbff68f 605 if (sscanf(lineBuffer,"FIZ_Format=%d",&valueIn) == 1) {
JamieB 20:ce1d8fbff68f 606 pc.printf("Got FIZ_Format value from file of %d\r\n",valueIn);
AndyA 22:0dd9c1b5664a 607 UserSettings.FIZmode = valueIn;
AndyA 22:0dd9c1b5664a 608 }
AndyA 22:0dd9c1b5664a 609 if (sscanf(lineBuffer,"FreeD_Port=%d",&valueIn) == 1) {
AndyA 22:0dd9c1b5664a 610 pc.printf("Got FreeD_Port value from file of %d\r\n",valueIn);
AndyA 22:0dd9c1b5664a 611 UserSettings.UDPPort = valueIn;
JamieB 20:ce1d8fbff68f 612 }
AndyA 23:5c237f04327d 613 if (sscanf(lineBuffer,"IP_addr=%s",UserSettings.IPAddress) == 1) {
AndyA 23:5c237f04327d 614 pc.printf("Got IP_addr value from file of %s\r\n",UserSettings.IPAddress);
AndyA 23:5c237f04327d 615 }
AndyA 23:5c237f04327d 616 if (sscanf(lineBuffer,"Subnet=%s",UserSettings.Subnet) == 1) {
JamieB 25:7002be632308 617 pc.printf("Got Subnet mask value from file of %s\r\n",UserSettings.Subnet);
AndyA 23:5c237f04327d 618 }
JamieB 25:7002be632308 619 if (sscanf(lineBuffer,"Gateway=%s",UserSettings.Gateway) == 1) {
AndyA 23:5c237f04327d 620 pc.printf("Got gateway value from file of %s\r\n",UserSettings.Gateway);
AndyA 23:5c237f04327d 621 }
AndyA 34:c864a0c67dbf 622 if (sscanf(lineBuffer,"FilterOrder=%d",&valueIn) == 1) {
AndyA 34:c864a0c67dbf 623 pc.printf("Got FilterOrder value from file of %d\r\n",valueIn);
AndyA 34:c864a0c67dbf 624 UserSettings.FilterOrder = valueIn;
AndyA 34:c864a0c67dbf 625 }
AndyA 34:c864a0c67dbf 626 if (sscanf(lineBuffer,"FilterFreq=%f",&floatIn) == 1) {
AndyA 34:c864a0c67dbf 627 pc.printf("Got FilterFreq value from file of %.2f\r\n",floatIn);
AndyA 34:c864a0c67dbf 628 UserSettings.FilterFreq = floatIn;
AndyA 34:c864a0c67dbf 629 }
AndyA 34:c864a0c67dbf 630 if (sscanf(lineBuffer,"FilterRate=%f",&floatIn) == 1) {
AndyA 34:c864a0c67dbf 631 pc.printf("Got FilterRate value from file of %.2f\r\n",floatIn);
AndyA 34:c864a0c67dbf 632 UserSettings.FilterRate = floatIn;
AndyA 34:c864a0c67dbf 633 }
AndyA 34:c864a0c67dbf 634 if (sscanf(lineBuffer,"FilterXY=%d",&valueIn) == 1) {
AndyA 34:c864a0c67dbf 635 pc.printf("Got FilterXY value from file of %d\r\n",valueIn);
AndyA 34:c864a0c67dbf 636 UserSettings.FilterXY = (valueIn==1);
AndyA 34:c864a0c67dbf 637 }
AndyA 34:c864a0c67dbf 638 if (sscanf(lineBuffer,"FilterZ=%d",&valueIn) == 1) {
AndyA 34:c864a0c67dbf 639 pc.printf("Got FilterZ value from file of %d\r\n",valueIn);
AndyA 34:c864a0c67dbf 640 UserSettings.FilterZ = (valueIn==1);
AndyA 34:c864a0c67dbf 641 }
AndyA 34:c864a0c67dbf 642 if (sscanf(lineBuffer,"FilterRoll=%d",&valueIn) == 1) {
AndyA 34:c864a0c67dbf 643 pc.printf("Got FilterRoll value from file of %d\r\n",valueIn);
AndyA 34:c864a0c67dbf 644 UserSettings.FilterRoll = (valueIn==1);
AndyA 34:c864a0c67dbf 645 }
AndyA 34:c864a0c67dbf 646 if (sscanf(lineBuffer,"FilterPitch=%d",&valueIn) == 1) {
AndyA 34:c864a0c67dbf 647 pc.printf("Got FilterPitch value from file of %d\r\n",valueIn);
AndyA 34:c864a0c67dbf 648 UserSettings.FilterPitch = (valueIn==1);
AndyA 34:c864a0c67dbf 649 }
AndyA 34:c864a0c67dbf 650 if (sscanf(lineBuffer,"FilterYaw=%d",&valueIn) == 1) {
AndyA 34:c864a0c67dbf 651 pc.printf("Got FilterYaw value from file of %d\r\n",valueIn);
AndyA 34:c864a0c67dbf 652 UserSettings.FilterYaw = (valueIn==1);
AndyA 34:c864a0c67dbf 653 }
JamieB 20:ce1d8fbff68f 654 }
JamieB 20:ce1d8fbff68f 655 }
JamieB 20:ce1d8fbff68f 656 fclose(LSFile);
JamieB 20:ce1d8fbff68f 657 } else {
JamieB 20:ce1d8fbff68f 658 pc.printf("No Settings File Found \r\n");
JamieB 20:ce1d8fbff68f 659 }
JamieB 20:ce1d8fbff68f 660 }
JamieB 20:ce1d8fbff68f 661
AndyA 32:bfb385d35097 662 void ethernetTask(void const* settings)
AndyA 32:bfb385d35097 663 {
AndyA 32:bfb385d35097 664
AndyA 32:bfb385d35097 665 EthernetInterface eth;
AndyA 32:bfb385d35097 666 UDPSocket* FreeDSocket = NULL;
AndyA 32:bfb385d35097 667 Endpoint FreeDTarget;
AndyA 32:bfb385d35097 668
AndyA 32:bfb385d35097 669 UserSettings_t *settingsPtr = (UserSettings_t *) settings;
AndyA 32:bfb385d35097 670
AndyA 32:bfb385d35097 671 pc.puts("Ethernet task startup\r\n");
AndyA 32:bfb385d35097 672 if (!settingsPtr->UDPPort) {
AndyA 32:bfb385d35097 673 pc.puts("No UDP port set. Ethernet task exiting\r\n");
AndyA 32:bfb385d35097 674 return;
AndyA 32:bfb385d35097 675 }
AndyA 32:bfb385d35097 676 int Result = -1;
AndyA 32:bfb385d35097 677 while (Result != 0) {
AndyA 32:bfb385d35097 678 if ((UserSettings.IPAddress[0] != 0) && (UserSettings.Gateway[0] != 0) && (UserSettings.Subnet[0] != 0)) {
AndyA 32:bfb385d35097 679 pc.puts("Static IP init attempt\r\n");
AndyA 32:bfb385d35097 680 Result = eth.init(UserSettings.IPAddress, UserSettings.Subnet, UserSettings.Gateway);
AndyA 32:bfb385d35097 681 } else {
AndyA 32:bfb385d35097 682 pc.puts("Dynamic IP init attempt\r\n");
AndyA 32:bfb385d35097 683 Result = eth.init();
AndyA 32:bfb385d35097 684 }
AndyA 32:bfb385d35097 685
AndyA 32:bfb385d35097 686 if (Result) {
AndyA 32:bfb385d35097 687 pc.puts("Ethernet init failed\r\n");
AndyA 32:bfb385d35097 688 Thread::wait(500);
AndyA 32:bfb385d35097 689 }
AndyA 32:bfb385d35097 690 }
AndyA 32:bfb385d35097 691 pc.puts("Ethernet init complete\r\n");
AndyA 32:bfb385d35097 692
AndyA 32:bfb385d35097 693 while (true) {
AndyA 32:bfb385d35097 694
AndyA 32:bfb385d35097 695 Result = -1;
AndyA 32:bfb385d35097 696 while (Result != 0) {
AndyA 32:bfb385d35097 697 Result = eth.connect();
AndyA 32:bfb385d35097 698 if (Result) {
AndyA 32:bfb385d35097 699 pc.puts("Ethernet connect failed\r\n");
AndyA 32:bfb385d35097 700 Thread::wait(500);
AndyA 32:bfb385d35097 701 }
AndyA 32:bfb385d35097 702 }
AndyA 32:bfb385d35097 703 pc.puts("Ethernet connect complete\r\n");
AndyA 32:bfb385d35097 704
AndyA 32:bfb385d35097 705 if (FreeDSocket)
AndyA 32:bfb385d35097 706 delete FreeDSocket;
AndyA 32:bfb385d35097 707 FreeDSocket = new UDPSocket();
AndyA 32:bfb385d35097 708 FreeDSocket->init();
AndyA 32:bfb385d35097 709 FreeDSocket->set_broadcasting(true);
AndyA 32:bfb385d35097 710 FreeDTarget.set_address(0xFFFFFFFF, UserSettings.UDPPort);
AndyA 32:bfb385d35097 711
AndyA 32:bfb385d35097 712 while (true) {
AndyA 32:bfb385d35097 713 if (EthTxNow) {
AndyA 32:bfb385d35097 714 EthTxNow = false;
AndyA 32:bfb385d35097 715 if (!FreeDSocket) {
AndyA 32:bfb385d35097 716 pc.puts("No UDP socket\r\n");
AndyA 32:bfb385d35097 717 break;
AndyA 32:bfb385d35097 718 }
AndyA 32:bfb385d35097 719 Result = FreeDSocket->sendTo(FreeDTarget,(char *)&fdPacket, sizeof(struct D1MsgFormat_s));
AndyA 32:bfb385d35097 720 if (Result != sizeof(struct D1MsgFormat_s)) {
AndyA 32:bfb385d35097 721 pc.puts("UDP Tx Failed!\r\n");
AndyA 32:bfb385d35097 722 break;
AndyA 32:bfb385d35097 723 }
AndyA 32:bfb385d35097 724 // pc.puts("UDP Tx\r\n");
AndyA 32:bfb385d35097 725 } else
AndyA 32:bfb385d35097 726 Thread::wait(5);
AndyA 32:bfb385d35097 727 }
AndyA 32:bfb385d35097 728 eth.disconnect();
AndyA 32:bfb385d35097 729 pc.puts("Attempting to restart network\r\n");
AndyA 32:bfb385d35097 730 }
AndyA 32:bfb385d35097 731 pc.puts("Eth Task ending. Should never happen!\r\n");
AndyA 32:bfb385d35097 732 }
AndyA 32:bfb385d35097 733
AndyA 32:bfb385d35097 734
JamieB 20:ce1d8fbff68f 735
AndyA 1:dd1f7e162f91 736 int main()
AndyA 1:dd1f7e162f91 737 {
AndyA 1:dd1f7e162f91 738 pc.baud(115200);
AndyA 35:7ecf25d9c414 739 pc.printf("\r\n\r\nStartup - v0.10\r\n");
JamieB 27:498cce52fe5f 740 setRED();
AndyA 22:0dd9c1b5664a 741
JamieB 20:ce1d8fbff68f 742 readSettingsFile();
AndyA 22:0dd9c1b5664a 743
AndyA 22:0dd9c1b5664a 744 switch(UserSettings.FIZmode) {
JamieB 21:0dec6dd14e10 745 case formatPreston :
JamieB 21:0dec6dd14e10 746 FIZPort = new FIZDisney(p9, p10);
JamieB 26:7f66ac76cd5d 747 pc.printf("Set Preston");
JamieB 26:7f66ac76cd5d 748 break;
JamieB 21:0dec6dd14e10 749 case formatFujiPassive :
JamieB 21:0dec6dd14e10 750 FIZPort = new FIZDigiPower(p9, p10);
JamieB 26:7f66ac76cd5d 751 pc.printf("Set FujiPassive");
JamieB 26:7f66ac76cd5d 752 break;
JamieB 21:0dec6dd14e10 753 case formatFujiActive :
JamieB 21:0dec6dd14e10 754 FIZPort = new FIZDigiPowerActive(p9, p10);
JamieB 26:7f66ac76cd5d 755 pc.printf("Set FujiActive\r\n");
JamieB 26:7f66ac76cd5d 756 break;
JamieB 29:b0eaeefa4e63 757 case formatCanon :
JamieB 29:b0eaeefa4e63 758 FIZPort = new FIZCanon(p9, p10);
JamieB 29:b0eaeefa4e63 759 pc.printf("Set Canon\r\n");
JamieB 29:b0eaeefa4e63 760 break;
JamieB 21:0dec6dd14e10 761 default:
JamieB 21:0dec6dd14e10 762 FIZPort = new FIZDisney(p9, p10); //preston
JamieB 26:7f66ac76cd5d 763 pc.printf("Set Default - Preston");
JamieB 21:0dec6dd14e10 764 }
JamieB 26:7f66ac76cd5d 765 // FIZPort = new FIZDigiPowerActive(p9, p10);
AndyA 22:0dd9c1b5664a 766 COM1.baud(115200); // VIPS port
AndyA 22:0dd9c1b5664a 767
AndyA 32:bfb385d35097 768 Thread serialTask(ethernetTask, &UserSettings, osPriorityNormal, 256 * 4);
AndyA 22:0dd9c1b5664a 769
AndyA 14:76083dc18b0d 770 led1 = 0;
AndyA 1:dd1f7e162f91 771 inputTimer.reset();
AndyA 1:dd1f7e162f91 772 inputTimer.start();
AndyA 0:97661408d0f9 773
AndyA 1:dd1f7e162f91 774 prepPacketOut();
AndyA 3:14d241e29be3 775
AndyA 9:7214e3c3e5f8 776 LTCInput.enable(true);
AndyA 3:14d241e29be3 777
AndyA 35:7ecf25d9c414 778 if (!VIPS.setFilters(&UserSettings))
AndyA 35:7ecf25d9c414 779 pc.puts("Failed to create VIPS filters\r\n");
AndyA 35:7ecf25d9c414 780
AndyA 1:dd1f7e162f91 781 VIPS.run();
AndyA 1:dd1f7e162f91 782
AndyA 14:76083dc18b0d 783 pc.printf("System init complete\r\n");
JamieB 27:498cce52fe5f 784 setBLUE();
AndyA 16:a8d3a0dbe4bf 785 COM1.attach(&onOutputSerialRx);
AndyA 0:97661408d0f9 786
AndyA 1:dd1f7e162f91 787 TimeSinceLastFrame.reset();
AndyA 1:dd1f7e162f91 788 TimeSinceLastFrame.start();
AndyA 9:7214e3c3e5f8 789
JamieB 27:498cce52fe5f 790
AndyA 9:7214e3c3e5f8 791 pc.printf("Waiting for sync input clock\r\n");
AndyA 16:a8d3a0dbe4bf 792
AndyA 15:830fc953edd9 793 #ifdef enableFakePPF
AndyA 15:830fc953edd9 794 FakePPF.attach(callback(&OnPPFInputStartup),1/24.0);
AndyA 15:830fc953edd9 795 #endif
AndyA 16:a8d3a0dbe4bf 796
AndyA 9:7214e3c3e5f8 797 PPFin.rise(callback(&OnPPFInputStartup));
AndyA 9:7214e3c3e5f8 798 Syncin.rise(callback(&OnSyncInputStartup));
AndyA 9:7214e3c3e5f8 799 framesIn = 0;
AndyA 9:7214e3c3e5f8 800 SyncInCount = 0;
AndyA 9:7214e3c3e5f8 801 bool LockToSync = false;
AndyA 9:7214e3c3e5f8 802
AndyA 1:dd1f7e162f91 803 while (true) {
AndyA 10:053bac3e326b 804 if (SyncInCount == 100) {
AndyA 10:053bac3e326b 805 LockToSync= true;
AndyA 9:7214e3c3e5f8 806 break;
AndyA 9:7214e3c3e5f8 807 }
AndyA 14:76083dc18b0d 808 if ((framesIn == 100) && (SyncInCount<45)) { // prefer frame sync
AndyA 9:7214e3c3e5f8 809 break;
AndyA 9:7214e3c3e5f8 810 }
AndyA 9:7214e3c3e5f8 811 }
AndyA 1:dd1f7e162f91 812
AndyA 9:7214e3c3e5f8 813 if (LockToSync) {
AndyA 9:7214e3c3e5f8 814 pc.printf("Using Genlock sync input\r\n");
AndyA 9:7214e3c3e5f8 815 Syncin.rise(callback(&OnPPFInputStartup));
AndyA 9:7214e3c3e5f8 816 PPFin.rise(NULL);
AndyA 9:7214e3c3e5f8 817 } else {
AndyA 9:7214e3c3e5f8 818 pc.printf("Using pulse per frame input\r\n");
AndyA 9:7214e3c3e5f8 819 Syncin.rise(NULL);
AndyA 9:7214e3c3e5f8 820 }
AndyA 9:7214e3c3e5f8 821
JamieB 27:498cce52fe5f 822 setGREEN();
AndyA 9:7214e3c3e5f8 823 pc.printf("Measuring frame rate\r\n");
AndyA 0:97661408d0f9 824
AndyA 9:7214e3c3e5f8 825 int currentFrames = framesIn;
AndyA 9:7214e3c3e5f8 826 while (framesIn == currentFrames); // wait for next frame;
AndyA 9:7214e3c3e5f8 827 inputTimer.reset();
AndyA 9:7214e3c3e5f8 828 framesIn = 0;
AndyA 9:7214e3c3e5f8 829
AndyA 10:053bac3e326b 830
AndyA 9:7214e3c3e5f8 831 while (framesIn < 100); // wait for 100 frames;
AndyA 9:7214e3c3e5f8 832 uint32_t frameTime = inputTimer.read_us()/100;
AndyA 9:7214e3c3e5f8 833
AndyA 9:7214e3c3e5f8 834 int framesPerSecond = frameRates::getClosestRate(frameTime);
AndyA 9:7214e3c3e5f8 835
AndyA 9:7214e3c3e5f8 836 pc.printf("Detected frame rate %d\r\n",framesPerSecond);
AndyA 1:dd1f7e162f91 837
AndyA 9:7214e3c3e5f8 838 if (LTCInput.synced()) { // getting LTC so set the clock.
AndyA 9:7214e3c3e5f8 839 currentFrames = framesIn;
AndyA 9:7214e3c3e5f8 840 while (framesIn == currentFrames); // wait for next frame;
AndyA 9:7214e3c3e5f8 841 wait_us (frameTime/4); // ensure the LTC decode for the last frame is done.
AndyA 9:7214e3c3e5f8 842 int hour,minute,second,frame;
AndyA 9:7214e3c3e5f8 843 bool drop = LTCInput.isFrameDrop();
AndyA 9:7214e3c3e5f8 844 LTCInput.getTime(&hour,&minute,&second,&frame);
AndyA 9:7214e3c3e5f8 845 movieTime.setMode(framesPerSecond,drop);
AndyA 14:76083dc18b0d 846 movieTime.setTime(hour,minute,second,frame);
AndyA 9:7214e3c3e5f8 847 } else { // no time code so clock time doesn't matter
AndyA 9:7214e3c3e5f8 848 movieTime.setMode(framesPerSecond,false);
AndyA 9:7214e3c3e5f8 849 }
AndyA 9:7214e3c3e5f8 850
AndyA 9:7214e3c3e5f8 851 if (LockToSync)
AndyA 9:7214e3c3e5f8 852 Syncin.rise(callback(&OnPPFInput));
AndyA 9:7214e3c3e5f8 853 else
AndyA 9:7214e3c3e5f8 854 PPFin.rise(callback(&OnPPFInput));
AndyA 9:7214e3c3e5f8 855
AndyA 15:830fc953edd9 856 #ifdef enableFakePPF
AndyA 15:830fc953edd9 857 FakePPF.attach(callback(&OnPPFInput),1/24.0);
AndyA 15:830fc953edd9 858 #endif
AndyA 15:830fc953edd9 859
AndyA 9:7214e3c3e5f8 860 pc.printf("Current time is %02d:%02d:%02d %02d\r\n",movieTime.hours(),movieTime.minutes(),movieTime.seconds(),movieTime.frame());
AndyA 9:7214e3c3e5f8 861 LTCInput.enable(false);
JamieB 27:498cce52fe5f 862 setOFF();
AndyA 9:7214e3c3e5f8 863
AndyA 9:7214e3c3e5f8 864 pc.printf("Running\r\n",framesPerSecond);
AndyA 9:7214e3c3e5f8 865
AndyA 14:76083dc18b0d 866
AndyA 9:7214e3c3e5f8 867 getNextFileNumber();
AndyA 16:a8d3a0dbe4bf 868 COM1.attach(callback(onOutputSerialRx));
AndyA 9:7214e3c3e5f8 869
JamieB 27:498cce52fe5f 870
AndyA 9:7214e3c3e5f8 871 while (true) {
AndyA 9:7214e3c3e5f8 872 if (NewFramePulse) { // New frame. Output data.
AndyA 9:7214e3c3e5f8 873 //framePulse(FramePulseTime);
AndyA 15:830fc953edd9 874 NewFramePulse = false;
AndyA 9:7214e3c3e5f8 875 framePositionOutput();
AndyA 9:7214e3c3e5f8 876 }
AndyA 18:ad407a2ed4c9 877 VIPS.sendQueued(); // should ideally be called on 100Hz PPS edge but we don't have that in this code...
AndyA 9:7214e3c3e5f8 878
AndyA 9:7214e3c3e5f8 879 if (logButtonLastState != logButton) {
AndyA 15:830fc953edd9 880 logButtonLastState = logButton;
AndyA 15:830fc953edd9 881 if (logButtonLastState) { // pressed
AndyA 9:7214e3c3e5f8 882 logButtonDownTime = inputTimer.read();
AndyA 15:830fc953edd9 883 if ((logButtonDownTime - logButtonUpTime) > 0.2f) {
AndyA 15:830fc953edd9 884 // pc.puts("Down\r\n");
AndyA 15:830fc953edd9 885 // resetTimeout.attach(callback(&OnResetTimeout),10);
AndyA 15:830fc953edd9 886 if (logging) {
AndyA 15:830fc953edd9 887 // pc.puts("Logging off\r\n");
AndyA 15:830fc953edd9 888 GreenLED = LED_OFF;
AndyA 15:830fc953edd9 889 logging=false;
AndyA 15:830fc953edd9 890 fclose(logFile);
AndyA 15:830fc953edd9 891 } else {
AndyA 15:830fc953edd9 892 logFile = nextBinaryFile();
AndyA 15:830fc953edd9 893 if(logFile) {
AndyA 15:830fc953edd9 894 // pc.puts("Logging on\r\n");
AndyA 15:830fc953edd9 895 GreenLED = LED_ON;
AndyA 15:830fc953edd9 896 logging = true;
AndyA 15:830fc953edd9 897 }
AndyA 15:830fc953edd9 898 //else pc.puts("Logging failed\r\n");
AndyA 9:7214e3c3e5f8 899 }
AndyA 1:dd1f7e162f91 900 }
AndyA 9:7214e3c3e5f8 901 } else { // released
AndyA 9:7214e3c3e5f8 902 logButtonUpTime = inputTimer.read();
AndyA 15:830fc953edd9 903 // resetTimeout.attach(NULL,0);
AndyA 15:830fc953edd9 904 if ((logButtonUpTime-logButtonDownTime) > 0.05f) {
AndyA 15:830fc953edd9 905 // pc.puts("Up\r\n");
AndyA 15:830fc953edd9 906 }
AndyA 1:dd1f7e162f91 907 }
AndyA 0:97661408d0f9 908 }
AndyA 9:7214e3c3e5f8 909 }
AndyA 0:97661408d0f9 910 }