Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: BufferedSerial FatFileSystemCpp mbed
main.cpp@79:1910ae03cb2e, 2022-12-15 (annotated)
- 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?
| User | Revision | Line number | New 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 | } |