Template for LPC1768
Dependencies: Gimbal MLX90620 Socket lwip-eth lwip-sys lwip mbed-rtos mbed
Fork of EkkoEye by
main.cpp@54:aaf6b5ceedd8, 2016-04-14 (annotated)
- Committer:
- gardnmc
- Date:
- Thu Apr 14 13:02:29 2016 +0000
- Revision:
- 54:aaf6b5ceedd8
- Parent:
- 53:72f350a6d09c
libs
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
gardnmc | 52:53b1625b8035 | 1 | #include "mbed.h" |
gardnmc | 52:53b1625b8035 | 2 | #include "EthernetInterface.h" |
Mike | 53:72f350a6d09c | 3 | #include "CMLX90620.h" |
Mike | 53:72f350a6d09c | 4 | #include "base.h" |
Mike | 53:72f350a6d09c | 5 | #include <string.h> |
Mike | 53:72f350a6d09c | 6 | #include <time.h> |
Mike | 53:72f350a6d09c | 7 | #define MAX_CHARS 1024 |
Mike | 53:72f350a6d09c | 8 | Serial pc(USBTX, USBRX); |
Mike | 53:72f350a6d09c | 9 | Ticker Pulser; |
Mike | 53:72f350a6d09c | 10 | |
Mike | 53:72f350a6d09c | 11 | /* |
Mike | 53:72f350a6d09c | 12 | DigitalOut xStep(LED1); |
Mike | 53:72f350a6d09c | 13 | DigitalOut xDir(LED2); |
Mike | 53:72f350a6d09c | 14 | DigitalOut yStep(LED3); |
Mike | 53:72f350a6d09c | 15 | DigitalOut yDir(LED4); |
Mike | 53:72f350a6d09c | 16 | DigitalIn xStop(p20); |
Mike | 53:72f350a6d09c | 17 | DigitalOut laser(p11); |
Mike | 53:72f350a6d09c | 18 | */ |
Mike | 53:72f350a6d09c | 19 | |
Mike | 53:72f350a6d09c | 20 | DigitalOut xStep(p14); |
Mike | 53:72f350a6d09c | 21 | DigitalOut xDir(p26); |
Mike | 53:72f350a6d09c | 22 | DigitalOut yStep(p6); |
Mike | 53:72f350a6d09c | 23 | DigitalOut yDir(p5); |
Mike | 53:72f350a6d09c | 24 | DigitalOut enable(p22); |
Mike | 53:72f350a6d09c | 25 | DigitalOut newenable(p25); |
Mike | 53:72f350a6d09c | 26 | DigitalOut laser(p20); |
Mike | 53:72f350a6d09c | 27 | DigitalIn xHome(p15); |
Mike | 53:72f350a6d09c | 28 | DigitalIn yHome(p13); |
Mike | 53:72f350a6d09c | 29 | |
Mike | 53:72f350a6d09c | 30 | // DigitalIn m0X(p19); // Must be set to float to achieve some micro-step values |
Mike | 53:72f350a6d09c | 31 | DigitalOut m1X(p18); |
Mike | 53:72f350a6d09c | 32 | DigitalOut m0X(p19); |
Mike | 53:72f350a6d09c | 33 | |
Mike | 53:72f350a6d09c | 34 | //DigitalIn m0Y(p8); // Must be set to float to achieve some micro-step values |
Mike | 53:72f350a6d09c | 35 | DigitalOut m1Y(p11); |
Mike | 53:72f350a6d09c | 36 | DigitalOut m0Y(p8); |
Mike | 53:72f350a6d09c | 37 | |
Mike | 53:72f350a6d09c | 38 | |
Mike | 53:72f350a6d09c | 39 | char* EEbuf = new char[256]; // buffer for contents of EEPROM |
Mike | 53:72f350a6d09c | 40 | char* RamCmmd = new char[8]; // holds / sends MLX90620 RAM commands |
Mike | 53:72f350a6d09c | 41 | char* RamBuf = new char[128]; // 0x3f words, values are 'unsigned short' |
Mike | 53:72f350a6d09c | 42 | float Ta = 0.0; // Ambient temperature from MLX |
Mike | 53:72f350a6d09c | 43 | float TempPxl = 0.0; // Interim measure for use with centre pixel of 16x4 MLX array |
Mike | 53:72f350a6d09c | 44 | int mgTick=0; // Used as a general reference by core Timer ISR |
Mike | 53:72f350a6d09c | 45 | MLX90620 mlx(p9, p10, "mlx"); // Constructor for mlx class |
Mike | 53:72f350a6d09c | 46 | ROTATION rotn; // Structure for x and y rotation values |
Mike | 53:72f350a6d09c | 47 | |
Mike | 53:72f350a6d09c | 48 | CGimbal gimbal(&xStep, &xDir, &yStep, &yDir); // Constructor for gimbal |
Mike | 53:72f350a6d09c | 49 | CGimbal * pGimbal=NULL; // Pointer to gimbal class for easing argument passing |
Mike | 53:72f350a6d09c | 50 | |
Mike | 53:72f350a6d09c | 51 | |
Mike | 53:72f350a6d09c | 52 | |
gardnmc | 52:53b1625b8035 | 53 | int main() { |
Mike | 53:72f350a6d09c | 54 | |
Mike | 53:72f350a6d09c | 55 | char cmd; |
Mike | 53:72f350a6d09c | 56 | int timeout=1200; |
Mike | 53:72f350a6d09c | 57 | |
Mike | 53:72f350a6d09c | 58 | init(); |
Mike | 53:72f350a6d09c | 59 | pc.printf("Initialising Network...\r\n"); |
gardnmc | 52:53b1625b8035 | 60 | EthernetInterface eth; |
gardnmc | 52:53b1625b8035 | 61 | eth.init(); //Use DHCP |
gardnmc | 52:53b1625b8035 | 62 | eth.connect(); |
gardnmc | 52:53b1625b8035 | 63 | |
Mike | 53:72f350a6d09c | 64 | pc.printf("IP Address is %s\r\n", eth.getIPAddress()); |
Mike | 53:72f350a6d09c | 65 | |
Mike | 53:72f350a6d09c | 66 | while (1) |
Mike | 53:72f350a6d09c | 67 | { |
Mike | 53:72f350a6d09c | 68 | cmd = handleSerial(); // Checks for any input from user and returns single char command token |
Mike | 53:72f350a6d09c | 69 | switch(cmd) |
Mike | 53:72f350a6d09c | 70 | { |
Mike | 53:72f350a6d09c | 71 | case 'G' : // Hand over to server |
Mike | 53:72f350a6d09c | 72 | case 'g' : |
Mike | 53:72f350a6d09c | 73 | ServerLoop(); |
Mike | 53:72f350a6d09c | 74 | break; |
Mike | 53:72f350a6d09c | 75 | |
Mike | 53:72f350a6d09c | 76 | case 'h' : // Go to Home position |
Mike | 53:72f350a6d09c | 77 | case 'H' : |
Mike | 53:72f350a6d09c | 78 | enable.write(1); |
Mike | 53:72f350a6d09c | 79 | pGimbal->Home(); |
Mike | 53:72f350a6d09c | 80 | enable.write(0); |
Mike | 53:72f350a6d09c | 81 | break; |
Mike | 53:72f350a6d09c | 82 | |
Mike | 53:72f350a6d09c | 83 | case 'L' : // Laser ON |
Mike | 53:72f350a6d09c | 84 | laser = ON; |
Mike | 53:72f350a6d09c | 85 | pc.printf("Laser ON\r\n"); |
Mike | 53:72f350a6d09c | 86 | break; |
Mike | 53:72f350a6d09c | 87 | |
Mike | 53:72f350a6d09c | 88 | case 'l' : // Laser OFF |
Mike | 53:72f350a6d09c | 89 | laser = OFF; |
Mike | 53:72f350a6d09c | 90 | pc.printf("Laser OFF\r\n"); |
Mike | 53:72f350a6d09c | 91 | break; |
Mike | 53:72f350a6d09c | 92 | |
Mike | 53:72f350a6d09c | 93 | case 'm' : // Perform a meander-scan and take readings |
Mike | 53:72f350a6d09c | 94 | case 'M' : |
Mike | 53:72f350a6d09c | 95 | pGimbal->MeanderScan(); |
Mike | 53:72f350a6d09c | 96 | break; |
Mike | 53:72f350a6d09c | 97 | |
Mike | 53:72f350a6d09c | 98 | case 'r' : // Rotate to absolute (x,y) position, perform homing reference first |
Mike | 53:72f350a6d09c | 99 | Rotate(rotn); |
Mike | 53:72f350a6d09c | 100 | break; |
Mike | 53:72f350a6d09c | 101 | |
Mike | 53:72f350a6d09c | 102 | case 'R' : // Rotate to absolute (x,y) position direct without homing first |
Mike | 53:72f350a6d09c | 103 | RotateNoHome(rotn); |
Mike | 53:72f350a6d09c | 104 | break; |
Mike | 53:72f350a6d09c | 105 | |
Mike | 53:72f350a6d09c | 106 | case 't' : // Execute a tour using internal stored waypoints |
Mike | 53:72f350a6d09c | 107 | case 'T' : |
Mike | 53:72f350a6d09c | 108 | Tour(); |
Mike | 53:72f350a6d09c | 109 | timeout = 600; |
Mike | 53:72f350a6d09c | 110 | break; |
Mike | 53:72f350a6d09c | 111 | |
Mike | 53:72f350a6d09c | 112 | case 'v' : // Measure the temperature at the current position |
Mike | 53:72f350a6d09c | 113 | case 'V' : |
Mike | 53:72f350a6d09c | 114 | // xStop(); |
Mike | 53:72f350a6d09c | 115 | Measure(); |
Mike | 53:72f350a6d09c | 116 | break; |
Mike | 53:72f350a6d09c | 117 | |
Mike | 53:72f350a6d09c | 118 | case 'z' : // Set this position as the home reference |
Mike | 53:72f350a6d09c | 119 | case 'Z' : |
Mike | 53:72f350a6d09c | 120 | // xStop(); |
Mike | 53:72f350a6d09c | 121 | Zero(); |
Mike | 53:72f350a6d09c | 122 | break; |
Mike | 53:72f350a6d09c | 123 | |
Mike | 53:72f350a6d09c | 124 | default : |
Mike | 53:72f350a6d09c | 125 | break; |
Mike | 53:72f350a6d09c | 126 | } |
Mike | 53:72f350a6d09c | 127 | wait(0.1); |
gardnmc | 52:53b1625b8035 | 128 | } |
gardnmc | 52:53b1625b8035 | 129 | |
gardnmc | 52:53b1625b8035 | 130 | eth.disconnect(); |
Mike | 53:72f350a6d09c | 131 | } |
Mike | 53:72f350a6d09c | 132 | |
Mike | 53:72f350a6d09c | 133 | /* |
Mike | 53:72f350a6d09c | 134 | * Set all parameters to a known state |
Mike | 53:72f350a6d09c | 135 | */ |
Mike | 53:72f350a6d09c | 136 | int init() |
Mike | 53:72f350a6d09c | 137 | { |
Mike | 53:72f350a6d09c | 138 | |
Mike | 53:72f350a6d09c | 139 | int i; |
Mike | 53:72f350a6d09c | 140 | |
Mike | 53:72f350a6d09c | 141 | laser.write(0); // Ensure the laser is off |
Mike | 53:72f350a6d09c | 142 | enable.write(0); // Disable the x and y motor drivers |
Mike | 53:72f350a6d09c | 143 | pc.baud(115200); // Set the USB virtual comm port baud rate to 115200 |
Mike | 53:72f350a6d09c | 144 | pGimbal = &gimbal; // Determine the pointer to the gimbal class |
Mike | 53:72f350a6d09c | 145 | Pulser.attach_us(Pulse, 10); // Start the ISR ticker event every 10us |
Mike | 53:72f350a6d09c | 146 | xHome.mode(PullUp); // Enable weak pull-up |
Mike | 53:72f350a6d09c | 147 | yHome.mode(PullUp); // Enable weak pull-up |
Mike | 53:72f350a6d09c | 148 | |
Mike | 53:72f350a6d09c | 149 | wait(1); |
Mike | 53:72f350a6d09c | 150 | // m0X.mode(PullNone); // Disable pull-up to force it to float |
Mike | 53:72f350a6d09c | 151 | m0X.write(1); // Set X micro-step to 1/16 |
Mike | 53:72f350a6d09c | 152 | m1X.write(1); // Set X micro-step to 1/16 |
Mike | 53:72f350a6d09c | 153 | |
Mike | 53:72f350a6d09c | 154 | // m0Y.mode(PullNone); // Disable pull-up to force it to float |
Mike | 53:72f350a6d09c | 155 | m0Y.write(1); // Set Y micro-step to 1/16 |
Mike | 53:72f350a6d09c | 156 | m1Y.write(1); // Set Y micro-step to 1/16 |
Mike | 53:72f350a6d09c | 157 | |
Mike | 53:72f350a6d09c | 158 | mlx.LoadEEPROM(); // if returns non 0, MLX90620 may not be connected to i2c bus |
Mike | 53:72f350a6d09c | 159 | mlx.SetOscTrimReg(); // if returns non 0, MLX90620 is having RAM access problems with i2c bus |
Mike | 53:72f350a6d09c | 160 | mlx.SetConfigReg(); // if returns non 0, shouldn't be any i2c problems at this point |
Mike | 53:72f350a6d09c | 161 | mlx.StartMeasurement(); |
Mike | 53:72f350a6d09c | 162 | |
Mike | 53:72f350a6d09c | 163 | newenable.write(1); // newenable is a temporary over-ride for the motor enable signal |
Mike | 53:72f350a6d09c | 164 | |
Mike | 53:72f350a6d09c | 165 | // Insert some random way-points into the tour for testing only (will get over-written by remote server anyway) |
Mike | 53:72f350a6d09c | 166 | srand (time(NULL)); |
Mike | 53:72f350a6d09c | 167 | for (i=0; i<MAX_TOUR; i++) |
Mike | 53:72f350a6d09c | 168 | { |
Mike | 53:72f350a6d09c | 169 | gimbal.m_TourPoints[X_AXIS][i] = (0x3fffffff - rand()) / 13421760; |
Mike | 53:72f350a6d09c | 170 | gimbal.m_TourPoints[Y_AXIS][i] = (0x3fffffff - rand()) / 13421760; |
Mike | 53:72f350a6d09c | 171 | } |
Mike | 53:72f350a6d09c | 172 | return(0); |
Mike | 53:72f350a6d09c | 173 | |
Mike | 53:72f350a6d09c | 174 | /* |
Mike | 53:72f350a6d09c | 175 | * Manual entries instead... |
Mike | 53:72f350a6d09c | 176 | * |
Mike | 53:72f350a6d09c | 177 | * |
Mike | 53:72f350a6d09c | 178 | gimbal.m_TourPoints[X_AXIS][0] = 50; |
Mike | 53:72f350a6d09c | 179 | gimbal.m_TourPoints[X_AXIS][1] = -50; |
Mike | 53:72f350a6d09c | 180 | gimbal.m_TourPoints[X_AXIS][2] = 100; |
Mike | 53:72f350a6d09c | 181 | gimbal.m_TourPoints[X_AXIS][3] = -100; |
Mike | 53:72f350a6d09c | 182 | gimbal.m_TourPoints[X_AXIS][4] = 100; |
Mike | 53:72f350a6d09c | 183 | gimbal.m_TourPoints[X_AXIS][5] = -100; |
Mike | 53:72f350a6d09c | 184 | gimbal.m_TourPoints[X_AXIS][6] = 50; |
Mike | 53:72f350a6d09c | 185 | gimbal.m_TourPoints[X_AXIS][7] = -50; |
Mike | 53:72f350a6d09c | 186 | * |
Mike | 53:72f350a6d09c | 187 | * |
Mike | 53:72f350a6d09c | 188 | * |
Mike | 53:72f350a6d09c | 189 | */ |
Mike | 53:72f350a6d09c | 190 | } |
Mike | 53:72f350a6d09c | 191 | |
Mike | 53:72f350a6d09c | 192 | |
Mike | 53:72f350a6d09c | 193 | /* |
Mike | 53:72f350a6d09c | 194 | * Parse the response from the remote server and determine the number of way-points and respective x,y coordinates |
Mike | 53:72f350a6d09c | 195 | */ |
Mike | 53:72f350a6d09c | 196 | int parseServerResponse(char * buffer, CGimbal * pgimbal) |
Mike | 53:72f350a6d09c | 197 | { |
Mike | 53:72f350a6d09c | 198 | char * startstr=NULL; |
Mike | 53:72f350a6d09c | 199 | char * endstr=NULL; |
Mike | 53:72f350a6d09c | 200 | int PointIdx=0; |
Mike | 53:72f350a6d09c | 201 | |
Mike | 53:72f350a6d09c | 202 | // Typical Server Response... |
Mike | 53:72f350a6d09c | 203 | // {"status":"1 readings imported","readingVals":[{"xAngle":5,"yAngle":0},{"xAngle":13,"yAngle":4}]} |
Mike | 53:72f350a6d09c | 204 | |
Mike | 53:72f350a6d09c | 205 | startstr = strstr(buffer, "status\":\""); |
Mike | 53:72f350a6d09c | 206 | while (startstr) |
Mike | 53:72f350a6d09c | 207 | { |
Mike | 53:72f350a6d09c | 208 | startstr = strstr(startstr, "xAngle"); |
Mike | 53:72f350a6d09c | 209 | endstr = strstr(startstr, ","); |
Mike | 53:72f350a6d09c | 210 | |
Mike | 53:72f350a6d09c | 211 | if (startstr) |
Mike | 53:72f350a6d09c | 212 | { |
Mike | 53:72f350a6d09c | 213 | pgimbal->m_TourPoints[X_AXIS][PointIdx] = strtol(startstr+8, &endstr, 10); |
Mike | 53:72f350a6d09c | 214 | startstr = strstr(startstr, "yAngle"); |
Mike | 53:72f350a6d09c | 215 | endstr = strstr(startstr, "}"); |
Mike | 53:72f350a6d09c | 216 | |
Mike | 53:72f350a6d09c | 217 | if (startstr) |
Mike | 53:72f350a6d09c | 218 | { |
Mike | 53:72f350a6d09c | 219 | pgimbal->m_TourPoints[Y_AXIS][PointIdx] = strtol(startstr+8, &endstr, 10); |
Mike | 53:72f350a6d09c | 220 | PointIdx++; |
Mike | 53:72f350a6d09c | 221 | } |
Mike | 53:72f350a6d09c | 222 | } |
Mike | 53:72f350a6d09c | 223 | } |
Mike | 53:72f350a6d09c | 224 | |
Mike | 53:72f350a6d09c | 225 | return(PointIdx); |
Mike | 53:72f350a6d09c | 226 | } |
Mike | 53:72f350a6d09c | 227 | |
Mike | 53:72f350a6d09c | 228 | /* |
Mike | 53:72f350a6d09c | 229 | * Retrieves the MLX data, currently only prints it to stdout (USB virt comm port) |
Mike | 53:72f350a6d09c | 230 | */ |
Mike | 53:72f350a6d09c | 231 | float ReadMLX(void) |
Mike | 53:72f350a6d09c | 232 | { |
Mike | 53:72f350a6d09c | 233 | int chk = 0x200; // Running flag in config register |
Mike | 53:72f350a6d09c | 234 | int i, j; // Used only for future meander-scan operation |
Mike | 53:72f350a6d09c | 235 | float tPix=0.0; // Stores temperature of centre pixel |
Mike | 53:72f350a6d09c | 236 | |
Mike | 53:72f350a6d09c | 237 | mlx.CalcTa_To(); // Get ambient temperature |
Mike | 53:72f350a6d09c | 238 | Ta = mlx.GetDieTemp(); |
Mike | 53:72f350a6d09c | 239 | // pc.printf("\nTa = %3.1f\r\n", Ta); |
Mike | 53:72f350a6d09c | 240 | |
Mike | 53:72f350a6d09c | 241 | mlx.StartMeasurement(); // Starts a conversion |
Mike | 53:72f350a6d09c | 242 | wait (.5); // Allow time for gimbal to settle |
Mike | 53:72f350a6d09c | 243 | laser.write(1); // Switch on laser |
Mike | 53:72f350a6d09c | 244 | wait (.5); // Allow time to settle |
Mike | 53:72f350a6d09c | 245 | while(chk > 0) // 1 second should have been ample time to complete a conversion, but check the completion flag anyway |
Mike | 53:72f350a6d09c | 246 | { |
Mike | 53:72f350a6d09c | 247 | chk = mlx.GetConfigReg() & 0x200; // Completion flag is b9 of config register |
Mike | 53:72f350a6d09c | 248 | if(chk == 0) |
Mike | 53:72f350a6d09c | 249 | mlx.LoadMLXRam(); // Retrieve the values from the MLX Ram contents |
Mike | 53:72f350a6d09c | 250 | else |
Mike | 53:72f350a6d09c | 251 | wait_ms(200); |
Mike | 53:72f350a6d09c | 252 | } |
Mike | 53:72f350a6d09c | 253 | /* |
Mike | 53:72f350a6d09c | 254 | for(i = 0; i < 16; i++) // The MLX pixel format is 16 columms of 4 rows rather than 4 rows of 16 columns |
Mike | 53:72f350a6d09c | 255 | { // So values have to be read out x0y0, x0y1, x0y2, x0y3 rather than x0y0, x1y0, x2y0 ... |
Mike | 53:72f350a6d09c | 256 | for (j=0; j<4; j++) |
Mike | 53:72f350a6d09c | 257 | { |
Mike | 53:72f350a6d09c | 258 | TempPxl = mlx.CalcPixel(j + i*4); |
Mike | 53:72f350a6d09c | 259 | pc.printf("%3.1f ", TempPxl); |
Mike | 53:72f350a6d09c | 260 | } |
Mike | 53:72f350a6d09c | 261 | printf("\r\n"); |
Mike | 53:72f350a6d09c | 262 | } |
Mike | 53:72f350a6d09c | 263 | printf("\r\n"); |
Mike | 53:72f350a6d09c | 264 | */ |
Mike | 53:72f350a6d09c | 265 | |
Mike | 53:72f350a6d09c | 266 | tPix = mlx.CalcPixel(31); // Centre pixel |
Mike | 53:72f350a6d09c | 267 | laser.write(0); // Switch off laser |
Mike | 53:72f350a6d09c | 268 | |
Mike | 53:72f350a6d09c | 269 | return(tPix); |
Mike | 53:72f350a6d09c | 270 | |
Mike | 53:72f350a6d09c | 271 | } |
Mike | 53:72f350a6d09c | 272 | /* |
Mike | 53:72f350a6d09c | 273 | * Performs an HTTP transaction with the remote server and stores the response in the char * data buffer |
Mike | 53:72f350a6d09c | 274 | */ |
Mike | 53:72f350a6d09c | 275 | void ContactServer(char * data) |
Mike | 53:72f350a6d09c | 276 | { |
Mike | 53:72f350a6d09c | 277 | TCPSocketConnection sock; |
Mike | 53:72f350a6d09c | 278 | int ret; |
Mike | 53:72f350a6d09c | 279 | |
Mike | 53:72f350a6d09c | 280 | sock.connect("ekko.legendary-services.com", 80); |
Mike | 53:72f350a6d09c | 281 | char http_cmd[] = "GET /api/ekkocam?data="; |
Mike | 53:72f350a6d09c | 282 | char http_data[256]; |
Mike | 53:72f350a6d09c | 283 | char readingvals[256]; |
Mike | 53:72f350a6d09c | 284 | char http_footer[] = "Host: ekko.legendary-services.com\r\nAccept: application/json\r\n\r\n\r\n"; |
Mike | 53:72f350a6d09c | 285 | |
Mike | 53:72f350a6d09c | 286 | |
Mike | 53:72f350a6d09c | 287 | sprintf(readingvals, "\"readingVals\":[{"); |
Mike | 53:72f350a6d09c | 288 | for (ret=0; ret < pGimbal->m_NumWaypoints -1; ret++) |
Mike | 53:72f350a6d09c | 289 | { |
Mike | 53:72f350a6d09c | 290 | sprintf(http_data, "\"xAngle\":%3.1f,\"yAngle\":%3.1f,\"temperature\":%3.1f", pGimbal->m_TourPoints[X_AXIS][ret], pGimbal->m_TourPoints[Y_AXIS][ret], pGimbal->m_PointTemperature[ret]); // temporary use of http_data array to conserve RAM |
Mike | 53:72f350a6d09c | 291 | strcat(http_data, ","); |
Mike | 53:72f350a6d09c | 292 | strcat(readingvals, http_data); |
Mike | 53:72f350a6d09c | 293 | } |
Mike | 53:72f350a6d09c | 294 | // No comma on the last entry... |
Mike | 53:72f350a6d09c | 295 | sprintf(http_data, "\"xAngle\":%3.1f,\"yAngle\":%3.1f,\"temperature\":%3.1f", pGimbal->m_TourPoints[X_AXIS][ret], pGimbal->m_TourPoints[Y_AXIS][ret], pGimbal->m_PointTemperature[ret]); // temporary use of http_data array to conserve RAM |
Mike | 53:72f350a6d09c | 296 | strcat(readingvals, http_data); |
Mike | 53:72f350a6d09c | 297 | |
Mike | 53:72f350a6d09c | 298 | // Dummy time value is 1458085736 |
Mike | 53:72f350a6d09c | 299 | sprintf(http_data, "{\"systemID\":\"hello\",\"sensorID\":\"Ekko0001\",\"eventID\":\"132\",\"utcStamp\":\"%ld\",%s}]} HTTP/1.0\r\n", time(NULL), readingvals); |
Mike | 53:72f350a6d09c | 300 | sprintf(data, "%s%s%s", (char *)http_cmd, (char *)http_data, (char *)http_footer); |
Mike | 53:72f350a6d09c | 301 | printf("\f%s", (char *)data); |
Mike | 53:72f350a6d09c | 302 | |
Mike | 53:72f350a6d09c | 303 | sock.send_all(data, strlen(data)); |
Mike | 53:72f350a6d09c | 304 | |
Mike | 53:72f350a6d09c | 305 | while (true) { |
Mike | 53:72f350a6d09c | 306 | ret = sock.receive_all(data, MAX_CHARS -1); |
Mike | 53:72f350a6d09c | 307 | if (ret <= 0) |
Mike | 53:72f350a6d09c | 308 | break; |
Mike | 53:72f350a6d09c | 309 | data[ret] = '\0'; |
Mike | 53:72f350a6d09c | 310 | pc.printf("Received %d bytes:\r\n%s\r\n", ret, data); |
Mike | 53:72f350a6d09c | 311 | } |
Mike | 53:72f350a6d09c | 312 | |
Mike | 53:72f350a6d09c | 313 | sock.close(); |
Mike | 53:72f350a6d09c | 314 | |
Mike | 53:72f350a6d09c | 315 | } |
Mike | 53:72f350a6d09c | 316 | |
Mike | 53:72f350a6d09c | 317 | /* |
Mike | 53:72f350a6d09c | 318 | * Communicate with server, interpret the response and instruct the gimbal accordingly |
Mike | 53:72f350a6d09c | 319 | */ |
Mike | 53:72f350a6d09c | 320 | int ServerLoop(void) |
Mike | 53:72f350a6d09c | 321 | { |
Mike | 53:72f350a6d09c | 322 | char buffer[MAX_CHARS]; |
Mike | 53:72f350a6d09c | 323 | int i; |
Mike | 53:72f350a6d09c | 324 | |
Mike | 53:72f350a6d09c | 325 | while(1) |
Mike | 53:72f350a6d09c | 326 | { |
Mike | 53:72f350a6d09c | 327 | |
Mike | 53:72f350a6d09c | 328 | ContactServer(buffer); |
Mike | 53:72f350a6d09c | 329 | pGimbal->m_NumWaypoints = parseServerResponse(buffer, pGimbal); |
Mike | 53:72f350a6d09c | 330 | |
Mike | 53:72f350a6d09c | 331 | pc.printf ("ISR Count: %08d, numwaypoints: %d\r\n", mgTick, pGimbal->m_NumWaypoints); |
Mike | 53:72f350a6d09c | 332 | |
Mike | 53:72f350a6d09c | 333 | enable.write(1); |
Mike | 53:72f350a6d09c | 334 | for (i=0; i< pGimbal->m_NumWaypoints; i++) |
Mike | 53:72f350a6d09c | 335 | { |
Mike | 53:72f350a6d09c | 336 | // Issue command to move to waypoint [i] |
Mike | 53:72f350a6d09c | 337 | pGimbal->RotateAbs(pGimbal->m_TourPoints[X_AXIS][i], pGimbal->m_TourPoints[Y_AXIS][i]); |
Mike | 53:72f350a6d09c | 338 | pGimbal->m_PointTemperature[i] = ReadMLX(); |
Mike | 53:72f350a6d09c | 339 | printf("Temperature at (%3.1f,%3.1f)=%3.1f\r\n", pGimbal->m_TourPoints[X_AXIS][i], pGimbal->m_TourPoints[Y_AXIS][i], pGimbal->m_PointTemperature[i]); |
Mike | 53:72f350a6d09c | 340 | } |
Mike | 53:72f350a6d09c | 341 | pGimbal->Home(); |
Mike | 53:72f350a6d09c | 342 | |
Mike | 53:72f350a6d09c | 343 | printf("Temperature at (0,0)=%3.1f\r\n", pGimbal->m_PointTemperature[i]); |
Mike | 53:72f350a6d09c | 344 | printf("Socket Closed\r\n"); |
Mike | 53:72f350a6d09c | 345 | enable.write(0); |
Mike | 53:72f350a6d09c | 346 | wait(8); |
Mike | 53:72f350a6d09c | 347 | } |
Mike | 53:72f350a6d09c | 348 | |
Mike | 53:72f350a6d09c | 349 | } |
Mike | 53:72f350a6d09c | 350 | /* |
Mike | 53:72f350a6d09c | 351 | * Execute a tour by stepping through 'i' way-points |
Mike | 53:72f350a6d09c | 352 | */ |
Mike | 53:72f350a6d09c | 353 | void Tour(void) |
Mike | 53:72f350a6d09c | 354 | { |
Mike | 53:72f350a6d09c | 355 | int i; |
Mike | 53:72f350a6d09c | 356 | |
Mike | 53:72f350a6d09c | 357 | enable.write(1); |
Mike | 53:72f350a6d09c | 358 | pc.printf("Performing manual tour...\r\n"); |
Mike | 53:72f350a6d09c | 359 | for (i=0; i<MAX_TOUR; i++) |
Mike | 53:72f350a6d09c | 360 | { |
Mike | 53:72f350a6d09c | 361 | pGimbal->TourPoint(i); |
Mike | 53:72f350a6d09c | 362 | pGimbal->m_PointTemperature[i] = ReadMLX(); |
Mike | 53:72f350a6d09c | 363 | printf("Temperature at (%3.1f,%3.1f)=%3.1f\r\n", pGimbal->m_TourPoints[X_AXIS][i], pGimbal->m_TourPoints[Y_AXIS][i], pGimbal->m_PointTemperature[i]); |
Mike | 53:72f350a6d09c | 364 | } |
Mike | 53:72f350a6d09c | 365 | enable.write(0); |
Mike | 53:72f350a6d09c | 366 | |
Mike | 53:72f350a6d09c | 367 | } |
Mike | 53:72f350a6d09c | 368 | |
Mike | 53:72f350a6d09c | 369 | void xStop(void) |
Mike | 53:72f350a6d09c | 370 | { |
Mike | 53:72f350a6d09c | 371 | pc.printf("Stop state: %02x\r\n", xHome.read()); |
Mike | 53:72f350a6d09c | 372 | } |
Mike | 53:72f350a6d09c | 373 | |
Mike | 53:72f350a6d09c | 374 | /* |
Mike | 53:72f350a6d09c | 375 | * Set the current x,y position as the Zero point for all x and y coordinates |
Mike | 53:72f350a6d09c | 376 | */ |
Mike | 53:72f350a6d09c | 377 | void Zero(void) |
Mike | 53:72f350a6d09c | 378 | { |
Mike | 53:72f350a6d09c | 379 | pGimbal->m_AbsoluteXAngle = 0.0; |
Mike | 53:72f350a6d09c | 380 | pGimbal->m_AbsoluteXPos = 0; |
Mike | 53:72f350a6d09c | 381 | pGimbal->m_AbsoluteYAngle = 0.0; |
Mike | 53:72f350a6d09c | 382 | pGimbal->m_AbsoluteYPos = 0; |
Mike | 53:72f350a6d09c | 383 | } |
Mike | 53:72f350a6d09c | 384 | |
Mike | 53:72f350a6d09c | 385 | /* |
Mike | 53:72f350a6d09c | 386 | * Rotate to absolute position x,y stored in the rotn structure, reference to home before moving |
Mike | 53:72f350a6d09c | 387 | */ |
Mike | 53:72f350a6d09c | 388 | void Rotate(ROTATION rotn) |
Mike | 53:72f350a6d09c | 389 | { |
Mike | 53:72f350a6d09c | 390 | float temperature; |
Mike | 53:72f350a6d09c | 391 | enable.write(1); |
Mike | 53:72f350a6d09c | 392 | pGimbal->Home(); |
Mike | 53:72f350a6d09c | 393 | pGimbal->RotateAbs(rotn.xAngle, rotn.yAngle); |
Mike | 53:72f350a6d09c | 394 | temperature = ReadMLX(); |
Mike | 53:72f350a6d09c | 395 | printf("%3.1f\r\nOK\r\n", temperature); |
Mike | 53:72f350a6d09c | 396 | enable.write(0); |
Mike | 53:72f350a6d09c | 397 | } |
Mike | 53:72f350a6d09c | 398 | |
Mike | 53:72f350a6d09c | 399 | /* |
Mike | 53:72f350a6d09c | 400 | * Rotate to absolute position x,y stored in the rotn structure without reference to home before moving |
Mike | 53:72f350a6d09c | 401 | */ |
Mike | 53:72f350a6d09c | 402 | void RotateNoHome(ROTATION rotn) |
Mike | 53:72f350a6d09c | 403 | { |
Mike | 53:72f350a6d09c | 404 | float temperature; |
Mike | 53:72f350a6d09c | 405 | enable.write(1); |
Mike | 53:72f350a6d09c | 406 | pGimbal->RotateAbs(rotn.xAngle, rotn.yAngle); |
Mike | 53:72f350a6d09c | 407 | temperature = ReadMLX(); |
Mike | 53:72f350a6d09c | 408 | printf("%3.1f\r\nOK\r\n", temperature); |
Mike | 53:72f350a6d09c | 409 | enable.write(0); |
Mike | 53:72f350a6d09c | 410 | } |
Mike | 53:72f350a6d09c | 411 | |
Mike | 53:72f350a6d09c | 412 | /* |
Mike | 53:72f350a6d09c | 413 | * Display the current MLX temperature value |
Mike | 53:72f350a6d09c | 414 | */ |
Mike | 53:72f350a6d09c | 415 | void Measure(void) |
Mike | 53:72f350a6d09c | 416 | { |
Mike | 53:72f350a6d09c | 417 | float temperature; |
Mike | 53:72f350a6d09c | 418 | |
Mike | 53:72f350a6d09c | 419 | temperature = ReadMLX(); |
Mike | 53:72f350a6d09c | 420 | printf("%3.1f\r\nOK\r\n", temperature); |
Mike | 53:72f350a6d09c | 421 | |
Mike | 53:72f350a6d09c | 422 | } |