#include <Arduino.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include "WiFi.h"

// 创建一个LCD对象,用于操作LCD显示屏
LiquidCrystal_I2C LCD(0x27, 16, 2);

// 凯撒密码函数,用于加密或解密文本
String caesarCipher(String input, int shift) {
    String output = "";
    for (int i = 0; i < input.length(); i++) {
        char c = input[i];
        // 对小写字母进行加密或解密
        if (c >= 'a' && c <= 'z') {
            c = (c - 'a' + shift + 26) % 26 + 'a';
        // 对大写字母进行加密或解密
        } else if (c >= 'A' && c <= 'Z') {
            c = (c - 'A' + shift + 26) % 26 + 'A';
        }
        // 将加密或解密后的字符添加到输出字符串
        output += c;
    }
    return output;
}

void setup() {
  // 初始化串口通信,波特率设置为115200
  Serial.begin(115200);
  // 提示用户输入要加密或解密的文本
  Serial.println("输入要加密/解密的文本(使用小写字母)并按ENTER键:");
  // 提示用户输入偏移量
  Serial.println("然后输入偏移量(0-25)并按ENTER键:");

  // 设置WiFi为STA模式
  WiFi.mode(WIFI_STA);
  // 初始化LCD显示屏
  LCD.init();
  // 打开LCD背光
  LCD.backlight();
  // 在LCD上显示启动信息
  LCD.print("WiFi Scanning...");
}

void loop() {
  // 清除LCD显示屏
  LCD.clear();
  // 在LCD上显示扫描信息
  LCD.print("Scanning...");

  // 扫描WiFi网络
  int n = WiFi.scanNetworks();
  // 等待扫描完成
  delay(500);

  if (n == 0) {
    // 如果没有找到网络,显示“没有找到网络”
    LCD.print("No networks found.");
  } else {
    // 如果找到网络,显示“扫描完成”
    LCD.print("Scan done!");
    // 遍历所有找到的网络
    for (int i = 0; i < n; ++i) {
      // 设置LCD光标位置,打印网络信息
      LCD.setCursor(0, 0);
      LCD.print("Net:");
      LCD.print(i + 1);
      LCD.print(" SSID: ");
      LCD.print(WiFi.SSID(i));
      LCD.setCursor(0, 1);
      LCD.print("Ch:");
      LCD.print(WiFi.channel(i));
      LCD.print(" RSSI:");
      LCD.print(WiFi.RSSI(i));
      LCD.print(" dBm");
      // 根据加密类型打印是否加密
      LCD.print((WiFi.encryptionType(i) == WIFI_AUTH_OPEN) ? " Open" : " *");
      // 每显示一个网络信息后等待2秒
      delay(2000);
    }
  }

  // 处理串口输入
  if (Serial.available() > 0) {
    String input = "";
    bool hasNewLine = false;

    // 读取直到遇到换行符
    while (Serial.available() > 0) {
      char c = (char)Serial.read();
      if (c == '\n') {
        hasNewLine = true;
        break;
      }
      input += c;
    }

    if (hasNewLine) {
      // 读取偏移量
      int shift;
      while (!Serial.available());
      shift = Serial.parseInt();
      // 清除输入缓冲区
      while (Serial.available()) Serial.read();

      // 检查偏移量是否有效
      if (shift >= -26 && shift <= 26) {
        // 执行加密或解密操作
        String result = caesarCipher(input, shift);
        // 打印加密或解密后的文本
        Serial.print("Encrypted/Decrypted text: ");
        Serial.println(result);
        // 在LCD上显示加密或解密结果
        LCD.clear();
        LCD.print("Encrypted/Decrypted:");
        LCD.setCursor(0, 1);
        LCD.print(result);
      } else {
        // 如果偏移量无效,打印错误信息
        Serial.println("Invalid shift value. It should be between -26 and 26.");
      }
    }
  }

  // 等待一段时间后再次扫描
  delay(3000);
}