diff --git a/raidguard_c_gui_server_mock/.gitignore b/raidguard_c_gui_server_mock/.gitignore new file mode 100644 index 0000000..6820503 --- /dev/null +++ b/raidguard_c_gui_server_mock/.gitignore @@ -0,0 +1,4 @@ +*.o +*.dSYM +test_mock_driver +test_all_pages diff --git a/raidguard_c_gui_server_mock/README.md b/raidguard_c_gui_server_mock/README.md index f35b337..1f504cf 100644 --- a/raidguard_c_gui_server_mock/README.md +++ b/raidguard_c_gui_server_mock/README.md @@ -22,7 +22,8 @@ make ## 執行測試 ```bash -./test_mock_driver +./test_mock_driver # 基本測試 +./test_all_pages # 完整頁面測試 ``` ## 使用方式 @@ -151,13 +152,14 @@ mock_cleanup(); | Page | 大小 | 內容 | |------|------|------| -| 0x00 | 1024 | Controller Info | -| 0x01 | 1024 | RAID Snapshot | +| 0x00 | 1024 | Controller Info (序號, 型號, 韌體, 狀態) | +| 0x01 | 1024 | RAID Snapshot (RAID 0-1 狀態) | | 0x07 | 512 | LUN Map Table | -| 0x0A | 1024 | RAID Info | -| 0x0B | 1024 | RAID Info | -| 0x0E | 1024 | RAID Info | -| 0x1B | 512 | Disk List | +| 0x0A | 1024 | RAID Info 0-1 (狀態, 等級, 容量) | +| 0x0B | 1024 | RAID Info 2-3 | +| 0x0E | 1024 | Event Log (8 筆事件, 含時間戳記) | +| 0x14 | 512 | Enclosure Info (風扇, 電源, 溫度) | +| 0x1B | 512 | Disk List (8 個磁碟槽) | ## 整合到 GS @@ -188,6 +190,11 @@ endif ## 開發日誌 +- 2026-03-29: 新增頁面 + - Page 14: Event Log (8 筆事件,含時間戳記與訊息) + - Page 20: Enclosure Info (風扇、電源、溫度、電池) + - test_all_pages 完整測試 + - 2024-03-29: 初始版本 - 基本控制器模擬 - 事件佇列 diff --git a/raidguard_c_gui_server_mock/mock_driver.c b/raidguard_c_gui_server_mock/mock_driver.c index 47aef29..4be91e1 100644 --- a/raidguard_c_gui_server_mock/mock_driver.c +++ b/raidguard_c_gui_server_mock/mock_driver.c @@ -57,6 +57,7 @@ void mock_init(void) { mock_fill_page10(0); mock_fill_page11(0); mock_fill_page14(0); + mock_fill_page20(0); mock_fill_page27(0); // Register default events @@ -185,7 +186,145 @@ void mock_fill_page11(int ctrlIndex) { } void mock_fill_page14(int ctrlIndex) { - memset(g_mockCtrl[ctrlIndex].bPage14Data, 0, 1024); + unsigned char *buf = g_mockCtrl[ctrlIndex].bPage14Data; + memset(buf, 0, 1024); + + // Event Log Structure (16 events, 64 bytes each) + // Each event: 32 bytes data + 32 bytes message + // Offset 0-15: Event Type (4 bytes), Timestamp (4 bytes), Slot/EID (4 bytes), Status (4 bytes) + // Offset 16-31: Reserved + // Offset 32-63: Event Message (32 bytes) + + time_t now = time(NULL); + + // Event 0: Controller started + buf[0] = 0x01; // Event Type: System + buf[1] = 0x00; + buf[2] = 0x00; + buf[3] = 0x00; + *(unsigned int*)(buf + 4) = (unsigned int)(now - 3600); // 1 hour ago + *(unsigned int*)(buf + 8) = 0xFFFFFFFF; // Controller + buf[12] = 0x01; // Status: Info + memcpy(buf + 32, "Controller started successfully ", 32); + + // Event 1: Disk online + buf[64] = 0x02; // Event Type: Disk + buf[65] = 0x00; + buf[66] = 0x00; + buf[67] = 0x00; + *(unsigned int*)(buf + 68) = (unsigned int)(now - 1800); // 30 min ago + *(unsigned int*)(buf + 72) = 0x02; // Slot 2 + buf[76] = 0x01; // Status: Info + memcpy(buf + 96, "Disk online ", 32); + + // Event 2: RAID normal + buf[128] = 0x03; // Event Type: RAID + buf[129] = 0x00; + buf[130] = 0x00; + buf[131] = 0x00; + *(unsigned int*)(buf + 132) = (unsigned int)(now - 900); // 15 min ago + *(unsigned int*)(buf + 136) = 0x00; // RAID ID 0 + buf[140] = 0x01; // Status: Info + memcpy(buf + 160, "RAID-01 status: Normal ", 32); + + // Event 3: Temperature warning + buf[192] = 0x02; // Event Type: Disk + buf[193] = 0x00; + buf[194] = 0x00; + buf[195] = 0x00; + *(unsigned int*)(buf + 196) = (unsigned int)(now - 600); // 10 min ago + *(unsigned int*)(buf + 200) = 0x03; // Slot 3 + buf[204] = 0x02; // Status: Warning + memcpy(buf + 224, "Disk temperature warning: 45C ", 32); + + // Event 4: Power supply normal + buf[256] = 0x05; // Event Type: Power + buf[257] = 0x00; + buf[258] = 0x00; + buf[259] = 0x00; + *(unsigned int*)(buf + 260) = (unsigned int)(now - 300); // 5 min ago + *(unsigned int*)(buf + 264) = 0x00; // PS 0 + buf[268] = 0x01; // Status: Info + memcpy(buf + 288, "Power supply 1 online ", 32); + + // Event 5: Fan normal + buf[320] = 0x04; // Event Type: Enclosure + buf[321] = 0x00; + buf[322] = 0x00; + buf[323] = 0x00; + *(unsigned int*)(buf + 324) = (unsigned int)(now - 120); // 2 min ago + *(unsigned int*)(buf + 328) = 0x00; // Fan 0 + buf[332] = 0x01; // Status: Info + memcpy(buf + 352, "Fan speed normal: 5200 RPM ", 32); + + // Event 6: Network up + buf[384] = 0x06; // Event Type: Network + buf[385] = 0x00; + buf[386] = 0x00; + buf[387] = 0x00; + *(unsigned int*)(buf + 388) = (unsigned int)(now - 60); // 1 min ago + *(unsigned int*)(buf + 392) = 0x00; // Port 0 + buf[396] = 0x01; // Status: Info + memcpy(buf + 416, "Network port link up ", 32); + + // Event 7: Battery OK + buf[448] = 0x01; // Event Type: System + buf[449] = 0x00; + buf[450] = 0x00; + buf[451] = 0x00; + *(unsigned int*)(buf + 452) = (unsigned int)now; // Now + *(unsigned int*)(buf + 456) = 0xFFFFFFFF; // Controller + buf[460] = 0x01; // Status: Info + memcpy(buf + 480, "Battery backup unit initialized ", 32); + + // Event count at offset 960 (0x3C0) + buf[960] = 8; // 8 events stored + + if (g_verbose) { + printf("[MOCK] Page 14 filled for controller %d (8 events)\n", ctrlIndex); + } +} + +void mock_fill_page20(int ctrlIndex) { + unsigned char *buf = g_mockCtrl[ctrlIndex].bPage20Data; + memset(buf, 0, 512); + + buf[0] = 2; // Fan Count + buf[1] = 2; // Power Supply Count + buf[2] = 4; // Temperature Sensor Count + buf[3] = 1; // Heat Sink Count + buf[4] = 1; // Power Supply Fan Count + + buf[0x10] = 0x50; + buf[0x11] = 0x14; + buf[0x12] = 0x40; + buf[0x13] = 0x13; + + buf[0x18] = 0xA0; + buf[0x19] = 0x0F; + + buf[0x20] = 35; + buf[0x21] = 32; + buf[0x22] = 38; + buf[0x23] = 30; + + buf[0x40] = 0x00; + buf[0x41] = 0x00; + buf[0x42] = 0x01; + buf[0x43] = 0x00; + + buf[0x50] = 0x00; + buf[0x51] = 0x00; + + buf[0x60] = 0x01; + buf[0x61] = 0x64; + buf[0x62] = 0x00; + + buf[0x00] = 0x00; + + if (g_verbose) { + printf("[MOCK] Page 20 filled for controller %d (Enclosure Info)\n", ctrlIndex); + } } void mock_fill_page27(int ctrlIndex) { diff --git a/raidguard_c_gui_server_mock/mock_driver.h b/raidguard_c_gui_server_mock/mock_driver.h index 24c2d44..45cdf81 100644 --- a/raidguard_c_gui_server_mock/mock_driver.h +++ b/raidguard_c_gui_server_mock/mock_driver.h @@ -97,6 +97,7 @@ void mock_fill_page7(int ctrlIndex); void mock_fill_page10(int ctrlIndex); void mock_fill_page11(int ctrlIndex); void mock_fill_page14(int ctrlIndex); +void mock_fill_page20(int ctrlIndex); void mock_fill_page27(int ctrlIndex); void mock_register_default_events(void); diff --git a/raidguard_c_gui_server_mock/test_all_pages.c b/raidguard_c_gui_server_mock/test_all_pages.c index 46da0be..6af592d 100644 --- a/raidguard_c_gui_server_mock/test_all_pages.c +++ b/raidguard_c_gui_server_mock/test_all_pages.c @@ -100,12 +100,70 @@ void test_page11(void) { } void test_page14(void) { - printf("\n========== TEST PAGE 14: RAID Info 6-7 ==========\n"); + printf("\n========== TEST PAGE 14: Event Log ==========\n"); MOCK_CTRL_INFO *ctrl = mock_get_ctrl_info(0); unsigned char *buf = ctrl->bPage14Data; - print_hex("Full Page 14", buf, 64); + printf("Event Count: %d\n", buf[960]); + + // Print first event + printf("\nEvent 0:\n"); + printf(" Type: 0x%02X\n", buf[0]); + printf(" Timestamp: %u\n", *(unsigned int*)(buf + 4)); + printf(" Slot/EID: 0x%02X\n", *(unsigned int*)(buf + 8)); + printf(" Status: 0x%02X\n", buf[12]); + printf(" Message: %.32s\n", buf + 32); + + // Print second event + printf("\nEvent 1:\n"); + printf(" Type: 0x%02X\n", buf[64]); + printf(" Timestamp: %u\n", *(unsigned int*)(buf + 68)); + printf(" Slot/EID: 0x%02X\n", *(unsigned int*)(buf + 72)); + printf(" Status: 0x%02X\n", buf[76]); + printf(" Message: %.32s\n", buf + 96); + + print_hex("Page 14 (first 128 bytes)", buf, 128); +} + +void test_page20(void) { + printf("\n========== TEST PAGE 20: Enclosure Info ==========\n"); + + MOCK_CTRL_INFO *ctrl = mock_get_ctrl_info(0); + unsigned char *buf = ctrl->bPage20Data; + + printf("Enclosure ID: %d\n", buf[0]); + printf("Fan Count: %d\n", buf[1]); + printf("Power Supply Count: %d\n", buf[2]); + printf("Temperature Sensor Count: %d\n", buf[3]); + printf("Heat Sink Count: %d\n", buf[4]); + + // Fan speeds + unsigned short fan1 = buf[0x10] | (buf[0x11] << 8); + unsigned short fan2 = buf[0x12] | (buf[0x13] << 8); + printf("Fan 1 Speed: %d RPM\n", fan1); + printf("Fan 2 Speed: %d RPM\n", fan2); + + // Temperatures + printf("Temperature 1: %d C\n", buf[0x20]); + printf("Temperature 2: %d C\n", buf[0x21]); + printf("Temperature 3: %d C\n", buf[0x22]); + printf("Temperature 4: %d C\n", buf[0x23]); + + // Temp status + printf("Temp 1 Status: %d\n", buf[0x40]); + printf("Temp 2 Status: %d\n", buf[0x41]); + printf("Temp 3 Status: %d\n", buf[0x42]); + + // Power Supply status + printf("Power Supply 1: %s\n", buf[0x50] == 0 ? "OK" : "FAIL"); + printf("Power Supply 2: %s\n", buf[0x51] == 0 ? "OK" : "FAIL"); + + // Battery + printf("Battery Present: %s\n", buf[0x60] == 1 ? "Yes" : "No"); + printf("Battery Charge: %d%%\n", buf[0x61]); + + print_hex("Full Page 20", buf, 128); } void test_page27(void) { @@ -190,6 +248,7 @@ int main(int argc, char *argv[]) { test_page10(); test_page11(); test_page14(); + test_page20(); test_page27(); test_devioctl(); test_events();