Add C mock driver for RAIDGuard X GUI Server
This commit is contained in:
@@ -0,0 +1,198 @@
|
||||
# RAIDGuard X Mock Driver (C)
|
||||
|
||||
Mock driver for RAIDGuard X GUI Server - provides simulated RAID controller for testing without hardware.
|
||||
|
||||
## 目錄結構
|
||||
|
||||
```
|
||||
raidguard_c_gui_server_mock/
|
||||
├── mock_driver.h # Header file
|
||||
├── mock_driver.c # Implementation
|
||||
├── test_mock_driver.c # Test program
|
||||
├── Makefile # Build file
|
||||
└── README.md # This file
|
||||
```
|
||||
|
||||
## 建構
|
||||
|
||||
```bash
|
||||
make
|
||||
```
|
||||
|
||||
## 執行測試
|
||||
|
||||
```bash
|
||||
./test_mock_driver
|
||||
```
|
||||
|
||||
## 使用方式
|
||||
|
||||
### 1. 初始化
|
||||
|
||||
```c
|
||||
#include "mock_driver.h"
|
||||
|
||||
// 初始化 Mock Driver
|
||||
mock_init();
|
||||
|
||||
// 啟用詳細輸出
|
||||
mock_set_verbose(true);
|
||||
```
|
||||
|
||||
### 2. 設定控制器
|
||||
|
||||
```c
|
||||
// 設定控制器數量 (預設 1)
|
||||
mock_set_controller_count(2);
|
||||
|
||||
// 設定控制器序號
|
||||
mock_set_controller_serial(0, "MOCK00000001");
|
||||
mock_set_controller_serial(1, "MOCK00000002");
|
||||
|
||||
// 設定控制器型號
|
||||
mock_set_controller_model(0, "Accusys GEN2");
|
||||
```
|
||||
|
||||
### 3. 查詢控制器資訊
|
||||
|
||||
```c
|
||||
UCHAR pageBuf[1024];
|
||||
UCHAR heatsink;
|
||||
|
||||
// 查詢控制器資訊
|
||||
CHAR result = mock_QuaryDTR(0, pageBuf, &heatsink);
|
||||
|
||||
if (result == 1) {
|
||||
// 取得序號
|
||||
printf("SN: %.16s\n", pageBuf);
|
||||
|
||||
// 取得型號
|
||||
printf("Model: %.20s\n", pageBuf + 16);
|
||||
|
||||
// 取得韌體版本
|
||||
printf("FW: %.8s\n", pageBuf + 64);
|
||||
}
|
||||
```
|
||||
|
||||
### 4. 取得事件
|
||||
|
||||
```c
|
||||
EVENT_INFO evt;
|
||||
UCHAR result = mock_GetCtlrEvent(0, &evt);
|
||||
|
||||
if (result == SYSOK && evt.bStatus) {
|
||||
// 處理事件
|
||||
printf("Event Type: %d\n", evt.bEventBuf[0]);
|
||||
}
|
||||
```
|
||||
|
||||
### 5. 模擬事件
|
||||
|
||||
```c
|
||||
// 模擬磁碟上線事件
|
||||
mock_generate_disk_event(5, 0x01);
|
||||
|
||||
// 模擬 RAID 重建事件
|
||||
mock_generate_raid_event(0, 0x02);
|
||||
|
||||
// 自訂事件
|
||||
UCHAR customEvent[] = {
|
||||
0x03, 0x00, 0x00, 0x00, // Event Type
|
||||
0x00, 0x00, 0x00, 0x00, // Timestamp
|
||||
0x00, 0x00, 0x00, 0x00, // Data
|
||||
0x00, 0x00, 0x00, 0x00
|
||||
};
|
||||
mock_push_event(customEvent, 16);
|
||||
```
|
||||
|
||||
### 6. 清理
|
||||
|
||||
```c
|
||||
mock_cleanup();
|
||||
```
|
||||
|
||||
## API 參考
|
||||
|
||||
### 初始化與清理
|
||||
|
||||
| 函數 | 說明 |
|
||||
|------|------|
|
||||
| `mock_init()` | 初始化 Mock Driver |
|
||||
| `mock_cleanup()` | 清理資源 |
|
||||
| `mock_set_verbose(bool)` | 設定詳細輸出 |
|
||||
|
||||
### 控制器設定
|
||||
|
||||
| 函數 | 說明 |
|
||||
|------|------|
|
||||
| `mock_set_controller_count(int)` | 設定控制器數量 |
|
||||
| `mock_set_controller_serial(int, const char*)` | 設定控制器序號 |
|
||||
| `mock_set_controller_model(int, const char*)` | 設定控制器型號 |
|
||||
| `mock_set_controller_status(int, UCHAR)` | 設定控制器狀態 |
|
||||
|
||||
### Driver 函數
|
||||
|
||||
| 函數 | 說明 |
|
||||
|------|------|
|
||||
| `mock_QuaryDTR(UCHAR, UCHAR*, UCHAR*)` | 查詢控制器資訊 |
|
||||
| `mock_DevIoControl(...)` | I/O Control (模擬) |
|
||||
| `mock_GetCtlrEvent(UCHAR, EVENT_INFO*)` | 取得事件 |
|
||||
|
||||
### 事件模擬
|
||||
|
||||
| 函數 | 說明 |
|
||||
|------|------|
|
||||
| `mock_push_event(UCHAR*, int)` | 推入自訂事件 |
|
||||
| `mock_clear_events()` | 清除所有事件 |
|
||||
| `mock_generate_disk_event(int, int)` | 產生磁碟事件 |
|
||||
| `mock_generate_raid_event(int, int)` | 產生 RAID 事件 |
|
||||
|
||||
## 模擬的 Page 資料
|
||||
|
||||
| Page | 大小 | 內容 |
|
||||
|------|------|------|
|
||||
| 0x00 | 1024 | Controller Info |
|
||||
| 0x01 | 1024 | RAID Snapshot |
|
||||
| 0x07 | 512 | LUN Map Table |
|
||||
| 0x0A | 1024 | RAID Info |
|
||||
| 0x0B | 1024 | RAID Info |
|
||||
| 0x0E | 1024 | RAID Info |
|
||||
| 0x1B | 512 | Disk List |
|
||||
|
||||
## 整合到 GS
|
||||
|
||||
要將 Mock Driver 整合到 GS (DtrGuiSrv),請在編譯時使用 `-DENABLE_MOCK_MODE` :
|
||||
|
||||
```makefile
|
||||
ifdef ENABLE_MOCK_MODE
|
||||
CFLAGS += -DENABLE_MOCK_MODE
|
||||
SRCS += mock_driver.c
|
||||
|
||||
# 置換函數
|
||||
CFLAGS += -DQuaryDTR=mock_QuaryDTR
|
||||
CFLAGS += -DDevIoControl=mock_DevIoControl
|
||||
CFLAGS += -DGetCtlrEvent=mock_GetCtlrEvent
|
||||
endif
|
||||
```
|
||||
|
||||
或使用 FFI:
|
||||
|
||||
```c
|
||||
#ifdef ENABLE_MOCK_MODE
|
||||
#include "mock_driver.h"
|
||||
#define DevIoControl mock_DevIoControl
|
||||
#define QuaryDTR mock_QuaryDTR
|
||||
#define GetCtlrEvent mock_GetCtlrEvent
|
||||
#endif
|
||||
```
|
||||
|
||||
## 開發日誌
|
||||
|
||||
- 2024-03-29: 初始版本
|
||||
- 基本控制器模擬
|
||||
- 事件佇列
|
||||
- Page 0-1, 7, 10, 27 資料
|
||||
|
||||
## License
|
||||
|
||||
Proprietary - Accusys Inc.
|
||||
Reference in New Issue
Block a user