Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stddef.h>
- #include "sys/alt_alarm.h"
- #include "alt_types.h"
- #include <io.h>
- #include "sys/alt_timestamp.h"
- #include "altera_avalon_pio_regs.h"
- #include "sys/alt_irq.h"
- #include <unistd.h>
- #include <stdio.h>
- #include <system.h>
- #include "includes.h"
- #define SW0 0x00000001
- #define SW1 0x00000002
- #define SW2 0x00000004
- #define SW3 0x00000008
- #define SW4 0x00000010
- #define SW5 0x00000020
- #define SW6 0x00000040
- #define SW7 0x00000080
- #define SW8 0x00000100
- #define SW9 0x00000200
- #define LED0 0x00000001
- #define LED1 0x00000002
- #define LED2 0x00000004
- #define LED3 0x00000008
- #define LED4 0x00000010
- #define LED5 0x00000020
- #define LED6 0x00000040
- #define LED7 0x00000080
- #define LED8 0x00000100
- #define LED9 0x00000200
- // hex
- #define SEGA 0x00001
- #define SEGB 0x00002
- #define SEGC 0x00004
- #define SEGD 0x00008
- #define SEGE 0x00010
- #define SEGF 0x00020
- #define SEGG 0x00040
- // hex - numbers
- #define ZERO SEGA | SEGB | SEGC | SEGD |SEGE | SEGF
- #define ONE SEGB | SEGC
- #define TWO SEGA | SEGB | SEGG | SEGE | SEGD
- #define THREE SEGA | SEGB | SEGC | SEGD | SEGG
- #define FOUR SEGB | SEGC | SEGG | SEGF
- #define FIVE SEGA | SEGC | SEGD | SEGF | SEGG
- #define SIX SEGA | SEGC | SEGD | SEGE | SEGF | SEGG
- #define SEVEN SEGA | SEGB | SEGC
- #define EIGHT SEGA | SEGB | SEGC | SEGD | SEGE | SEGF | SEGG
- #define NINE SEGA | SEGB | SEGC | SEGF | SEGG
- #define HEXE SEGA | SEGD | SEGE | SEGF | SEGG
- #define HEXL SEGD | SEGE | SEGF
- #define HEXP SEGE | SEGF | SEGG | SEGA | SEGB
- #define HEX 0x81040
- #define LED 0x81080
- #define SW 0x81070
- typedef enum POZIOM_TEMP{
- POZIOM_0 = 0,
- POZIOM_1 = 2,
- POZIOM_2 = 4,
- POZIOM_3 = 8,
- POZIOM_4 = 16,
- POZIOM_5 = 32,
- POZIOM_6 = 64,
- POZIOM_7 = 128,
- POZIOM_8 = 256,
- POZIOM_9 = 512,
- POZIOM_10 = 1024,
- }TEMP;
- /* Definition of Task Stacks */
- #define TASK_STACKSIZE 2048
- OS_STK task1_stk[TASK_STACKSIZE];
- OS_STK task2_stk[TASK_STACKSIZE];
- OS_STK task3_stk[TASK_STACKSIZE];
- OS_STK task4_stk[TASK_STACKSIZE];
- OS_STK task5_stk[TASK_STACKSIZE];
- OS_STK task6_stk[TASK_STACKSIZE];
- OS_EVENT *SWBox1;
- /* Definition of Task Priorities */
- #define TASK1_PRIORITY 1
- #define TASK2_PRIORITY 2
- #define TASK3_PRIORITY 3
- #define TASK4_PRIORITY 4
- #define TASK5_PRIORITY 5
- #define TASK6_PRIORITY 6
- void ustawDiodeR(unsigned int dioda, int stan){
- if(stan){
- //zapal
- IOWR(LED, 0, IORD(LED, 0) | dioda );
- }else{
- //zgaś
- IOWR(LED, 0, IORD(LED, 0) & ~dioda );
- }
- }
- void zapalDiodeR(unsigned int dioda){
- IOWR(LED, 0, IORD(LED, 0) | dioda );
- }
- void zgasDiodeR(unsigned int dioda){
- IOWR(LED, 0, IORD(LED, 0) & ~dioda );
- }
- int stanDiody(unsigned int dioda){
- if(IORD(LED, 0) & dioda)
- return 1;
- else
- return 0;
- }
- void przelaczNaDiode(unsigned int dioda){
- IOWR(LED, 0, dioda);
- }
- unsigned int getSwMask(int i){
- switch(i){
- case 0:
- return SW0;
- case 1:
- return SW1;
- case 2:
- return SW2;
- case 3:
- return SW3;
- case 4:
- return SW4;
- case 5:
- return SW5;
- case 6:
- return SW6;
- case 7:
- return SW7;
- case 8:
- return SW8;
- case 9:
- return SW9;
- }
- }
- unsigned int getLedMask(int i){
- switch(i){
- case 0:
- return LED0;
- case 1:
- return LED1;
- case 2:
- return LED2;
- case 3:
- return LED3;
- case 4:
- return LED4;
- case 5:
- return LED5;
- case 6:
- return LED6;
- case 7:
- return LED7;
- case 8:
- return LED8;
- case 9:
- return LED9;
- }
- }
- unsigned char getHexMask(int i){
- switch(i){
- case 0:
- return ZERO;
- case 1:
- return ONE;
- case 2:
- return TWO;
- case 3:
- return THREE;
- case 4:
- return FOUR;
- case 5:
- return FIVE;
- case 6:
- return SIX;
- case 7:
- return SEVEN;
- case 8:
- return EIGHT;
- case 9:
- return NINE;
- }
- }
- unsigned int setHex(int hex, unsigned char znak){
- unsigned int znak2 = znak;
- IOWR(HEX, hex, znak2 );
- }
- int glosnosc = 0;
- int state = 0;
- int substate = 0; //status kanalu (lewy/prawy/zaden)
- //unsigned int swstate = 0;
- unsigned int nieaktywneSw = 0; //maska sw wywołujących alarm
- //używaneSW = SW0 | SW1 | SW2 | SW3 | SW4 | SW8 | SW9;
- alt_u32 lastTimeLedOn[10]; //chwila czasowa kiedy ostatni raz dana dioda była aktywna
- alt_u32 lastTimeLedOff[10]; //kiedy ostatni raz byla nieaktywna
- int ledOn[10];
- float timeToOn[10];
- float timeToOff[10];
- int czekaNaZapalenie[10];
- int flag1 = 1;
- int flag2 = 1;
- alt_u32 zaswiec(int context)
- {
- /* This function is called once per second */
- printf("zaswiec\n");
- zapalDiodeR( getLedMask( context) );
- flag1 = -1;
- return 0;
- }
- alt_u32 zgas(int context)
- {
- /* This function is called once per second */
- //zgasDiodeR( getLedMask( context) );
- flag2 = -1;
- return 0;
- }
- void setLedAlarm(unsigned int dioda, int stan, float time){
- static alt_alarm alarm1;
- static alt_alarm alarm2;
- if(flag1==-1){
- alt_alarm_stop (&alarm1);
- flag1 = 1;
- }
- if(flag2==-1){
- alt_alarm_stop (&alarm2);
- flag2 = 1;
- }
- if(stan && flag1==1){
- flag1 = 0;
- alt_alarm_start(&alarm1,alt_ticks_per_second()*time,zaswiec, dioda);
- }else if(flag2==1){
- flag2 = 0;
- alt_alarm_start(&alarm2,alt_ticks_per_second()*time,zgas, dioda);
- }
- }
- void setLed(unsigned int dioda, int stan, float time){
- ledOn[dioda] = stan;
- if(stan){
- setLedAlarm(dioda, stan, time);
- //timeToOn[dioda] = time;
- //czekaNaZapalenie[dioda] = 1;
- }else{
- timeToOff[dioda] = time;
- }
- }
- void setLedOSTime(unsigned int dioda, int stan, float time){
- OSTimeDlyHMSM(0, 0, time, 0);
- unsigned int mask = getLedMask(dioda);
- if(stan)
- zapalDiodeR(mask);
- else
- zgasDiodeR(mask);
- }
- void aktualizujLedy(){ //timeout
- int i = 0;
- for(i = 0; i<10; i++){
- if(ledOn[i]) lastTimeLedOn[i] = alt_nticks(); else lastTimeLedOff[i] = alt_nticks();
- unsigned int mask = getLedMask(i);
- //if(!czekaNaZapalenie[i]) continue;
- if(ledOn[i] && !stanDiody(mask) && alt_nticks()-lastTimeLedOff[i] >= timeToOn[i]*alt_ticks_per_second()){
- //zapalDiodeR(mask);
- czekaNaZapalenie[i] = 0;
- }
- else if(!ledOn[i] && stanDiody(mask) && alt_nticks()-lastTimeLedOn[i] >= timeToOff[i]*alt_ticks_per_second())
- zgasDiodeR(mask);
- }
- }
- void zgasWszystkieDiody(float time){
- //IOWR(LED, 0, 0);
- int i = 0;
- for(i = 0; i<10; i++){
- setLed(i, 0, time);
- }
- }
- void displayFloat(float f){
- int i1 = (int) f;
- int i2 = (f-i1)*10;
- setHex(5, getHexMask(i1));
- setHex(4, getHexMask(i2));
- }
- void wait(alt_u32 start, float sec){
- while(alt_nticks()-start < sec*alt_ticks_per_second());
- return;
- }
- void przejdzDoStanu(int stan){
- //wyjscie z aktualnego stanu
- switch(state){
- case 0: //idle
- break;
- case 1: //przedni
- setLed(0, 0, 2);
- break;
- case 2: //tylne
- setLed(1, 0, 2);
- break;
- case 3: //centralny
- setLed(2, 0, 2);
- break;
- case 4: //niskotonowy
- setLed(3, 0, 2);
- break;
- case 5: //wszystko
- setLed(4, 0, 2);
- break;
- case 6: //alarm
- OSTimeDlyHMSM(0, 0, 2, 0);
- setLed(9, 0, 2);
- setHex(0, ZERO);
- setHex(1, 0);
- setHex(2, 0);
- setHex(3, 0);
- setHex(4, 0);
- setHex(5, 0);
- break;
- }
- //przejscie do stanu docelowego
- switch(stan){
- case 0: //idle
- state = 0;
- nieaktywneSw = SW9 | SW8;
- //zgasWszystkieDiody();
- setHex(0, ZERO);
- setHex(1, 0);
- setHex(2, 0);
- setHex(3, 0);
- setHex(4, 0);
- setHex(5, 0);
- printf("Przelaczono na tryb 0 - idle!\n");
- break;
- case 1: //przedni
- state = 1;
- setLed(0, 1, 1);
- nieaktywneSw = SW3 | SW4;
- setHex(0, ONE);
- setHex(1, SEGG);
- setHex(2, getHexMask(glosnosc));
- printf("Przelaczono na tryb 1 - przednie!\n");
- break;
- case 2: //tylne
- state = 2;
- setLed(1, 1, 1);
- nieaktywneSw = SW0 | SW4;
- setHex(0, TWO);
- setHex(1, SEGG);
- setHex(2, getHexMask(glosnosc));
- printf("Przelaczono na tryb 2 - tylne!\n");
- break;
- case 3: //centralny
- state = 3;
- setLed(2, 1, 1);
- nieaktywneSw = SW0 | SW1 | SW3 | SW4;
- setHex(0, THREE);
- setHex(2, getHexMask(glosnosc));
- printf("Przelaczono na tryb 3 - centralny!\n");
- break;
- case 4: //niskotonowy
- state = 4;
- setLed(3, 1, 1);
- nieaktywneSw = SW0 | SW1 | SW2 | SW4;
- setHex(0, FOUR);
- setHex(2, getHexMask(glosnosc));
- printf("Przelaczono na tryb 4 - niskotonowy!\n");
- break;
- case 5: //wszystko
- state = 5;
- setLed(4, 1, 1);
- nieaktywneSw = SW0 | SW1 | SW2 | SW3;
- setHex(0, FIVE);
- setHex(2, getHexMask(glosnosc));
- printf("Przelaczono na tryb 5 - wszystko!\n");
- break;
- case 6: //alarm
- OSTimeDlyHMSM(0, 0, 2, 0);
- state = 6;
- zgasWszystkieDiody(2);
- setLed(9, 1, 3);
- //nieaktywneSw = SW0 | SW1 | SW2 | SW3 | SW4 | SW8 | SW9;
- printf("Alarm!\n");
- setHex(0, HEXE);
- setHex(1, HEXE);
- setHex(2, HEXE);
- setHex(3, HEXE);
- setHex(4, HEXE);
- setHex(5, HEXE);
- break;
- }
- }
- void kanal(int sw, unsigned int swstate){
- switch(substate){
- case 0: //żaden
- if(swstate & getSwMask(sw)){
- substate = 1; //lewy
- setLed(sw, 1, 1);
- setHex(1, HEXL);
- printf("Wybrano kanal lewy!\n");
- }else if(swstate & getSwMask(sw+1)){
- substate = 2; //prawy
- setHex(1, HEXP);
- setLed(sw+1, 1, 1);
- printf("Wybrano kanal prawy!\n");
- }
- break;
- case 1: //kanal lewy
- if( !(swstate & getSwMask(sw)) ){
- substate = 0;
- setLed(sw, 0, 2);
- setHex(1, SEGG);
- printf("Wylaczono tryb kanalu lewego!\n");
- }else if(swstate & getSwMask(sw+1)){
- nieaktywneSw = nieaktywneSw | getSwMask(sw+1);
- przejdzDoStanu(6); //alarm
- }
- break;
- case 2: //kanal prawy
- if( !(swstate & getSwMask(sw+1)) ){
- substate = 0;
- setLed(sw+1, 0, 2);
- setHex(1, SEGG);
- printf("Wylaczono tryb kanalu prawego!\n");
- }else if(swstate & getSwMask(sw)){
- nieaktywneSw = nieaktywneSw | getSwMask(sw);
- przejdzDoStanu(6); //alarm
- }
- break;
- }
- }
- int sw9 = 0;
- int sw8 = 0;
- void glosnik(unsigned int swstate){
- switch(sw9){
- case 0:
- if(swstate & SW9){
- sw9 = 1;
- setLed(9, 1, 1);
- printf("Przelaczono na dodawanie!\n");
- }
- break;
- case 1:
- if( !(swstate & SW9) ){
- sw9 = 0;
- setLed(9, 0, 2);
- printf("Przelaczono na odejmowanie!\n");
- }
- break;
- }
- switch(sw8){
- case 0:
- if(swstate & SW8){
- sw8 = 1;
- if(sw9)
- glosnosc += 1;
- else
- glosnosc -= 1;
- printf("Nowa glosnosc: %d \n", glosnosc);
- if(glosnosc>=10 || glosnosc<0){
- nieaktywneSw = nieaktywneSw | SW8;
- przejdzDoStanu(6); //alarm
- }else{
- setHex(2, getHexMask(glosnosc));
- setLed(8, 1, 1);
- }
- }
- break;
- case 1:
- if( !(swstate & SW8) ){
- sw8 = 0;
- setLed(8, 0, 2);
- }
- break;
- }
- }
- /*void maszynaStanu(){
- switch(state){
- case 0: //idle
- if(swstate & SW0){
- przejdzDoStanu(1); //przedni
- }else if(swstate & SW1){
- przejdzDoStanu(2); //tylni
- }else if(swstate & SW2){
- przejdzDoStanu(3); //centralny
- }else if(swstate & SW3){
- przejdzDoStanu(4); //niskotonowy
- }else if(swstate & SW4){
- przejdzDoStanu(5); //wszystko
- }else if(swstate & nieaktywneSw){
- przejdzDoStanu(6); //alarm
- }
- break;
- case 1: //przedni
- if(!(swstate & SW0)){
- przejdzDoStanu(0); //idle
- }else if(swstate & nieaktywneSw){
- przejdzDoStanu(6); //alarm
- }else{
- kanal(1);
- glosnik();
- }
- break;
- case 2: //tylne
- if(!(swstate & SW1)){
- przejdzDoStanu(0); //idle
- }else if(swstate & nieaktywneSw){
- przejdzDoStanu(6); //alarm
- }else{
- kanal(2);
- glosnik();
- }
- break;
- case 3: //centralny
- if(!(swstate & SW2)){
- przejdzDoStanu(0); //idle
- }else if(swstate & nieaktywneSw){
- przejdzDoStanu(6); //alarm
- }else{
- glosnik();
- }
- break;
- case 4: //niskotonowy
- if(!(swstate & SW3)){
- przejdzDoStanu(0); //idle
- }else if(swstate & nieaktywneSw){
- przejdzDoStanu(6); //alarm
- }else{
- glosnik();
- }
- break;
- case 5: //wszystko
- if(!(swstate & SW4)){
- przejdzDoStanu(0); //idle
- }else if(swstate & nieaktywneSw){
- przejdzDoStanu(6); //alarm
- }else{
- glosnik();
- }
- break;
- case 6: //alarm
- if( !(swstate & nieaktywneSw) ){
- sw8 = 0;
- sw9 = 0;
- substate = 0;
- glosnosc = 0;
- //wyjście z alarmu:
- if(swstate & SW0){
- przejdzDoStanu(1); //przedni
- }else if(swstate & SW1){
- przejdzDoStanu(2); //tylni
- }else if(swstate & SW2){
- przejdzDoStanu(3); //centralny
- }else if(swstate & SW3){
- przejdzDoStanu(4); //niskotonowy
- }else if(swstate & SW4){
- przejdzDoStanu(5); //wszystko
- }else{
- przejdzDoStanu(0); //idle
- }
- }
- break;
- }
- }*/
- void task1(void* pdata)
- {
- while(1){
- aktualizujLedy();
- printf("Hello from task1\n");
- unsigned int swstate;
- swstate = IORD(SW, 0);
- if(state==0){
- if(swstate & SW0){
- przejdzDoStanu(1); //przedni
- }else if(swstate & SW1){
- przejdzDoStanu(2); //tylni
- }else if(swstate & SW2){
- przejdzDoStanu(3); //centralny
- }else if(swstate & SW3){
- przejdzDoStanu(4); //niskotonowy
- }else if(swstate & SW4){
- przejdzDoStanu(5); //wszystko
- }else if(swstate & nieaktywneSw){
- przejdzDoStanu(6); //alarm
- }
- }
- printf("Slider = %d\n", swstate);
- OSMboxPostOpt(SWBox1, &swstate, OS_POST_OPT_BROADCAST);
- OSTimeDlyHMSM(0, 0, 0, 120);
- }
- }
- void task2(void* pdata)
- {
- while(1){
- OSTimeDlyHMSM(0, 0, 0, 20);
- INT8U err;
- printf("Hello from task2\n");
- unsigned int *swstatep;
- unsigned int swstate;
- swstatep = OSMboxPend(SWBox1, 0, &err);
- swstate = *swstatep;
- if(state==1){
- if(!(swstate & SW0)){
- przejdzDoStanu(0); //idle
- }else if(swstate & nieaktywneSw){
- przejdzDoStanu(6); //alarm
- }else{
- kanal(1, swstate);
- glosnik(swstate);
- }
- }
- OSMboxPostOpt(SWBox1, &swstate, OS_POST_OPT_BROADCAST);
- OSTimeDlyHMSM(0, 0, 0, 100);
- }
- }
- void task3(void* pdata)
- {
- while(1){
- OSTimeDlyHMSM(0, 0, 0, 40);
- INT8U err;
- printf("Hello from task3\n");
- unsigned int *swstatep;
- unsigned int swstate;
- swstatep = OSMboxPend(SWBox1, 0, &err);
- swstate = *swstatep;
- if(state==2){
- if(!(swstate & SW1)){
- przejdzDoStanu(0); //idle
- }else if(swstate & nieaktywneSw){
- przejdzDoStanu(6); //alarm
- }else{
- kanal(2, swstate);
- glosnik(swstate);
- }
- }
- OSMboxPostOpt(SWBox1, &swstate, OS_POST_OPT_BROADCAST);
- OSTimeDlyHMSM(0, 0, 0, 120);
- }
- }
- void task4(void* pdata)
- {
- while(1){
- OSTimeDlyHMSM(0, 0, 0, 60);
- INT8U err;
- printf("Hello from task4\n");
- unsigned int *swstatep;
- unsigned int swstate;
- swstatep = OSMboxPend(SWBox1, 0, &err);
- swstate = *swstatep;
- if(state==3){
- if(!(swstate & SW2)){
- przejdzDoStanu(0); //idle
- }else if(swstate & nieaktywneSw){
- przejdzDoStanu(6); //alarm
- }else{
- glosnik(swstate);
- }
- }
- OSMboxPostOpt(SWBox1, &swstate, OS_POST_OPT_BROADCAST);
- OSTimeDlyHMSM(0, 0, 0, 120);
- }
- }
- void task5(void* pdata)
- {
- while(1){
- OSTimeDlyHMSM(0, 0, 0, 80);
- INT8U err;
- printf("Hello from task5\n");
- unsigned int *swstatep;
- unsigned int swstate;
- swstatep = OSMboxPend(SWBox1, 0, &err);
- swstate = *swstatep;
- if(state==4){
- if(!(swstate & SW3)){
- przejdzDoStanu(0); //idle
- }else if(swstate & nieaktywneSw){
- przejdzDoStanu(6); //alarm
- }else{
- glosnik(swstate);
- }
- }
- OSMboxPostOpt(SWBox1, &swstate, OS_POST_OPT_BROADCAST);
- OSTimeDlyHMSM(0, 0, 0, 120);
- }
- }
- void task6(void* pdata)
- {
- while(1){
- OSTimeDlyHMSM(0, 0, 0, 100);
- INT8U err;
- printf("Hello from task6\n");
- unsigned int *swstatep;
- unsigned int swstate;
- swstatep = OSMboxPend(SWBox1, 0, &err);
- swstate = *swstatep;
- if(state==5){
- if(!(swstate & SW4)){
- przejdzDoStanu(0); //idle
- }else if(swstate & nieaktywneSw){
- przejdzDoStanu(6); //alarm
- }else{
- glosnik(swstate);
- }
- }else if(state==6){
- if( !(swstate & nieaktywneSw) ){
- sw8 = 0;
- sw9 = 0;
- substate = 0;
- glosnosc = 0;
- //wyjście z alarmu:
- if(swstate & SW0){
- przejdzDoStanu(1); //przedni
- }else if(swstate & SW1){
- przejdzDoStanu(2); //tylni
- }else if(swstate & SW2){
- przejdzDoStanu(3); //centralny
- }else if(swstate & SW3){
- przejdzDoStanu(4); //niskotonowy
- }else if(swstate & SW4){
- przejdzDoStanu(5); //wszystko
- }else{
- przejdzDoStanu(0); //idle
- }
- }
- }
- OSTimeDlyHMSM(0, 0, 0, 120);
- }
- }
- /* The main function creates two task and starts multi-tasking */
- int main(void)
- {
- printf("Hello from Nios II!\n");
- przejdzDoStanu(0);
- aktualizujLedy();
- SWBox1 =OSMboxCreate((void*)0);
- OSTaskCreateExt(task1,
- NULL,
- (void *)&task1_stk[TASK_STACKSIZE-1],
- TASK1_PRIORITY,
- TASK1_PRIORITY,
- task1_stk,
- TASK_STACKSIZE,
- NULL,
- 0);
- OSTaskCreateExt(task2,
- NULL,
- (void *)&task2_stk[TASK_STACKSIZE-1],
- TASK2_PRIORITY,
- TASK2_PRIORITY,
- task2_stk,
- TASK_STACKSIZE,
- NULL,
- 0);
- OSTaskCreateExt(task3,
- NULL,
- (void *)&task3_stk[TASK_STACKSIZE-1],
- TASK3_PRIORITY,
- TASK3_PRIORITY,
- task3_stk,
- TASK_STACKSIZE,
- NULL,
- 0);
- OSTaskCreateExt(task4,
- NULL,
- (void *)&task4_stk[TASK_STACKSIZE-1],
- TASK4_PRIORITY,
- TASK4_PRIORITY,
- task4_stk,
- TASK_STACKSIZE,
- NULL,
- 0);
- OSTaskCreateExt(task5,
- NULL,
- (void *)&task5_stk[TASK_STACKSIZE-1],
- TASK5_PRIORITY,
- TASK5_PRIORITY,
- task5_stk,
- TASK_STACKSIZE,
- NULL,
- 0);
- OSTaskCreateExt(task6,
- NULL,
- (void *)&task6_stk[TASK_STACKSIZE-1],
- TASK6_PRIORITY,
- TASK6_PRIORITY,
- task6_stk,
- TASK_STACKSIZE,
- NULL,
- 0);
- OSStart();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement