Template for LPC1768

Dependencies:   Gimbal MLX90620 Socket lwip-eth lwip-sys lwip mbed-rtos mbed

Fork of EkkoEye by EkkoSense

Committer:
gardnmc
Date:
Thu Apr 14 13:02:29 2016 +0000
Revision:
54:aaf6b5ceedd8
Parent:
53:72f350a6d09c
libs

Who changed what in which revision?

UserRevisionLine numberNew 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 }