Advertisement
Guest User

Untitled

a guest
Nov 14th, 2019
142
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.28 KB | None | 0 0
  1. #include "definition.h"
  2. #include "alt_types.h"
  3. #include "altera_avalon_pio_regs.h"
  4. #include "sys/alt_irq.h"
  5. //#include "sys/alt_timestamp.h"
  6. #include <io.h>
  7. #include <system.h>
  8. #include <stdint.h>
  9. #include <stdio.h>
  10. #include <unistd.h>
  11. #include <sys/alt_alarm.h>
  12.  
  13. #define LIGHTS_NUM 7
  14. #define HEX_NUM 6
  15.  
  16. int currentTime = 0;
  17.  
  18. typedef enum STATES {
  19.     NONE,
  20.     FIRST_TYPE,
  21.     SECOND_TYPE,
  22.     ERROR
  23. } STATES;
  24.  
  25. typedef struct IOreg {
  26.     uint32_t sliders;
  27.     uint32_t leds[LIGHTS_NUM];
  28.     uint32_t hex[HEX_NUM];
  29. } IOreg;
  30.  
  31. STATES currentState = NONE;
  32.  
  33. void clear_led(IOreg* regs) {
  34.     for (int i = 0; i < LIGHTS_NUM; ++i)
  35.         regs->leds[i] = 0x00000000;
  36. }
  37.  
  38. void clear_hex(IOreg* regs) {
  39.     for (int i = 0; i < HEX_NUM; ++i)
  40.         regs->hex[i] = 0x00000000;
  41. }
  42.  
  43. void read_IO(IOreg* regs) {
  44.     regs->sliders = IORD(SW_SLIDERS_BASE, 0);
  45. }
  46.  
  47. STATES get_state(IOreg* regs) {
  48.     int state = regs->sliders;
  49.     STATES previousState = currentState;
  50.  
  51.     switch (state) {
  52.         case SW0:
  53.         case SW2:
  54.         case SW4:
  55.         case SW5:
  56.         case SW0 | SW2:
  57.         case SW0 | SW4:
  58.         case SW0 | SW5:
  59.         case SW2 | SW4:
  60.         case SW2 | SW5:
  61.         case SW4 | SW5:
  62.         case SW0 | SW2 | SW4:
  63.         case SW0 | SW2 | SW5:
  64.         case SW2 | SW4 | SW5:
  65.         case SW0 | SW2 | SW4 | SW5:
  66.             if (currentState != FIRST_TYPE &&
  67.                     currentTime + alt_ticks_per_second() <= alt_nticks()) {
  68.                 currentTime = alt_nticks();
  69.             }
  70.  
  71.             currentState = FIRST_TYPE;
  72.             break;
  73.         case SW1:
  74.         case SW3:
  75.         case SW6:
  76.         case SW1 | SW3:
  77.         case SW1 | SW6:
  78.         case SW3 | SW6:
  79.         case SW1 | SW3 | SW6:
  80.             if (currentState != SECOND_TYPE &&
  81.                     currentTime + alt_ticks_per_second() <= alt_nticks()) {
  82.                 currentTime = alt_nticks();
  83.             }
  84.  
  85.             currentState = SECOND_TYPE;
  86.             break;
  87.         case 0:
  88.             currentState = NONE;
  89.             break;
  90.         default:
  91.             currentState = ERROR;
  92.             break;
  93.         }
  94.  
  95.     if (previousState == ERROR && previousState != currentState) {
  96.         currentTime = alt_nticks();
  97.     }
  98.  
  99.     return currentState;
  100. }
  101.  
  102. void update(STATES state, IOreg* regs) {
  103.     switch (state) {
  104.     case NONE:
  105.         if (currentTime + alt_ticks_per_second() <= alt_nticks()) {
  106.             clear_led(regs);
  107.             clear_hex(regs);
  108.         }
  109.         break;
  110.     case FIRST_TYPE:
  111.         if (currentTime + alt_ticks_per_second() <= alt_nticks()) {
  112.             regs->leds[0] = LED0;
  113.             regs->leds[2] = LED2;
  114.             regs->leds[4] = LED4;
  115.             regs->leds[5] = LED5;
  116.             regs->hex[5] = HEX_ONE;
  117.         }
  118.         break;
  119.     case SECOND_TYPE:
  120.         if (currentTime + alt_ticks_per_second() <= alt_nticks()) {
  121.             regs->leds[1] = LED1;
  122.             regs->leds[3] = LED3;
  123.             regs->leds[6] = LED6;
  124.             regs->hex[3] = HEX_TWO;
  125.         }
  126.         break;
  127.     case ERROR:
  128.         if (currentTime + alt_ticks_per_second() <= alt_nticks()) {
  129.             for (int i = 0; i < LIGHTS_NUM; i++)
  130.                 regs->leds[i] = LED9;
  131.  
  132.             regs->hex[1] = HEX_E;
  133.             regs->hex[0] = HEX_R;
  134.         }
  135.         break;
  136.     default:
  137.         if (currentTime + alt_ticks_per_second() <= alt_nticks()) {
  138.             clear_led(regs);
  139.             clear_hex(regs);
  140.         }
  141.         break;
  142.     }
  143. }
  144.  
  145. void write_IO(IOreg* regs) {
  146.     for (int i = 0; i < LIGHTS_NUM; i++)
  147.         IOWR(LEDS_BASE, 0, regs->leds[i]);
  148.  
  149.     for (int i = 0; i < HEX_NUM; i++)
  150.         IOWR(HEX_BASE, i, regs->hex[i]);
  151. }
  152.  
  153. int main(void) {
  154.     IOreg regs = { 0 };
  155.  
  156.     clear_led(&regs);
  157.     clear_hex(&regs);
  158.     write_IO(&regs);
  159.  
  160.     while (1) {
  161.         read_IO(&regs);
  162.         update(get_state(&regs), &regs);
  163.         write_IO(&regs);
  164.     }
  165.     return 0;
  166. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement