version 1.0

Dependencies:   CMSIS_DSP_401 GPS MPU9150_DMP PID QuaternionMath Servo mbed

Fork of SolarOnFoils_MainModule_20150518 by Dannis Brugman

Committer:
Dannis_mbed
Date:
Tue Jun 23 13:55:28 2015 +0000
Revision:
0:81b21910454e
Child:
1:b4a0d63db637
version 1.0

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Dannis_mbed 0:81b21910454e 1 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 0:81b21910454e 2 // //
Dannis_mbed 0:81b21910454e 3 // File : main.cpp //
Dannis_mbed 0:81b21910454e 4 // Version : 0.1 //
Dannis_mbed 0:81b21910454e 5 // Date : 25 march 2015 //
Dannis_mbed 0:81b21910454e 6 // Author : Dany Brugman //
Dannis_mbed 0:81b21910454e 7 // Comment : Function to write data to a 2x16 LCD by I2C //
Dannis_mbed 0:81b21910454e 8 // using a MCP23017 port expander. //
Dannis_mbed 0:81b21910454e 9 // //
Dannis_mbed 0:81b21910454e 10 // Changelog : //
Dannis_mbed 0:81b21910454e 11 // Date: Name: Comment: //
Dannis_mbed 0:81b21910454e 12 // 25/03/2015 DNB First version //
Dannis_mbed 0:81b21910454e 13 // //
Dannis_mbed 0:81b21910454e 14 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 0:81b21910454e 15
Dannis_mbed 0:81b21910454e 16 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 0:81b21910454e 17 // includes //
Dannis_mbed 0:81b21910454e 18 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 0:81b21910454e 19
Dannis_mbed 0:81b21910454e 20 #include "mbed.h"
Dannis_mbed 0:81b21910454e 21 #include <stdio.h>
Dannis_mbed 0:81b21910454e 22 #include <stdlib.h>
Dannis_mbed 0:81b21910454e 23 #include <string.h>
Dannis_mbed 0:81b21910454e 24 #include "MCP23017.h"
Dannis_mbed 0:81b21910454e 25 #include "LCD_I2C.h"
Dannis_mbed 0:81b21910454e 26 #include "uart.h"
Dannis_mbed 0:81b21910454e 27 #include "GPS.h"
Dannis_mbed 0:81b21910454e 28 #include "MPU9150.h"
Dannis_mbed 0:81b21910454e 29 #include "Quaternion.h"
Dannis_mbed 0:81b21910454e 30 #include "PID.h"
Dannis_mbed 0:81b21910454e 31 #include "Servo.h"
Dannis_mbed 0:81b21910454e 32 #include "mRotaryEncoder.h"
Dannis_mbed 0:81b21910454e 33 #include "MainModule.h"
Dannis_mbed 0:81b21910454e 34 #include "LCD_Menu.h"
Dannis_mbed 0:81b21910454e 35 #include "menu.h"
Dannis_mbed 0:81b21910454e 36 #include "systemVar.h"
Dannis_mbed 0:81b21910454e 37
Dannis_mbed 0:81b21910454e 38 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 0:81b21910454e 39 // defines //
Dannis_mbed 0:81b21910454e 40 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 0:81b21910454e 41
Dannis_mbed 0:81b21910454e 42 #define CLEAR "\033[2J"
Dannis_mbed 0:81b21910454e 43 #define PROJECT "\033[1;10fSolar on Foils\n"
Dannis_mbed 0:81b21910454e 44 #define VERSION "\033[2;10fVersion 1.0\n"
Dannis_mbed 0:81b21910454e 45
Dannis_mbed 0:81b21910454e 46 #define ACTUATOR_PORT_ID 101
Dannis_mbed 0:81b21910454e 47 #define ACTUATOR_STARB_ID 102
Dannis_mbed 0:81b21910454e 48 #define HEIGHT_PORT_ID 201
Dannis_mbed 0:81b21910454e 49 #define HEIGHT_STARB_ID 202
Dannis_mbed 0:81b21910454e 50 #define GYRO_GPS_ID 205
Dannis_mbed 0:81b21910454e 51 #define EXT_UI_ID 20
Dannis_mbed 0:81b21910454e 52 #define MESSAGE_ALL 2000
Dannis_mbed 0:81b21910454e 53 #define PORT_ACT_DIAGN 2001
Dannis_mbed 0:81b21910454e 54 #define STARB_ACT_DIAGN 2002
Dannis_mbed 0:81b21910454e 55 #define PORT_HGHT_DIAGN 2003
Dannis_mbed 0:81b21910454e 56 #define STARB_HGHT_DIAGN 2004
Dannis_mbed 0:81b21910454e 57 #define GYRO_GPS_DIAGN 2005
Dannis_mbed 0:81b21910454e 58 #define EXT_UI_DIAGN 2006
Dannis_mbed 0:81b21910454e 59
Dannis_mbed 0:81b21910454e 60 #define CCW 0
Dannis_mbed 0:81b21910454e 61 #define CW 1
Dannis_mbed 0:81b21910454e 62
Dannis_mbed 0:81b21910454e 63 #define V_MAX 1.85
Dannis_mbed 0:81b21910454e 64 #define NSAMPLES 10000 //current samples for ref.
Dannis_mbed 0:81b21910454e 65
Dannis_mbed 0:81b21910454e 66 #define ROLL_IN_MIN -90
Dannis_mbed 0:81b21910454e 67 #define ROLL_IN_MAX 90
Dannis_mbed 0:81b21910454e 68 #define ROLL_OUT_MIN -0.1
Dannis_mbed 0:81b21910454e 69 #define ROLL_OUT_MAX 0.1
Dannis_mbed 0:81b21910454e 70
Dannis_mbed 0:81b21910454e 71 #define Kc 1.0
Dannis_mbed 0:81b21910454e 72 #define Ti 0.0
Dannis_mbed 0:81b21910454e 73 #define Td 0.0
Dannis_mbed 0:81b21910454e 74 #define RATE 0.01
Dannis_mbed 0:81b21910454e 75
Dannis_mbed 0:81b21910454e 76 enum MSG_t
Dannis_mbed 0:81b21910454e 77 {
Dannis_mbed 0:81b21910454e 78 MSG1 = 0, // message 1
Dannis_mbed 0:81b21910454e 79 MSG2, // message 2
Dannis_mbed 0:81b21910454e 80 MSG3 // message 3
Dannis_mbed 0:81b21910454e 81 };
Dannis_mbed 0:81b21910454e 82
Dannis_mbed 0:81b21910454e 83 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 0:81b21910454e 84 // port declaration //
Dannis_mbed 0:81b21910454e 85 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 0:81b21910454e 86
Dannis_mbed 0:81b21910454e 87 DigitalOut myLed(LED1);
Dannis_mbed 0:81b21910454e 88 DigitalOut myLed2(LED2);
Dannis_mbed 0:81b21910454e 89
Dannis_mbed 0:81b21910454e 90 DigitalOut aliveLed(p23);
Dannis_mbed 0:81b21910454e 91 DigitalOut statusLed(p26);
Dannis_mbed 0:81b21910454e 92 DigitalOut emergencyLed(p25);
Dannis_mbed 0:81b21910454e 93 DigitalOut motorRelais(p20);
Dannis_mbed 0:81b21910454e 94
Dannis_mbed 0:81b21910454e 95 AnalogIn currentSensor(p15);
Dannis_mbed 0:81b21910454e 96
Dannis_mbed 0:81b21910454e 97 InterruptIn intAGM(p8);
Dannis_mbed 0:81b21910454e 98
Dannis_mbed 0:81b21910454e 99 I2C i2c(p9, p10);
Dannis_mbed 0:81b21910454e 100 GPS gps(p13, p14);
Dannis_mbed 0:81b21910454e 101 // I2C Rx, I2C Tx, Int
Dannis_mbed 0:81b21910454e 102 MPU9150 imu(p10, p9, p8);
Dannis_mbed 0:81b21910454e 103 //mRotaryEncoder(PinName pinA, PinName pinB, PinName pinSW, PinMode pullMode=PullUp, int debounceTime_us=1000)
Dannis_mbed 0:81b21910454e 104 mRotaryEncoder rSwitch(p12, p11, p7);
Dannis_mbed 0:81b21910454e 105 CAN CANbus(p30, p29);
Dannis_mbed 0:81b21910454e 106 MCP23017 mcp23017 = MCP23017(i2c, 0x40);
Dannis_mbed 0:81b21910454e 107 Serial debug(USBTX, USBRX);
Dannis_mbed 0:81b21910454e 108
Dannis_mbed 0:81b21910454e 109 PID rollPID(Kc,Ti,Td,RATE); // declare a PID for roll adjustment
Dannis_mbed 0:81b21910454e 110
Dannis_mbed 0:81b21910454e 111 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 0:81b21910454e 112 // function prototypes //
Dannis_mbed 0:81b21910454e 113 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 0:81b21910454e 114
Dannis_mbed 0:81b21910454e 115
Dannis_mbed 0:81b21910454e 116 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 0:81b21910454e 117 // global variables //
Dannis_mbed 0:81b21910454e 118 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 0:81b21910454e 119
Dannis_mbed 0:81b21910454e 120 int i = 0;
Dannis_mbed 0:81b21910454e 121 int value = 0;
Dannis_mbed 0:81b21910454e 122 int lastGet;
Dannis_mbed 0:81b21910454e 123 int thisGet;
Dannis_mbed 0:81b21910454e 124 int iFilter;
Dannis_mbed 0:81b21910454e 125 uint32_t uiFilterId;
Dannis_mbed 0:81b21910454e 126
Dannis_mbed 0:81b21910454e 127 bool enc_pressed = false; // Button of rotaryencoder was pressed
Dannis_mbed 0:81b21910454e 128 bool enc_rotated = false; // rotary encoder was totaded left or right
Dannis_mbed 0:81b21910454e 129 bool bSystemFail = false; // sytem fail
Dannis_mbed 0:81b21910454e 130
Dannis_mbed 0:81b21910454e 131 char buffer_GPIOB;
Dannis_mbed 0:81b21910454e 132 char cBuffer[200];
Dannis_mbed 0:81b21910454e 133 char cMessage;
Dannis_mbed 0:81b21910454e 134 char text[16];
Dannis_mbed 0:81b21910454e 135 //char buffer[16];
Dannis_mbed 0:81b21910454e 136
Dannis_mbed 0:81b21910454e 137 float fRoll, fPitch, fEulerRoll;
Dannis_mbed 0:81b21910454e 138 float fRollDiff;
Dannis_mbed 0:81b21910454e 139 float fPreviousTime;
Dannis_mbed 0:81b21910454e 140
Dannis_mbed 0:81b21910454e 141 double dCurrent = 0.0;
Dannis_mbed 0:81b21910454e 142 double dRefCurrent = 0.0;
Dannis_mbed 0:81b21910454e 143
Dannis_mbed 0:81b21910454e 144 Quaternion q1;
Dannis_mbed 0:81b21910454e 145
Dannis_mbed 0:81b21910454e 146 Ticker CANTicker;
Dannis_mbed 0:81b21910454e 147 Ticker tAliveOn;
Dannis_mbed 0:81b21910454e 148 Ticker tEmergencyLedOn;
Dannis_mbed 0:81b21910454e 149 Ticker tMPU;
Dannis_mbed 0:81b21910454e 150
Dannis_mbed 0:81b21910454e 151 Timeout tAliveOff;
Dannis_mbed 0:81b21910454e 152 Timeout tEmergencyLedOff;
Dannis_mbed 0:81b21910454e 153 Timer actualTime;
Dannis_mbed 0:81b21910454e 154 Timer timer;
Dannis_mbed 0:81b21910454e 155
Dannis_mbed 0:81b21910454e 156 Menu mLCDMenu;
Dannis_mbed 0:81b21910454e 157 SystemVar svSoF;
Dannis_mbed 0:81b21910454e 158
Dannis_mbed 0:81b21910454e 159 MSG_t messageToSend;
Dannis_mbed 0:81b21910454e 160 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 0:81b21910454e 161 // main //
Dannis_mbed 0:81b21910454e 162 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 0:81b21910454e 163
Dannis_mbed 0:81b21910454e 164 int main()
Dannis_mbed 0:81b21910454e 165 {
Dannis_mbed 0:81b21910454e 166 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 0:81b21910454e 167 // init //
Dannis_mbed 0:81b21910454e 168 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 0:81b21910454e 169 vInit();
Dannis_mbed 0:81b21910454e 170 // init CANbus
Dannis_mbed 0:81b21910454e 171 vInitCANBus();
Dannis_mbed 0:81b21910454e 172 // init Gyro
Dannis_mbed 0:81b21910454e 173 vInitImu();
Dannis_mbed 0:81b21910454e 174
Dannis_mbed 0:81b21910454e 175
Dannis_mbed 0:81b21910454e 176 CANMessage msg;
Dannis_mbed 0:81b21910454e 177 messageToSend = MSG1;
Dannis_mbed 0:81b21910454e 178
Dannis_mbed 0:81b21910454e 179
Dannis_mbed 0:81b21910454e 180 //acquiring v_ref
Dannis_mbed 0:81b21910454e 181 for (int i=0; i<NSAMPLES; i++)
Dannis_mbed 0:81b21910454e 182 {
Dannis_mbed 0:81b21910454e 183 dRefCurrent += currentSensor;
Dannis_mbed 0:81b21910454e 184 }
Dannis_mbed 0:81b21910454e 185 dRefCurrent /= NSAMPLES;
Dannis_mbed 0:81b21910454e 186 //debug.printf("RefCurrent : %f\n\r", dRefCurrent);
Dannis_mbed 0:81b21910454e 187
Dannis_mbed 0:81b21910454e 188 timer.start(); //timer to test imu roll angle
Dannis_mbed 0:81b21910454e 189 actualTime.start(); //crash timer
Dannis_mbed 0:81b21910454e 190 // clear line -1-
Dannis_mbed 0:81b21910454e 191 vLCD_printPos_I2C((unsigned char*)" ", 1, 1);
Dannis_mbed 0:81b21910454e 192
Dannis_mbed 0:81b21910454e 193 // put text on lcd
Dannis_mbed 0:81b21910454e 194
Dannis_mbed 0:81b21910454e 195 //mLCDMenu.cShowScreen(_FOILBORNE);
Dannis_mbed 0:81b21910454e 196 //vLCD_printPos_I2C((unsigned char*)mLCDMenu.getLine1(), 2, 1);
Dannis_mbed 0:81b21910454e 197
Dannis_mbed 0:81b21910454e 198 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 0:81b21910454e 199 // endless loop //
Dannis_mbed 0:81b21910454e 200 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 0:81b21910454e 201 while (1)
Dannis_mbed 0:81b21910454e 202 {
Dannis_mbed 0:81b21910454e 203 // rotary switch has been rotated?
Dannis_mbed 0:81b21910454e 204 if (enc_rotated) vSwitchRotated();
Dannis_mbed 0:81b21910454e 205
Dannis_mbed 0:81b21910454e 206 // rotary switch confirm pressed?
Dannis_mbed 0:81b21910454e 207 if (enc_pressed) vSwitchConfirmed();
Dannis_mbed 0:81b21910454e 208
Dannis_mbed 0:81b21910454e 209 // answer on id#1003
Dannis_mbed 0:81b21910454e 210 if(CANbus.read(msg)){
Dannis_mbed 0:81b21910454e 211 if ((msg.id == ACTUATOR_PORT_ID)&&(msg.data[0] == 0xFF)) statusLed = ! statusLed;
Dannis_mbed 0:81b21910454e 212 //debug.printf("ID#102 received: %d answer.\r\n", msg.data[0]);
Dannis_mbed 0:81b21910454e 213 }
Dannis_mbed 0:81b21910454e 214
Dannis_mbed 0:81b21910454e 215 if(timer.read_ms() > 500)
Dannis_mbed 0:81b21910454e 216 {
Dannis_mbed 0:81b21910454e 217 timer.reset();
Dannis_mbed 0:81b21910454e 218 svSoF.vSetPitch(q1); // call function class SystemVar
Dannis_mbed 0:81b21910454e 219 mLCDMenu.cShowScreen(_PITCHTEST);
Dannis_mbed 0:81b21910454e 220 vLCD_update();
Dannis_mbed 0:81b21910454e 221
Dannis_mbed 0:81b21910454e 222 //debug.printf("Roll: %c\t", svSoF.getValue());
Dannis_mbed 0:81b21910454e 223 //debug.printf("Roll: %f\t", getRollAngle(q1));
Dannis_mbed 0:81b21910454e 224 //debug.printf("Pitch: %f\t", getPitchAngle(q1));
Dannis_mbed 0:81b21910454e 225 //debug.printf("Time: %f\r\n", actualTime.read());
Dannis_mbed 0:81b21910454e 226 }
Dannis_mbed 0:81b21910454e 227 /*for (int samples = 0; samples<NSAMPLES; samples++) dCurrent += currentSensor;
Dannis_mbed 0:81b21910454e 228
Dannis_mbed 0:81b21910454e 229 dCurrent /= NSAMPLES;
Dannis_mbed 0:81b21910454e 230 //debug.printf("RefCurrent : %f\n\r", dRefCurrent);
Dannis_mbed 0:81b21910454e 231 //debug.printf("dCurrent : %f\n\r", dCurrent);
Dannis_mbed 0:81b21910454e 232 dCurrent = (dCurrent-dRefCurrent)*V_MAX/0.185;
Dannis_mbed 0:81b21910454e 233
Dannis_mbed 0:81b21910454e 234 debug.printf("Current mA : %f\n\r", (dCurrent*1000));*/
Dannis_mbed 0:81b21910454e 235 wait(0.2);
Dannis_mbed 0:81b21910454e 236
Dannis_mbed 0:81b21910454e 237 }
Dannis_mbed 0:81b21910454e 238
Dannis_mbed 0:81b21910454e 239 } // END MAIN
Dannis_mbed 0:81b21910454e 240
Dannis_mbed 0:81b21910454e 241 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 0:81b21910454e 242 // delay function for LCD //
Dannis_mbed 0:81b21910454e 243 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 0:81b21910454e 244
Dannis_mbed 0:81b21910454e 245 void vLCD_delay_I2C (unsigned int t_delay)
Dannis_mbed 0:81b21910454e 246 {
Dannis_mbed 0:81b21910454e 247 unsigned int i;
Dannis_mbed 0:81b21910454e 248
Dannis_mbed 0:81b21910454e 249 for (i=0; i < t_delay; i++);
Dannis_mbed 0:81b21910454e 250 }
Dannis_mbed 0:81b21910454e 251
Dannis_mbed 0:81b21910454e 252 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 0:81b21910454e 253 // write commando to LCD //
Dannis_mbed 0:81b21910454e 254 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 0:81b21910454e 255
Dannis_mbed 0:81b21910454e 256 void vLCD_cmd_I2C (unsigned char commando)
Dannis_mbed 0:81b21910454e 257 {
Dannis_mbed 0:81b21910454e 258 __disable_irq(); // Disable Interrupts
Dannis_mbed 0:81b21910454e 259
Dannis_mbed 0:81b21910454e 260 // write commando to LCD
Dannis_mbed 0:81b21910454e 261 mcp23017.write(PORT_A, commando);
Dannis_mbed 0:81b21910454e 262
Dannis_mbed 0:81b21910454e 263 // LCD_RS = 0
Dannis_mbed 0:81b21910454e 264 buffer_GPIOB = buffer_GPIOB & 0xFD; // RS = 0
Dannis_mbed 0:81b21910454e 265 // write to LCD
Dannis_mbed 0:81b21910454e 266 mcp23017.write(PORT_B, buffer_GPIOB);
Dannis_mbed 0:81b21910454e 267
Dannis_mbed 0:81b21910454e 268 // LCD_EN = 1
Dannis_mbed 0:81b21910454e 269 buffer_GPIOB = buffer_GPIOB | 0x01; // EN = 1
Dannis_mbed 0:81b21910454e 270 // write to LCD
Dannis_mbed 0:81b21910454e 271 mcp23017.write(PORT_B, buffer_GPIOB);
Dannis_mbed 0:81b21910454e 272
Dannis_mbed 0:81b21910454e 273 // LCD_EN = 0
Dannis_mbed 0:81b21910454e 274 buffer_GPIOB = buffer_GPIOB & 0xFE; // EN = 0
Dannis_mbed 0:81b21910454e 275 // write to LCD
Dannis_mbed 0:81b21910454e 276 mcp23017.write(PORT_B, buffer_GPIOB);
Dannis_mbed 0:81b21910454e 277
Dannis_mbed 0:81b21910454e 278 __enable_irq(); // Enable Interrupts
Dannis_mbed 0:81b21910454e 279 }
Dannis_mbed 0:81b21910454e 280
Dannis_mbed 0:81b21910454e 281 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 0:81b21910454e 282 // write single char to LCD //
Dannis_mbed 0:81b21910454e 283 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 0:81b21910454e 284
Dannis_mbed 0:81b21910454e 285 void vLCD_data_I2C (unsigned char data)
Dannis_mbed 0:81b21910454e 286 {
Dannis_mbed 0:81b21910454e 287 __disable_irq(); // Disable Interrupts
Dannis_mbed 0:81b21910454e 288
Dannis_mbed 0:81b21910454e 289 // write data to LCD
Dannis_mbed 0:81b21910454e 290 mcp23017.write(PORT_A, data);
Dannis_mbed 0:81b21910454e 291
Dannis_mbed 0:81b21910454e 292 // LCD_RS = 1
Dannis_mbed 0:81b21910454e 293 buffer_GPIOB = buffer_GPIOB | 0x02; // RS = 1
Dannis_mbed 0:81b21910454e 294 // write to LCD
Dannis_mbed 0:81b21910454e 295 mcp23017.write(PORT_B, buffer_GPIOB);
Dannis_mbed 0:81b21910454e 296
Dannis_mbed 0:81b21910454e 297 // LCD_EN = 1
Dannis_mbed 0:81b21910454e 298 buffer_GPIOB = buffer_GPIOB | 0x01; // EN = 1
Dannis_mbed 0:81b21910454e 299 // write to LCD
Dannis_mbed 0:81b21910454e 300 mcp23017.write(PORT_B, buffer_GPIOB);
Dannis_mbed 0:81b21910454e 301
Dannis_mbed 0:81b21910454e 302 // LCD_EN = 0
Dannis_mbed 0:81b21910454e 303 buffer_GPIOB = buffer_GPIOB & 0xFE; // EN = 0
Dannis_mbed 0:81b21910454e 304 // write to LCD
Dannis_mbed 0:81b21910454e 305 mcp23017.write(PORT_B, buffer_GPIOB);
Dannis_mbed 0:81b21910454e 306
Dannis_mbed 0:81b21910454e 307 __enable_irq(); // Enable Interrupts
Dannis_mbed 0:81b21910454e 308 }
Dannis_mbed 0:81b21910454e 309
Dannis_mbed 0:81b21910454e 310 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 0:81b21910454e 311 // Initialize LCD //
Dannis_mbed 0:81b21910454e 312 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 0:81b21910454e 313
Dannis_mbed 0:81b21910454e 314 void vLCD_init_I2C (void)
Dannis_mbed 0:81b21910454e 315 {
Dannis_mbed 0:81b21910454e 316 vLCD_cmd_I2C (0x00);
Dannis_mbed 0:81b21910454e 317 // vLCD_delay_I2C (65535)
Dannis_mbed 0:81b21910454e 318 vLCD_delay_I2C (100);
Dannis_mbed 0:81b21910454e 319
Dannis_mbed 0:81b21910454e 320 vLCD_cmd_I2C (0x38);
Dannis_mbed 0:81b21910454e 321 // vLCD_delay_I2C (65535)
Dannis_mbed 0:81b21910454e 322 vLCD_delay_I2C (100);
Dannis_mbed 0:81b21910454e 323
Dannis_mbed 0:81b21910454e 324 vLCD_cmd_I2C (0x38);
Dannis_mbed 0:81b21910454e 325 //vLCD_delay_I2C (65535)
Dannis_mbed 0:81b21910454e 326 vLCD_delay_I2C (100);
Dannis_mbed 0:81b21910454e 327
Dannis_mbed 0:81b21910454e 328 vLCD_cmd_I2C (0x38);
Dannis_mbed 0:81b21910454e 329 //vLCD_delay_I2C (65535)
Dannis_mbed 0:81b21910454e 330 vLCD_delay_I2C (100);
Dannis_mbed 0:81b21910454e 331
Dannis_mbed 0:81b21910454e 332 // Display ON / OFF
Dannis_mbed 0:81b21910454e 333 vLCD_cmd_I2C (0x08);
Dannis_mbed 0:81b21910454e 334
Dannis_mbed 0:81b21910454e 335 //vLCD_delay_I2C (65535)
Dannis_mbed 0:81b21910454e 336 vLCD_delay_I2C (100);
Dannis_mbed 0:81b21910454e 337
Dannis_mbed 0:81b21910454e 338 // Clear Display
Dannis_mbed 0:81b21910454e 339 vLCD_cmd_I2C (0x01);
Dannis_mbed 0:81b21910454e 340
Dannis_mbed 0:81b21910454e 341 //vLCD_delay_I2C (65535)
Dannis_mbed 0:81b21910454e 342 vLCD_delay_I2C (100);
Dannis_mbed 0:81b21910454e 343
Dannis_mbed 0:81b21910454e 344 // Entry Mode Set
Dannis_mbed 0:81b21910454e 345 vLCD_cmd_I2C (0x06);
Dannis_mbed 0:81b21910454e 346
Dannis_mbed 0:81b21910454e 347 //vLCD_delay_I2C (65535)
Dannis_mbed 0:81b21910454e 348 vLCD_delay_I2C (100);
Dannis_mbed 0:81b21910454e 349
Dannis_mbed 0:81b21910454e 350 // Display ON / OFF
Dannis_mbed 0:81b21910454e 351 vLCD_cmd_I2C (0x0C);
Dannis_mbed 0:81b21910454e 352
Dannis_mbed 0:81b21910454e 353 //vLCD_delay_I2C (65535)
Dannis_mbed 0:81b21910454e 354 vLCD_delay_I2C (100);
Dannis_mbed 0:81b21910454e 355 }
Dannis_mbed 0:81b21910454e 356
Dannis_mbed 0:81b21910454e 357 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 0:81b21910454e 358 // Write string to LCD //
Dannis_mbed 0:81b21910454e 359 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 0:81b21910454e 360
Dannis_mbed 0:81b21910454e 361 void vLCD_print_I2C (unsigned char *string, unsigned char line)
Dannis_mbed 0:81b21910454e 362 {
Dannis_mbed 0:81b21910454e 363 unsigned int i;
Dannis_mbed 0:81b21910454e 364
Dannis_mbed 0:81b21910454e 365 // select target line to write to
Dannis_mbed 0:81b21910454e 366 if (line == 1)
Dannis_mbed 0:81b21910454e 367 {
Dannis_mbed 0:81b21910454e 368 vLCD_cmd_I2C (0x80);
Dannis_mbed 0:81b21910454e 369 }
Dannis_mbed 0:81b21910454e 370 else if (line == 2)
Dannis_mbed 0:81b21910454e 371 {
Dannis_mbed 0:81b21910454e 372 vLCD_cmd_I2C (0xC0);
Dannis_mbed 0:81b21910454e 373 }
Dannis_mbed 0:81b21910454e 374 else
Dannis_mbed 0:81b21910454e 375 {
Dannis_mbed 0:81b21910454e 376 return; // End of function: Error in the past value of line
Dannis_mbed 0:81b21910454e 377 }
Dannis_mbed 0:81b21910454e 378
Dannis_mbed 0:81b21910454e 379 // write data to selected line
Dannis_mbed 0:81b21910454e 380 for (i=0; i<16; i++)
Dannis_mbed 0:81b21910454e 381 {
Dannis_mbed 0:81b21910454e 382 if (string [i] != 0x00)
Dannis_mbed 0:81b21910454e 383 {
Dannis_mbed 0:81b21910454e 384 vLCD_data_I2C (string [i]);
Dannis_mbed 0:81b21910454e 385 }
Dannis_mbed 0:81b21910454e 386 else
Dannis_mbed 0:81b21910454e 387 vLCD_data_I2C (' ');
Dannis_mbed 0:81b21910454e 388 }
Dannis_mbed 0:81b21910454e 389 }
Dannis_mbed 0:81b21910454e 390
Dannis_mbed 0:81b21910454e 391 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 0:81b21910454e 392 // Write string to LCD //
Dannis_mbed 0:81b21910454e 393 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 0:81b21910454e 394
Dannis_mbed 0:81b21910454e 395 void vLCD_printPos_I2C (unsigned char *string, unsigned char line, unsigned char character)
Dannis_mbed 0:81b21910454e 396 {
Dannis_mbed 0:81b21910454e 397 unsigned int i;
Dannis_mbed 0:81b21910454e 398
Dannis_mbed 0:81b21910454e 399 // select target line and position to write to
Dannis_mbed 0:81b21910454e 400 if (line == 1)
Dannis_mbed 0:81b21910454e 401 {
Dannis_mbed 0:81b21910454e 402 vLCD_cmd_I2C (0x80+(character-1));
Dannis_mbed 0:81b21910454e 403 }
Dannis_mbed 0:81b21910454e 404
Dannis_mbed 0:81b21910454e 405 else if (line == 2)
Dannis_mbed 0:81b21910454e 406 {
Dannis_mbed 0:81b21910454e 407 vLCD_cmd_I2C (0xC0+(character-1));
Dannis_mbed 0:81b21910454e 408 }
Dannis_mbed 0:81b21910454e 409
Dannis_mbed 0:81b21910454e 410 else
Dannis_mbed 0:81b21910454e 411 {
Dannis_mbed 0:81b21910454e 412 return; // End of function: Error in the past value of line
Dannis_mbed 0:81b21910454e 413 }
Dannis_mbed 0:81b21910454e 414
Dannis_mbed 0:81b21910454e 415 // write data to selected line and position
Dannis_mbed 0:81b21910454e 416 for (i=0; i<16; i++)
Dannis_mbed 0:81b21910454e 417 {
Dannis_mbed 0:81b21910454e 418 if (string [i] != 0x00)
Dannis_mbed 0:81b21910454e 419 {
Dannis_mbed 0:81b21910454e 420 vLCD_data_I2C (string [i]);
Dannis_mbed 0:81b21910454e 421 }
Dannis_mbed 0:81b21910454e 422 else
Dannis_mbed 0:81b21910454e 423 vLCD_data_I2C (' ');
Dannis_mbed 0:81b21910454e 424 }
Dannis_mbed 0:81b21910454e 425 }
Dannis_mbed 0:81b21910454e 426
Dannis_mbed 0:81b21910454e 427 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 0:81b21910454e 428 // update LCD //
Dannis_mbed 0:81b21910454e 429 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 0:81b21910454e 430 void vLCD_clear_I2C (void)
Dannis_mbed 0:81b21910454e 431 {
Dannis_mbed 0:81b21910454e 432 // Clear Display
Dannis_mbed 0:81b21910454e 433 vLCD_cmd_I2C (0x01);
Dannis_mbed 0:81b21910454e 434 //vLCD_delay_I2C (65535)
Dannis_mbed 0:81b21910454e 435 vLCD_delay_I2C (100);
Dannis_mbed 0:81b21910454e 436 // Display ON / OFF
Dannis_mbed 0:81b21910454e 437 vLCD_cmd_I2C (0x0C);
Dannis_mbed 0:81b21910454e 438 //vLCD_delay_I2C (65535)
Dannis_mbed 0:81b21910454e 439 vLCD_delay_I2C (100);
Dannis_mbed 0:81b21910454e 440 }
Dannis_mbed 0:81b21910454e 441
Dannis_mbed 0:81b21910454e 442 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 0:81b21910454e 443 // update LCD //
Dannis_mbed 0:81b21910454e 444 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 0:81b21910454e 445 void vLCD_update (void)
Dannis_mbed 0:81b21910454e 446 {
Dannis_mbed 0:81b21910454e 447 vLCD_print_I2C((unsigned char*)mLCDMenu.getLine1(), 1);
Dannis_mbed 0:81b21910454e 448 vLCD_print_I2C((unsigned char*)mLCDMenu.getLine2(), 2);
Dannis_mbed 0:81b21910454e 449 //vLCD_printPos_I2C((unsigned char*)mLCDMenu.getLine1(), 1, 1);
Dannis_mbed 0:81b21910454e 450 //vLCD_printPos_I2C((unsigned char*)mLCDMenu.getLine2(), 2, 1);
Dannis_mbed 0:81b21910454e 451 }
Dannis_mbed 0:81b21910454e 452
Dannis_mbed 0:81b21910454e 453 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 0:81b21910454e 454 // Init SOF module //
Dannis_mbed 0:81b21910454e 455 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 0:81b21910454e 456 void vInit (void)
Dannis_mbed 0:81b21910454e 457 {
Dannis_mbed 0:81b21910454e 458 // I2C init
Dannis_mbed 0:81b21910454e 459 i2c.frequency(100000);
Dannis_mbed 0:81b21910454e 460 //Port A is databus - Output
Dannis_mbed 0:81b21910454e 461 mcp23017.direction(PORT_A, PORT_DIR_OUT);
Dannis_mbed 0:81b21910454e 462 //Port B is controlbus - Output
Dannis_mbed 0:81b21910454e 463 mcp23017.direction(PORT_B, PORT_DIR_OUT);
Dannis_mbed 0:81b21910454e 464
Dannis_mbed 0:81b21910454e 465 debug.baud(115200);
Dannis_mbed 0:81b21910454e 466 // initialize LCD
Dannis_mbed 0:81b21910454e 467 vLCD_init_I2C();
Dannis_mbed 0:81b21910454e 468 mLCDMenu.cShowScreen(_INIT);
Dannis_mbed 0:81b21910454e 469 vLCD_update();
Dannis_mbed 0:81b21910454e 470
Dannis_mbed 0:81b21910454e 471 // led's out
Dannis_mbed 0:81b21910454e 472 aliveLed = 1; wait(0.1); aliveLed = 0;
Dannis_mbed 0:81b21910454e 473 statusLed = 1; wait(0.1); statusLed = 0;
Dannis_mbed 0:81b21910454e 474 emergencyLed = 1; wait(0.1); emergencyLed = 0;
Dannis_mbed 0:81b21910454e 475
Dannis_mbed 0:81b21910454e 476 wait(0.2);
Dannis_mbed 0:81b21910454e 477 motorRelais = 1;
Dannis_mbed 0:81b21910454e 478 wait(1.0);
Dannis_mbed 0:81b21910454e 479 motorRelais = 0;
Dannis_mbed 0:81b21910454e 480
Dannis_mbed 0:81b21910454e 481 //Int-Handler rotary encoder switch
Dannis_mbed 0:81b21910454e 482 // call trigger_sw() when button of rotary-encoder is pressed
Dannis_mbed 0:81b21910454e 483 rSwitch.attachSW(&trigger_sw);
Dannis_mbed 0:81b21910454e 484 // call trigger_rot() when the shaft is rotaded left or right
Dannis_mbed 0:81b21910454e 485 rSwitch.attachROT(&trigger_rotated);
Dannis_mbed 0:81b21910454e 486 lastGet = 0;
Dannis_mbed 0:81b21910454e 487 // set encrotated, so position is displayed on startup
Dannis_mbed 0:81b21910454e 488 enc_rotated = true;
Dannis_mbed 0:81b21910454e 489 // blink alive LED
Dannis_mbed 0:81b21910454e 490 aliveLed = 1;
Dannis_mbed 0:81b21910454e 491 tAliveOff.attach(&vBlinkOnce_cb, 0.05);
Dannis_mbed 0:81b21910454e 492 tAliveOn.attach(&vBlinkOnce_cb, 5);
Dannis_mbed 0:81b21910454e 493 }
Dannis_mbed 0:81b21910454e 494
Dannis_mbed 0:81b21910454e 495 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 0:81b21910454e 496 // Init MPU 9150 //
Dannis_mbed 0:81b21910454e 497 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 0:81b21910454e 498 void vInitImu (void)
Dannis_mbed 0:81b21910454e 499 {
Dannis_mbed 0:81b21910454e 500 if(imu.isReady()) mLCDMenu.cShowScreen(_IMUREADY);
Dannis_mbed 0:81b21910454e 501 else mLCDMenu.cShowScreen(_IMUFAIL);
Dannis_mbed 0:81b21910454e 502 vLCD_update();
Dannis_mbed 0:81b21910454e 503
Dannis_mbed 0:81b21910454e 504 imu.initialiseDMP();
Dannis_mbed 0:81b21910454e 505 imu.setFifoReset(true);
Dannis_mbed 0:81b21910454e 506 imu.setDMPEnabled(true);
Dannis_mbed 0:81b21910454e 507 intAGM.rise(&vGetMPUBuffer);
Dannis_mbed 0:81b21910454e 508 //tMPU.attach_us(&vGetMPUBuffer,50000);
Dannis_mbed 0:81b21910454e 509 }
Dannis_mbed 0:81b21910454e 510
Dannis_mbed 0:81b21910454e 511 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 0:81b21910454e 512 // Init CANbus //
Dannis_mbed 0:81b21910454e 513 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 0:81b21910454e 514 void vInitCANBus (void)
Dannis_mbed 0:81b21910454e 515 {
Dannis_mbed 0:81b21910454e 516 CANbus.frequency(250000);
Dannis_mbed 0:81b21910454e 517 debug.printf("vInitCANBus\r\n");
Dannis_mbed 0:81b21910454e 518 CANMessage msg;
Dannis_mbed 0:81b21910454e 519 int i, iTry = 10;
Dannis_mbed 0:81b21910454e 520 uint32_t id = MESSAGE_ALL;
Dannis_mbed 0:81b21910454e 521 bool bReceived = false;
Dannis_mbed 0:81b21910454e 522 cMessage = 0x00;
Dannis_mbed 0:81b21910454e 523 // check CAN system
Dannis_mbed 0:81b21910454e 524 for (i = 6; i > 0 ; i--)
Dannis_mbed 0:81b21910454e 525 {
Dannis_mbed 0:81b21910454e 526 debug.printf("for loop: %i\r\n", i);
Dannis_mbed 0:81b21910454e 527 bReceived = false;
Dannis_mbed 0:81b21910454e 528 id++; // increase id
Dannis_mbed 0:81b21910454e 529 while ((iTry > 0)&&(!bReceived))
Dannis_mbed 0:81b21910454e 530 {
Dannis_mbed 0:81b21910454e 531 CANbus.write(CANMessage(id, &cMessage, 1));
Dannis_mbed 0:81b21910454e 532 wait(0.15);
Dannis_mbed 0:81b21910454e 533 switch(id){ // set adress to filter
Dannis_mbed 0:81b21910454e 534 case PORT_ACT_DIAGN: uiFilterId = ACTUATOR_PORT_ID; break;
Dannis_mbed 0:81b21910454e 535 case STARB_ACT_DIAGN: uiFilterId = ACTUATOR_STARB_ID; break;
Dannis_mbed 0:81b21910454e 536 case PORT_HGHT_DIAGN: uiFilterId = HEIGHT_PORT_ID; break;
Dannis_mbed 0:81b21910454e 537 case STARB_HGHT_DIAGN: uiFilterId = HEIGHT_STARB_ID; break;
Dannis_mbed 0:81b21910454e 538 case GYRO_GPS_DIAGN: uiFilterId = GYRO_GPS_ID; break;
Dannis_mbed 0:81b21910454e 539 case EXT_UI_DIAGN: uiFilterId = EXT_UI_ID; break;
Dannis_mbed 0:81b21910454e 540 }//end switch
Dannis_mbed 0:81b21910454e 541 iFilter = CANbus.filter(0x200, 0x7FF, CANStandard);
Dannis_mbed 0:81b21910454e 542 if(CANbus.read(msg, iFilter)){
Dannis_mbed 0:81b21910454e 543 debug.printf("can.read(msg) ID: %i\r\n", id);
Dannis_mbed 0:81b21910454e 544 debug.printf("can.msg id: %i, %i\r\n", msg.id, msg.data[0]);
Dannis_mbed 0:81b21910454e 545 switch(id){
Dannis_mbed 0:81b21910454e 546 case PORT_ACT_DIAGN: if((msg.id == ACTUATOR_PORT_ID)&&(msg.data[0] == 0xFF)) mLCDMenu.cShowScreen(_CANID101OK); break;
Dannis_mbed 0:81b21910454e 547 case STARB_ACT_DIAGN: if((msg.id == ACTUATOR_STARB_ID)&&(msg.data[0] == 0xFF)) mLCDMenu.cShowScreen(_CANID102OK); break;
Dannis_mbed 0:81b21910454e 548 case PORT_HGHT_DIAGN: if((msg.id == HEIGHT_PORT_ID)&&(msg.data[0] == 0xFF)) mLCDMenu.cShowScreen(_CANID201OK); break;
Dannis_mbed 0:81b21910454e 549 case STARB_HGHT_DIAGN: if((msg.id == HEIGHT_STARB_ID)&&(msg.data[0] == 0xFF)) mLCDMenu.cShowScreen(_CANID202OK); break;
Dannis_mbed 0:81b21910454e 550 case GYRO_GPS_DIAGN: if((msg.id == GYRO_GPS_ID)&&(msg.data[0] == 0xFF)) mLCDMenu.cShowScreen(_CANID205OK); break;
Dannis_mbed 0:81b21910454e 551 case EXT_UI_DIAGN: if((msg.id == EXT_UI_ID)&&(msg.data[0] == 0xFF)) mLCDMenu.cShowScreen(_CANID1001OK); break;
Dannis_mbed 0:81b21910454e 552 } //end switch
Dannis_mbed 0:81b21910454e 553 vLCD_update();
Dannis_mbed 0:81b21910454e 554 bReceived = true;
Dannis_mbed 0:81b21910454e 555 } //end if
Dannis_mbed 0:81b21910454e 556 else if(iTry == 1){
Dannis_mbed 0:81b21910454e 557 switch(id){
Dannis_mbed 0:81b21910454e 558 case PORT_ACT_DIAGN: mLCDMenu.cShowScreen(_CANID101FAIL); break;
Dannis_mbed 0:81b21910454e 559 case STARB_ACT_DIAGN: mLCDMenu.cShowScreen(_CANID102FAIL); break;
Dannis_mbed 0:81b21910454e 560 case PORT_HGHT_DIAGN: mLCDMenu.cShowScreen(_CANID201FAIL); break;
Dannis_mbed 0:81b21910454e 561 case STARB_HGHT_DIAGN: mLCDMenu.cShowScreen(_CANID202FAIL); break;
Dannis_mbed 0:81b21910454e 562 case GYRO_GPS_DIAGN: mLCDMenu.cShowScreen(_CANID205FAIL); break;
Dannis_mbed 0:81b21910454e 563 case EXT_UI_DIAGN: mLCDMenu.cShowScreen(_CANID1001FAIL); break;
Dannis_mbed 0:81b21910454e 564 } //end switch
Dannis_mbed 0:81b21910454e 565 vLCD_update();
Dannis_mbed 0:81b21910454e 566 } //end if
Dannis_mbed 0:81b21910454e 567 if(CANbus.read(msg)){}//unwanted message
Dannis_mbed 0:81b21910454e 568 if(!bReceived) iTry--;
Dannis_mbed 0:81b21910454e 569 debug.printf("Tries: %i\r\n", iTry);
Dannis_mbed 0:81b21910454e 570 } //end while
Dannis_mbed 0:81b21910454e 571 wait(0.5); // some time to read message
Dannis_mbed 0:81b21910454e 572 iTry = 10; // reset try counter
Dannis_mbed 0:81b21910454e 573 // *****afhandelen can fail ****
Dannis_mbed 0:81b21910454e 574 if (iTry != 0) iTry = 10;
Dannis_mbed 0:81b21910454e 575 else bSystemFail = true;
Dannis_mbed 0:81b21910454e 576 } //end for
Dannis_mbed 0:81b21910454e 577
Dannis_mbed 0:81b21910454e 578 // in case system fail
Dannis_mbed 0:81b21910454e 579 if(bSystemFail){
Dannis_mbed 0:81b21910454e 580 vCallEmergencyLed();
Dannis_mbed 0:81b21910454e 581 mLCDMenu.cShowScreen(_CANNORESPONSE);
Dannis_mbed 0:81b21910454e 582 vLCD_update();
Dannis_mbed 0:81b21910454e 583 }
Dannis_mbed 0:81b21910454e 584 debug.printf("end can init");
Dannis_mbed 0:81b21910454e 585 }
Dannis_mbed 0:81b21910454e 586
Dannis_mbed 0:81b21910454e 587 // call vCANBusSend every 1 second test
Dannis_mbed 0:81b21910454e 588 // CANTicker.attach(&vCANBusSend, 1);
Dannis_mbed 0:81b21910454e 589
Dannis_mbed 0:81b21910454e 590 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 0:81b21910454e 591 // Blink alive led //
Dannis_mbed 0:81b21910454e 592 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 0:81b21910454e 593 void vBlinkOff_cb (void)
Dannis_mbed 0:81b21910454e 594 {
Dannis_mbed 0:81b21910454e 595 aliveLed = 0;
Dannis_mbed 0:81b21910454e 596 }
Dannis_mbed 0:81b21910454e 597
Dannis_mbed 0:81b21910454e 598 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 0:81b21910454e 599 // Blink emergecy led //
Dannis_mbed 0:81b21910454e 600 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 0:81b21910454e 601 void vEmergencyOff_cb (void)
Dannis_mbed 0:81b21910454e 602 {
Dannis_mbed 0:81b21910454e 603 emergencyLed = 0;
Dannis_mbed 0:81b21910454e 604 }
Dannis_mbed 0:81b21910454e 605
Dannis_mbed 0:81b21910454e 606 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 0:81b21910454e 607 // Blink status led once //
Dannis_mbed 0:81b21910454e 608 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 0:81b21910454e 609 void vBlinkOnce_cb (void)
Dannis_mbed 0:81b21910454e 610 {
Dannis_mbed 0:81b21910454e 611 aliveLed = 1;
Dannis_mbed 0:81b21910454e 612 tAliveOff.detach();
Dannis_mbed 0:81b21910454e 613 tAliveOff.attach(&vBlinkOff_cb, 0.05);
Dannis_mbed 0:81b21910454e 614 }
Dannis_mbed 0:81b21910454e 615
Dannis_mbed 0:81b21910454e 616 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 0:81b21910454e 617 // Blink emergency led once //
Dannis_mbed 0:81b21910454e 618 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 0:81b21910454e 619 void vEmergencyOnce_cb (void)
Dannis_mbed 0:81b21910454e 620 {
Dannis_mbed 0:81b21910454e 621 emergencyLed = 1;
Dannis_mbed 0:81b21910454e 622 tEmergencyLedOff.detach();
Dannis_mbed 0:81b21910454e 623 tEmergencyLedOff.attach(&vEmergencyOff_cb, 0.05);
Dannis_mbed 0:81b21910454e 624
Dannis_mbed 0:81b21910454e 625 if (!bSystemFail)
Dannis_mbed 0:81b21910454e 626 {
Dannis_mbed 0:81b21910454e 627 tEmergencyLedOn.detach();
Dannis_mbed 0:81b21910454e 628 tEmergencyLedOff.detach();
Dannis_mbed 0:81b21910454e 629 aliveLed = 0;
Dannis_mbed 0:81b21910454e 630 }
Dannis_mbed 0:81b21910454e 631 }
Dannis_mbed 0:81b21910454e 632
Dannis_mbed 0:81b21910454e 633 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 0:81b21910454e 634 // Call emergency led //
Dannis_mbed 0:81b21910454e 635 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 0:81b21910454e 636 void vCallEmergencyLed(void)
Dannis_mbed 0:81b21910454e 637 {
Dannis_mbed 0:81b21910454e 638 aliveLed = 1;
Dannis_mbed 0:81b21910454e 639 tEmergencyLedOff.attach(&vEmergencyOnce_cb, 0.05);
Dannis_mbed 0:81b21910454e 640 tEmergencyLedOn.attach(&vEmergencyOnce_cb, 0.5);
Dannis_mbed 0:81b21910454e 641 }
Dannis_mbed 0:81b21910454e 642
Dannis_mbed 0:81b21910454e 643 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 0:81b21910454e 644 // Writing integer to LCD //
Dannis_mbed 0:81b21910454e 645 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 0:81b21910454e 646 void vLCD_printInt_I2C (int value, unsigned char line, unsigned char character)
Dannis_mbed 0:81b21910454e 647 {
Dannis_mbed 0:81b21910454e 648 static char buffer[32];
Dannis_mbed 0:81b21910454e 649 // convert int to char
Dannis_mbed 0:81b21910454e 650 sprintf(buffer, "%.2d", value);
Dannis_mbed 0:81b21910454e 651 // write converted int to LCD
Dannis_mbed 0:81b21910454e 652 vLCD_printPos_I2C((unsigned char*)buffer, line, character);
Dannis_mbed 0:81b21910454e 653 }
Dannis_mbed 0:81b21910454e 654
Dannis_mbed 0:81b21910454e 655 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 0:81b21910454e 656 // calculate Roll from quaternion //
Dannis_mbed 0:81b21910454e 657 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 0:81b21910454e 658 float getRollAngle(Quaternion q1)
Dannis_mbed 0:81b21910454e 659 {
Dannis_mbed 0:81b21910454e 660 float fRoll;
Dannis_mbed 0:81b21910454e 661 fRoll = atan2(2*(q1.v.x*q1.v.y + q1.w*q1.v.y), q1.w*q1.w + q1.v.x*q1.v.x - q1.v.y*q1.v.y - q1.v.y*q1.v.y);
Dannis_mbed 0:81b21910454e 662 fRoll *= 180/3.14;
Dannis_mbed 0:81b21910454e 663 return (fRoll);
Dannis_mbed 0:81b21910454e 664 }
Dannis_mbed 0:81b21910454e 665
Dannis_mbed 0:81b21910454e 666 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 0:81b21910454e 667 // calculate Pitch from quaternion //
Dannis_mbed 0:81b21910454e 668 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 0:81b21910454e 669 float getPitchAngle(Quaternion q1)
Dannis_mbed 0:81b21910454e 670 {
Dannis_mbed 0:81b21910454e 671 Vector3 euler = q1.getEulerAngles();
Dannis_mbed 0:81b21910454e 672 //debug.printf("$ Pitch = %f #\t", euler.y);
Dannis_mbed 0:81b21910454e 673 float fPitch;
Dannis_mbed 0:81b21910454e 674 //fPitch = atan2((2*((q1.v.x*q1.v.z) - (q1.w*q1.v.y))),(sqrt((2*((q1.w*q1.v.x) + (q1.v.y*q1.v.z)))*(2*((q1.w*q1.v.x) + (q1.v.y*q1.v.z)))) + (((q1.w*q1.w) - (q1.v.x*q1.v.x) - (q1.v.y*q1.v.y) + (q1.v.z*q1.v.z))*((q1.w*q1.w) - (q1.v.x*q1.v.x) - (q1.v.y*q1.v.y) + (q1.v.z*q1.v.z)))));
Dannis_mbed 0:81b21910454e 675 //fPitch = acos(-(q1.w*q1.w) - (q1.v.x*q1.v.x) + (q1.v.y*q1.v.y) + (q1.v.z*q1.v.z));
Dannis_mbed 0:81b21910454e 676 //fPitch = -asin(2*q1.w*q1.v.y - 2*q1.v.x*q1.v.z);
Dannis_mbed 0:81b21910454e 677 fPitch = euler.y;
Dannis_mbed 0:81b21910454e 678 fPitch *= 180/3.14;
Dannis_mbed 0:81b21910454e 679 return (fPitch);
Dannis_mbed 0:81b21910454e 680
Dannis_mbed 0:81b21910454e 681 }
Dannis_mbed 0:81b21910454e 682
Dannis_mbed 0:81b21910454e 683 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 0:81b21910454e 684 // interrup-Handler for button on rotary-encoder //
Dannis_mbed 0:81b21910454e 685 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 0:81b21910454e 686 void trigger_sw(void)
Dannis_mbed 0:81b21910454e 687 {
Dannis_mbed 0:81b21910454e 688 enc_pressed = true; // just set the flag, rest is done outside isr
Dannis_mbed 0:81b21910454e 689 }
Dannis_mbed 0:81b21910454e 690
Dannis_mbed 0:81b21910454e 691 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 0:81b21910454e 692 // interrup-Handler for rotary-encoder rotation //
Dannis_mbed 0:81b21910454e 693 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 0:81b21910454e 694 void trigger_rotated(void)
Dannis_mbed 0:81b21910454e 695 {
Dannis_mbed 0:81b21910454e 696 enc_rotated = true; // just set the flag, rest is done outside isr
Dannis_mbed 0:81b21910454e 697 }
Dannis_mbed 0:81b21910454e 698
Dannis_mbed 0:81b21910454e 699 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 0:81b21910454e 700 // reset for rotary-encoder switch //
Dannis_mbed 0:81b21910454e 701 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 0:81b21910454e 702 void vResetSwitch (void)
Dannis_mbed 0:81b21910454e 703 {
Dannis_mbed 0:81b21910454e 704 rSwitch.Set(0);
Dannis_mbed 0:81b21910454e 705 }
Dannis_mbed 0:81b21910454e 706
Dannis_mbed 0:81b21910454e 707 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 0:81b21910454e 708 // set for rotary-encoder switch //
Dannis_mbed 0:81b21910454e 709 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 0:81b21910454e 710 void vSetSwitch (int value)
Dannis_mbed 0:81b21910454e 711 {
Dannis_mbed 0:81b21910454e 712 rSwitch.Set(value);
Dannis_mbed 0:81b21910454e 713 }
Dannis_mbed 0:81b21910454e 714
Dannis_mbed 0:81b21910454e 715 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 0:81b21910454e 716 // rotary-encoder switch rotated //
Dannis_mbed 0:81b21910454e 717 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 0:81b21910454e 718 void vSwitchRotated (void)
Dannis_mbed 0:81b21910454e 719 {
Dannis_mbed 0:81b21910454e 720 enc_rotated = false;
Dannis_mbed 0:81b21910454e 721 // get value from rotary encoder
Dannis_mbed 0:81b21910454e 722 thisGet = rSwitch.Get();
Dannis_mbed 0:81b21910454e 723 //if(rSwitch.Get()<0)
Dannis_mbed 0:81b21910454e 724 //debug.printf("negatief \r\n");
Dannis_mbed 0:81b21910454e 725 //else if(rSwitch.Get()>=0)
Dannis_mbed 0:81b21910454e 726 //debug.printf("positief \r\n");
Dannis_mbed 0:81b21910454e 727 // --- show for development ---
Dannis_mbed 0:81b21910454e 728 mLCDMenu.cShowScreen(_PULSE_IS);
Dannis_mbed 0:81b21910454e 729 vLCD_update();
Dannis_mbed 0:81b21910454e 730
Dannis_mbed 0:81b21910454e 731 //vLCD_printInt_I2C(thisGet, 1, 11);
Dannis_mbed 0:81b21910454e 732 }
Dannis_mbed 0:81b21910454e 733
Dannis_mbed 0:81b21910454e 734 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 0:81b21910454e 735 // rotary-encoder switch confirmed //
Dannis_mbed 0:81b21910454e 736 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 0:81b21910454e 737 void vSwitchConfirmed (void)
Dannis_mbed 0:81b21910454e 738 {
Dannis_mbed 0:81b21910454e 739 static char cTurns[2] ={0}; //[value][direction]
Dannis_mbed 0:81b21910454e 740 enc_pressed = false;
Dannis_mbed 0:81b21910454e 741
Dannis_mbed 0:81b21910454e 742 cTurns[0] = 10;//abs(rSwitch.Get()); // send absolute value
Dannis_mbed 0:81b21910454e 743 if(rSwitch.Get()>=0) cTurns[1] = CW; // CW
Dannis_mbed 0:81b21910454e 744 else cTurns[1] = CCW; // CCW
Dannis_mbed 0:81b21910454e 745 CANbus.write(CANMessage(ACTUATOR_STARB_ID, cTurns, 2)); // send message to port actuator
Dannis_mbed 0:81b21910454e 746 CANbus.write(CANMessage(ACTUATOR_PORT_ID, cTurns, 2)); // send message to port actuator
Dannis_mbed 0:81b21910454e 747 // reset switch count
Dannis_mbed 0:81b21910454e 748 vResetSwitch();
Dannis_mbed 0:81b21910454e 749 // get value from rotary encoder
Dannis_mbed 0:81b21910454e 750 thisGet = rSwitch.Get();
Dannis_mbed 0:81b21910454e 751 // --- show for development ---
Dannis_mbed 0:81b21910454e 752 //vLCD_printInt_I2C(thisGet, 1, 11);
Dannis_mbed 0:81b21910454e 753 }
Dannis_mbed 0:81b21910454e 754
Dannis_mbed 0:81b21910454e 755 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 0:81b21910454e 756 // CANbus send not used //
Dannis_mbed 0:81b21910454e 757 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 0:81b21910454e 758 void vCANBusSend(void)
Dannis_mbed 0:81b21910454e 759 {
Dannis_mbed 0:81b21910454e 760 static char counter = 0;
Dannis_mbed 0:81b21910454e 761 static char counterTwo = 0;
Dannis_mbed 0:81b21910454e 762 static char random[8] = {0};
Dannis_mbed 0:81b21910454e 763 //vLCD_printPos_I2C((unsigned char*)"CANbus send ", 2, 1);
Dannis_mbed 0:81b21910454e 764 switch(messageToSend){
Dannis_mbed 0:81b21910454e 765 case MSG1:
Dannis_mbed 0:81b21910454e 766 if(CANbus.write(CANMessage(1336, &counter, 1)))
Dannis_mbed 0:81b21910454e 767 {
Dannis_mbed 0:81b21910454e 768 counter++;
Dannis_mbed 0:81b21910454e 769 messageToSend = MSG2;
Dannis_mbed 0:81b21910454e 770 break;
Dannis_mbed 0:81b21910454e 771 }
Dannis_mbed 0:81b21910454e 772 case MSG2:
Dannis_mbed 0:81b21910454e 773 if(CANbus.write(CANMessage(1003, &counterTwo, 1)))
Dannis_mbed 0:81b21910454e 774 {
Dannis_mbed 0:81b21910454e 775 counterTwo++;
Dannis_mbed 0:81b21910454e 776 messageToSend = MSG3;
Dannis_mbed 0:81b21910454e 777 break;
Dannis_mbed 0:81b21910454e 778 }
Dannis_mbed 0:81b21910454e 779 case MSG3:
Dannis_mbed 0:81b21910454e 780 if(CANbus.write(CANMessage(1236, random, 4)))
Dannis_mbed 0:81b21910454e 781 {
Dannis_mbed 0:81b21910454e 782 random[0] = rand()% 10 + 1;
Dannis_mbed 0:81b21910454e 783 random[1] = rand()% 10 + 20;
Dannis_mbed 0:81b21910454e 784 random[2] = rand()% 100 + 1;
Dannis_mbed 0:81b21910454e 785 random[3] = 00;
Dannis_mbed 0:81b21910454e 786 //messageToSend = MSG1;
Dannis_mbed 0:81b21910454e 787 break;
Dannis_mbed 0:81b21910454e 788 }
Dannis_mbed 0:81b21910454e 789 } // end switch case
Dannis_mbed 0:81b21910454e 790
Dannis_mbed 0:81b21910454e 791 myLed = !myLed;
Dannis_mbed 0:81b21910454e 792 }
Dannis_mbed 0:81b21910454e 793
Dannis_mbed 0:81b21910454e 794 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 0:81b21910454e 795 // Get data from MPU fifo buffer //
Dannis_mbed 0:81b21910454e 796 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 0:81b21910454e 797 void vGetMPUBuffer(void)
Dannis_mbed 0:81b21910454e 798 {
Dannis_mbed 0:81b21910454e 799 int iFifoCount;
Dannis_mbed 0:81b21910454e 800 if (imu.getInterruptFifoOverflow())
Dannis_mbed 0:81b21910454e 801 imu.setFifoReset(true);
Dannis_mbed 0:81b21910454e 802 iFifoCount = imu.getFifoCount();
Dannis_mbed 0:81b21910454e 803 //debug.printf("fifocount: %i\r\n", iFifoCount);
Dannis_mbed 0:81b21910454e 804 if(imu.getFifoCount() >= 48){
Dannis_mbed 0:81b21910454e 805 if(iFifoCount % 48 != 0) imu.getFifoBuffer(cBuffer, iFifoCount % 48);
Dannis_mbed 0:81b21910454e 806 //imu.getFifoBuffer(cBuffer, iFifoCount- 48);
Dannis_mbed 0:81b21910454e 807 imu.getFifoBuffer(cBuffer, 48);
Dannis_mbed 0:81b21910454e 808 //myLed2 = !myLed2;
Dannis_mbed 0:81b21910454e 809 q1.decode(cBuffer);// quaternion vector to buffer
Dannis_mbed 0:81b21910454e 810 }
Dannis_mbed 0:81b21910454e 811 }
Dannis_mbed 0:81b21910454e 812
Dannis_mbed 0:81b21910454e 813 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 0:81b21910454e 814 // EOF //
Dannis_mbed 0:81b21910454e 815 //////////////////////////////////////////////////////////////////////////////////////
Dannis_mbed 0:81b21910454e 816
Dannis_mbed 0:81b21910454e 817 /*if (fifoCount == 1024) // test
Dannis_mbed 0:81b21910454e 818 {mpu.resetFIFO();} // reset so we can continue cleanly
Dannis_mbed 0:81b21910454e 819
Dannis_mbed 0:81b21910454e 820 else if (fifoCount >= 42) // otherwise, check for DMP data ready interrupt (this should happen frequently)
Dannis_mbed 0:81b21910454e 821 {
Dannis_mbed 0:81b21910454e 822 if ((fifoCount % stMPU9150->packetSize) != 0) // test
Dannis_mbed 0:81b21910454e 823 {mpu.getFIFOBytes(fifoBuffer, (fifoCount % stMPU9150->packetSize));} // test
Dannis_mbed 0:81b21910454e 824
Dannis_mbed 0:81b21910454e 825 while (mpu.getFIFOCount() >= 42)
Dannis_mbed 0:81b21910454e 826 {mpu.getFIFOBytes(fifoBuffer, stMPU9150->packetSize);} // read a packet from FIFO
Dannis_mbed 0:81b21910454e 827
Dannis_mbed 0:81b21910454e 828 mpu.dmpGetQuaternion(&stMPU9150->q, fifoBuffer);*/