Racelogic / Mbed 2 deprecated VIPS_LTC_RAW_IMU

Dependencies:   BufferedSerial FatFileSystemCpp mbed

Committer:
JamieB
Date:
Thu Dec 15 05:53:28 2022 +0000
Revision:
79:1910ae03cb2e
Parent:
78:8e1170e18a2d
Child:
85:0cc5931bb9ef
Working State RAW IMU output in message

Who changed what in which revision?

UserRevisionLine numberNew contents of line
JamieB 78:8e1170e18a2d 1 #define APP_VERSION 0.302
JamieB 41:a3556d765635 2
AndyA 23:5c237f04327d 3 /*
AndyA 23:5c237f04327d 4 Settings file options
AndyA 23:5c237f04327d 5
AndyA 23:5c237f04327d 6 On startup system will look for settings.txt on the built in mbed drive.
AndyA 23:5c237f04327d 7
AndyA 23:5c237f04327d 8 This file should be ascii text with one option per line.
AndyA 23:5c237f04327d 9 The following options supported:
AndyA 23:5c237f04327d 10
AndyA 23:5c237f04327d 11 Output_Format=n
AndyA 23:5c237f04327d 12 Sets the serial output format.
AndyA 23:5c237f04327d 13 n = 0 - VIPS
AndyA 23:5c237f04327d 14 n = 1 - FreeD
AndyA 23:5c237f04327d 15
AndyA 23:5c237f04327d 16
AndyA 23:5c237f04327d 17 FIZ_Format=n
AndyA 23:5c237f04327d 18 Sets the FIZ reader to use
AndyA 23:5c237f04327d 19 n = 0 - Preston
AndyA 23:5c237f04327d 20 n = 1 - Fuji passive listen mode (skycam)
AndyA 23:5c237f04327d 21 n = 2 - Fuji active mode
AndyA 32:bfb385d35097 22 n = 3 - Canon
AndyA 62:dcb92159ac8e 23 n = 4 - Arri
AndyA 23:5c237f04327d 24
AndyA 23:5c237f04327d 25 FreeD_Port=pppp
AndyA 23:5c237f04327d 26 Sets the UDP port for FreeD network output.
AndyA 23:5c237f04327d 27 Data is sent as a UDP broadcast on the select port number.
AndyA 23:5c237f04327d 28 A port number of 0 disables UDP output.
AndyA 23:5c237f04327d 29
JamieB 42:9653486372a6 30 VIPS_UDP_Port=pppp
JamieB 42:9653486372a6 31 Same As Above
JamieB 42:9653486372a6 32
AndyA 23:5c237f04327d 33 IP_addr=aaa.bbb.ccc.ddd
AndyA 23:5c237f04327d 34 Subnet=aaa.bbb.ccc.ddd
AndyA 23:5c237f04327d 35 Gateway=aaa.bbb.ccc.ddd
AndyA 23:5c237f04327d 36 Set the IPv4 address to use for the ethernet interface.
AndyA 23:5c237f04327d 37 All 3 values must be set for a static address to be used otherwise DHCP will be used.
AndyA 23:5c237f04327d 38
AndyA 34:c864a0c67dbf 39
AndyA 34:c864a0c67dbf 40 FilterOrder=n
AndyA 34:c864a0c67dbf 41 FilterFreq=m.mm
AndyA 34:c864a0c67dbf 42 FilterRate=r.rr
AndyA 34:c864a0c67dbf 43 Low pass filter settings for channels that have it enabled.
AndyA 34:c864a0c67dbf 44 Filter is of order n with a cut off at m Hz assuming input data rate is at r Hz
AndyA 34:c864a0c67dbf 45 Filter order must be set to enable filters.
AndyA 34:c864a0c67dbf 46 Frequency default is 10Hz
AndyA 34:c864a0c67dbf 47 Rate default is 100Hz
AndyA 34:c864a0c67dbf 48
AndyA 34:c864a0c67dbf 49 FilterXY=1
AndyA 34:c864a0c67dbf 50 FilterZ=1
AndyA 34:c864a0c67dbf 51 FilterRoll=1
AndyA 34:c864a0c67dbf 52 FilterPitch=1
AndyA 34:c864a0c67dbf 53 FilterYaw=1
AndyA 34:c864a0c67dbf 54 Enable channels to low pass filter. All filters use the settings given above.
AndyA 34:c864a0c67dbf 55 A value of 1 enables the filter. A value of 0 or skipping the line disables the filter.
AndyA 34:c864a0c67dbf 56
AndyA 34:c864a0c67dbf 57 NOTE-The filter will add latency so a filtered channel will be delayed relative to an unfiltered one.
AndyA 34:c864a0c67dbf 58
AndyA 34:c864a0c67dbf 59
AndyA 44:fe7fcf62c75d 60 ExtendedOutput=1
AndyA 44:fe7fcf62c75d 61 Enable extra fields in VIPS output.
AndyA 44:fe7fcf62c75d 62
AndyA 44:fe7fcf62c75d 63
AndyA 23:5c237f04327d 64 All settings are case sensitive.
AndyA 23:5c237f04327d 65 Do NOT include spaces in the options lines.
AndyA 23:5c237f04327d 66 All options default to a value of 0 is omitted from the file.
AndyA 23:5c237f04327d 67
AndyA 23:5c237f04327d 68 */
AndyA 23:5c237f04327d 69
AndyA 0:97661408d0f9 70 #include "mbed.h"
AndyA 0:97661408d0f9 71 #include "LTCApp.h"
AndyA 22:0dd9c1b5664a 72 #include "EthernetInterface.h"
JamieB 79:1910ae03cb2e 73 #include <vector>
AndyA 0:97661408d0f9 74
AndyA 22:0dd9c1b5664a 75 //#define enableUSBStick
AndyA 15:830fc953edd9 76 //#define enableFakePPF
AndyA 15:830fc953edd9 77
AndyA 15:830fc953edd9 78 // delay transmit to n ms after the frame
AndyA 15:830fc953edd9 79 // comment out rather than set to 0 to disable
AndyA 15:830fc953edd9 80 //#define Delay_TX_By 10
AndyA 14:76083dc18b0d 81
AndyA 14:76083dc18b0d 82 #ifdef enableUSBStick
AndyA 14:76083dc18b0d 83 #include "MSCFileSystem.h"
AndyA 14:76083dc18b0d 84 MSCFileSystem msc("msc");
AndyA 14:76083dc18b0d 85 #endif
AndyA 9:7214e3c3e5f8 86
AndyA 0:97661408d0f9 87 BufferedSerial pc(USBTX, USBRX);
AndyA 0:97661408d0f9 88 VIPSSerial VIPS(p28, p27);
AndyA 50:d6c56eccf56a 89 BufferedSerial COM1(p13, p14);
AndyA 16:a8d3a0dbe4bf 90 FIZReader *FIZPort;
AndyA 68:9e68287f0ab7 91 EthernetInterface eth;
AndyA 0:97661408d0f9 92
AndyA 11:ef7f6591b776 93 DigitalOut led1(LED1);
AndyA 0:97661408d0f9 94 DigitalOut led2(LED2);
AndyA 0:97661408d0f9 95 DigitalOut led3(LED3);
AndyA 0:97661408d0f9 96 DigitalOut frameToggle(LED4);
AndyA 0:97661408d0f9 97
AndyA 0:97661408d0f9 98 LTCDecode LTCInput(p7);
AndyA 0:97661408d0f9 99 InterruptIn PPFin(p29);
AndyA 0:97661408d0f9 100 InterruptIn Syncin(p8);
AndyA 0:97661408d0f9 101
AndyA 11:ef7f6591b776 102 DigitalIn logButton(p17,PullDown);
AndyA 11:ef7f6591b776 103
AndyA 15:830fc953edd9 104 DigitalOut RedLED(p18); // red
AndyA 11:ef7f6591b776 105 DigitalOut GreenLED(p19);
AndyA 11:ef7f6591b776 106 DigitalOut BlueLED(p20);
AndyA 11:ef7f6591b776 107
AndyA 68:9e68287f0ab7 108 LocalFileSystem localFS("local");
AndyA 68:9e68287f0ab7 109
AndyA 11:ef7f6591b776 110 #define LED_OFF 1
AndyA 11:ef7f6591b776 111 #define LED_ON 0
AndyA 14:76083dc18b0d 112
JamieB 27:498cce52fe5f 113 #define setRED() ({GreenLED=LED_OFF;BlueLED = LED_OFF;RedLED = LED_ON;})
JamieB 27:498cce52fe5f 114 #define setGREEN() ({GreenLED=LED_ON;BlueLED = LED_OFF;RedLED = LED_OFF;})
JamieB 27:498cce52fe5f 115 #define setBLUE() ({GreenLED=LED_OFF;BlueLED = LED_ON;RedLED = LED_OFF;})
JamieB 27:498cce52fe5f 116 #define setOFF() ({GreenLED=LED_OFF;BlueLED = LED_OFF;RedLED = LED_OFF;})
AndyA 9:7214e3c3e5f8 117
AndyA 9:7214e3c3e5f8 118 frameclock movieTime;
AndyA 9:7214e3c3e5f8 119
AndyA 0:97661408d0f9 120 // clock to time everything with
AndyA 0:97661408d0f9 121 Timer inputTimer;
AndyA 12:06050debf014 122 Timeout resetTimeout;
AndyA 16:a8d3a0dbe4bf 123 Timeout filteringTimeout;
AndyA 16:a8d3a0dbe4bf 124 Timeout BypassTimeout;
AndyA 0:97661408d0f9 125
AndyA 15:830fc953edd9 126 #ifdef enableFakePPF
AndyA 15:830fc953edd9 127 Ticker FakePPF;
AndyA 15:830fc953edd9 128 #endif
AndyA 15:830fc953edd9 129
AndyA 9:7214e3c3e5f8 130 float logButtonDownTime;
AndyA 9:7214e3c3e5f8 131 float logButtonUpTime;
AndyA 9:7214e3c3e5f8 132 int logButtonLastState;
AndyA 9:7214e3c3e5f8 133
AndyA 16:a8d3a0dbe4bf 134 bool bypassMode = false;
AndyA 9:7214e3c3e5f8 135 bool logging = false;
AndyA 9:7214e3c3e5f8 136 FILE *logFile = NULL;
AndyA 9:7214e3c3e5f8 137
AndyA 9:7214e3c3e5f8 138
AndyA 0:97661408d0f9 139 // Time since last frame event, used for position output interpolation
AndyA 0:97661408d0f9 140 Timer TimeSinceLastFrame;
AndyA 0:97661408d0f9 141 uint32_t TimeSinceLastFrameWrap;
AndyA 0:97661408d0f9 142
JamieB 58:8cce8fcc765f 143 //Debug Timer for Ethernet
JamieB 58:8cce8fcc765f 144 Timer EthernetTimer;
JamieB 58:8cce8fcc765f 145 uint32_t TimeSinceLastEthernetPacket;
JamieB 58:8cce8fcc765f 146
AndyA 0:97661408d0f9 147 // used to start PPS at the correct point
AndyA 0:97661408d0f9 148 Timeout PPSsyncTimer;
AndyA 0:97661408d0f9 149
AndyA 15:830fc953edd9 150 Timeout OutputDelayTimer;
AndyA 50:d6c56eccf56a 151 Timeout UDPOutputDelayTimer;
AndyA 15:830fc953edd9 152
AndyA 0:97661408d0f9 153 // used to generate PPS edges
AndyA 0:97661408d0f9 154 Ticker PPSOutputTimer;
AndyA 0:97661408d0f9 155
AndyA 0:97661408d0f9 156 frameRates detectedRate;
AndyA 0:97661408d0f9 157 bool ppsRunning = false; // set when PPS start has been scheduled
AndyA 0:97661408d0f9 158 volatile bool ppsActive = false; // set when PPS is actuallt going (up to 1 second later)
AndyA 0:97661408d0f9 159
AndyA 0:97661408d0f9 160 volatile bool PPSHigh;
AndyA 0:97661408d0f9 161 bool resync = false;
AndyA 0:97661408d0f9 162 bool resyncDone = false;
AndyA 0:97661408d0f9 163 uint32_t resyncPeriod;
AndyA 0:97661408d0f9 164 bool OKToCheckSync = false;
AndyA 0:97661408d0f9 165 volatile uint32_t VBOXTicks = 0; // time at the NEXT PPS edge
AndyA 0:97661408d0f9 166 uint32_t lastPPSSecondStart;
JamieB 76:c7c795b22f63 167 volatile bool StopTCPListening = false;
AndyA 0:97661408d0f9 168
AndyA 0:97661408d0f9 169 #define _longPPMTrackLen_ 20
AndyA 0:97661408d0f9 170 float PPMErrors[_longPPMTrackLen_];
AndyA 0:97661408d0f9 171 float PPMTrackTotal;
AndyA 0:97661408d0f9 172 int PPMTrackIndex;
AndyA 0:97661408d0f9 173 float PPMHighAcc;
AndyA 0:97661408d0f9 174 float remainingClockError;
AndyA 0:97661408d0f9 175 bool ppmCorrection;
AndyA 0:97661408d0f9 176
AndyA 22:0dd9c1b5664a 177 enum SerialOutput {mode_VIPS, mode_FreeD};
AndyA 62:dcb92159ac8e 178 enum FIZFormats {formatPreston, formatFujiPassive, formatFujiActive, formatCanon, formatArri};
JamieB 20:ce1d8fbff68f 179
AndyA 22:0dd9c1b5664a 180 UserSettings_t UserSettings;
AndyA 9:7214e3c3e5f8 181
AndyA 44:fe7fcf62c75d 182 uint8_t FlexibleVIPSOut[200];
AndyA 44:fe7fcf62c75d 183 int VIPSOutSize;
AndyA 0:97661408d0f9 184
JamieB 20:ce1d8fbff68f 185 struct D1MsgFormat_s fdPacket;
AndyA 1:dd1f7e162f91 186
AndyA 32:bfb385d35097 187 volatile bool EthTxNow = false;
JamieB 58:8cce8fcc765f 188 Mutex NewData;
JamieB 58:8cce8fcc765f 189
JamieB 61:e734e86661b0 190 bool TXFrame = true;
JamieB 61:e734e86661b0 191
AndyA 32:bfb385d35097 192
AndyA 16:a8d3a0dbe4bf 193 void filterOff(void)
AndyA 16:a8d3a0dbe4bf 194 {
AndyA 16:a8d3a0dbe4bf 195 VIPS.EnableSmoothing(false);
AndyA 16:a8d3a0dbe4bf 196 pc.puts("FilterTimeout");
AndyA 16:a8d3a0dbe4bf 197 }
AndyA 16:a8d3a0dbe4bf 198
AndyA 16:a8d3a0dbe4bf 199 /***************************
AndyA 16:a8d3a0dbe4bf 200 *
AndyA 16:a8d3a0dbe4bf 201 * Input format is
AndyA 16:a8d3a0dbe4bf 202 * enable filter $RLFIZ FILTER ON\n
AndyA 16:a8d3a0dbe4bf 203 * disable filter $RLFIZ FILTER OFF\n
AndyA 16:a8d3a0dbe4bf 204 *
AndyA 16:a8d3a0dbe4bf 205 * Filter mode auto exits after 30 seconds
AndyA 16:a8d3a0dbe4bf 206 *
AndyA 16:a8d3a0dbe4bf 207 ****************************/
AndyA 16:a8d3a0dbe4bf 208
AndyA 16:a8d3a0dbe4bf 209 const int C1InputBufferSize = 20;
AndyA 16:a8d3a0dbe4bf 210 char C1InputBuffer[C1InputBufferSize];
AndyA 16:a8d3a0dbe4bf 211 int C1InputPtr = 0;
AndyA 16:a8d3a0dbe4bf 212
AndyA 16:a8d3a0dbe4bf 213 void parseC1Input(void)
AndyA 16:a8d3a0dbe4bf 214 {
AndyA 16:a8d3a0dbe4bf 215 if (C1InputBuffer[1] != 'R')
AndyA 16:a8d3a0dbe4bf 216 return;
AndyA 16:a8d3a0dbe4bf 217 if (C1InputBuffer[2] != 'L')
AndyA 16:a8d3a0dbe4bf 218 return;
AndyA 16:a8d3a0dbe4bf 219 if (C1InputBuffer[3] != 'F')
AndyA 16:a8d3a0dbe4bf 220 return;
AndyA 16:a8d3a0dbe4bf 221 if (C1InputBuffer[4] != 'I')
AndyA 16:a8d3a0dbe4bf 222 return;
AndyA 16:a8d3a0dbe4bf 223 if (C1InputBuffer[5] != 'Z')
AndyA 16:a8d3a0dbe4bf 224 return;
AndyA 16:a8d3a0dbe4bf 225
AndyA 16:a8d3a0dbe4bf 226 if (C1InputBuffer[7] == 'F') {
AndyA 16:a8d3a0dbe4bf 227 if (C1InputBuffer[8] != 'I')
AndyA 16:a8d3a0dbe4bf 228 return;
AndyA 16:a8d3a0dbe4bf 229 if (C1InputBuffer[9] != 'L')
AndyA 16:a8d3a0dbe4bf 230 return;
AndyA 16:a8d3a0dbe4bf 231 // 10 = T, 11 = E, 12=R, 13= space, 14 = O, 15 = N or F
AndyA 16:a8d3a0dbe4bf 232 if (C1InputBuffer[14] != 'O')
AndyA 16:a8d3a0dbe4bf 233 return;
AndyA 16:a8d3a0dbe4bf 234
AndyA 16:a8d3a0dbe4bf 235 if (C1InputBuffer[15] == 'N') {
JamieB 66:066b16c6c34f 236 VIPS.ForceSmoothing(true);
AndyA 16:a8d3a0dbe4bf 237 filteringTimeout.attach(callback(&filterOff),30.0f);
AndyA 16:a8d3a0dbe4bf 238 pc.puts("FilterOn\n");
AndyA 16:a8d3a0dbe4bf 239 return;
AndyA 16:a8d3a0dbe4bf 240 } else {
JamieB 66:066b16c6c34f 241 VIPS.ForceSmoothing(false);
AndyA 16:a8d3a0dbe4bf 242 filteringTimeout.detach();
AndyA 16:a8d3a0dbe4bf 243 pc.puts("FilterOFF\n");
AndyA 16:a8d3a0dbe4bf 244 return;
AndyA 16:a8d3a0dbe4bf 245 }
AndyA 16:a8d3a0dbe4bf 246 } // if F
AndyA 16:a8d3a0dbe4bf 247
AndyA 16:a8d3a0dbe4bf 248 }
AndyA 16:a8d3a0dbe4bf 249
AndyA 16:a8d3a0dbe4bf 250
AndyA 16:a8d3a0dbe4bf 251 void ExitBypass(void)
AndyA 16:a8d3a0dbe4bf 252 {
AndyA 16:a8d3a0dbe4bf 253 VIPS.EnableBypass(false);
AndyA 16:a8d3a0dbe4bf 254 bypassMode = false;
AndyA 16:a8d3a0dbe4bf 255 }
AndyA 16:a8d3a0dbe4bf 256
AndyA 16:a8d3a0dbe4bf 257
AndyA 16:a8d3a0dbe4bf 258 void vipsBypassRx(char byte)
AndyA 16:a8d3a0dbe4bf 259 {
AndyA 16:a8d3a0dbe4bf 260 COM1.putc(byte);
AndyA 16:a8d3a0dbe4bf 261 }
AndyA 16:a8d3a0dbe4bf 262
AndyA 16:a8d3a0dbe4bf 263
AndyA 16:a8d3a0dbe4bf 264 void onOutputSerialRx(void)
AndyA 16:a8d3a0dbe4bf 265 {
AndyA 16:a8d3a0dbe4bf 266 static bool got0x07 = false;
AndyA 16:a8d3a0dbe4bf 267 led1=!led1;
JamieB 66:066b16c6c34f 268 while (COM1.RawSerial::readable()) {
AndyA 16:a8d3a0dbe4bf 269 if (bypassMode) {
JamieB 66:066b16c6c34f 270 VIPS.bypassTx(COM1.RawSerial::getc());
AndyA 16:a8d3a0dbe4bf 271 BypassTimeout.attach(&ExitBypass,5);
AndyA 16:a8d3a0dbe4bf 272 } else {
JamieB 66:066b16c6c34f 273 C1InputBuffer[C1InputPtr] = COM1.RawSerial::getc();
AndyA 16:a8d3a0dbe4bf 274 pc.putc(C1InputBuffer[C1InputPtr]);
AndyA 16:a8d3a0dbe4bf 275 if (C1InputPtr == 0) {
AndyA 16:a8d3a0dbe4bf 276 if (got0x07) {
AndyA 16:a8d3a0dbe4bf 277 got0x07 = false;
AndyA 16:a8d3a0dbe4bf 278 if ((C1InputBuffer[0] >= 5) && (C1InputBuffer[0] <=11)) {
AndyA 16:a8d3a0dbe4bf 279 VIPS.bypassTx(0x07);
AndyA 16:a8d3a0dbe4bf 280 VIPS.bypassTx(C1InputBuffer[0]);
AndyA 16:a8d3a0dbe4bf 281 bypassMode = true;
AndyA 16:a8d3a0dbe4bf 282 BypassTimeout.attach(&ExitBypass,5);
AndyA 16:a8d3a0dbe4bf 283 }
AndyA 16:a8d3a0dbe4bf 284 } else if (C1InputBuffer[0] == '$')
AndyA 16:a8d3a0dbe4bf 285 C1InputPtr = 1;
AndyA 16:a8d3a0dbe4bf 286 else if (C1InputBuffer[0] == 0x07)
AndyA 16:a8d3a0dbe4bf 287 got0x07 = true;
AndyA 16:a8d3a0dbe4bf 288 } else if (C1InputBuffer[C1InputPtr] == '\n') {
AndyA 16:a8d3a0dbe4bf 289 parseC1Input();
AndyA 16:a8d3a0dbe4bf 290 C1InputPtr = 0;
AndyA 16:a8d3a0dbe4bf 291 } else {
AndyA 16:a8d3a0dbe4bf 292 C1InputPtr++;
AndyA 16:a8d3a0dbe4bf 293 if (C1InputPtr == C1InputBufferSize)
AndyA 16:a8d3a0dbe4bf 294 C1InputPtr = 0;
AndyA 16:a8d3a0dbe4bf 295 }
AndyA 16:a8d3a0dbe4bf 296 }
AndyA 16:a8d3a0dbe4bf 297 }
AndyA 16:a8d3a0dbe4bf 298 }
AndyA 16:a8d3a0dbe4bf 299
AndyA 16:a8d3a0dbe4bf 300
AndyA 16:a8d3a0dbe4bf 301
AndyA 16:a8d3a0dbe4bf 302
AndyA 1:dd1f7e162f91 303 void prepPacketOut()
AndyA 1:dd1f7e162f91 304 {
AndyA 44:fe7fcf62c75d 305 FlexibleVIPSOut[0]=0x24;
AndyA 44:fe7fcf62c75d 306 FlexibleVIPSOut[1]=0xd9;
AndyA 1:dd1f7e162f91 307 }
AndyA 1:dd1f7e162f91 308
AndyA 15:830fc953edd9 309 void onOutputTxTime(void)
AndyA 15:830fc953edd9 310 {
AndyA 22:0dd9c1b5664a 311 switch (UserSettings.SerialOutMode) {
JamieB 24:16fd010a71d0 312 case mode_FreeD: {
JamieB 24:16fd010a71d0 313 char *dataPtr = (char *)&fdPacket;
AndyA 22:0dd9c1b5664a 314 for (int byte=0; byte<sizeof(struct D1MsgFormat_s); byte++)
AndyA 22:0dd9c1b5664a 315 COM1.putc(*(dataPtr+byte));
JamieB 24:16fd010a71d0 316 }
JamieB 24:16fd010a71d0 317 break;
AndyA 22:0dd9c1b5664a 318 case mode_VIPS:
JamieB 24:16fd010a71d0 319 default: {
AndyA 44:fe7fcf62c75d 320 char *dataPtr = (char *)FlexibleVIPSOut;
AndyA 44:fe7fcf62c75d 321 for (int byte=0; byte<VIPSOutSize; byte++)
AndyA 22:0dd9c1b5664a 322 COM1.putc(*(dataPtr+byte));
JamieB 24:16fd010a71d0 323 }
JamieB 24:16fd010a71d0 324 break;
JamieB 20:ce1d8fbff68f 325 }
JamieB 20:ce1d8fbff68f 326 }
AndyA 17:5ce3fe98e76d 327
AndyA 22:0dd9c1b5664a 328 void createFreeDPacket(position *posPtr)
JamieB 20:ce1d8fbff68f 329 {
JamieB 20:ce1d8fbff68f 330 if (posPtr) {
JamieB 20:ce1d8fbff68f 331 fdPacket.header = 0xD1;
JamieB 20:ce1d8fbff68f 332 fdPacket.id = 0xFF - posPtr->ID;
JamieB 27:498cce52fe5f 333 set24bitValue(fdPacket.yaw, (int)(((posPtr->yaw > 180)? posPtr->yaw - 360 : posPtr->yaw) *32768)); ;
JamieB 25:7002be632308 334 set24bitValue(fdPacket.pitch, (int)(posPtr->pitch *32768));
JamieB 25:7002be632308 335 set24bitValue(fdPacket.roll, (int)(posPtr->roll *32768));
JamieB 25:7002be632308 336 // fdPacket.yaw = (int)(posPtr->yaw *32768);
JamieB 25:7002be632308 337 // fdPacket.pitch = (int)(posPtr->pitch *32768);
JamieB 25:7002be632308 338 // fdPacket.roll = (int)(posPtr->roll *32768);
JamieB 25:7002be632308 339 set24bitValue(fdPacket.x, (int)(posPtr->X *64000));
JamieB 25:7002be632308 340 set24bitValue(fdPacket.y, (int)(posPtr->Y *64000));
JamieB 25:7002be632308 341 set24bitValue(fdPacket.z, (int)(posPtr->Height *64000));
JamieB 25:7002be632308 342 // fdPacket.x = (int)(posPtr->X *64000);
JamieB 25:7002be632308 343 // fdPacket.y = (int)(posPtr->Y)*64000;
JamieB 25:7002be632308 344 // fdPacket.z = (int)(posPtr->Height *64000);
AndyA 22:0dd9c1b5664a 345 if (posPtr->KFStatus < 0x200) {
AndyA 22:0dd9c1b5664a 346 led2 = 0;
AndyA 22:0dd9c1b5664a 347 RedLED = LED_ON;
AndyA 22:0dd9c1b5664a 348 } else {
AndyA 22:0dd9c1b5664a 349 led2 = 1;
AndyA 22:0dd9c1b5664a 350 RedLED = LED_OFF;
AndyA 22:0dd9c1b5664a 351 }
JamieB 20:ce1d8fbff68f 352 } else {
JamieB 20:ce1d8fbff68f 353 fdPacket.header = 0xD1;
JamieB 20:ce1d8fbff68f 354 fdPacket.id = 0xFF - posPtr->ID;
JamieB 25:7002be632308 355 set24bitValue(fdPacket.yaw, 0);
JamieB 25:7002be632308 356 set24bitValue(fdPacket.pitch, 0);
JamieB 25:7002be632308 357 set24bitValue(fdPacket.roll, 0);
JamieB 25:7002be632308 358 set24bitValue(fdPacket.x, 0);
JamieB 25:7002be632308 359 set24bitValue(fdPacket.y, 0);
JamieB 25:7002be632308 360 set24bitValue(fdPacket.z, 0);
AndyA 22:0dd9c1b5664a 361 led2 = 1;
AndyA 22:0dd9c1b5664a 362 RedLED = LED_OFF;
JamieB 20:ce1d8fbff68f 363 }
JamieB 20:ce1d8fbff68f 364 uint32_t temp_focus;
JamieB 20:ce1d8fbff68f 365 uint16_t temp_iris, temp_zoom; //can't directly address bitfield
JamieB 20:ce1d8fbff68f 366 FIZPort->getMostRecent(&temp_focus, &temp_iris, &temp_zoom);
JamieB 25:7002be632308 367 set24bitValue(fdPacket.focus, temp_focus);
JamieB 25:7002be632308 368 set24bitValue(fdPacket.zoom, temp_zoom);
JamieB 20:ce1d8fbff68f 369 fdPacket.checksum = GetFdCRC((void *)&fdPacket);
JamieB 25:7002be632308 370 //pc.puts("\r\n'");
AndyA 22:0dd9c1b5664a 371 }
JamieB 20:ce1d8fbff68f 372
AndyA 48:475b3c5f5707 373 void sendFreeDpacketSerial()
AndyA 22:0dd9c1b5664a 374 {
AndyA 50:d6c56eccf56a 375 if (UserSettings.SerialTxDelayMS > 0)
AndyA 50:d6c56eccf56a 376 OutputDelayTimer.attach_us(&onOutputTxTime,UserSettings.SerialTxDelayMS*1000);
AndyA 50:d6c56eccf56a 377 else
AndyA 50:d6c56eccf56a 378 onOutputTxTime();// COM1.write(&packetOut, sizeof(struct outputFormat_s));
AndyA 50:d6c56eccf56a 379
JamieB 20:ce1d8fbff68f 380 if (logging) {
JamieB 20:ce1d8fbff68f 381 if (!fwrite(&fdPacket, sizeof(struct D1MsgFormat_s), 1, logFile)) { // write failed
JamieB 20:ce1d8fbff68f 382 GreenLED = LED_OFF;
JamieB 20:ce1d8fbff68f 383 logging = false;
JamieB 20:ce1d8fbff68f 384 fclose(logFile);
JamieB 20:ce1d8fbff68f 385 logFile = NULL;
JamieB 20:ce1d8fbff68f 386 }
JamieB 20:ce1d8fbff68f 387 }
AndyA 15:830fc953edd9 388 }
AndyA 15:830fc953edd9 389
AndyA 15:830fc953edd9 390
AndyA 50:d6c56eccf56a 391 void createVIPSPacket(position *posPtr)
AndyA 50:d6c56eccf56a 392 {
AndyA 50:d6c56eccf56a 393
AndyA 44:fe7fcf62c75d 394 int byteCount = 4;
JamieB 79:1910ae03cb2e 395 //uint32_t mask = 0x0446; // Status,orientation,accuracy,FIZ
JamieB 79:1910ae03cb2e 396 uint32_t mask = 0x0546; // Status,orientation,accuracy,FIZ,RAW_IMU
AndyA 44:fe7fcf62c75d 397 if (posPtr && UserSettings.FlexibleVIPSOut) {
AndyA 47:8d577dfb7eb1 398 if (posPtr->UsedBeaconsValid) {
AndyA 44:fe7fcf62c75d 399 mask |= 0x1000;
AndyA 50:d6c56eccf56a 400 }
AndyA 44:fe7fcf62c75d 401 if (posPtr->LLAPosition)
AndyA 44:fe7fcf62c75d 402 mask |= 0x0001;
AndyA 44:fe7fcf62c75d 403 }
AndyA 44:fe7fcf62c75d 404
AndyA 44:fe7fcf62c75d 405 *((uint32_t*)(FlexibleVIPSOut + byteCount)) = mask;
AndyA 44:fe7fcf62c75d 406 byteCount +=4;
AndyA 44:fe7fcf62c75d 407
AndyA 44:fe7fcf62c75d 408 *((uint32_t*)(FlexibleVIPSOut + byteCount)) = movieTime.getTimeMS();
AndyA 44:fe7fcf62c75d 409 byteCount +=4;
AndyA 44:fe7fcf62c75d 410
AndyA 0:97661408d0f9 411 if (posPtr) {
AndyA 44:fe7fcf62c75d 412 *((double*)(FlexibleVIPSOut + byteCount)) = posPtr->X;
AndyA 44:fe7fcf62c75d 413 byteCount +=8;
AndyA 44:fe7fcf62c75d 414 *((double*)(FlexibleVIPSOut + byteCount)) = posPtr->Y;
AndyA 44:fe7fcf62c75d 415 byteCount +=8;
AndyA 44:fe7fcf62c75d 416 *((float*)(FlexibleVIPSOut + byteCount)) = posPtr->Height;
AndyA 44:fe7fcf62c75d 417 byteCount +=4;
AndyA 47:8d577dfb7eb1 418 FlexibleVIPSOut[byteCount++] = posPtr->beacons;
AndyA 47:8d577dfb7eb1 419 FlexibleVIPSOut[byteCount++] = posPtr->solutionType;
AndyA 44:fe7fcf62c75d 420 *((uint16_t*)(FlexibleVIPSOut + byteCount)) = posPtr->KFStatus;
AndyA 44:fe7fcf62c75d 421 byteCount +=2;
AndyA 44:fe7fcf62c75d 422 *((float*)(FlexibleVIPSOut + byteCount)) = posPtr->roll;
AndyA 44:fe7fcf62c75d 423 byteCount +=4;
AndyA 44:fe7fcf62c75d 424 *((float*)(FlexibleVIPSOut + byteCount)) = posPtr->pitch;
AndyA 44:fe7fcf62c75d 425 byteCount +=4;
AndyA 44:fe7fcf62c75d 426 *((float*)(FlexibleVIPSOut + byteCount)) = posPtr->yaw;
AndyA 44:fe7fcf62c75d 427 byteCount +=4;
AndyA 6:61274e214f46 428 } else {
AndyA 44:fe7fcf62c75d 429 int blankBytes = 8+8+4+1+1+2+4+4+4;
AndyA 44:fe7fcf62c75d 430 memset(FlexibleVIPSOut + byteCount,0,blankBytes);
AndyA 44:fe7fcf62c75d 431 byteCount += blankBytes;
AndyA 44:fe7fcf62c75d 432 }
AndyA 44:fe7fcf62c75d 433
AndyA 47:8d577dfb7eb1 434 FlexibleVIPSOut[byteCount++] = 0;
AndyA 47:8d577dfb7eb1 435 FlexibleVIPSOut[byteCount++] = 0;
AndyA 47:8d577dfb7eb1 436 FlexibleVIPSOut[byteCount++] = 0;
AndyA 47:8d577dfb7eb1 437 FlexibleVIPSOut[byteCount++] = posPtr?posPtr->ID:0;
AndyA 44:fe7fcf62c75d 438
JamieB 79:1910ae03cb2e 439 if (posPtr) {
JamieB 79:1910ae03cb2e 440 //RAWIMU
JamieB 79:1910ae03cb2e 441 *((float*)(FlexibleVIPSOut + byteCount)) = posPtr->x_accel;
JamieB 79:1910ae03cb2e 442 byteCount +=4;
JamieB 79:1910ae03cb2e 443 *((float*)(FlexibleVIPSOut + byteCount)) = posPtr->y_accel;
JamieB 79:1910ae03cb2e 444 byteCount +=4;
JamieB 79:1910ae03cb2e 445 *((float*)(FlexibleVIPSOut + byteCount)) = posPtr->z_accel;
JamieB 79:1910ae03cb2e 446 byteCount +=4;
JamieB 79:1910ae03cb2e 447 *((float*)(FlexibleVIPSOut + byteCount)) = posPtr->x_gyro;
JamieB 79:1910ae03cb2e 448 byteCount +=4;
JamieB 79:1910ae03cb2e 449 *((float*)(FlexibleVIPSOut + byteCount)) = posPtr->y_gyro;
JamieB 79:1910ae03cb2e 450 byteCount +=4;
JamieB 79:1910ae03cb2e 451 *((float*)(FlexibleVIPSOut + byteCount)) = posPtr->z_gyro;
JamieB 79:1910ae03cb2e 452 byteCount +=4;
JamieB 79:1910ae03cb2e 453 }
JamieB 79:1910ae03cb2e 454
AndyA 44:fe7fcf62c75d 455 FIZPort->getMostRecent((uint32_t*)(FlexibleVIPSOut + byteCount), (uint16_t*)(FlexibleVIPSOut + byteCount+4), (uint16_t*)(FlexibleVIPSOut + byteCount+6));
AndyA 44:fe7fcf62c75d 456 byteCount+=8;
AndyA 44:fe7fcf62c75d 457
JamieB 64:e2b454ed9940 458 if (mask & 0x1000) { // pos must be valid for this to be set
AndyA 44:fe7fcf62c75d 459 memcpy(FlexibleVIPSOut + byteCount,posPtr->UsedBeacons,12);
AndyA 47:8d577dfb7eb1 460 byteCount+=12;
AndyA 47:8d577dfb7eb1 461 }
AndyA 44:fe7fcf62c75d 462
AndyA 44:fe7fcf62c75d 463 // set length to current size plus checksum.
AndyA 44:fe7fcf62c75d 464 VIPSOutSize = byteCount+2;
AndyA 44:fe7fcf62c75d 465 *((uint16_t*)(FlexibleVIPSOut + 2)) = VIPSOutSize;
AndyA 44:fe7fcf62c75d 466
AndyA 50:d6c56eccf56a 467 VIPSSerial::getCRC(FlexibleVIPSOut, byteCount, (void *)(FlexibleVIPSOut+byteCount));
AndyA 50:d6c56eccf56a 468 }
AndyA 15:830fc953edd9 469
AndyA 48:475b3c5f5707 470
AndyA 48:475b3c5f5707 471 void sendVIPSPacketSerial()
AndyA 48:475b3c5f5707 472 {
AndyA 50:d6c56eccf56a 473 if (UserSettings.SerialTxDelayMS > 0)
AndyA 50:d6c56eccf56a 474 OutputDelayTimer.attach_us(&onOutputTxTime,UserSettings.SerialTxDelayMS*1000);
AndyA 50:d6c56eccf56a 475 else
AndyA 50:d6c56eccf56a 476 onOutputTxTime();// COM1.write(&packetOut, sizeof(struct outputFormat_s));
AndyA 50:d6c56eccf56a 477
AndyA 9:7214e3c3e5f8 478 if (logging) {
AndyA 44:fe7fcf62c75d 479 if (!fwrite(FlexibleVIPSOut, VIPSOutSize, 1, logFile)) { // write failed
AndyA 15:830fc953edd9 480 GreenLED = LED_OFF;
AndyA 9:7214e3c3e5f8 481 logging = false;
AndyA 9:7214e3c3e5f8 482 fclose(logFile);
AndyA 9:7214e3c3e5f8 483 logFile = NULL;
AndyA 0:97661408d0f9 484 }
AndyA 0:97661408d0f9 485 }
AndyA 0:97661408d0f9 486 }
AndyA 0:97661408d0f9 487
JamieB 42:9653486372a6 488 void UDP_Tx_Now()
AndyA 22:0dd9c1b5664a 489 {
AndyA 32:bfb385d35097 490 EthTxNow = true;
JamieB 58:8cce8fcc765f 491 NewData.unlock();
AndyA 22:0dd9c1b5664a 492 }
AndyA 22:0dd9c1b5664a 493
JamieB 57:ba6f516d93b9 494 void applyOffsets(float *value, int offset, bool invert, int max_wrap)
AndyA 55:ee36cab19a58 495 {
JamieB 57:ba6f516d93b9 496 int min_wrap = max_wrap - 360;
JamieB 61:e734e86661b0 497
AndyA 55:ee36cab19a58 498 *value += offset;
AndyA 55:ee36cab19a58 499 if (invert)
AndyA 55:ee36cab19a58 500 *value = 360-*value;
AndyA 55:ee36cab19a58 501
JamieB 57:ba6f516d93b9 502 *value += 360-max_wrap;
JamieB 57:ba6f516d93b9 503
JamieB 57:ba6f516d93b9 504 if (*value<min_wrap)
AndyA 56:0d9684c7df36 505 *value+=((int)(*value/-360)+1)*360;
JamieB 57:ba6f516d93b9 506 if (*value>=max_wrap)
AndyA 56:0d9684c7df36 507 *value-=((int)(*value/360))*360;
JamieB 57:ba6f516d93b9 508
JamieB 57:ba6f516d93b9 509 *value -= 360-max_wrap;
AndyA 55:ee36cab19a58 510 }
AndyA 55:ee36cab19a58 511
JamieB 20:ce1d8fbff68f 512 void sendPosition(position *posPtr)
JamieB 20:ce1d8fbff68f 513 {
JamieB 58:8cce8fcc765f 514 NewData.lock();
AndyA 32:bfb385d35097 515 static bool NoDataWarn = true;
JamieB 25:7002be632308 516 if (!posPtr) {
AndyA 32:bfb385d35097 517 if (NoDataWarn) { // only warn once per dropout
AndyA 32:bfb385d35097 518 pc.puts("No VIPS Data\r\n");
AndyA 32:bfb385d35097 519 NoDataWarn = false;
AndyA 32:bfb385d35097 520 }
AndyA 32:bfb385d35097 521 } else
AndyA 32:bfb385d35097 522 NoDataWarn= true;
JamieB 25:7002be632308 523
AndyA 51:d4a5151af5af 524 if (posPtr) {
JamieB 57:ba6f516d93b9 525 applyOffsets(&posPtr->roll, UserSettings.OffsetRoll, UserSettings.InvertRoll, 180);
JamieB 57:ba6f516d93b9 526 applyOffsets(&posPtr->pitch, UserSettings.OffsetPitch, UserSettings.InvertPitch, 180);
JamieB 57:ba6f516d93b9 527 applyOffsets(&posPtr->yaw, UserSettings.OffsetYaw, UserSettings.InvertYaw, 360);
AndyA 51:d4a5151af5af 528 }
AndyA 51:d4a5151af5af 529
JamieB 25:7002be632308 530
AndyA 32:bfb385d35097 531 // FreeD could be output by two different methods so calculate first if needed rather than at Tx.
JamieB 42:9653486372a6 532 if ((UserSettings.SerialOutMode==mode_FreeD) || UserSettings.FreeDPort)
AndyA 22:0dd9c1b5664a 533 createFreeDPacket(posPtr);
AndyA 22:0dd9c1b5664a 534
JamieB 73:89f799500055 535 if ((UserSettings.SerialOutMode==mode_VIPS) || UserSettings.VipsUDPPort || (UserSettings.DataOutPort && !UserSettings.FreeDPort))
AndyA 48:475b3c5f5707 536 createVIPSPacket(posPtr);
AndyA 48:475b3c5f5707 537
AndyA 48:475b3c5f5707 538
AndyA 32:bfb385d35097 539 // Network is faster so send that first.
JamieB 73:89f799500055 540 if (UserSettings.DataOutPort || UserSettings.VipsUDPPort) {
AndyA 50:d6c56eccf56a 541 if (UserSettings.UDPTxDelayMS > 0) {
AndyA 51:d4a5151af5af 542 UDPOutputDelayTimer.attach_us(&UDP_Tx_Now,UserSettings.UDPTxDelayMS*1000);
AndyA 50:d6c56eccf56a 543 } else
AndyA 51:d4a5151af5af 544 UDP_Tx_Now();
AndyA 22:0dd9c1b5664a 545 }
JamieB 61:e734e86661b0 546 if (TXFrame) {
AndyA 22:0dd9c1b5664a 547
JamieB 61:e734e86661b0 548 switch (UserSettings.SerialOutMode) {
JamieB 61:e734e86661b0 549 case mode_FreeD:
JamieB 61:e734e86661b0 550 sendFreeDpacketSerial();
JamieB 61:e734e86661b0 551 break;
JamieB 61:e734e86661b0 552 case mode_VIPS:
JamieB 61:e734e86661b0 553 default:
JamieB 61:e734e86661b0 554 sendVIPSPacketSerial();
JamieB 61:e734e86661b0 555 break;
JamieB 61:e734e86661b0 556 }
JamieB 61:e734e86661b0 557
JamieB 61:e734e86661b0 558 if (posPtr && (posPtr->KFStatus < 0x200)) {
JamieB 61:e734e86661b0 559 led2 = 0;
JamieB 61:e734e86661b0 560 RedLED = LED_ON;
JamieB 61:e734e86661b0 561 } else {
JamieB 61:e734e86661b0 562 led2 = 1;
JamieB 61:e734e86661b0 563 RedLED = LED_OFF;
JamieB 61:e734e86661b0 564 }
JamieB 61:e734e86661b0 565
JamieB 20:ce1d8fbff68f 566 }
AndyA 68:9e68287f0ab7 567 if (UserSettings.HalfRate) {
AndyA 68:9e68287f0ab7 568 TXFrame = !TXFrame;
AndyA 68:9e68287f0ab7 569 }
JamieB 20:ce1d8fbff68f 570 }
JamieB 20:ce1d8fbff68f 571
JamieB 20:ce1d8fbff68f 572
AndyA 0:97661408d0f9 573 //called once per frame to output the current postition
AndyA 1:dd1f7e162f91 574 void framePositionOutput()
AndyA 1:dd1f7e162f91 575 {
AndyA 14:76083dc18b0d 576 led3 = !led3;
JamieB 72:da2f1df6a50d 577 uint32_t outputTime = TimeSinceLastFrame.read_us() + UserSettings.InterpolationOffset_uS;
AndyA 0:97661408d0f9 578 TimeSinceLastFrame.reset();
AndyA 9:7214e3c3e5f8 579 sendPosition(VIPS.sendPositionForTime(outputTime));
AndyA 16:a8d3a0dbe4bf 580 FIZPort->requestCurrent();
AndyA 0:97661408d0f9 581 }
AndyA 0:97661408d0f9 582
AndyA 9:7214e3c3e5f8 583 int getNextFileNumber()
AndyA 1:dd1f7e162f91 584 {
AndyA 14:76083dc18b0d 585
AndyA 14:76083dc18b0d 586 #ifdef enableUSBStick
AndyA 9:7214e3c3e5f8 587 static unsigned int fileNbr = 0;
AndyA 9:7214e3c3e5f8 588 char fileName[32];
AndyA 9:7214e3c3e5f8 589 FILE *filePtr = NULL;
JamieB 20:ce1d8fbff68f 590 pc.puts("DiskInit\r\n");
JamieB 20:ce1d8fbff68f 591 if (!msc.disk_initialize()) {
JamieB 20:ce1d8fbff68f 592 pc.puts("DiskInit failed/r/n");
JamieB 20:ce1d8fbff68f 593 return fileNbr;
JamieB 20:ce1d8fbff68f 594 }
AndyA 14:76083dc18b0d 595
AndyA 9:7214e3c3e5f8 596 do {
AndyA 9:7214e3c3e5f8 597 if (filePtr != NULL)
AndyA 9:7214e3c3e5f8 598 fclose(filePtr);
JamieB 20:ce1d8fbff68f 599 pc.printf("Looking to see if %d exists\r\n",fileNbr);
AndyA 15:830fc953edd9 600 sprintf(fileName,"/msc/VIPS%04u.bin",fileNbr);
AndyA 9:7214e3c3e5f8 601 filePtr = fopen(fileName,"rb");
AndyA 15:830fc953edd9 602 if (filePtr) fileNbr++;
AndyA 9:7214e3c3e5f8 603 } while (filePtr != NULL);
JamieB 20:ce1d8fbff68f 604 pc.puts("File not found\r\n");
AndyA 15:830fc953edd9 605 return fileNbr;
AndyA 14:76083dc18b0d 606 #else
AndyA 14:76083dc18b0d 607 return 0;
AndyA 15:830fc953edd9 608 #endif
AndyA 0:97661408d0f9 609 }
AndyA 0:97661408d0f9 610
AndyA 9:7214e3c3e5f8 611 FILE *nextBinaryFile(void)
AndyA 1:dd1f7e162f91 612 {
AndyA 14:76083dc18b0d 613 #ifdef enableUSBStick
AndyA 15:830fc953edd9 614 // pc.puts("DiskInit\r\n");
AndyA 15:830fc953edd9 615 // int initResult = msc.disk_initialize();
AndyA 15:830fc953edd9 616 // pc.printf("Init returned %d\r\n",initResult);
AndyA 14:76083dc18b0d 617
AndyA 15:830fc953edd9 618 // if (msc.disk_initialize()==) {
AndyA 15:830fc953edd9 619 // pc.puts("DiskInit failed/r/n");
AndyA 15:830fc953edd9 620 // return NULL;
AndyA 15:830fc953edd9 621 // }
AndyA 9:7214e3c3e5f8 622 char fileName[32];
AndyA 9:7214e3c3e5f8 623 int file = getNextFileNumber();
AndyA 9:7214e3c3e5f8 624 sprintf(fileName,"/msc/VIPS%04u.bin",file);
AndyA 15:830fc953edd9 625 // pc.printf("Opending output file %s\r\n",fileName);
AndyA 9:7214e3c3e5f8 626 return fopen(fileName,"wb");
AndyA 14:76083dc18b0d 627 #else
AndyA 15:830fc953edd9 628 pc.puts("Disk support disabled\r\n");
AndyA 15:830fc953edd9 629 return NULL;
AndyA 14:76083dc18b0d 630 #endif
AndyA 9:7214e3c3e5f8 631 }
AndyA 7:87aea27cc68b 632
AndyA 0:97661408d0f9 633
AndyA 0:97661408d0f9 634 volatile bool NewFramePulse= false;
AndyA 0:97661408d0f9 635 volatile int framesIn = 0;
AndyA 1:dd1f7e162f91 636 void OnPPFInputStartup(void)
AndyA 1:dd1f7e162f91 637 {
AndyA 0:97661408d0f9 638 framesIn++;
AndyA 0:97661408d0f9 639 }
AndyA 0:97661408d0f9 640
AndyA 0:97661408d0f9 641 volatile int SyncInCount = 0;
AndyA 1:dd1f7e162f91 642 void OnSyncInputStartup(void)
AndyA 1:dd1f7e162f91 643 {
AndyA 0:97661408d0f9 644 SyncInCount++;
AndyA 0:97661408d0f9 645 }
AndyA 0:97661408d0f9 646
AndyA 0:97661408d0f9 647
AndyA 1:dd1f7e162f91 648 void OnPPFInput(void)
AndyA 1:dd1f7e162f91 649 {
AndyA 14:76083dc18b0d 650 frameToggle=!frameToggle;
AndyA 9:7214e3c3e5f8 651 movieTime.nextFrame();
AndyA 0:97661408d0f9 652 NewFramePulse = true;
AndyA 0:97661408d0f9 653 }
AndyA 0:97661408d0f9 654
AndyA 14:76083dc18b0d 655 void OnResetTimeout()
AndyA 14:76083dc18b0d 656 {
JamieB 76:c7c795b22f63 657 __disable_irq();
JamieB 76:c7c795b22f63 658 led1=1;
JamieB 76:c7c795b22f63 659 led2=1;
JamieB 76:c7c795b22f63 660 led3=1;
JamieB 76:c7c795b22f63 661 frameToggle=1;
JamieB 76:c7c795b22f63 662 RedLED=1; // red
JamieB 76:c7c795b22f63 663 GreenLED=1;
JamieB 76:c7c795b22f63 664 BlueLED=1;
JamieB 76:c7c795b22f63 665 wait(1);
AndyA 12:06050debf014 666 NVIC_SystemReset();
AndyA 14:76083dc18b0d 667 }
AndyA 12:06050debf014 668
JamieB 78:8e1170e18a2d 669 void readLensFile(char* filename)
JamieB 78:8e1170e18a2d 670 {
JamieB 78:8e1170e18a2d 671 FILE *LensFile = fopen(filename,"r");
JamieB 78:8e1170e18a2d 672 if (LensFile) {
JamieB 78:8e1170e18a2d 673 char chunk[64];
JamieB 78:8e1170e18a2d 674 size_t len = sizeof(chunk);
JamieB 78:8e1170e18a2d 675 char *line = new char[len];
JamieB 78:8e1170e18a2d 676 pc.printf("Opened File %s\r\n", filename);
JamieB 79:1910ae03cb2e 677 vector<int> *encoder;
JamieB 79:1910ae03cb2e 678 vector<float> *absolute;
JamieB 79:1910ae03cb2e 679 int focus_datapoints;
JamieB 79:1910ae03cb2e 680 int iris_datapoints;
JamieB 79:1910ae03cb2e 681 int zoom_datapoints;
JamieB 78:8e1170e18a2d 682
JamieB 78:8e1170e18a2d 683 while(fgets(chunk, sizeof(chunk), LensFile) != NULL) {
JamieB 78:8e1170e18a2d 684 size_t len_used = strlen(line);
JamieB 78:8e1170e18a2d 685 size_t chunk_used = strlen(chunk);
JamieB 78:8e1170e18a2d 686
JamieB 78:8e1170e18a2d 687 if(len - len_used < chunk_used) {
JamieB 78:8e1170e18a2d 688 pc.printf("Line Buffer Exceeded - Failed to read file");
JamieB 78:8e1170e18a2d 689 free(line);
JamieB 78:8e1170e18a2d 690 return;
JamieB 79:1910ae03cb2e 691 }
JamieB 78:8e1170e18a2d 692
JamieB 78:8e1170e18a2d 693 strncpy(line + len_used, chunk, len - len_used);
JamieB 78:8e1170e18a2d 694 len_used += chunk_used;
JamieB 78:8e1170e18a2d 695 if(line[len_used - 1] == '\n') {
JamieB 79:1910ae03cb2e 696 pc.printf("Retrieved line of length %u: ", len_used);
JamieB 79:1910ae03cb2e 697 pc.printf("%s\n", line);
JamieB 79:1910ae03cb2e 698 if (sscanf(line,"FOCUS:%d", &focus_datapoints) == 1) {
JamieB 79:1910ae03cb2e 699 encoder = &UserSettings.focus_encoder_map;
JamieB 79:1910ae03cb2e 700 absolute = &UserSettings.focus_absolute_map;
JamieB 79:1910ae03cb2e 701 printf("\tSet Focus\n");
JamieB 79:1910ae03cb2e 702 } else if (sscanf(line,"IRIS:%d", &iris_datapoints) == 1) {
JamieB 79:1910ae03cb2e 703 encoder = &UserSettings.iris_encoder_map;
JamieB 79:1910ae03cb2e 704 absolute = &UserSettings.iris_absolute_map;
JamieB 79:1910ae03cb2e 705 printf("\tSet Iris\n");
JamieB 79:1910ae03cb2e 706 } else if (sscanf(line,"ZOOM:%d", &zoom_datapoints) == 1) {
JamieB 79:1910ae03cb2e 707 encoder = &UserSettings.zoom_encoder_map;
JamieB 79:1910ae03cb2e 708 absolute = &UserSettings.zoom_absolute_map;
JamieB 79:1910ae03cb2e 709 printf("\tSet Zoom\n");
JamieB 79:1910ae03cb2e 710 } else if (strchr(line,',') != NULL) {
JamieB 79:1910ae03cb2e 711 pc.printf("\tProbably some data in this line\n");
JamieB 79:1910ae03cb2e 712 int encoder_val;
JamieB 79:1910ae03cb2e 713 float absolute_val;
JamieB 79:1910ae03cb2e 714 char *pt = strtok (line,",");
JamieB 79:1910ae03cb2e 715 if (pt) {
JamieB 79:1910ae03cb2e 716 encoder_val = atoi(pt);
JamieB 79:1910ae03cb2e 717 printf("\tENCODER: %d\n", encoder_val);
JamieB 79:1910ae03cb2e 718 }
JamieB 79:1910ae03cb2e 719 pt = strtok(line, ",");
JamieB 79:1910ae03cb2e 720 if (pt) {
JamieB 79:1910ae03cb2e 721 absolute_val = (float)atof(pt);
JamieB 79:1910ae03cb2e 722 printf("\tABSOLUTE: %f\n", absolute_val);
JamieB 79:1910ae03cb2e 723 }
JamieB 79:1910ae03cb2e 724 if (encoder_val != NULL && absolute_val != NULL) {
JamieB 79:1910ae03cb2e 725 encoder->push_back(encoder_val);
JamieB 79:1910ae03cb2e 726 absolute->push_back(absolute_val);
JamieB 79:1910ae03cb2e 727 printf("\tADDED Datapoint\n");
JamieB 79:1910ae03cb2e 728 }
JamieB 79:1910ae03cb2e 729 } else {
JamieB 79:1910ae03cb2e 730 printf("\tNot Valid matching line\n");
JamieB 79:1910ae03cb2e 731 }
JamieB 79:1910ae03cb2e 732 line[0] = '\0';
JamieB 78:8e1170e18a2d 733 }
JamieB 78:8e1170e18a2d 734 }
JamieB 78:8e1170e18a2d 735 fclose(LensFile);
JamieB 78:8e1170e18a2d 736 free(line);
JamieB 79:1910ae03cb2e 737 } else {
JamieB 78:8e1170e18a2d 738 pc.printf("Unable to open File %s\r\n", filename);
JamieB 78:8e1170e18a2d 739 }
JamieB 78:8e1170e18a2d 740 }
AndyA 0:97661408d0f9 741
JamieB 20:ce1d8fbff68f 742 void readSettingsFile()
JamieB 20:ce1d8fbff68f 743 {
AndyA 34:c864a0c67dbf 744
AndyA 34:c864a0c67dbf 745 UserSettings.FIZmode = formatPreston;
AndyA 34:c864a0c67dbf 746 UserSettings.SerialOutMode = mode_VIPS;
JamieB 42:9653486372a6 747 UserSettings.FreeDPort = 0;
JamieB 73:89f799500055 748 UserSettings.DataOutPort = 0;
JamieB 42:9653486372a6 749 UserSettings.VipsUDPPort = 0;
AndyA 68:9e68287f0ab7 750 UserSettings.SettingsPort = 0;
AndyA 34:c864a0c67dbf 751 UserSettings.IPAddress[0] = 0;
AndyA 34:c864a0c67dbf 752 UserSettings.Gateway[0] = 0;
AndyA 34:c864a0c67dbf 753 UserSettings.Subnet[0] = 0;
AndyA 34:c864a0c67dbf 754 UserSettings.FilterOrder = 0;
AndyA 34:c864a0c67dbf 755 UserSettings.FilterFreq = 10;
AndyA 34:c864a0c67dbf 756 UserSettings.FilterRate = 100;
AndyA 34:c864a0c67dbf 757 UserSettings.FilterXY = false;
AndyA 34:c864a0c67dbf 758 UserSettings.FilterZ = false;
AndyA 34:c864a0c67dbf 759 UserSettings.FilterRoll = false;
AndyA 34:c864a0c67dbf 760 UserSettings.FilterPitch = false;
AndyA 34:c864a0c67dbf 761 UserSettings.FilterYaw = false;
JamieB 46:432d63e8fe64 762 UserSettings.AutoHyperSmooth = true;
AndyA 44:fe7fcf62c75d 763 UserSettings.FlexibleVIPSOut = false;
AndyA 50:d6c56eccf56a 764 UserSettings.SerialTxDelayMS = 0;
AndyA 50:d6c56eccf56a 765 UserSettings.UDPTxDelayMS = 0;
AndyA 50:d6c56eccf56a 766 UserSettings.SerialTxDelayFrame = 0;
AndyA 50:d6c56eccf56a 767 UserSettings.UDPTxDelayFrame = 0;
JamieB 72:da2f1df6a50d 768 UserSettings.InterpolationOffsetFrame = 0;
JamieB 72:da2f1df6a50d 769 UserSettings.InterpolationOffset_uS = 0;
AndyA 51:d4a5151af5af 770 UserSettings.InvertRoll = false;
AndyA 51:d4a5151af5af 771 UserSettings.InvertPitch = false;
AndyA 51:d4a5151af5af 772 UserSettings.InvertYaw = false;
AndyA 55:ee36cab19a58 773 UserSettings.OffsetRoll =0;
AndyA 55:ee36cab19a58 774 UserSettings.OffsetPitch =0;
AndyA 55:ee36cab19a58 775 UserSettings.OffsetYaw =0;
AndyA 52:adbbaadca0a9 776 UserSettings.bypassBaud = 0;
JamieB 60:899862db7f2a 777 UserSettings.ForcePPF = 0;
JamieB 61:e734e86661b0 778 UserSettings.HalfRate = 0;
JamieB 71:7305a35cee58 779 UserSettings.focus_scale= 1;
JamieB 71:7305a35cee58 780 UserSettings.focus_offset = 0;
JamieB 71:7305a35cee58 781 UserSettings.iris_scale = 1;
JamieB 71:7305a35cee58 782 UserSettings.iris_offset = 0;
JamieB 71:7305a35cee58 783 UserSettings.zoom_scale = 1;
JamieB 71:7305a35cee58 784 UserSettings.zoom_offset= 0;
AndyA 51:d4a5151af5af 785
AndyA 68:9e68287f0ab7 786 // LocalFileSystem localFS("local");
JamieB 20:ce1d8fbff68f 787 FILE *LSFile= fopen("/local/settings.txt","r");
JamieB 78:8e1170e18a2d 788 char lineBuffer[128];
JamieB 20:ce1d8fbff68f 789 int valueIn;
AndyA 34:c864a0c67dbf 790 float floatIn;
JamieB 78:8e1170e18a2d 791 char lensfile[128] = "/local/";//7 characters for filepath, minus 12 chars of settings string, hence 128 shouldnt cause buffer overflow
JamieB 78:8e1170e18a2d 792 /*MAXIMUM FILENAME LENGTH IS 8 Characters*/
JamieB 78:8e1170e18a2d 793
JamieB 20:ce1d8fbff68f 794 if (LSFile) {
AndyA 52:adbbaadca0a9 795 while (!feof(LSFile) && !UserSettings.bypassBaud) {
JamieB 78:8e1170e18a2d 796 if (fgets(lineBuffer, 128, LSFile)) {
AndyA 52:adbbaadca0a9 797 if (sscanf(lineBuffer,"RadioConfigPassthrough=%d",&valueIn) == 1) {
AndyA 52:adbbaadca0a9 798 pc.printf("Switching to RADIO/USB bypass mode at %d baud\r\n",valueIn);
AndyA 52:adbbaadca0a9 799 UserSettings.bypassBaud = valueIn;
AndyA 52:adbbaadca0a9 800 }
AndyA 52:adbbaadca0a9 801
JamieB 20:ce1d8fbff68f 802 if (sscanf(lineBuffer,"Output_Format=%d",&valueIn) == 1) {
JamieB 20:ce1d8fbff68f 803 pc.printf("Got Output_Format value from file of %d\r\n",valueIn);
AndyA 22:0dd9c1b5664a 804 UserSettings.SerialOutMode = valueIn;
JamieB 20:ce1d8fbff68f 805 }
JamieB 20:ce1d8fbff68f 806 if (sscanf(lineBuffer,"FIZ_Format=%d",&valueIn) == 1) {
JamieB 20:ce1d8fbff68f 807 pc.printf("Got FIZ_Format value from file of %d\r\n",valueIn);
AndyA 22:0dd9c1b5664a 808 UserSettings.FIZmode = valueIn;
AndyA 22:0dd9c1b5664a 809 }
AndyA 22:0dd9c1b5664a 810 if (sscanf(lineBuffer,"FreeD_Port=%d",&valueIn) == 1) {
AndyA 22:0dd9c1b5664a 811 pc.printf("Got FreeD_Port value from file of %d\r\n",valueIn);
JamieB 42:9653486372a6 812 UserSettings.FreeDPort = valueIn;
JamieB 73:89f799500055 813 UserSettings.DataOutPort = valueIn;
JamieB 73:89f799500055 814 }
JamieB 73:89f799500055 815 if (sscanf(lineBuffer,"FreeD_Mode=%d",&valueIn) == 1) {
JamieB 73:89f799500055 816 pc.printf("Got FreeD_Mode value from file of %d\r\n",valueIn);
JamieB 73:89f799500055 817 UserSettings.FreeDPort = valueIn;
JamieB 73:89f799500055 818 }
JamieB 73:89f799500055 819 if (sscanf(lineBuffer,"DataOut_Port=%d",&valueIn) == 1) {
JamieB 73:89f799500055 820 pc.printf("Got DataOut_Port value from file of %d\r\n",valueIn);
JamieB 73:89f799500055 821 UserSettings.DataOutPort = valueIn;
JamieB 42:9653486372a6 822 }
JamieB 42:9653486372a6 823 if (sscanf(lineBuffer,"VIPS_UDP_Port=%d",&valueIn) == 1) {
JamieB 42:9653486372a6 824 pc.printf("Got VIPS_Port value from file of %d\r\n",valueIn);
JamieB 42:9653486372a6 825 UserSettings.VipsUDPPort = valueIn;
JamieB 20:ce1d8fbff68f 826 }
AndyA 68:9e68287f0ab7 827 if (sscanf(lineBuffer,"Settings_Port=%d",&valueIn) == 1) {
AndyA 68:9e68287f0ab7 828 pc.printf("Got Settings update port value from file of %d\r\n",valueIn);
AndyA 68:9e68287f0ab7 829 UserSettings.SettingsPort = valueIn;
AndyA 68:9e68287f0ab7 830 }
AndyA 23:5c237f04327d 831 if (sscanf(lineBuffer,"IP_addr=%s",UserSettings.IPAddress) == 1) {
AndyA 23:5c237f04327d 832 pc.printf("Got IP_addr value from file of %s\r\n",UserSettings.IPAddress);
AndyA 23:5c237f04327d 833 }
AndyA 23:5c237f04327d 834 if (sscanf(lineBuffer,"Subnet=%s",UserSettings.Subnet) == 1) {
JamieB 25:7002be632308 835 pc.printf("Got Subnet mask value from file of %s\r\n",UserSettings.Subnet);
AndyA 23:5c237f04327d 836 }
JamieB 25:7002be632308 837 if (sscanf(lineBuffer,"Gateway=%s",UserSettings.Gateway) == 1) {
AndyA 23:5c237f04327d 838 pc.printf("Got gateway value from file of %s\r\n",UserSettings.Gateway);
AndyA 23:5c237f04327d 839 }
AndyA 34:c864a0c67dbf 840 if (sscanf(lineBuffer,"FilterOrder=%d",&valueIn) == 1) {
AndyA 34:c864a0c67dbf 841 pc.printf("Got FilterOrder value from file of %d\r\n",valueIn);
AndyA 34:c864a0c67dbf 842 UserSettings.FilterOrder = valueIn;
AndyA 34:c864a0c67dbf 843 }
AndyA 34:c864a0c67dbf 844 if (sscanf(lineBuffer,"FilterFreq=%f",&floatIn) == 1) {
AndyA 34:c864a0c67dbf 845 pc.printf("Got FilterFreq value from file of %.2f\r\n",floatIn);
AndyA 34:c864a0c67dbf 846 UserSettings.FilterFreq = floatIn;
AndyA 34:c864a0c67dbf 847 }
AndyA 34:c864a0c67dbf 848 if (sscanf(lineBuffer,"FilterRate=%f",&floatIn) == 1) {
AndyA 34:c864a0c67dbf 849 pc.printf("Got FilterRate value from file of %.2f\r\n",floatIn);
AndyA 34:c864a0c67dbf 850 UserSettings.FilterRate = floatIn;
AndyA 34:c864a0c67dbf 851 }
AndyA 34:c864a0c67dbf 852 if (sscanf(lineBuffer,"FilterXY=%d",&valueIn) == 1) {
AndyA 34:c864a0c67dbf 853 pc.printf("Got FilterXY value from file of %d\r\n",valueIn);
AndyA 34:c864a0c67dbf 854 UserSettings.FilterXY = (valueIn==1);
AndyA 34:c864a0c67dbf 855 }
AndyA 34:c864a0c67dbf 856 if (sscanf(lineBuffer,"FilterZ=%d",&valueIn) == 1) {
AndyA 34:c864a0c67dbf 857 pc.printf("Got FilterZ value from file of %d\r\n",valueIn);
AndyA 34:c864a0c67dbf 858 UserSettings.FilterZ = (valueIn==1);
AndyA 34:c864a0c67dbf 859 }
AndyA 34:c864a0c67dbf 860 if (sscanf(lineBuffer,"FilterRoll=%d",&valueIn) == 1) {
AndyA 34:c864a0c67dbf 861 pc.printf("Got FilterRoll value from file of %d\r\n",valueIn);
AndyA 34:c864a0c67dbf 862 UserSettings.FilterRoll = (valueIn==1);
AndyA 34:c864a0c67dbf 863 }
AndyA 34:c864a0c67dbf 864 if (sscanf(lineBuffer,"FilterPitch=%d",&valueIn) == 1) {
AndyA 34:c864a0c67dbf 865 pc.printf("Got FilterPitch value from file of %d\r\n",valueIn);
AndyA 34:c864a0c67dbf 866 UserSettings.FilterPitch = (valueIn==1);
AndyA 34:c864a0c67dbf 867 }
AndyA 34:c864a0c67dbf 868 if (sscanf(lineBuffer,"FilterYaw=%d",&valueIn) == 1) {
AndyA 34:c864a0c67dbf 869 pc.printf("Got FilterYaw value from file of %d\r\n",valueIn);
AndyA 34:c864a0c67dbf 870 UserSettings.FilterYaw = (valueIn==1);
AndyA 34:c864a0c67dbf 871 }
JamieB 46:432d63e8fe64 872 if (sscanf(lineBuffer,"AutoHyperSmooth=%d",&valueIn) == 1) {
JamieB 46:432d63e8fe64 873 pc.printf("Got AutoHyperSmooth value from file of %d\r\n",valueIn);
AndyA 56:0d9684c7df36 874 UserSettings.AutoHyperSmooth = (valueIn==1);
JamieB 46:432d63e8fe64 875 }
AndyA 44:fe7fcf62c75d 876 if (sscanf(lineBuffer,"ExtendedOutput=%d",&valueIn) == 1) {
AndyA 44:fe7fcf62c75d 877 pc.printf("Got ExtendedOutput value from file of %d\r\n",valueIn);
JamieB 61:e734e86661b0 878 UserSettings.FlexibleVIPSOut = (valueIn==1);
AndyA 44:fe7fcf62c75d 879 }
AndyA 50:d6c56eccf56a 880 if (sscanf(lineBuffer,"DelaySerial=%f",&floatIn) == 1) {
AndyA 50:d6c56eccf56a 881 pc.printf("Got serial delay value from file of %.2f ms\r\n",floatIn);
AndyA 50:d6c56eccf56a 882 UserSettings.SerialTxDelayMS = floatIn;
AndyA 50:d6c56eccf56a 883 }
AndyA 50:d6c56eccf56a 884 if (sscanf(lineBuffer,"DelaySerialFrame=%f",&floatIn) == 1) {
AndyA 50:d6c56eccf56a 885 pc.printf("Got serial delay value from file of %.2f frames\r\n",floatIn);
AndyA 50:d6c56eccf56a 886 UserSettings.SerialTxDelayFrame = floatIn;
AndyA 50:d6c56eccf56a 887 }
AndyA 50:d6c56eccf56a 888 if (sscanf(lineBuffer,"DelayUDP=%f",&floatIn) == 1) {
AndyA 50:d6c56eccf56a 889 pc.printf("Got UDP delay value from file of %.2f ms\r\n",floatIn);
AndyA 50:d6c56eccf56a 890 UserSettings.UDPTxDelayMS = floatIn;
AndyA 50:d6c56eccf56a 891 }
AndyA 50:d6c56eccf56a 892 if (sscanf(lineBuffer,"DelayUDPFrame=%f",&floatIn) == 1) {
AndyA 50:d6c56eccf56a 893 pc.printf("Got UDP delay value from file of %.2f frames\r\n",floatIn);
AndyA 50:d6c56eccf56a 894 UserSettings.UDPTxDelayFrame = floatIn;
AndyA 50:d6c56eccf56a 895 }
JamieB 72:da2f1df6a50d 896 if (sscanf(lineBuffer,"ShiftInterpolationByFrame=%f",&floatIn) == 1) {
JamieB 72:da2f1df6a50d 897 pc.printf("Got Interpolation Offset %.2f frames\r\n",floatIn);
JamieB 72:da2f1df6a50d 898 UserSettings.InterpolationOffsetFrame = floatIn;
JamieB 72:da2f1df6a50d 899 }
JamieB 72:da2f1df6a50d 900 if (sscanf(lineBuffer,"ShiftInterpolationByTimeMs=%f",&floatIn) == 1) {
JamieB 72:da2f1df6a50d 901 pc.printf("Got Interpolation offset of %.2f ms\r\n",floatIn);
JamieB 72:da2f1df6a50d 902 UserSettings.InterpolationOffset_uS = floatIn * 1000;
JamieB 72:da2f1df6a50d 903 }
AndyA 51:d4a5151af5af 904 if (sscanf(lineBuffer,"InvertRoll=%d",&valueIn) == 1) {
AndyA 51:d4a5151af5af 905 pc.printf("Got InvertRoll value from file of %d\r\n",valueIn);
AndyA 51:d4a5151af5af 906 UserSettings.InvertRoll = (valueIn==1);
AndyA 51:d4a5151af5af 907 }
AndyA 51:d4a5151af5af 908 if (sscanf(lineBuffer,"InvertPitch=%d",&valueIn) == 1) {
AndyA 51:d4a5151af5af 909 pc.printf("Got InvertPitch value from file of %d\r\n",valueIn);
AndyA 51:d4a5151af5af 910 UserSettings.InvertPitch = (valueIn==1);
AndyA 51:d4a5151af5af 911 }
AndyA 51:d4a5151af5af 912 if (sscanf(lineBuffer,"InvertYaw=%d",&valueIn) == 1) {
AndyA 51:d4a5151af5af 913 pc.printf("Got InvertYaw value from file of %d\r\n",valueIn);
AndyA 51:d4a5151af5af 914 UserSettings.InvertYaw = (valueIn==1);
AndyA 51:d4a5151af5af 915 }
AndyA 55:ee36cab19a58 916 if (sscanf(lineBuffer,"OffsetRoll=%d",&valueIn) == 1) {
AndyA 55:ee36cab19a58 917 pc.printf("Got OffsetRoll value from file of %d\r\n",valueIn);
AndyA 56:0d9684c7df36 918 UserSettings.OffsetRoll = valueIn;
AndyA 55:ee36cab19a58 919 }
AndyA 55:ee36cab19a58 920 if (sscanf(lineBuffer,"OffsetPitch=%d",&valueIn) == 1) {
AndyA 55:ee36cab19a58 921 pc.printf("Got OffsetPitch value from file of %d\r\n",valueIn);
AndyA 56:0d9684c7df36 922 UserSettings.OffsetPitch = valueIn;
AndyA 55:ee36cab19a58 923 }
AndyA 55:ee36cab19a58 924 if (sscanf(lineBuffer,"OffsetYaw=%d",&valueIn) == 1) {
AndyA 55:ee36cab19a58 925 pc.printf("Got OffsetYaw value from file of %d\r\n",valueIn);
AndyA 56:0d9684c7df36 926 UserSettings.OffsetYaw = valueIn;
AndyA 55:ee36cab19a58 927 }
JamieB 60:899862db7f2a 928 if (sscanf(lineBuffer,"ForcePPF=%d",&valueIn) == 1) {
JamieB 60:899862db7f2a 929 pc.printf("Using Forced PPF\r\n",valueIn);
JamieB 60:899862db7f2a 930 UserSettings.ForcePPF = valueIn;
JamieB 60:899862db7f2a 931 }
JamieB 61:e734e86661b0 932 if (sscanf(lineBuffer,"HalfSerialRate=%d",&valueIn) == 1) {
JamieB 61:e734e86661b0 933 pc.printf("Halving Serial rate output \r\n",valueIn);
JamieB 61:e734e86661b0 934 UserSettings.HalfRate = valueIn;
JamieB 61:e734e86661b0 935 }
JamieB 71:7305a35cee58 936 if (sscanf(lineBuffer,"FocusScale=%f",&floatIn) == 1) {
JamieB 71:7305a35cee58 937 pc.printf("Got Focus scale of %f \r\n",floatIn);
JamieB 71:7305a35cee58 938 UserSettings.focus_scale = floatIn;
JamieB 71:7305a35cee58 939 }
JamieB 71:7305a35cee58 940 if (sscanf(lineBuffer,"FocusOffset=%f",&floatIn) == 1) {
JamieB 71:7305a35cee58 941 pc.printf("Got Focus offset of %f \r\n",floatIn);
JamieB 71:7305a35cee58 942 UserSettings.focus_offset = floatIn;
JamieB 71:7305a35cee58 943 }
JamieB 71:7305a35cee58 944 if (sscanf(lineBuffer,"IrisScale=%f",&floatIn) == 1) {
JamieB 71:7305a35cee58 945 pc.printf("Got Iris scale of %f \r\n",floatIn);
JamieB 71:7305a35cee58 946 UserSettings.iris_scale = floatIn;
JamieB 71:7305a35cee58 947 }
JamieB 71:7305a35cee58 948 if (sscanf(lineBuffer,"IrisOffset=%f",&floatIn) == 1) {
JamieB 71:7305a35cee58 949 pc.printf("Got Iris offset of %f \r\n",floatIn);
JamieB 71:7305a35cee58 950 UserSettings.iris_offset = floatIn;
JamieB 71:7305a35cee58 951 }
JamieB 71:7305a35cee58 952 if (sscanf(lineBuffer,"ZoomScale=%f",&floatIn) == 1) {
JamieB 71:7305a35cee58 953 pc.printf("Got Zoom Scale of %f \r\n",floatIn);
JamieB 71:7305a35cee58 954 UserSettings.zoom_scale = floatIn;
JamieB 71:7305a35cee58 955 }
JamieB 71:7305a35cee58 956 if (sscanf(lineBuffer,"ZoomOffset=%f",&floatIn) == 1) {
JamieB 71:7305a35cee58 957 pc.printf("Got Zoom offset of %f \r\n",floatIn);
JamieB 71:7305a35cee58 958 UserSettings.zoom_offset = floatIn;
JamieB 71:7305a35cee58 959 }
JamieB 78:8e1170e18a2d 960 if (sscanf(lineBuffer,"LensProfile=%s", &lensfile[7]) == 1) {
JamieB 78:8e1170e18a2d 961 pc.printf("Found filename of %s \r\n", lensfile);
JamieB 78:8e1170e18a2d 962 }
AndyA 55:ee36cab19a58 963
JamieB 20:ce1d8fbff68f 964 }
JamieB 20:ce1d8fbff68f 965 }
JamieB 20:ce1d8fbff68f 966 fclose(LSFile);
JamieB 78:8e1170e18a2d 967 readLensFile(lensfile);
JamieB 20:ce1d8fbff68f 968 } else {
JamieB 20:ce1d8fbff68f 969 pc.printf("No Settings File Found \r\n");
JamieB 20:ce1d8fbff68f 970 }
JamieB 20:ce1d8fbff68f 971 }
JamieB 20:ce1d8fbff68f 972
JamieB 78:8e1170e18a2d 973
AndyA 68:9e68287f0ab7 974 void settingsNetUpdate(void const* netInterface)
AndyA 68:9e68287f0ab7 975 {
JamieB 69:47f800793d00 976 //FILE *LSFile;
JamieB 69:47f800793d00 977 const int rxBufferSize = MaxBuffSize; // making this 1024 causes a crash. Probably out of memory somewhere.
JamieB 69:47f800793d00 978 //char settingsOutBuffer[rxBufferSize];
AndyA 68:9e68287f0ab7 979 char settingsInBuffer[rxBufferSize];
JamieB 69:47f800793d00 980 int bytesToSend = 0;
JamieB 69:47f800793d00 981 unsigned char *bufferToSend;
JamieB 69:47f800793d00 982 bool validated_connection = false;
AndyA 68:9e68287f0ab7 983
AndyA 68:9e68287f0ab7 984 Thread::wait(1000);
JamieB 69:47f800793d00 985 pc.puts("Starting TCP network listen server\r\n");
AndyA 68:9e68287f0ab7 986 Thread::wait(50);
AndyA 68:9e68287f0ab7 987
AndyA 68:9e68287f0ab7 988
JamieB 69:47f800793d00 989 // int fileSize = 0;
AndyA 68:9e68287f0ab7 990 TCPSocketServer server;
AndyA 68:9e68287f0ab7 991 server.bind(UserSettings.SettingsPort);
JamieB 76:c7c795b22f63 992 server.set_blocking(false, 1000);
AndyA 68:9e68287f0ab7 993 server.listen();
AndyA 68:9e68287f0ab7 994
JamieB 76:c7c795b22f63 995 TCPSocketConnection connection;
JamieB 76:c7c795b22f63 996 pc.puts("TCP thread waiting for connection\r\n");
JamieB 76:c7c795b22f63 997
JamieB 76:c7c795b22f63 998 while (!StopTCPListening) {
AndyA 68:9e68287f0ab7 999 server.accept(connection);
JamieB 76:c7c795b22f63 1000 if (connection.is_connected()) {
JamieB 76:c7c795b22f63 1001 pc.puts("TCP Connected\r\n");
JamieB 76:c7c795b22f63 1002 connection.set_blocking(false,50);
JamieB 69:47f800793d00 1003
JamieB 76:c7c795b22f63 1004 int bytesIn = 0;
JamieB 76:c7c795b22f63 1005 do {
JamieB 76:c7c795b22f63 1006 bytesIn = connection.receive(settingsInBuffer,rxBufferSize);
JamieB 76:c7c795b22f63 1007 if (bytesIn > 0) {
JamieB 76:c7c795b22f63 1008 if (!validated_connection) {
JamieB 76:c7c795b22f63 1009 printf("Recieved %d bytes on unvalidated connection\r\n",bytesIn);
JamieB 76:c7c795b22f63 1010 if ((settingsInBuffer[0] == 0x07) &&
JamieB 76:c7c795b22f63 1011 (settingsInBuffer[1] == 0x05) &&
JamieB 76:c7c795b22f63 1012 (settingsInBuffer[2] == 0x02)) {
JamieB 76:c7c795b22f63 1013 validated_connection = true;
JamieB 76:c7c795b22f63 1014 printf("Validated Connection - Sending 'set quiet' command\r\n");
JamieB 76:c7c795b22f63 1015 VIPS.sendQuiet();
JamieB 76:c7c795b22f63 1016 Thread::wait(50);
JamieB 76:c7c795b22f63 1017 VIPS.EnableDirectTX(true);
JamieB 76:c7c795b22f63 1018 GreenLED = LED_ON;
JamieB 76:c7c795b22f63 1019 VIPS.sendDirectTX((unsigned char *)settingsInBuffer, bytesIn);
JamieB 76:c7c795b22f63 1020 printf("Sent first %d bytes to VIPS\r\n",bytesIn); //also a set-quiet command but good to send twice
JamieB 76:c7c795b22f63 1021 } else {
JamieB 76:c7c795b22f63 1022 printf("Invalid: %X %X %X", settingsInBuffer[0], settingsInBuffer[1], settingsInBuffer[2]);
JamieB 76:c7c795b22f63 1023 }
JamieB 76:c7c795b22f63 1024 } else if (validated_connection) {
JamieB 69:47f800793d00 1025 VIPS.sendDirectTX((unsigned char *)settingsInBuffer, bytesIn);
JamieB 76:c7c795b22f63 1026 printf("Sent %d bytes to VIPS\r\n",bytesIn);
JamieB 69:47f800793d00 1027 }
JamieB 76:c7c795b22f63 1028 }
JamieB 76:c7c795b22f63 1029 if (VIPS.getWaitingBuffer(&bufferToSend, &bytesToSend)) {
JamieB 76:c7c795b22f63 1030 connection.send((char *)bufferToSend, bytesToSend);
JamieB 76:c7c795b22f63 1031 printf("Recieved %d bytes from VIPS\r\n",bytesIn);
JamieB 69:47f800793d00 1032 }
JamieB 76:c7c795b22f63 1033 } while (connection.is_connected());
AndyA 68:9e68287f0ab7 1034
JamieB 76:c7c795b22f63 1035 VIPS.EnableDirectTX(false);
JamieB 76:c7c795b22f63 1036 GreenLED = LED_OFF;
JamieB 76:c7c795b22f63 1037 validated_connection = false;
JamieB 76:c7c795b22f63 1038 pc.puts("Disconnected TCP \r\n");
JamieB 76:c7c795b22f63 1039 connection.close();
JamieB 76:c7c795b22f63 1040 Thread::wait(50);
JamieB 76:c7c795b22f63 1041 }
AndyA 68:9e68287f0ab7 1042 }
JamieB 76:c7c795b22f63 1043 VIPS.EnableDirectTX(false);
JamieB 76:c7c795b22f63 1044 GreenLED = LED_OFF;
JamieB 76:c7c795b22f63 1045 pc.puts("Ending TCP Task\r\n");
AndyA 68:9e68287f0ab7 1046 }
AndyA 68:9e68287f0ab7 1047
AndyA 68:9e68287f0ab7 1048
AndyA 32:bfb385d35097 1049 void ethernetTask(void const* settings)
AndyA 32:bfb385d35097 1050 {
AndyA 32:bfb385d35097 1051
AndyA 68:9e68287f0ab7 1052 Thread* ListenTask=NULL;
JamieB 73:89f799500055 1053 UDPSocket* PrimaryDataSocket = NULL;
JamieB 73:89f799500055 1054 Endpoint PrimaryDataTarget;
AndyA 32:bfb385d35097 1055
JamieB 42:9653486372a6 1056 UDPSocket* VIPSSocket = NULL;
JamieB 42:9653486372a6 1057 Endpoint VIPSTarget;
JamieB 42:9653486372a6 1058
AndyA 32:bfb385d35097 1059 UserSettings_t *settingsPtr = (UserSettings_t *) settings;
AndyA 32:bfb385d35097 1060
AndyA 32:bfb385d35097 1061 pc.puts("Ethernet task startup\r\n");
JamieB 73:89f799500055 1062 if (!settingsPtr->DataOutPort && !settingsPtr->VipsUDPPort && !settingsPtr->SettingsPort) {
AndyA 68:9e68287f0ab7 1063 pc.puts("No ports set. Ethernet task exiting\r\n");
AndyA 32:bfb385d35097 1064 return;
AndyA 32:bfb385d35097 1065 }
AndyA 32:bfb385d35097 1066 int Result = -1;
AndyA 32:bfb385d35097 1067 while (Result != 0) {
AndyA 50:d6c56eccf56a 1068 if ((UserSettings.IPAddress[0] != 0) && (UserSettings.Gateway[0] != 0) && (UserSettings.Subnet[0] != 0)) {
AndyA 32:bfb385d35097 1069 pc.puts("Static IP init attempt\r\n");
AndyA 32:bfb385d35097 1070 Result = eth.init(UserSettings.IPAddress, UserSettings.Subnet, UserSettings.Gateway);
AndyA 32:bfb385d35097 1071 } else {
AndyA 32:bfb385d35097 1072 pc.puts("Dynamic IP init attempt\r\n");
AndyA 32:bfb385d35097 1073 Result = eth.init();
AndyA 32:bfb385d35097 1074 }
AndyA 32:bfb385d35097 1075
AndyA 32:bfb385d35097 1076 if (Result) {
AndyA 32:bfb385d35097 1077 pc.puts("Ethernet init failed\r\n");
AndyA 32:bfb385d35097 1078 Thread::wait(500);
AndyA 32:bfb385d35097 1079 }
AndyA 32:bfb385d35097 1080 }
AndyA 32:bfb385d35097 1081 pc.puts("Ethernet init complete\r\n");
AndyA 32:bfb385d35097 1082
AndyA 32:bfb385d35097 1083 while (true) {
AndyA 32:bfb385d35097 1084
AndyA 50:d6c56eccf56a 1085 Result = -1;
AndyA 50:d6c56eccf56a 1086 while (Result != 0) {
AndyA 32:bfb385d35097 1087 Result = eth.connect();
AndyA 32:bfb385d35097 1088 if (Result) {
AndyA 32:bfb385d35097 1089 pc.puts("Ethernet connect failed\r\n");
AndyA 32:bfb385d35097 1090 Thread::wait(500);
AndyA 32:bfb385d35097 1091 }
AndyA 32:bfb385d35097 1092 }
AndyA 32:bfb385d35097 1093 pc.puts("Ethernet connect complete\r\n");
AndyA 68:9e68287f0ab7 1094 Thread::wait(100);
JamieB 69:47f800793d00 1095 printf("IP Address is %s\r\n", eth.getIPAddress());
AndyA 68:9e68287f0ab7 1096 if (ListenTask)
AndyA 68:9e68287f0ab7 1097 delete ListenTask;
AndyA 68:9e68287f0ab7 1098 if (settingsPtr->SettingsPort) {
AndyA 68:9e68287f0ab7 1099 pc.puts("Starting network update task\r\n");
AndyA 68:9e68287f0ab7 1100 Thread::wait(100);
JamieB 76:c7c795b22f63 1101 StopTCPListening = false;
AndyA 68:9e68287f0ab7 1102 ListenTask = new Thread(settingsNetUpdate, NULL, osPriorityHigh, 256 * 4);
AndyA 68:9e68287f0ab7 1103 }
JamieB 73:89f799500055 1104 if (PrimaryDataSocket)
JamieB 73:89f799500055 1105 delete PrimaryDataSocket;
JamieB 73:89f799500055 1106 if (UserSettings.DataOutPort) {
JamieB 73:89f799500055 1107 pc.printf("Starting Primary data socket - %s\r\n", (UserSettings.FreeDPort ? "FreeD Output Mode" : "VIPS Output Mode"));
AndyA 68:9e68287f0ab7 1108 Thread::wait(50);
JamieB 73:89f799500055 1109 PrimaryDataSocket = new UDPSocket();
JamieB 73:89f799500055 1110 PrimaryDataSocket->init();
JamieB 73:89f799500055 1111 PrimaryDataSocket->set_broadcasting(true);
JamieB 73:89f799500055 1112 PrimaryDataTarget.set_address(0xFFFFFFFF, UserSettings.DataOutPort);
JamieB 77:6453dcc202d5 1113 int option = (1);
JamieB 77:6453dcc202d5 1114 int tos_option = (IPTOS_LOWDELAY|IPTOS_THROUGHPUT|IPTOS_PREC_IMMEDIATE);
JamieB 77:6453dcc202d5 1115 // PrimaryDataSocket->get_option(IPPROTO_IP, IP_TOS, &option, sizeof(option))
JamieB 77:6453dcc202d5 1116 // pc.printf("Socket IPTOS Option: %d\r\n", option);
JamieB 77:6453dcc202d5 1117 PrimaryDataSocket->set_option(IPPROTO_IP, IP_TOS, &tos_option, sizeof(option));
JamieB 77:6453dcc202d5 1118 // PrimaryDataSocket->set_option(IPPROTO_TCP, TCP_NODELAY, &option, sizeof(option));
JamieB 77:6453dcc202d5 1119 // PrimaryDataSocket->set_option(SOL_SOCKET, SO_NO_CHECK, &option, sizeof(option));
JamieB 79:1910ae03cb2e 1120
AndyA 47:8d577dfb7eb1 1121 }
AndyA 32:bfb385d35097 1122
JamieB 42:9653486372a6 1123 if (VIPSSocket)
JamieB 42:9653486372a6 1124 delete VIPSSocket;
AndyA 47:8d577dfb7eb1 1125 if (UserSettings.VipsUDPPort) {
AndyA 68:9e68287f0ab7 1126 pc.puts("Starting VIPS socket\r\n");
AndyA 68:9e68287f0ab7 1127 Thread::wait(50);
AndyA 47:8d577dfb7eb1 1128 VIPSSocket = new UDPSocket();
AndyA 47:8d577dfb7eb1 1129 VIPSSocket->init();
AndyA 47:8d577dfb7eb1 1130 VIPSSocket->set_broadcasting(true);
AndyA 47:8d577dfb7eb1 1131 VIPSTarget.set_address(0xFFFFFFFF, UserSettings.VipsUDPPort);
AndyA 47:8d577dfb7eb1 1132 }
JamieB 58:8cce8fcc765f 1133 EthernetTimer.reset();
JamieB 58:8cce8fcc765f 1134 EthernetTimer.start();
AndyA 68:9e68287f0ab7 1135 pc.puts("Network ready for TX\r\n");
AndyA 68:9e68287f0ab7 1136 Thread::wait(50);
AndyA 32:bfb385d35097 1137 while (true) {
AndyA 32:bfb385d35097 1138 if (EthTxNow) {
JamieB 58:8cce8fcc765f 1139 // NewData.lock();
AndyA 32:bfb385d35097 1140 EthTxNow = false;
JamieB 73:89f799500055 1141 if (!PrimaryDataSocket && UserSettings.DataOutPort) {
JamieB 42:9653486372a6 1142 pc.puts("No FreeD UDP socket\r\n");
JamieB 42:9653486372a6 1143 break;
JamieB 42:9653486372a6 1144 }
JamieB 42:9653486372a6 1145 if (!VIPSSocket && UserSettings.VipsUDPPort) {
JamieB 42:9653486372a6 1146 pc.puts("No VIPS UDP socket\r\n");
AndyA 32:bfb385d35097 1147 break;
AndyA 32:bfb385d35097 1148 }
JamieB 73:89f799500055 1149 if (PrimaryDataSocket) {
JamieB 73:89f799500055 1150 if (UserSettings.FreeDPort)
JamieB 73:89f799500055 1151 Result = PrimaryDataSocket->sendTo(PrimaryDataTarget,(char *)&fdPacket, sizeof(struct D1MsgFormat_s));
JamieB 73:89f799500055 1152 else
JamieB 73:89f799500055 1153 Result = PrimaryDataSocket->sendTo(PrimaryDataTarget,(char *)FlexibleVIPSOut, VIPSOutSize);
JamieB 58:8cce8fcc765f 1154 //uint32_t ethtime = EthernetTimer.read_us();
JamieB 58:8cce8fcc765f 1155 //EthernetTimer.reset();
JamieB 73:89f799500055 1156 int expected_size = UserSettings.FreeDPort ? sizeof(struct D1MsgFormat_s) : VIPSOutSize;
JamieB 73:89f799500055 1157 if (Result != expected_size) {
JamieB 73:89f799500055 1158 pc.puts("Primary Port UDP Tx Failed!\r\n");
AndyA 47:8d577dfb7eb1 1159 break;
JamieB 58:8cce8fcc765f 1160 } //else
JamieB 58:8cce8fcc765f 1161 //pc.printf("%d\r\n", ethtime);
JamieB 42:9653486372a6 1162 }
AndyA 47:8d577dfb7eb1 1163 if (VIPSSocket) {
AndyA 47:8d577dfb7eb1 1164 Result = VIPSSocket->sendTo(VIPSTarget,(char *)FlexibleVIPSOut, VIPSOutSize);
AndyA 47:8d577dfb7eb1 1165 if (Result != VIPSOutSize) {
AndyA 47:8d577dfb7eb1 1166 pc.puts("VIPS UDP Tx Failed!\r\n");
AndyA 47:8d577dfb7eb1 1167 break;
AndyA 47:8d577dfb7eb1 1168 }
AndyA 32:bfb385d35097 1169 }
AndyA 32:bfb385d35097 1170 // pc.puts("UDP Tx\r\n");
AndyA 32:bfb385d35097 1171 } else
JamieB 58:8cce8fcc765f 1172 // NewData.unlock();
JamieB 58:8cce8fcc765f 1173 Thread::wait(1);
AndyA 32:bfb385d35097 1174 }
JamieB 76:c7c795b22f63 1175 StopTCPListening = true;
JamieB 76:c7c795b22f63 1176 Thread::wait(1);
JamieB 76:c7c795b22f63 1177
JamieB 76:c7c795b22f63 1178 while (ListenTask->get_state()) {
JamieB 76:c7c795b22f63 1179 Thread::wait(50);
JamieB 76:c7c795b22f63 1180 }
JamieB 76:c7c795b22f63 1181 // int ListenState = ListenTask->get_state();
JamieB 76:c7c795b22f63 1182 // pc.printf("Listen State: %d\r\n", ListenState);
JamieB 76:c7c795b22f63 1183
AndyA 32:bfb385d35097 1184 eth.disconnect();
AndyA 32:bfb385d35097 1185 pc.puts("Attempting to restart network\r\n");
AndyA 32:bfb385d35097 1186 }
AndyA 32:bfb385d35097 1187 pc.puts("Eth Task ending. Should never happen!\r\n");
AndyA 32:bfb385d35097 1188 }
AndyA 32:bfb385d35097 1189
AndyA 32:bfb385d35097 1190
AndyA 52:adbbaadca0a9 1191 void XBEEBypassmode(int baud)
AndyA 52:adbbaadca0a9 1192 {
AndyA 52:adbbaadca0a9 1193 pc.baud(baud);
AndyA 52:adbbaadca0a9 1194
AndyA 55:ee36cab19a58 1195 /*
AndyA 55:ee36cab19a58 1196 COM1.baud(9600);
AndyA 55:ee36cab19a58 1197 COM1.puts("+++");
AndyA 55:ee36cab19a58 1198 wait(1.2);
AndyA 55:ee36cab19a58 1199 switch (baud) {
AndyA 55:ee36cab19a58 1200 case 1200:
AndyA 55:ee36cab19a58 1201 COM1.puts("ATBD0\n");
AndyA 55:ee36cab19a58 1202 break;
AndyA 55:ee36cab19a58 1203 case 2400:
AndyA 55:ee36cab19a58 1204 COM1.puts("ATBD1\n");
AndyA 55:ee36cab19a58 1205 break;
AndyA 55:ee36cab19a58 1206 case 4800:
AndyA 55:ee36cab19a58 1207 COM1.puts("ATBD2\n");
AndyA 55:ee36cab19a58 1208 break;
AndyA 55:ee36cab19a58 1209 case 9600:
AndyA 55:ee36cab19a58 1210 COM1.puts("ATBD3\n");
AndyA 55:ee36cab19a58 1211 break;
AndyA 55:ee36cab19a58 1212 case 19200:
AndyA 55:ee36cab19a58 1213 COM1.puts("ATBD4\n");
AndyA 55:ee36cab19a58 1214 break;
AndyA 55:ee36cab19a58 1215 case 38400:
AndyA 55:ee36cab19a58 1216 COM1.puts("ATBD5\n");
AndyA 55:ee36cab19a58 1217 break;
AndyA 55:ee36cab19a58 1218 case 57600:
AndyA 55:ee36cab19a58 1219 COM1.puts("ATBD6\n");
AndyA 55:ee36cab19a58 1220 break;
AndyA 55:ee36cab19a58 1221 case 115200:
AndyA 55:ee36cab19a58 1222 COM1.puts("ATBD7\n");
AndyA 55:ee36cab19a58 1223 break;
AndyA 55:ee36cab19a58 1224 default:
AndyA 55:ee36cab19a58 1225 COM1.printf("ATBD%d\n",baud);
AndyA 55:ee36cab19a58 1226 break;
AndyA 55:ee36cab19a58 1227 }
AndyA 52:adbbaadca0a9 1228
AndyA 55:ee36cab19a58 1229 wait(0.1);
AndyA 55:ee36cab19a58 1230 COM1.puts("ATCN\n");
AndyA 55:ee36cab19a58 1231 wait(0.5);
AndyA 55:ee36cab19a58 1232 */
AndyA 52:adbbaadca0a9 1233
AndyA 52:adbbaadca0a9 1234 COM1.baud(baud);
AndyA 52:adbbaadca0a9 1235 while (true) {
AndyA 52:adbbaadca0a9 1236 if (pc.readable()) {
AndyA 52:adbbaadca0a9 1237 char commandIn = pc.getc();
AndyA 52:adbbaadca0a9 1238 COM1.putc(commandIn);
AndyA 52:adbbaadca0a9 1239 }
AndyA 52:adbbaadca0a9 1240 if (COM1.readable())
AndyA 52:adbbaadca0a9 1241 pc.putc(COM1.getc());
AndyA 52:adbbaadca0a9 1242 }
AndyA 52:adbbaadca0a9 1243 }
JamieB 20:ce1d8fbff68f 1244
AndyA 1:dd1f7e162f91 1245 int main()
AndyA 1:dd1f7e162f91 1246 {
AndyA 1:dd1f7e162f91 1247 pc.baud(115200);
JamieB 41:a3556d765635 1248 pc.printf("\r\n\r\nStartup - v%.2f\r\n", APP_VERSION); //Change via Line 1
JamieB 27:498cce52fe5f 1249 setRED();
AndyA 22:0dd9c1b5664a 1250
JamieB 20:ce1d8fbff68f 1251 readSettingsFile();
AndyA 22:0dd9c1b5664a 1252
AndyA 52:adbbaadca0a9 1253 if (UserSettings.bypassBaud) {
AndyA 52:adbbaadca0a9 1254 XBEEBypassmode(UserSettings.bypassBaud);
AndyA 52:adbbaadca0a9 1255 }
AndyA 52:adbbaadca0a9 1256
AndyA 22:0dd9c1b5664a 1257 switch(UserSettings.FIZmode) {
JamieB 21:0dec6dd14e10 1258 case formatPreston :
JamieB 21:0dec6dd14e10 1259 FIZPort = new FIZDisney(p9, p10);
JamieB 26:7f66ac76cd5d 1260 pc.printf("Set Preston");
JamieB 26:7f66ac76cd5d 1261 break;
JamieB 21:0dec6dd14e10 1262 case formatFujiPassive :
JamieB 21:0dec6dd14e10 1263 FIZPort = new FIZDigiPower(p9, p10);
JamieB 26:7f66ac76cd5d 1264 pc.printf("Set FujiPassive");
JamieB 26:7f66ac76cd5d 1265 break;
JamieB 21:0dec6dd14e10 1266 case formatFujiActive :
JamieB 21:0dec6dd14e10 1267 FIZPort = new FIZDigiPowerActive(p9, p10);
JamieB 26:7f66ac76cd5d 1268 pc.printf("Set FujiActive\r\n");
JamieB 26:7f66ac76cd5d 1269 break;
JamieB 29:b0eaeefa4e63 1270 case formatCanon :
JamieB 29:b0eaeefa4e63 1271 FIZPort = new FIZCanon(p9, p10);
JamieB 29:b0eaeefa4e63 1272 pc.printf("Set Canon\r\n");
JamieB 29:b0eaeefa4e63 1273 break;
AndyA 68:9e68287f0ab7 1274 case formatArri:
AndyA 62:dcb92159ac8e 1275 FIZPort = new FIZ_ArriCmotion(p9, p10);
AndyA 62:dcb92159ac8e 1276 pc.printf("Set Arri\r\n");
AndyA 62:dcb92159ac8e 1277 break;
JamieB 21:0dec6dd14e10 1278 default:
JamieB 21:0dec6dd14e10 1279 FIZPort = new FIZDisney(p9, p10); //preston
JamieB 26:7f66ac76cd5d 1280 pc.printf("Set Default - Preston");
AndyA 62:dcb92159ac8e 1281
JamieB 21:0dec6dd14e10 1282 }
JamieB 26:7f66ac76cd5d 1283 // FIZPort = new FIZDigiPowerActive(p9, p10);
AndyA 52:adbbaadca0a9 1284 COM1.baud(115200); // radio port
AndyA 22:0dd9c1b5664a 1285
AndyA 68:9e68287f0ab7 1286 Thread ethernetThread(ethernetTask, &UserSettings, osPriorityHigh, 256 * 4);
AndyA 14:76083dc18b0d 1287 led1 = 0;
AndyA 1:dd1f7e162f91 1288 inputTimer.reset();
AndyA 1:dd1f7e162f91 1289 inputTimer.start();
AndyA 0:97661408d0f9 1290
AndyA 1:dd1f7e162f91 1291 prepPacketOut();
AndyA 3:14d241e29be3 1292
AndyA 9:7214e3c3e5f8 1293 LTCInput.enable(true);
AndyA 3:14d241e29be3 1294
AndyA 35:7ecf25d9c414 1295 if (!VIPS.setFilters(&UserSettings))
AndyA 35:7ecf25d9c414 1296 pc.puts("Failed to create VIPS filters\r\n");
AndyA 44:fe7fcf62c75d 1297
AndyA 1:dd1f7e162f91 1298 VIPS.run();
AndyA 1:dd1f7e162f91 1299
AndyA 14:76083dc18b0d 1300 pc.printf("System init complete\r\n");
JamieB 27:498cce52fe5f 1301 setBLUE();
AndyA 16:a8d3a0dbe4bf 1302 COM1.attach(&onOutputSerialRx);
AndyA 0:97661408d0f9 1303
AndyA 1:dd1f7e162f91 1304 TimeSinceLastFrame.reset();
AndyA 1:dd1f7e162f91 1305 TimeSinceLastFrame.start();
AndyA 9:7214e3c3e5f8 1306
JamieB 27:498cce52fe5f 1307
AndyA 9:7214e3c3e5f8 1308 pc.printf("Waiting for sync input clock\r\n");
AndyA 16:a8d3a0dbe4bf 1309
AndyA 15:830fc953edd9 1310 #ifdef enableFakePPF
JamieB 60:899862db7f2a 1311 FakePPF.attach(callback(&OnPPFInputStartup),1/50.0);
AndyA 15:830fc953edd9 1312 #endif
AndyA 16:a8d3a0dbe4bf 1313
AndyA 9:7214e3c3e5f8 1314 PPFin.rise(callback(&OnPPFInputStartup));
AndyA 9:7214e3c3e5f8 1315 Syncin.rise(callback(&OnSyncInputStartup));
AndyA 9:7214e3c3e5f8 1316 framesIn = 0;
AndyA 9:7214e3c3e5f8 1317 SyncInCount = 0;
AndyA 9:7214e3c3e5f8 1318 bool LockToSync = false;
AndyA 9:7214e3c3e5f8 1319
AndyA 1:dd1f7e162f91 1320 while (true) {
AndyA 10:053bac3e326b 1321 if (SyncInCount == 100) {
AndyA 10:053bac3e326b 1322 LockToSync= true;
AndyA 9:7214e3c3e5f8 1323 break;
AndyA 9:7214e3c3e5f8 1324 }
AndyA 14:76083dc18b0d 1325 if ((framesIn == 100) && (SyncInCount<45)) { // prefer frame sync
AndyA 9:7214e3c3e5f8 1326 break;
AndyA 9:7214e3c3e5f8 1327 }
AndyA 9:7214e3c3e5f8 1328 }
AndyA 1:dd1f7e162f91 1329
JamieB 60:899862db7f2a 1330 if (LockToSync && !UserSettings.ForcePPF) {
AndyA 9:7214e3c3e5f8 1331 pc.printf("Using Genlock sync input\r\n");
AndyA 9:7214e3c3e5f8 1332 Syncin.rise(callback(&OnPPFInputStartup));
AndyA 9:7214e3c3e5f8 1333 PPFin.rise(NULL);
AndyA 9:7214e3c3e5f8 1334 } else {
AndyA 9:7214e3c3e5f8 1335 pc.printf("Using pulse per frame input\r\n");
AndyA 9:7214e3c3e5f8 1336 Syncin.rise(NULL);
AndyA 9:7214e3c3e5f8 1337 }
AndyA 9:7214e3c3e5f8 1338
JamieB 27:498cce52fe5f 1339 setGREEN();
AndyA 9:7214e3c3e5f8 1340 pc.printf("Measuring frame rate\r\n");
AndyA 0:97661408d0f9 1341
AndyA 9:7214e3c3e5f8 1342 int currentFrames = framesIn;
AndyA 9:7214e3c3e5f8 1343 while (framesIn == currentFrames); // wait for next frame;
AndyA 9:7214e3c3e5f8 1344 inputTimer.reset();
AndyA 9:7214e3c3e5f8 1345 framesIn = 0;
AndyA 9:7214e3c3e5f8 1346
AndyA 10:053bac3e326b 1347
AndyA 9:7214e3c3e5f8 1348 while (framesIn < 100); // wait for 100 frames;
AndyA 9:7214e3c3e5f8 1349 uint32_t frameTime = inputTimer.read_us()/100;
AndyA 9:7214e3c3e5f8 1350
AndyA 9:7214e3c3e5f8 1351 int framesPerSecond = frameRates::getClosestRate(frameTime);
AndyA 9:7214e3c3e5f8 1352
AndyA 9:7214e3c3e5f8 1353 pc.printf("Detected frame rate %d\r\n",framesPerSecond);
AndyA 50:d6c56eccf56a 1354 if (UserSettings.SerialTxDelayFrame != 0) {
AndyA 50:d6c56eccf56a 1355 UserSettings.SerialTxDelayMS = (UserSettings.SerialTxDelayFrame*1000)/framesPerSecond;
AndyA 50:d6c56eccf56a 1356 pc.printf("Serial delay of %.2f frames calculated as %.2f ms\r\n",UserSettings.SerialTxDelayFrame,UserSettings.SerialTxDelayMS);
AndyA 50:d6c56eccf56a 1357 }
AndyA 50:d6c56eccf56a 1358 if (UserSettings.UDPTxDelayFrame != 0) {
AndyA 50:d6c56eccf56a 1359 UserSettings.UDPTxDelayMS = (UserSettings.UDPTxDelayFrame*1000)/framesPerSecond;
AndyA 50:d6c56eccf56a 1360 pc.printf("Serial delay of %.2f frames calculated as %.2f ms\r\n",UserSettings.UDPTxDelayFrame,UserSettings.UDPTxDelayMS);
AndyA 50:d6c56eccf56a 1361 }
JamieB 72:da2f1df6a50d 1362 if (UserSettings.InterpolationOffsetFrame != 0) {
JamieB 72:da2f1df6a50d 1363 UserSettings.InterpolationOffset_uS = (UserSettings.InterpolationOffsetFrame*1000000)/framesPerSecond;
JamieB 72:da2f1df6a50d 1364 pc.printf("Interpolation Delay of %.2f frames calculated as %.2f ms\r\n", UserSettings.InterpolationOffsetFrame,UserSettings.InterpolationOffset_uS);
JamieB 72:da2f1df6a50d 1365 }
AndyA 1:dd1f7e162f91 1366
AndyA 9:7214e3c3e5f8 1367 if (LTCInput.synced()) { // getting LTC so set the clock.
AndyA 9:7214e3c3e5f8 1368 currentFrames = framesIn;
AndyA 9:7214e3c3e5f8 1369 while (framesIn == currentFrames); // wait for next frame;
AndyA 9:7214e3c3e5f8 1370 wait_us (frameTime/4); // ensure the LTC decode for the last frame is done.
AndyA 9:7214e3c3e5f8 1371 int hour,minute,second,frame;
AndyA 9:7214e3c3e5f8 1372 bool drop = LTCInput.isFrameDrop();
AndyA 9:7214e3c3e5f8 1373 LTCInput.getTime(&hour,&minute,&second,&frame);
AndyA 9:7214e3c3e5f8 1374 movieTime.setMode(framesPerSecond,drop);
AndyA 14:76083dc18b0d 1375 movieTime.setTime(hour,minute,second,frame);
AndyA 9:7214e3c3e5f8 1376 } else { // no time code so clock time doesn't matter
AndyA 9:7214e3c3e5f8 1377 movieTime.setMode(framesPerSecond,false);
AndyA 9:7214e3c3e5f8 1378 }
AndyA 9:7214e3c3e5f8 1379
AndyA 9:7214e3c3e5f8 1380 if (LockToSync)
AndyA 9:7214e3c3e5f8 1381 Syncin.rise(callback(&OnPPFInput));
AndyA 9:7214e3c3e5f8 1382 else
AndyA 9:7214e3c3e5f8 1383 PPFin.rise(callback(&OnPPFInput));
AndyA 9:7214e3c3e5f8 1384
AndyA 15:830fc953edd9 1385 #ifdef enableFakePPF
JamieB 60:899862db7f2a 1386 FakePPF.attach(callback(&OnPPFInput),1/50.0);
AndyA 15:830fc953edd9 1387 #endif
AndyA 15:830fc953edd9 1388
AndyA 9:7214e3c3e5f8 1389 pc.printf("Current time is %02d:%02d:%02d %02d\r\n",movieTime.hours(),movieTime.minutes(),movieTime.seconds(),movieTime.frame());
AndyA 9:7214e3c3e5f8 1390 LTCInput.enable(false);
JamieB 27:498cce52fe5f 1391 setOFF();
AndyA 9:7214e3c3e5f8 1392
AndyA 9:7214e3c3e5f8 1393 pc.printf("Running\r\n",framesPerSecond);
AndyA 9:7214e3c3e5f8 1394
AndyA 14:76083dc18b0d 1395
AndyA 9:7214e3c3e5f8 1396 getNextFileNumber();
AndyA 16:a8d3a0dbe4bf 1397 COM1.attach(callback(onOutputSerialRx));
AndyA 9:7214e3c3e5f8 1398
JamieB 27:498cce52fe5f 1399
AndyA 9:7214e3c3e5f8 1400 while (true) {
AndyA 9:7214e3c3e5f8 1401 if (NewFramePulse) { // New frame. Output data.
AndyA 9:7214e3c3e5f8 1402 //framePulse(FramePulseTime);
AndyA 15:830fc953edd9 1403 NewFramePulse = false;
AndyA 9:7214e3c3e5f8 1404 framePositionOutput();
AndyA 9:7214e3c3e5f8 1405 }
AndyA 18:ad407a2ed4c9 1406 VIPS.sendQueued(); // should ideally be called on 100Hz PPS edge but we don't have that in this code...
AndyA 9:7214e3c3e5f8 1407
AndyA 9:7214e3c3e5f8 1408 if (logButtonLastState != logButton) {
AndyA 15:830fc953edd9 1409 logButtonLastState = logButton;
AndyA 15:830fc953edd9 1410 if (logButtonLastState) { // pressed
AndyA 9:7214e3c3e5f8 1411 logButtonDownTime = inputTimer.read();
AndyA 15:830fc953edd9 1412 if ((logButtonDownTime - logButtonUpTime) > 0.2f) {
JamieB 76:c7c795b22f63 1413 // pc.puts("Down\r\n");
JamieB 76:c7c795b22f63 1414 resetTimeout.attach(callback(&OnResetTimeout),5);
AndyA 15:830fc953edd9 1415 if (logging) {
AndyA 15:830fc953edd9 1416 // pc.puts("Logging off\r\n");
AndyA 15:830fc953edd9 1417 GreenLED = LED_OFF;
AndyA 15:830fc953edd9 1418 logging=false;
AndyA 15:830fc953edd9 1419 fclose(logFile);
AndyA 15:830fc953edd9 1420 } else {
AndyA 15:830fc953edd9 1421 logFile = nextBinaryFile();
AndyA 15:830fc953edd9 1422 if(logFile) {
AndyA 15:830fc953edd9 1423 // pc.puts("Logging on\r\n");
AndyA 15:830fc953edd9 1424 GreenLED = LED_ON;
AndyA 15:830fc953edd9 1425 logging = true;
AndyA 15:830fc953edd9 1426 }
AndyA 15:830fc953edd9 1427 //else pc.puts("Logging failed\r\n");
AndyA 9:7214e3c3e5f8 1428 }
AndyA 1:dd1f7e162f91 1429 }
AndyA 9:7214e3c3e5f8 1430 } else { // released
AndyA 9:7214e3c3e5f8 1431 logButtonUpTime = inputTimer.read();
JamieB 76:c7c795b22f63 1432 resetTimeout.attach(NULL,0);
AndyA 15:830fc953edd9 1433 if ((logButtonUpTime-logButtonDownTime) > 0.05f) {
AndyA 15:830fc953edd9 1434 // pc.puts("Up\r\n");
AndyA 15:830fc953edd9 1435 }
AndyA 1:dd1f7e162f91 1436 }
AndyA 0:97661408d0f9 1437 }
AndyA 9:7214e3c3e5f8 1438 }
AndyA 0:97661408d0f9 1439 }