#include <LiquidCrystal.h>
#include <TEA5767Radio.h>
TEA5767Radio radio = TEA5767Radio();
const int RS = 9;
const int EN = 10;
const int D4 = 2;
const int D5 = 3;
const int D6 = 4;
const int D7 = 5;
LiquidCrystal lcd(RS, EN, D4, D5, D6, D7);
const int numBlocks = 10;
String storageBlocks[numBlocks];
int currentBlockIndex = 0;
const int writeButton = 11;
const int readButton = 13;
const int deleteButton = 12;
const int writeIndicatorLED = 8;
const int blockIndicators[numBlocks] = {0, 1, 7, 6, A0, A5, A4, A3, A2, A1};
void setup() {
Serial.begin(9600);
Serial.println("Disk emulator");
for (int i = 0; i < numBlocks; i++) {
storageBlocks[i] = "";
pinMode(blockIndicators[i], OUTPUT);
digitalWrite(blockIndicators[i], LOW);
}
pinMode(writeButton, INPUT_PULLUP);
pinMode(readButton, INPUT_PULLUP);
pinMode(deleteButton, INPUT_PULLUP);
pinMode(writeIndicatorLED, OUTPUT);
digitalWrite(writeIndicatorLED, LOW);
lcd.begin(20, 4);
lcd.setCursor(16, 0);
delay(1000);
displayDiskUsage();
}
void loop() {
bool isWriteButtonPressed = digitalRead(writeButton) == LOW;
bool isReadButtonPressed = digitalRead(readButton) == LOW;
bool isDeleteButtonPressed = digitalRead(deleteButton) == LOW;
if (isWriteButtonPressed) {
writeToBlock();
}
if (isReadButtonPressed) {
readBlocks();
}
if (isDeleteButtonPressed) {
clearAllBlocks();
}
}
void writeToBlock() {
if (currentBlockIndex >= numBlocks) {
Serial.println("Disk is full!");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Disk full!");
delay(2000);
return;
}
Serial.println("Enter a data to write to the block:");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Writing to block: ");
lcd.print(currentBlockIndex);
while (Serial.available() == 0);
String inputData = Serial.readString();
if (inputData.length() > 20) { // Limit data size
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("String too long!");
Serial.println("Error: String too long!");
delay(2000);
return;
}
storageBlocks[currentBlockIndex] = inputData;
digitalWrite(blockIndicators[currentBlockIndex], HIGH);
digitalWrite(writeIndicatorLED, HIGH);
delay(500);
digitalWrite(writeIndicatorLED, LOW);
Serial.print("Writing to block: ");
Serial.println(currentBlockIndex);
currentBlockIndex++;
displayDiskUsage();
}
void readBlocks() {
Serial.println("Reading disk info:");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Reading disk...");
for (int i = 0; i < numBlocks; i++) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Block ");
lcd.print(i);
lcd.print(": ");
String data = storageBlocks[i].length() > 0 ? storageBlocks[i] : "empty";
lcd.setCursor(0, 1);
lcd.print(data.length() > 5 ? data.substring(0, 5) : data);
Serial.print("Block ");
Serial.print(i);
Serial.print(": ");
Serial.println(data);
delay(500);
}
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Read complete");
delay(2000);
}
void clearAllBlocks() {
Serial.println("Clearing the disk...");
for (int i = 0; i < numBlocks; i++) {
storageBlocks[i] = "";
digitalWrite(blockIndicators[i], LOW);
}
currentBlockIndex = 0;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Disk cleared");
delay(2000);
displayDiskUsage();
}
void displayDiskUsage() {
lcd.clear();
int usedBlocks = 0;
for (int i = 0; i < numBlocks; i++) {
if (storageBlocks[i] != "") {
usedBlocks++;
}
}
lcd.setCursor(0, 0);
lcd.print("Used Blocks: ");
lcd.print(usedBlocks);
lcd.print("/");
lcd.print(numBlocks);
lcd.setCursor(0, 1);
lcd.print("Free Blocks: ");
lcd.print(numBlocks - usedBlocks);
}