Nurbol Nurdaulet / Mbed 2 deprecated state_machine_modes_1_12_11

Dependencies:   mbed WattBob_TextLCD MCP23017 globals

Committer:
Nurbol
Date:
Thu Dec 01 08:40:29 2011 +0000
Revision:
1:7cb0ee7f57b6
Parent:
0:485df37a69ec

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Nurbol 0:485df37a69ec 1 #include "mbed.h"
Nurbol 0:485df37a69ec 2 #include "MCP23017.h"
Nurbol 0:485df37a69ec 3 #include "WattBob_TextLCD.h"
Nurbol 0:485df37a69ec 4 #include "cmd_io.h"
Nurbol 0:485df37a69ec 5 #include "globals.h"
Nurbol 0:485df37a69ec 6
Nurbol 0:485df37a69ec 7
Nurbol 0:485df37a69ec 8 //******************************************************************************
Nurbol 0:485df37a69ec 9 //declare ticker
Nurbol 0:485df37a69ec 10 //
Nurbol 0:485df37a69ec 11 Ticker timersensor;
Nurbol 0:485df37a69ec 12 Ticker timerstatemachine;
Nurbol 0:485df37a69ec 13
Nurbol 0:485df37a69ec 14 //******************************************************************************
Nurbol 0:485df37a69ec 15 //declare Pin
Nurbol 0:485df37a69ec 16 //
Nurbol 0:485df37a69ec 17 DigitalIn sensor1(p8);
Nurbol 0:485df37a69ec 18 DigitalIn sensor2(p7);
Nurbol 0:485df37a69ec 19 DigitalIn counter1p(p5); // Value when counter 1p = 10
Nurbol 0:485df37a69ec 20 DigitalIn counter2p(p6); // Value when counter 2p = 5
Nurbol 0:485df37a69ec 21 DigitalIn SW1p(p11); // Switch for the 1p
Nurbol 0:485df37a69ec 22 DigitalIn SW2p(p12); // Switch for the 2p
Nurbol 0:485df37a69ec 23
Nurbol 0:485df37a69ec 24 DigitalOut valueLED1(p23); // value sensor 2p send to the FPGA
Nurbol 0:485df37a69ec 25 DigitalOut valueLED2(p25); // value sensor 1p send to the FPGA
Nurbol 0:485df37a69ec 26 DigitalOut Reset(p27);
Nurbol 0:485df37a69ec 27 DigitalOut led1(LED1);
Nurbol 0:485df37a69ec 28 DigitalOut led2(LED2);
Nurbol 0:485df37a69ec 29 DigitalOut led3(LED3);
Nurbol 0:485df37a69ec 30 DigitalOut led4(LED4);
Nurbol 0:485df37a69ec 31 DigitalOut clk(p24);
Nurbol 0:485df37a69ec 32
Nurbol 0:485df37a69ec 33
Nurbol 0:485df37a69ec 34
Nurbol 0:485df37a69ec 35 //******************************************************************************
Nurbol 0:485df37a69ec 36 //declare variable
Nurbol 0:485df37a69ec 37 //
Nurbol 0:485df37a69ec 38 bool Position1_1p; // Position 1 for the 1p
Nurbol 0:485df37a69ec 39 bool Position2_1p; // Position 2 for the 1p
Nurbol 0:485df37a69ec 40 bool Position1_2p; // Position 1 for the 2p
Nurbol 0:485df37a69ec 41 bool Position2_2p; // Position 2 for the 2p
Nurbol 0:485df37a69ec 42 bool Motor;
Nurbol 0:485df37a69ec 43
Nurbol 0:485df37a69ec 44 bool bSort_Mode; //to use in the code to define the mode
Nurbol 0:485df37a69ec 45 bool bMaint_Mode; //to use in the code to define the mode
Nurbol 0:485df37a69ec 46
Nurbol 0:485df37a69ec 47 int state;
Nurbol 0:485df37a69ec 48
Nurbol 0:485df37a69ec 49
Nurbol 0:485df37a69ec 50
Nurbol 0:485df37a69ec 51 //******************************************************************************
Nurbol 0:485df37a69ec 52 // declare functions
Nurbol 0:485df37a69ec 53 //
Nurbol 0:485df37a69ec 54 void sensor (void); // Function to read sensors
Nurbol 0:485df37a69ec 55 void state_machine (void); // Function to go in the state machine to move the servos and the motor
Nurbol 0:485df37a69ec 56
Nurbol 0:485df37a69ec 57 //
Nurbol 0:485df37a69ec 58 // 3 servo outputs
Nurbol 0:485df37a69ec 59 //
Nurbol 0:485df37a69ec 60
Nurbol 0:485df37a69ec 61 PwmOut servo_0(p26);
Nurbol 0:485df37a69ec 62 PwmOut servo_4(p22);
Nurbol 0:485df37a69ec 63 PwmOut servo_5(p21);
Nurbol 0:485df37a69ec 64
Nurbol 0:485df37a69ec 65 //
Nurbol 0:485df37a69ec 66 // objects necessary to use the 2*16 character MBED display
Nurbol 0:485df37a69ec 67 //
Nurbol 0:485df37a69ec 68 MCP23017 *par_port;
Nurbol 0:485df37a69ec 69 WattBob_TextLCD *lcd;
Nurbol 0:485df37a69ec 70 //
Nurbol 0:485df37a69ec 71 // Virtual COM port over USB link to laptop/PC
Nurbol 0:485df37a69ec 72 //
Nurbol 0:485df37a69ec 73 Serial pc(USBTX, USBRX);
Nurbol 0:485df37a69ec 74
Nurbol 0:485df37a69ec 75 //******************************************************************************
Nurbol 0:485df37a69ec 76 // Defined GLOBAL variables and structures
Nurbol 0:485df37a69ec 77 //
Nurbol 0:485df37a69ec 78 CMD_STRUCT ext_cmd; // structure to hold command data
Nurbol 0:485df37a69ec 79 STAT_STRUCT ext_stat; // structure to hold status reply
Nurbol 0:485df37a69ec 80
Nurbol 0:485df37a69ec 81
Nurbol 0:485df37a69ec 82 //CMD_STRUCT commandcounter2;
Nurbol 0:485df37a69ec 83
Nurbol 0:485df37a69ec 84 uint32_t last_servo; // store for last servo number
Nurbol 0:485df37a69ec 85
Nurbol 0:485df37a69ec 86 //************************************************************************
Nurbol 0:485df37a69ec 87 //************************************************************************
Nurbol 0:485df37a69ec 88 // init_sys : initialise the system
Nurbol 0:485df37a69ec 89 // ========
Nurbol 0:485df37a69ec 90 //
Nurbol 0:485df37a69ec 91 // 1. Configure 2*16 character display
Nurbol 0:485df37a69ec 92 // 2. Print "COM test" string
Nurbol 0:485df37a69ec 93 // 3. initialise relevant global variables
Nurbol 0:485df37a69ec 94 // 4. set COM port baud rate to 19200 bits per second
Nurbol 0:485df37a69ec 95 //
Nurbol 0:485df37a69ec 96 void init_sys(void) {
Nurbol 0:485df37a69ec 97
Nurbol 0:485df37a69ec 98 par_port = new MCP23017(p9, p10, 0x40);
Nurbol 0:485df37a69ec 99 lcd = new WattBob_TextLCD(par_port);
Nurbol 0:485df37a69ec 100
Nurbol 0:485df37a69ec 101 par_port->write_bit(1,BL_BIT); // turn LCD backlight ON
Nurbol 0:485df37a69ec 102 lcd->cls();
Nurbol 0:485df37a69ec 103 lcd->locate(0,7);
Nurbol 0:485df37a69ec 104 lcd->printf("W3C");
Nurbol 0:485df37a69ec 105
Nurbol 0:485df37a69ec 106 servo_0.period(0.020); // servo requires a 20ms period, common for all 5 servo objects
Nurbol 0:485df37a69ec 107 last_servo = SERVO_UNKNOWN;
Nurbol 0:485df37a69ec 108 pc.baud(19200);
Nurbol 0:485df37a69ec 109
Nurbol 0:485df37a69ec 110 servo_0.pulsewidth_us(1000 + (0 * 1000) / 90); // Servo 1p initialise in position 1
Nurbol 0:485df37a69ec 111 servo_5.pulsewidth_us(1000 + (0 * 1000) / 90); // Servo 2p initialise in position 1
Nurbol 0:485df37a69ec 112 servo_4.pulsewidth_us(0); // Motor stop
Nurbol 0:485df37a69ec 113
Nurbol 0:485df37a69ec 114 Position1_1p = 1;
Nurbol 0:485df37a69ec 115 Position2_1p = 0;
Nurbol 0:485df37a69ec 116 Position1_2p = 1;
Nurbol 0:485df37a69ec 117 Position2_2p = 0;
Nurbol 0:485df37a69ec 118
Nurbol 0:485df37a69ec 119 state = 0;
Nurbol 0:485df37a69ec 120 Reset = 1;
Nurbol 0:485df37a69ec 121
Nurbol 0:485df37a69ec 122 valueLED1=0;
Nurbol 0:485df37a69ec 123 valueLED2=0;
Nurbol 0:485df37a69ec 124
Nurbol 0:485df37a69ec 125 clk=0;
Nurbol 1:7cb0ee7f57b6 126 Motor = 0;
Nurbol 0:485df37a69ec 127 return;
Nurbol 0:485df37a69ec 128 } // end init_sys
Nurbol 0:485df37a69ec 129
Nurbol 0:485df37a69ec 130 //************************************************************************
Nurbol 0:485df37a69ec 131 // process_cmd : decode and execute command
Nurbol 0:485df37a69ec 132 // ===========
Nurbol 0:485df37a69ec 133 uint32_t process_cmd(CMD_STRUCT *command)
Nurbol 0:485df37a69ec 134 {
Nurbol 0:485df37a69ec 135 int32_t pulse_width;
Nurbol 0:485df37a69ec 136
Nurbol 0:485df37a69ec 137 switch (command->cmd_code) {
Nurbol 0:485df37a69ec 138 //
Nurbol 0:485df37a69ec 139 // move a servo
Nurbol 0:485df37a69ec 140 //
Nurbol 0:485df37a69ec 141 case SERVO_CMD :
Nurbol 0:485df37a69ec 142 command->nos_data = 0; // no data to be returned
Nurbol 0:485df37a69ec 143 //
Nurbol 0:485df37a69ec 144 // check that parameters are OK
Nurbol 0:485df37a69ec 145 //
Nurbol 0:485df37a69ec 146 if (command->nos_params != 2) { // check for 2 parameters
Nurbol 0:485df37a69ec 147 command->result_status = CMD_BAD_NUMBER_OF_PARAMETERS;
Nurbol 0:485df37a69ec 148 break;
Nurbol 0:485df37a69ec 149 }
Nurbol 0:485df37a69ec 150 if (command->param[0] > MAX_SERVO_NUMBER ) { // check servo number
Nurbol 0:485df37a69ec 151 command->result_status = CMD_BAD_SERVO_NUMBER;
Nurbol 0:485df37a69ec 152 break;
Nurbol 0:485df37a69ec 153 }
Nurbol 0:485df37a69ec 154 if ((command->param[1] < MIN_SERVO_ANGLE) ||
Nurbol 0:485df37a69ec 155 (command->param[1] > MAX_SERVO_ANGLE) ) {
Nurbol 0:485df37a69ec 156 command->result_status = CMD_BAD_SERVO_VALUE;
Nurbol 0:485df37a69ec 157 break;
Nurbol 0:485df37a69ec 158 }
Nurbol 0:485df37a69ec 159 if ((command->param[0] == 4) && (command->param[1] == 0)) {
Nurbol 0:485df37a69ec 160 pulse_width = 0; // convert angle to pulse width
Nurbol 0:485df37a69ec 161 }
Nurbol 0:485df37a69ec 162 else{
Nurbol 0:485df37a69ec 163 pulse_width = 1000 + (command->param[1] * 1000) / 90; // convert angle to pulse width
Nurbol 0:485df37a69ec 164 }
Nurbol 0:485df37a69ec 165
Nurbol 0:485df37a69ec 166
Nurbol 0:485df37a69ec 167
Nurbol 0:485df37a69ec 168 //
Nurbol 0:485df37a69ec 169 // implement servo move to all 5 servos
Nurbol 0:485df37a69ec 170 //
Nurbol 0:485df37a69ec 171 switch (command->param[0]) {
Nurbol 0:485df37a69ec 172 case 0 : servo_0.pulsewidth_us(pulse_width); break;
Nurbol 0:485df37a69ec 173 case 4 : servo_4.pulsewidth_us(pulse_width); break;
Nurbol 0:485df37a69ec 174 case 5 : servo_5.pulsewidth_us(pulse_width); break;
Nurbol 0:485df37a69ec 175 }
Nurbol 0:485df37a69ec 176 last_servo = command->param[0];
Nurbol 0:485df37a69ec 177 break;
Nurbol 0:485df37a69ec 178 //
Nurbol 1:7cb0ee7f57b6 179 // return data of the value of sensor 1p and sensor 2p
Nurbol 0:485df37a69ec 180 //
Nurbol 0:485df37a69ec 181 case READ_CMD :
Nurbol 1:7cb0ee7f57b6 182 if((bSort_Mode == 0)&&(bMaint_Mode == 1)){ // when we are on sort mode
Nurbol 1:7cb0ee7f57b6 183 command->nos_data = 2;
Nurbol 0:485df37a69ec 184 command->result_data[0] = valueLED1;
Nurbol 0:485df37a69ec 185 command->result_data[1] = valueLED2;
Nurbol 0:485df37a69ec 186 }
Nurbol 0:485df37a69ec 187 break;
Nurbol 0:485df37a69ec 188
Nurbol 0:485df37a69ec 189 //
Nurbol 0:485df37a69ec 190 // Mode value
Nurbol 0:485df37a69ec 191 //
Nurbol 1:7cb0ee7f57b6 192 case MAINT_MODE : // Maintenance mode
Nurbol 0:485df37a69ec 193 bSort_Mode = 0;
Nurbol 0:485df37a69ec 194 bMaint_Mode = 1;
Nurbol 0:485df37a69ec 195 Reset = 1;
Nurbol 1:7cb0ee7f57b6 196 servo_4.pulsewidth_us(0); // Motor stop
Nurbol 1:7cb0ee7f57b6 197 servo_0.pulsewidth_us(0); // Servo 1p stop
Nurbol 1:7cb0ee7f57b6 198 servo_5.pulsewidth_us(0); // Servo 2p stop
Nurbol 0:485df37a69ec 199 lcd->cls();
Nurbol 0:485df37a69ec 200 lcd->locate(0,7);
Nurbol 0:485df37a69ec 201 lcd->printf("W3C");
Nurbol 0:485df37a69ec 202 lcd->locate(1,0);
Nurbol 0:485df37a69ec 203 lcd->printf("maintenance mode");
Nurbol 0:485df37a69ec 204 break;
Nurbol 0:485df37a69ec 205
Nurbol 0:485df37a69ec 206
Nurbol 1:7cb0ee7f57b6 207 case SORT_MODE : // sort mode
Nurbol 0:485df37a69ec 208 bSort_Mode = 1;
Nurbol 0:485df37a69ec 209 bMaint_Mode = 0;
Nurbol 0:485df37a69ec 210 Reset = 0;
Nurbol 0:485df37a69ec 211 state = 0;
Nurbol 0:485df37a69ec 212 lcd->cls();
Nurbol 0:485df37a69ec 213 lcd->locate(0,7);
Nurbol 0:485df37a69ec 214 lcd->printf("W3C");
Nurbol 0:485df37a69ec 215 lcd->locate(1,0);
Nurbol 0:485df37a69ec 216 lcd->printf("sort mode");
Nurbol 0:485df37a69ec 217
Nurbol 0:485df37a69ec 218 break;
Nurbol 0:485df37a69ec 219
Nurbol 0:485df37a69ec 220 //
Nurbol 0:485df37a69ec 221 // Urgency mode
Nurbol 0:485df37a69ec 222 //
Nurbol 1:7cb0ee7f57b6 223 case URGENCY :
Nurbol 0:485df37a69ec 224 Reset = 1;
Nurbol 0:485df37a69ec 225 bSort_Mode = 0;
Nurbol 0:485df37a69ec 226 bMaint_Mode = 0;
Nurbol 0:485df37a69ec 227 state = 0;
Nurbol 1:7cb0ee7f57b6 228 servo_4.pulsewidth_us(0); // Motor stop
Nurbol 1:7cb0ee7f57b6 229 servo_0.pulsewidth_us(0); // Servo 1p stop
Nurbol 1:7cb0ee7f57b6 230 servo_5.pulsewidth_us(0); // Servo 2p stop
Nurbol 0:485df37a69ec 231 lcd->cls();
Nurbol 0:485df37a69ec 232 lcd->locate(0,7);
Nurbol 0:485df37a69ec 233 lcd->printf("W3C");
Nurbol 0:485df37a69ec 234 lcd->locate(1,0);
Nurbol 0:485df37a69ec 235 lcd->printf("urgency mode");
Nurbol 0:485df37a69ec 236 break;
Nurbol 0:485df37a69ec 237 //
Nurbol 0:485df37a69ec 238 // Exit mode
Nurbol 0:485df37a69ec 239 //
Nurbol 0:485df37a69ec 240 case EXIT :
Nurbol 0:485df37a69ec 241 Reset = 1;
Nurbol 0:485df37a69ec 242 bSort_Mode = 0;
Nurbol 0:485df37a69ec 243 bMaint_Mode = 0;
Nurbol 0:485df37a69ec 244 state = 0;
Nurbol 1:7cb0ee7f57b6 245 servo_4.pulsewidth_us(0); // Motor stop
Nurbol 1:7cb0ee7f57b6 246 servo_0.pulsewidth_us(0); // sensor 1p stop
Nurbol 1:7cb0ee7f57b6 247 servo_5.pulsewidth_us(0); // sensor 2p stop
Nurbol 0:485df37a69ec 248 lcd->cls();
Nurbol 0:485df37a69ec 249 lcd->locate(0,7);
Nurbol 0:485df37a69ec 250 lcd->printf("W3C");
Nurbol 1:7cb0ee7f57b6 251 break;
Nurbol 1:7cb0ee7f57b6 252
Nurbol 1:7cb0ee7f57b6 253 // Send data of the value led 2p
Nurbol 1:7cb0ee7f57b6 254 case VALUE_LED1 :
Nurbol 1:7cb0ee7f57b6 255 command->nos_data = 1;
Nurbol 1:7cb0ee7f57b6 256 command->result_data[0] = valueLED1;
Nurbol 1:7cb0ee7f57b6 257 break;
Nurbol 1:7cb0ee7f57b6 258
Nurbol 1:7cb0ee7f57b6 259 // Send data of the value led 1p
Nurbol 1:7cb0ee7f57b6 260 case VALUE_LED2 :
Nurbol 1:7cb0ee7f57b6 261 command->nos_data = 2;
Nurbol 1:7cb0ee7f57b6 262 command->result_data[1] = valueLED2;
Nurbol 1:7cb0ee7f57b6 263 break;
Nurbol 1:7cb0ee7f57b6 264
Nurbol 1:7cb0ee7f57b6 265 // Send data of the value counter 1p
Nurbol 1:7cb0ee7f57b6 266 case COUNTER1P :
Nurbol 1:7cb0ee7f57b6 267 command->nos_data = 3;
Nurbol 1:7cb0ee7f57b6 268 command->result_data[2] = counter1p;
Nurbol 1:7cb0ee7f57b6 269 break;
Nurbol 1:7cb0ee7f57b6 270
Nurbol 1:7cb0ee7f57b6 271 // Send data of the value counter 2p
Nurbol 1:7cb0ee7f57b6 272 case COUNTER2P :
Nurbol 1:7cb0ee7f57b6 273 command->nos_data = 4;
Nurbol 1:7cb0ee7f57b6 274 command->result_data[3] = counter2p;
Nurbol 1:7cb0ee7f57b6 275 break;
Nurbol 1:7cb0ee7f57b6 276
Nurbol 1:7cb0ee7f57b6 277 // Send data of the value position1 1p
Nurbol 1:7cb0ee7f57b6 278 case POSITION1_1P :
Nurbol 1:7cb0ee7f57b6 279 command->nos_data = 1;
Nurbol 1:7cb0ee7f57b6 280 command->result_data[0] = Position1_1p;
Nurbol 1:7cb0ee7f57b6 281 break;
Nurbol 1:7cb0ee7f57b6 282
Nurbol 1:7cb0ee7f57b6 283 // Send data of the value position1 2p
Nurbol 1:7cb0ee7f57b6 284 case POSITION1_2P :
Nurbol 1:7cb0ee7f57b6 285 command->nos_data = 2;
Nurbol 1:7cb0ee7f57b6 286 command->result_data[1] = Position1_2p;
Nurbol 1:7cb0ee7f57b6 287 break;
Nurbol 1:7cb0ee7f57b6 288
Nurbol 1:7cb0ee7f57b6 289 // Send data of the motor
Nurbol 1:7cb0ee7f57b6 290 case MOTOR :
Nurbol 1:7cb0ee7f57b6 291 command->nos_data = 3;
Nurbol 1:7cb0ee7f57b6 292 command->result_data[2] = Motor;
Nurbol 1:7cb0ee7f57b6 293 break;
Nurbol 1:7cb0ee7f57b6 294
Nurbol 0:485df37a69ec 295 //
Nurbol 0:485df37a69ec 296 // catch any problems
Nurbol 0:485df37a69ec 297 //
Nurbol 0:485df37a69ec 298 default:
Nurbol 0:485df37a69ec 299 command->nos_data = 0; // no data to be returned
Nurbol 0:485df37a69ec 300 command->result_status = CMD_BAD_SERVO_VALUE;
Nurbol 0:485df37a69ec 301 break;
Nurbol 0:485df37a69ec 302 }
Nurbol 0:485df37a69ec 303 return OK;
Nurbol 0:485df37a69ec 304 }
Nurbol 0:485df37a69ec 305
Nurbol 0:485df37a69ec 306 //************************************************************************
Nurbol 0:485df37a69ec 307
Nurbol 0:485df37a69ec 308 //function to send value on the FPGA when 1p or 2p are detected
Nurbol 0:485df37a69ec 309 void sensor (void){
Nurbol 0:485df37a69ec 310 sensor1.read();
Nurbol 0:485df37a69ec 311 sensor2.read();
Nurbol 0:485df37a69ec 312
Nurbol 0:485df37a69ec 313 clk = !clk;
Nurbol 0:485df37a69ec 314 wait(0.01);
Nurbol 0:485df37a69ec 315
Nurbol 0:485df37a69ec 316 if(sensor1 > 0.5) {
Nurbol 0:485df37a69ec 317 led1 = 1;
Nurbol 0:485df37a69ec 318 valueLED1 = 1;
Nurbol 0:485df37a69ec 319 }
Nurbol 0:485df37a69ec 320 else if(sensor1 < 0.5){
Nurbol 0:485df37a69ec 321 led1 = 0;
Nurbol 0:485df37a69ec 322 valueLED1 = 0;
Nurbol 0:485df37a69ec 323 }
Nurbol 0:485df37a69ec 324 if(sensor2 > 0.5) {
Nurbol 0:485df37a69ec 325 led2 = 1;
Nurbol 0:485df37a69ec 326 valueLED2 = 1;
Nurbol 0:485df37a69ec 327 }
Nurbol 0:485df37a69ec 328 else if(sensor2 < 0.5){
Nurbol 0:485df37a69ec 329 led2 = 0;
Nurbol 0:485df37a69ec 330 valueLED2 = 0;
Nurbol 0:485df37a69ec 331 }
Nurbol 0:485df37a69ec 332 }
Nurbol 0:485df37a69ec 333
Nurbol 0:485df37a69ec 334
Nurbol 0:485df37a69ec 335 //function for the state machine to move servos between 2 positions
Nurbol 0:485df37a69ec 336 void state_machine (){
Nurbol 0:485df37a69ec 337 if((bSort_Mode == 1)&&(bMaint_Mode == 0)){
Nurbol 0:485df37a69ec 338 switch(state)
Nurbol 0:485df37a69ec 339 {
Nurbol 0:485df37a69ec 340 case 0: // initial state
Nurbol 0:485df37a69ec 341 servo_4.pulsewidth_us(1000 + (25 * 1000) / 90); // motor is run
Nurbol 0:485df37a69ec 342 servo_0.pulsewidth_us(1000 + (0 * 1000) / 90); // servo 1p go to position 1
Nurbol 0:485df37a69ec 343 servo_5.pulsewidth_us(1000 + (0 * 1000) / 90); // servo 2p go to position 1
Nurbol 0:485df37a69ec 344 Position1_1p = 1;
Nurbol 0:485df37a69ec 345 Position2_1p = 0;
Nurbol 0:485df37a69ec 346 Position1_2p = 1;
Nurbol 0:485df37a69ec 347 Position2_2p = 0;
Nurbol 0:485df37a69ec 348 Motor = 1;
Nurbol 0:485df37a69ec 349 led3 = 0;
Nurbol 0:485df37a69ec 350 led4 = 0;
Nurbol 0:485df37a69ec 351 counter1p.read();
Nurbol 0:485df37a69ec 352 counter2p.read();
Nurbol 0:485df37a69ec 353 if(SW1p == 0){
Nurbol 0:485df37a69ec 354 if(counter1p > 0.5){
Nurbol 0:485df37a69ec 355 state = 1;
Nurbol 0:485df37a69ec 356 }
Nurbol 0:485df37a69ec 357 }
Nurbol 0:485df37a69ec 358 if(SW2p == 0){
Nurbol 0:485df37a69ec 359 if(counter2p > 0.5){
Nurbol 0:485df37a69ec 360 state = 4;
Nurbol 0:485df37a69ec 361 }
Nurbol 0:485df37a69ec 362 }
Nurbol 0:485df37a69ec 363 break;
Nurbol 0:485df37a69ec 364 case 1: // state 1 if counter1p = 1
Nurbol 0:485df37a69ec 365 servo_4.pulsewidth_us(0); // motor stop
Nurbol 0:485df37a69ec 366 wait(2);
Nurbol 0:485df37a69ec 367 servo_0.pulsewidth_us(1000 + (200 * 1000) / 90); // servo 1p go to position 2
Nurbol 0:485df37a69ec 368 wait(1);
Nurbol 0:485df37a69ec 369 Position1_1p = 0;
Nurbol 0:485df37a69ec 370 Position2_1p = 1;
Nurbol 0:485df37a69ec 371 Motor = 0;
Nurbol 0:485df37a69ec 372 if((Position2_1p == 1)&&(counter1p < 0.5)){
Nurbol 0:485df37a69ec 373 state = 2;
Nurbol 0:485df37a69ec 374 }
Nurbol 0:485df37a69ec 375 break;
Nurbol 0:485df37a69ec 376 case 2: // state 2 if servo 1p is in position 2
Nurbol 0:485df37a69ec 377 servo_4.pulsewidth_us(1000 + (25 * 1000) / 90); // motor is run
Nurbol 0:485df37a69ec 378 Motor = 1;
Nurbol 0:485df37a69ec 379 counter1p.read();
Nurbol 0:485df37a69ec 380 if(counter1p > 0.5){
Nurbol 0:485df37a69ec 381 state = 3;
Nurbol 0:485df37a69ec 382 }
Nurbol 0:485df37a69ec 383 break;
Nurbol 0:485df37a69ec 384 case 3: // state 3 if counter 1p = 1
Nurbol 0:485df37a69ec 385 servo_4.pulsewidth_us(0); // motor stop
Nurbol 0:485df37a69ec 386 Motor = 0;
Nurbol 0:485df37a69ec 387 led3 = 1;
Nurbol 0:485df37a69ec 388 if(SW1p == 1){ // wait SW 1p to go to the initial state
Nurbol 0:485df37a69ec 389 state = 0;
Nurbol 0:485df37a69ec 390 }
Nurbol 0:485df37a69ec 391 break;
Nurbol 0:485df37a69ec 392 case 4: // state 4 if counter 2p = 1
Nurbol 0:485df37a69ec 393 servo_4.pulsewidth_us(0); // motor stop
Nurbol 0:485df37a69ec 394 wait(2);
Nurbol 0:485df37a69ec 395 servo_5.pulsewidth_us(1000 + (200 * 1000) / 90); // servo 2p go to position 2
Nurbol 0:485df37a69ec 396 wait(1);
Nurbol 0:485df37a69ec 397 Position1_2p = 0;
Nurbol 0:485df37a69ec 398 Position2_2p = 1;
Nurbol 0:485df37a69ec 399 Motor = 0;
Nurbol 0:485df37a69ec 400 if((Position2_2p == 1)&&(counter2p < 0.5)){
Nurbol 0:485df37a69ec 401 state = 5;
Nurbol 0:485df37a69ec 402 }
Nurbol 0:485df37a69ec 403 break;
Nurbol 0:485df37a69ec 404 case 5: // state 5 if servo 2p is in position 2
Nurbol 0:485df37a69ec 405 servo_4.pulsewidth_us(1000 + (25 * 1000) / 90); // motor run
Nurbol 0:485df37a69ec 406 Motor = 1;
Nurbol 0:485df37a69ec 407 counter2p.read();
Nurbol 0:485df37a69ec 408 if(counter2p > 0.5){
Nurbol 0:485df37a69ec 409 state = 6;
Nurbol 0:485df37a69ec 410 }
Nurbol 0:485df37a69ec 411 break;
Nurbol 0:485df37a69ec 412 case 6: // state 6 if counter 2p = 1
Nurbol 0:485df37a69ec 413 servo_4.pulsewidth_us(0); // motor stop
Nurbol 0:485df37a69ec 414 Motor = 0;
Nurbol 0:485df37a69ec 415 led4 = 1;
Nurbol 0:485df37a69ec 416 if(SW2p == 1){ // wait SW 2p to go to the initial state
Nurbol 0:485df37a69ec 417 state = 0;
Nurbol 0:485df37a69ec 418 }
Nurbol 0:485df37a69ec 419 break;
Nurbol 0:485df37a69ec 420 }
Nurbol 0:485df37a69ec 421 }
Nurbol 0:485df37a69ec 422 }
Nurbol 0:485df37a69ec 423
Nurbol 1:7cb0ee7f57b6 424 //
Nurbol 0:485df37a69ec 425 //************************************************************************
Nurbol 1:7cb0ee7f57b6 426 // Main Program
Nurbol 0:485df37a69ec 427 //
Nurbol 0:485df37a69ec 428 int main() {
Nurbol 0:485df37a69ec 429
Nurbol 0:485df37a69ec 430 init_sys();
Nurbol 0:485df37a69ec 431 Reset = 0;
Nurbol 0:485df37a69ec 432
Nurbol 0:485df37a69ec 433 FOREVER {
Nurbol 0:485df37a69ec 434
Nurbol 0:485df37a69ec 435 timersensor.attach(&sensor, 0.02); //function sensor is reading all the 20 ms
Nurbol 0:485df37a69ec 436
Nurbol 0:485df37a69ec 437 counter1p.read();
Nurbol 0:485df37a69ec 438 counter2p.read();
Nurbol 0:485df37a69ec 439
Nurbol 1:7cb0ee7f57b6 440 timerstatemachine.attach(&state_machine, 0.1); // function state machine is readinf all the 100 ms
Nurbol 0:485df37a69ec 441
Nurbol 0:485df37a69ec 442 clk = !clk;
Nurbol 0:485df37a69ec 443 wait(0.001);
Nurbol 0:485df37a69ec 444
Nurbol 0:485df37a69ec 445 get_cmd(&ext_cmd);
Nurbol 0:485df37a69ec 446 //
Nurbol 0:485df37a69ec 447 // Check status of read command activity and return an error status if there was a problem
Nurbol 0:485df37a69ec 448 // If there is a problem, then return status code only and wait for next command.
Nurbol 0:485df37a69ec 449 //
Nurbol 0:485df37a69ec 450 if (ext_cmd.result_status != OK){
Nurbol 0:485df37a69ec 451 send_status(ext_cmd.result_status);
Nurbol 0:485df37a69ec 452 continue;
Nurbol 0:485df37a69ec 453 }
Nurbol 0:485df37a69ec 454 //
Nurbol 0:485df37a69ec 455 // Parse command and return an error staus if there is a problem
Nurbol 0:485df37a69ec 456 // If there is a problem, then return status code only and wait for next command.
Nurbol 0:485df37a69ec 457 //
Nurbol 0:485df37a69ec 458 parse_cmd(&ext_cmd);
Nurbol 0:485df37a69ec 459 // lcd->locate(1,0); lcd->printf(ext_cmd.cmd_str);
Nurbol 0:485df37a69ec 460 if ((ext_cmd.result_status != OK) && (ext_cmd.cmd_code != TEXT_CMD)){
Nurbol 0:485df37a69ec 461 lcd->cls(); lcd->locate(0,0); lcd->printf("W3C"); lcd->locate(1,0); lcd->printf("parse : error");
Nurbol 0:485df37a69ec 462 send_status(ext_cmd.result_status);
Nurbol 0:485df37a69ec 463 continue;
Nurbol 0:485df37a69ec 464 }
Nurbol 0:485df37a69ec 465 //
Nurbol 0:485df37a69ec 466 // Execute command and return an error staus if there is a problem
Nurbol 0:485df37a69ec 467 //
Nurbol 0:485df37a69ec 468 process_cmd(&ext_cmd);
Nurbol 0:485df37a69ec 469 reply_to_cmd(&ext_cmd);
Nurbol 0:485df37a69ec 470 }
Nurbol 0:485df37a69ec 471
Nurbol 0:485df37a69ec 472 }
Nurbol 0:485df37a69ec 473
Nurbol 0:485df37a69ec 474
Nurbol 0:485df37a69ec 475
Nurbol 0:485df37a69ec 476
Nurbol 0:485df37a69ec 477
Nurbol 0:485df37a69ec 478
Nurbol 0:485df37a69ec 479
Nurbol 0:485df37a69ec 480
Nurbol 0:485df37a69ec 481