2025年4月24日 星期四

imulog Server API 功能擴充(/imulogload)

 

imulog Server API 功能擴充

✅ 功能擴充目標

API 路徑功能說明
/imulog接收 log 陣列資料(每筆為 [b1..b6, time]),以 .append() 加入全域變數 log_data。若總長度超過 500 筆,則自動移除最舊資料
/imulogloadlog_data 內容作為 JSON 回傳,並在回傳後立即清空(即一次性讀取)


✅ 更新後程式碼內容

🔧 全域 log_data 改為固定容量佇列(可用 collections.deque

python
from flask import Flask, request, jsonify import os import csv import re import json from collections import deque app = Flask(__name__) # 最大容量為 500 筆(約 5 秒) log_data = deque(maxlen=500)

✅ 更新 /imulog:改為 append 模式

python
@app.route('/imulog', methods=['POST']) def post_imu_log(): """接收 IMU log 資料並追加到 log_data(自動裁剪至 500 筆)。""" print("POST IMU log data!") if not request.is_json: return jsonify({"error": "Request must be JSON"}), 400 data = request.get_json() if 'time' not in data or 'log' not in data: return jsonify({"error": "JSON must contain 'time' and 'log' keys"}), 400 try: log_items = data['log'] if isinstance(log_items, str): log_items = json.loads(log_items) if not isinstance(log_items, list): raise ValueError("log must be a list") added = 0 for item in log_items: if isinstance(item, list) and len(item) == 7: log_data.append(item) added += 1 else: print(f"忽略格式錯誤項目:{item}") print(f"Appended {added} items to log_data (total: {len(log_data)})") return jsonify({"message": f"Appended {added} items", "length": len(log_data)}), 201 except Exception as e: print(f"Error appending log: {str(e)}") return jsonify({"error": f"Failed to append: {str(e)}"}), 400

✅ 新增 /imulogload:讀取後清空

python
@app.route('/imulogload', methods=['GET']) def load_and_clear_log_data(): """一次性取得 log_data 中的內容,並清空。""" print("GET /imulogload called") # 將 deque 轉成 list 回傳 data = list(log_data) log_data.clear() print(f"Returned {len(data)} items and cleared log_data") return jsonify({"log": data, "count": len(data)})

🔁 測試流程建議

  1. 傳送 log 資料

    bash
    curl -X POST http://localhost:8081/imulog \ -H "Content-Type: application/json" \ -d '{"time":"t1", "log":[[0.1,0.2,0.3,0.4,0.5,0.6,0.01]]}'
  2. 取得並清空 log 資料

    bash
    curl http://localhost:8081/imulogload


✅ 新增功能 + 調整重點

項目說明
🔁 新增 GET /imulogpeek API只讀取 log 資料內容,但不清除
🔁 log_data buffer 容量提升至 1000 筆對應 100Hz 取樣率 ≈ 10 秒緩衝

🔧 修改程式碼說明

1️⃣ 將 log_data 變更為 1000 筆上限:

python
from collections import deque log_data = deque(maxlen=1000) # 緩衝 10 秒的資料(100Hz)

2️⃣ 新增 /imulogpeek API

python
@app.route('/imulogpeek', methods=['GET']) def peek_log_data(): """僅查看 log_data 內容(不清除)。""" print("GET /imulogpeek called") data = list(log_data) return jsonify({ "log": data, "count": len(data) }), 200

✅ 完整 API 結構總結(目前為止)

Method路徑功能
POST/imulog接收 IMU log,追加至 log_data,保留最多 1000 筆
GET/imulogload讀取 + 清空 log_data
GET/imulogpeek只讀取 log_data,不清空
POST/imulogsave接收 log 並儲存成 CSV(由 client 主動上傳 log)

🧪 測試指令建議

✅ peek(只查看)

bash
curl http://localhost:8081/imulogpeek

✅ load(取出 + 清空)

bash
curl http://localhost:8081/imulogload





沒有留言:

張貼留言