Nurbol Nurdaulet / Mbed 2 deprecated state_machine_modes_1_12_11_11h

Dependencies:   cmd_io mbed WattBob_TextLCD MCP23017 globals

Committer:
Nurbol
Date:
Thu Dec 01 13:24:14 2011 +0000
Revision:
1:8a1818e89c49
Parent:
0:247c337c230a
Child:
2:881ca0a50c9b

        

Who changed what in which revision?

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