Do some stuff
This commit is contained in:
@@ -3,5 +3,37 @@
|
||||
//
|
||||
|
||||
#include "peripheraldata.h"
|
||||
#include "sevenseg.h"
|
||||
#include "switches.h"
|
||||
|
||||
AudioData audioData;
|
||||
AudioData audioData;
|
||||
|
||||
SevenSegment displayA;
|
||||
|
||||
SevenSegment displayB;
|
||||
|
||||
SevenSegment displayC;
|
||||
|
||||
SevenSegment displayD;
|
||||
|
||||
SevenSegment displayE;
|
||||
|
||||
SevenSegment displayF;
|
||||
|
||||
SevenSegment displayG;
|
||||
|
||||
SevenSegment displayH;
|
||||
|
||||
Switches switchesA;
|
||||
|
||||
Switches switchesB;
|
||||
|
||||
Switches switchesC;
|
||||
|
||||
Switches switchesD;
|
||||
|
||||
SDL_Texture *gpuTex;
|
||||
|
||||
SDL_Surface *gpuSurf;
|
||||
|
||||
bool gpuSurfDirty = false;
|
@@ -6,6 +6,39 @@
|
||||
#define RISCB_PERIPHERALDATA_H
|
||||
|
||||
#include "audio.h"
|
||||
#include "sevenseg.h"
|
||||
#include "switches.h"
|
||||
|
||||
extern AudioData audioData;
|
||||
|
||||
extern SevenSegment displayA;
|
||||
|
||||
extern SevenSegment displayB;
|
||||
|
||||
extern SevenSegment displayC;
|
||||
|
||||
extern SevenSegment displayD;
|
||||
|
||||
extern SevenSegment displayE;
|
||||
|
||||
extern SevenSegment displayF;
|
||||
|
||||
extern SevenSegment displayG;
|
||||
|
||||
extern SevenSegment displayH;
|
||||
|
||||
extern Switches switchesA;
|
||||
|
||||
extern Switches switchesB;
|
||||
|
||||
extern Switches switchesC;
|
||||
|
||||
extern Switches switchesD;
|
||||
|
||||
extern SDL_Texture *gpuTex;
|
||||
|
||||
extern SDL_Surface *gpuSurf;
|
||||
|
||||
extern bool gpuSurfDirty;
|
||||
|
||||
#endif //RISCB_PERIPHERALDATA_H
|
||||
|
84
peripherals/sevenseg.c
Normal file
84
peripherals/sevenseg.c
Normal file
@@ -0,0 +1,84 @@
|
||||
//
|
||||
// Created by bruno on 17.2.2025.
|
||||
//
|
||||
|
||||
#include "sevenseg.h"
|
||||
|
||||
#include <SDL2/SDL_render.h>
|
||||
|
||||
void render_segment(SDL_Renderer *renderer, SevenSegment *display) {
|
||||
int seg_width = display->rect->w / 4;
|
||||
int seg_height = display->rect->h / 10;
|
||||
|
||||
// Define segment positions
|
||||
SDL_Rect segments[9] = {
|
||||
{seg_width, display->rect->y, seg_width * 2, seg_height}, // Top
|
||||
{3 * seg_width + 4, seg_height, seg_height, seg_height * 3.5}, // Top Right
|
||||
{3 * seg_width + 4, 5.5 * seg_height, seg_height, seg_height * 3.5}, // Bottom Right
|
||||
{seg_width, 9 * seg_height, seg_width * 2, seg_height}, // Bottom
|
||||
{display->rect->x, 5.5 * seg_height, seg_height, seg_height * 3.5}, // Bottom Left
|
||||
{display->rect->x, seg_height, seg_height, seg_height * 3.5}, // Top Left
|
||||
{seg_width, 4.5 * seg_height, seg_width * 2, seg_height}, // Middle
|
||||
};
|
||||
|
||||
if (display->value & (1 << 7)) {
|
||||
SDL_SetRenderDrawColor(renderer, 0, 64, 64, 255);
|
||||
} else {
|
||||
SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
|
||||
}
|
||||
|
||||
SDL_RenderClear(renderer);
|
||||
SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255);
|
||||
for (int i = 0; i < 7; i++) {
|
||||
if (display->value & (1 << i)) {
|
||||
SDL_RenderFillRect(renderer, &segments[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void update_display_texture(SDL_Renderer *renderer, SevenSegment *display) {
|
||||
SDL_SetRenderTarget(renderer, display->texture);
|
||||
|
||||
render_segment(renderer, display);
|
||||
|
||||
SDL_SetRenderTarget(renderer, NULL);
|
||||
}
|
||||
|
||||
void init_seven_segment(SevenSegment *display, SDL_Renderer *renderer, int x, int y, int width, int height) {
|
||||
display->rect = malloc(sizeof(SDL_Rect));
|
||||
display->outRect = malloc(sizeof(SDL_Rect));
|
||||
display->value = 0;
|
||||
|
||||
display->rect->x = 0;
|
||||
display->rect->y = 0;
|
||||
display->rect->w = width;
|
||||
display->rect->h = height;
|
||||
|
||||
display->outRect->x = x;
|
||||
display->outRect->y = y;
|
||||
display->outRect->w = width;
|
||||
display->outRect->h = height;
|
||||
|
||||
display->texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, width, height);
|
||||
if (!display->texture) {
|
||||
fprintf(stderr, "Failed to create texture: %s\n", SDL_GetError());
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
update_display_texture(renderer, display);
|
||||
}
|
||||
|
||||
void render_seven_segment(SevenSegment *display, SDL_Renderer *renderer) {
|
||||
if (display->oldValue != display->value) {
|
||||
display->oldValue = display->value;
|
||||
update_display_texture(renderer, display);
|
||||
}
|
||||
if (display->texture) {
|
||||
SDL_RenderCopy(renderer, display->texture, NULL, display->outRect);
|
||||
}
|
||||
}
|
||||
|
||||
void destroy_seven_segment(SevenSegment *display) {
|
||||
SDL_DestroyTexture(display->texture);
|
||||
free(display->rect);
|
||||
free(display->outRect);
|
||||
}
|
34
peripherals/sevenseg.h
Normal file
34
peripherals/sevenseg.h
Normal file
@@ -0,0 +1,34 @@
|
||||
//
|
||||
// Created by bruno on 17.2.2025.
|
||||
//
|
||||
|
||||
#ifndef RISCB_SEVENSEG_H
|
||||
#define RISCB_SEVENSEG_H
|
||||
|
||||
#include <SDL_rect.h>
|
||||
#include <SDL2/SDL_render.h>
|
||||
|
||||
typedef struct {
|
||||
unsigned char value;
|
||||
unsigned char oldValue;
|
||||
SDL_Rect *rect;
|
||||
SDL_Rect *outRect;
|
||||
SDL_Texture *texture;
|
||||
} SevenSegment;
|
||||
|
||||
//
|
||||
// Created by bruno on 17.2.2025.
|
||||
//
|
||||
|
||||
|
||||
void render_segment(SDL_Renderer *renderer, SevenSegment *display);
|
||||
|
||||
void update_display_texture(SDL_Renderer *renderer, SevenSegment *display);
|
||||
|
||||
void init_seven_segment(SevenSegment *display, SDL_Renderer *renderer, int x, int y, int width, int height);
|
||||
|
||||
void render_seven_segment(SevenSegment *display, SDL_Renderer *renderer);
|
||||
|
||||
void destroy_seven_segment(SevenSegment *display);
|
||||
|
||||
#endif //RISCB_SEVENSEG_H
|
105
peripherals/switches.c
Normal file
105
peripherals/switches.c
Normal file
@@ -0,0 +1,105 @@
|
||||
//
|
||||
// Created by bruno on 17.2.2025.
|
||||
//
|
||||
|
||||
#include "switches.h"
|
||||
|
||||
void generate_switch_rects(Switches *switches) {
|
||||
int switch_width = switches->rect->w / 4;
|
||||
int switch_height = switches->rect->h / 4;
|
||||
|
||||
for (int row = 0; row < 4; row++) {
|
||||
for (int col = 0; col < 4; col++) {
|
||||
int idx = row * 4 + col;
|
||||
|
||||
// Base rect inside switches->rect
|
||||
switches->rects[idx] = (SDL_Rect) {
|
||||
col * switch_width + 2,
|
||||
row * switch_height + 2,
|
||||
switch_width - 2,
|
||||
switch_height - 2
|
||||
};
|
||||
|
||||
// Rect relative to outRect
|
||||
switches->outRects[idx] = (SDL_Rect) {
|
||||
switches->outRect->x + col * switch_width + 2,
|
||||
switches->outRect->y + row * switch_height + 2,
|
||||
switch_width - 2,
|
||||
switch_height - 2
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void render_switch_matrix(SDL_Renderer *renderer, Switches *switches) {
|
||||
SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
|
||||
SDL_RenderClear(renderer);
|
||||
|
||||
for (int i = 0; i < 16; i++) {
|
||||
if (switches->value & (1 << i)) {
|
||||
SDL_SetRenderDrawColor(renderer, 0, 255, 0, 255);
|
||||
} else {
|
||||
// Render black for "off" switches
|
||||
SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255);
|
||||
}
|
||||
SDL_RenderFillRect(renderer, &switches->rects[i]);
|
||||
}
|
||||
}
|
||||
|
||||
void toggle_switch(SDL_Rect rect, Switches *switches) {
|
||||
for (int i = 0; i < 16; i++) {
|
||||
if (SDL_HasIntersection(&rect, &switches->outRects[i])) {
|
||||
switches->value ^= (1 << i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void update_switches_texture(SDL_Renderer *renderer, Switches *display) {
|
||||
SDL_SetRenderTarget(renderer, display->texture);
|
||||
|
||||
render_switch_matrix(renderer, display); // Render the 4x4 switch matrix
|
||||
|
||||
SDL_SetRenderTarget(renderer, NULL);
|
||||
}
|
||||
|
||||
|
||||
void init_switches(Switches *switches, SDL_Renderer *renderer, int x, int y, int width, int height) {
|
||||
switches->rect = malloc(sizeof(SDL_Rect));
|
||||
switches->outRect = malloc(sizeof(SDL_Rect));
|
||||
switches->value = 0;
|
||||
|
||||
switches->rect->x = 0;
|
||||
switches->rect->y = 0;
|
||||
switches->rect->w = width;
|
||||
switches->rect->h = height;
|
||||
|
||||
switches->outRect->x = x;
|
||||
switches->outRect->y = y;
|
||||
switches->outRect->w = width;
|
||||
switches->outRect->h = height;
|
||||
|
||||
switches->texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, width, height);
|
||||
if (!switches->texture) {
|
||||
fprintf(stderr, "Failed to create texture: %s\n", SDL_GetError());
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
switches->value = (1 << 0) | (1 << 1);
|
||||
generate_switch_rects(switches);
|
||||
update_switches_texture(renderer, switches);
|
||||
}
|
||||
|
||||
void render_switches_segment(Switches *display, SDL_Renderer *renderer) {
|
||||
if (display->oldValue != display->value) {
|
||||
display->oldValue = display->value;
|
||||
update_switches_texture(renderer, display);
|
||||
}
|
||||
if (display->texture) {
|
||||
SDL_RenderCopy(renderer, display->texture, NULL, display->outRect);
|
||||
}
|
||||
}
|
||||
|
||||
void destroy_switches_segment(Switches *switches) {
|
||||
SDL_DestroyTexture(switches->texture);
|
||||
free(switches->rect);
|
||||
free(switches->outRect);
|
||||
}
|
33
peripherals/switches.h
Normal file
33
peripherals/switches.h
Normal file
@@ -0,0 +1,33 @@
|
||||
//
|
||||
// Created by bruno on 17.2.2025.
|
||||
//
|
||||
|
||||
#ifndef RISCB_SWITCHES_H
|
||||
#define RISCB_SWITCHES_H
|
||||
|
||||
#include <SDL_rect.h>
|
||||
#include <SDL_render.h>
|
||||
|
||||
typedef struct {
|
||||
uint16_t value;
|
||||
uint16_t oldValue;
|
||||
SDL_Rect *rect;
|
||||
SDL_Rect *outRect;
|
||||
SDL_Texture *texture;
|
||||
SDL_Rect rects[16];
|
||||
SDL_Rect outRects[16];
|
||||
} Switches;
|
||||
|
||||
void render_switch_matrix(SDL_Renderer *renderer, Switches *switches);
|
||||
|
||||
void update_switches_texture(SDL_Renderer *renderer, Switches *display);
|
||||
|
||||
void toggle_switch(SDL_Rect rect, Switches *switches);
|
||||
|
||||
void init_switches(Switches *switches, SDL_Renderer *renderer, int x, int y, int width, int height);
|
||||
|
||||
void render_switches_segment(Switches *display, SDL_Renderer *renderer);
|
||||
|
||||
void destroy_switches_segment(Switches *switches);
|
||||
|
||||
#endif //RISCB_SWITCHES_H
|
Reference in New Issue
Block a user