![](/media/cache/group/default_image.jpg.50x50_q85.jpg)
Coursework
Diff: main.cpp
- Revision:
- 17:dee80717e423
- Parent:
- 16:2646c1c4e62e
--- a/main.cpp Thu Jan 13 20:53:37 2022 +0000 +++ b/main.cpp Sat Jan 15 16:18:09 2022 +0000 @@ -15,13 +15,21 @@ // array of states in the FSM, each element is the output of the counter // set the output in binary to make it easier, 0 is LED on, 1 is LED off string fsm[4] = {"buttonA_isr","buttonB_isr","buttonAsss_isr","buttonA_isr"}; -volatile int Press; +volatile int Press; // Used to track the press +volatile int g_buttonA_flag = 0; // Global Flag +volatile int g_buttonB_flag = 0; // Global Flag +volatile int g_buttonX_flag = 0; // Global Flag +volatile int g_buttonY_flag = 0; // Global Flag +volatile int g_buttonStart_flag = 0; // Global Flag +volatile int g_buttonBack_flag = 0; // Global Flag +volatile int g_buttonLeft_flag = 0; // Global Flag +volatile int g_buttonRight_flag = 0; // Global Flag // y x button Joystick joystick(PTB10,PTB11,PTC16); HCSR04 sensor(D14, D15); Piezo Buzzer(PTC10); -//Bringing in buttons +//Bringing in buttons as interuppts to allow change to be detected during operation InterruptIn buttonA(PTB9); InterruptIn buttonB(PTD0); InterruptIn buttonX(PTC17); @@ -32,7 +40,7 @@ InterruptIn buttonRight(PTB3); // create an event queue -EventQueue queue; // events are needed to get arround the printf issue +EventQueue queue; // Event Queue is used to get around interrupt issue with Printf and LCDprint issues //rows,cols int sprite[8][5] = { { 0,0,1,0,0 }, @@ -45,7 +53,6 @@ { 1,1,0,1,1 }, }; void init_K64F(); // Start K64fBoard - void buttonA_isr(); // Button A interrupt service routine void buttonB_isr(); // Button B interrupt service routine void buttonX_isr(); // Button X interrupt service routine @@ -54,20 +61,9 @@ void buttonBack_isr(); // Button Back interrupt service routine void buttonLeft_isr(); // Button Left interrupt service routine void buttonRight_isr(); // Button Right interrupt service routine -volatile int g_buttonA_flag = 0; // Global Flag -volatile int g_buttonB_flag = 0; // Global Flag -volatile int g_buttonX_flag = 0; // Global Flag -volatile int g_buttonY_flag = 0; // Global Flag -volatile int g_buttonStart_flag = 0; // Global Flag -volatile int g_buttonBack_flag = 0; // Global Flag -volatile int g_buttonLeft_flag = 0; // Global Flag -volatile int g_buttonRight_flag = 0; // Global Flag + int buttonCounter(); -//volatile int g_buttonA_counter = 0; // Global counter -//Test function after research C++ lanuage 05/01/22 -int cube(int num){ - return num*num; - }; + // Menu Items int page1; int page2; @@ -76,79 +72,39 @@ string Listitem2 = "Measure"; // measure distance of object string Listitem3 = "Detect"; // alarm when object is dectected N5110 lcd(PTC9,PTC0,PTC7,PTD2,PTD1,PTC11); - /* Test of the interup an operating the buzzer this kills the board - void buzzme(){ - Buzzer.play(200,120); - wait_ms(5); - Buzzer.play(200,120);; - } - */ - void printme(){ - - volatile double x ; - x = 1; - printf("%f\n",x); - // return 0; - } - + +int main() { -//void returnme(){ -//int num; - // return num*num; - // }; -int main() { -//initialise Joystic - joystick.init(); - - // create a thread that'll run the event queue's dispatch function + joystick.init(); //initialise Joystick + lcd.init(); //first need to initialise display + //change set contrast in range 0.0 to 1.0 + //0.5 appears to be a good starting point + lcd.setContrast(0.5); + + // create a thread that'll run the event queue's dispatch function Thread eventThread; eventThread.start(callback(&queue, &EventQueue::dispatch_forever)); - - buttonA.rise(queue.event(&buttonA_isr)); // This is used to call the function putting it in queue allowing the screen toupdat no muxt error - buttonB.rise(queue.event(&buttonB_isr)); - buttonX.rise(queue.event(&buttonX_isr)); - buttonY.rise(queue.event(&buttonY_isr)); - buttonStart.rise(queue.event(&buttonStart_isr)); // This is used to call the function putting it in queue allowing the screen toupdat no muxt error - buttonBack.rise(queue.event(&buttonBack_isr)); - buttonLeft.rise(queue.event(&buttonLeft_isr)); + // This is used to call the function putting it in queue allowing the screen toupdat no muxt error + buttonA.rise(queue.event(&buttonA_isr)); + buttonB.rise(queue.event(&buttonB_isr)); + buttonX.rise(queue.event(&buttonX_isr)); + buttonY.rise(queue.event(&buttonY_isr)); + buttonStart.rise(queue.event(&buttonStart_isr)); + buttonBack.rise(queue.event(&buttonBack_isr)); + buttonLeft.rise(queue.event(&buttonLeft_isr)); buttonRight.rise(queue.event(&buttonRight_isr)); -//first need to initialise display - lcd.init(); - // Button A is connected between the pin and 3.3 V, we therefore need to turn on the internal pull-down resister - buttonA.mode(PullDown); - // Button B is connected between the pin and 3.3 V, we therefore need to turn on the internal pull-down resister - buttonB.mode(PullDown); - // Button X is connected between the pin and 3.3 V, we therefore need to turn on the internal pull-down resister - buttonX.mode(PullDown); - // Button Y is connected between the pin and 3.3 V, we therefore need to turn on the internal pull-down resister - buttonY.mode(PullDown); - // Button Start is connected between the pin and 3.3 V, we therefore need to turn on the internal pull-down resister + +// Buttons are connected between the pin and 3.3 V, we therefore need to turn on the internal pull-down resister + buttonA.mode(PullDown); + buttonB.mode(PullDown); + buttonX.mode(PullDown); + buttonY.mode(PullDown); buttonStart.mode(PullDown); - // Button Back is connected between the pin and 3.3 V, we therefore need to turn on the internal pull-down resister - buttonBack.mode(PullDown); - // Button Left is connected between the pin and 3.3 V, we therefore need to turn on the internal pull-down resister - buttonLeft.mode(PullDown); - // Button Right is connected between the pin and 3.3 V, we therefore need to turn on the internal pull-down resister + buttonBack.mode(PullDown); + buttonLeft.mode(PullDown); buttonRight.mode(PullDown); - -// It will return 0 by default and a 1 when pressed i.e. cause a rising edge - // buttonA.rise(&buttonA_isr); - // It will return 0 by default and a 1 when pressed i.e. cause a rising edge - // buttonB.rise(&buttonB_isr); - // It will return 0 by default and a 1 when pressed i.e. cause a rising edge - //buttonX.rise(&buttonX_isr); - // It will return 0 by default and a 1 when pressed i.e. cause a rising edge - // buttonY.rise(&buttonY_isr); - - -//change set contrast in range 0.0 to 1.0 -//0.5 appears to be a good starting point - lcd.setContrast(0.5); - -//Buzzer.period(10.0f); -//Buzzer.pulsewidth(1); //Test Struct after research 05/01/22 struct ObjectDefine{ int qwer; @@ -173,153 +129,40 @@ Object1.te = 'A'; Object1.dubs = 23; Object1.namestruct = "name"; -//buttonA.rise(&buzzme); Omitted due to error -//buttonA.rise(&printme,10); -//buttonA.rise(&returnme); + while(1) { -//Tune(Buzzer,So6,8); -//Stop_tunes(Buzzer); -//Section of code to try to get the button press to be recorded -//bool button = buttonA.read(); -//printf("%f\n", g_buttonA_flag ); -//Recording button presses - - // swap direction when button has been pressed - // (could just use ! but want this to be explicit to aid understanding) - if (direction == UP) { - direction = DOWN; - } - else { - direction = UP; - - //output = fsm[state]; - switch(Press){ + long distanced = sensor.distance(); + printf("Distance : %d cm",distanced); + switch(Press){ case 1: + Press = 1; lcd.clear(); - Press = 1; - lcd.printString("Menu 1",0,0); + lcd.printString("Menu 1",0,0); + + // if (distanced >= 400 || distanced <= 2) + printf("Distance : %d cm",distanced); + // wait(1.0); // 1 sec lcd.refresh(); - break; + break; case 2: Press = 2; lcd.clear(); - lcd.printString("Menu 2",0,0); - lcd.refresh(); - break; - Press = 0; - lcd.clear(); - lcd.printString("Menu 4",0,0); + lcd.printString("Menu 2",0,1); lcd.refresh(); break; - } - -/* -int result; - result = cube(5); - printf("Button A pressed %f\n", cube(5)); -int button_counter; -if (g_buttonA_flag){ - button_counter = button_counter +1; - //case (test) - g_buttonA_flag = 0; // if it has, clear the flag - - // send message over serial port - can observe in CoolTerm etc. - printf("Button A pressed %f\n", button_counter); - } -if (g_buttonB_flag){ - g_buttonB_flag = 0; // if it has, clear the flag - - // send message over serial port - can observe in CoolTerm etc. - printf("Button B pressed\n"); - } -if (g_buttonX_flag){ - g_buttonX_flag = 0; // if it has, clear the flag - // swap direction when button has been pressed - // (could just use ! but want this to be explicit to aid understanding) - if (direction == UP) { - direction = DOWN; - } - else { - direction = UP; - } - - // send message over serial port - can observe in CoolTerm etc. - printf("Button X pressed\n"); - lcd.clear(); - lcd.printString("Button Pressed!",0,0); - lcd.refresh(); - wait(1); - } -if (g_buttonY_flag){ - g_buttonY_flag = 0; // if it has, clear the flag - - // send message over serial port - can observe in CoolTerm etc. - printf("Button Y pressed\n"); - } - Buzzer.play(200,120); - wait_ms(5); - Buzzer.play(200,120); - long distanced = sensor.distance(); - if (distanced >= 400 || distanced <= 2) - { - printf("Out of range"); -//Calling dummy function 05/01/22 - int answer = cube(2); - printf("%f\n",answer); - wait(1.0); - } - else - { - printf("Distance : %d cm",distanced); - wait(1.0); // 1 sec - } - lcd.drawCircle(WIDTH/2,HEIGHT/2,distanced,FILL_BLACK); -//lcd.refresh must be used to update the lcd Display - lcd.refresh(); - wait(5.0); -//these are default settings so not strictly needed - lcd.normalMode(); // normal colour mode - lcd.setBrightness(0.5); // put LED backlight on 50% - lcd.clear(); - lcd.printString("Hello, World!",0,0); - Vector2D coord = joystick.get_coord(); - lcd.refresh(); - printf("Coord = %f,%f\n",coord.x,coord.y); - char buffer[14]; - Vector2D mapped_coord = joystick.get_mapped_coord(); - printf("Mapped coord = %f,%f\n",mapped_coord.x,mapped_coord.y); - - int length = sprintf(buffer,"T = %2f",coord.x); -//it is important the format specifier ensures the length will fit in the buffer - if (length <= 14) // if string will fit on display (assuming printing at x=0) - lcd.printString(buffer,0,1); // display on screen - lcd.refresh(); - lcd.clear(); -//times by 50 to try get the point moving across screen - float x50 = mapped_coord.x*5; - float y50 = mapped_coord.y*8; -//to see what the values are - printf(" *50 = %f,%f\n",x50,y50); -//example of how to draw circles - lcd.printChar('o',WIDTH/2,HEIGHT/2); - lcd.refresh(); - float mag = joystick.get_mag(); - float angle = joystick.get_angle(); - printf("Mag = %f Angle = %f\n",mag,angle); - Direction d = joystick.get_direction(); - printf("Direction = %i\n",d); - if (joystick.button_pressed() ) { - printf("Button Pressed\n"); - wait(5); - } - - } - }*/ + /* + case 3: + Press = 3; + lcd.clear(); + lcd.printString("Menu 3",0,1); + lcd.refresh(); + break; + }*/ } } } + int buttonCount(){ - Press++; if (Press >3){ Press = 0; @@ -336,21 +179,18 @@ g_buttonA_flag = 1; // set flag in ISR printf("press count = %i\n",Press); - - // lcd.clear(); - //lcd.printString("Button A Pressed",0,0); - - // lcd.refresh(); // set flag in ISR + } //Button B event-triggered interrupt void buttonB_isr() { + buttonCount(); g_buttonB_flag = 1; // set flag in ISR lcd.clear(); lcd.printString("Button B Pressed",0,0); - lcd.refresh(); // set flag in ISR + lcd.refresh(); } //Button X event-triggered interrupt void buttonX_isr() @@ -393,7 +233,7 @@ lcd.refresh(); // set flag in ISR } //Button Right event-triggered interrupt -void buttonRight_isr() + void buttonRight_isr() { g_buttonRight_flag = 1; // set flag in ISR lcd.clear();