Changes to integrate ploop
This commit is contained in:
parent
e39002b8e7
commit
743dcb81c3
18
classCAN.py
18
classCAN.py
|
|
@ -67,11 +67,11 @@ class CANBackend:
|
|||
raise RuntimeError("CAN not connected")
|
||||
|
||||
state_map = {
|
||||
"IDLE": 0,
|
||||
"PRODUCTION": 1,
|
||||
"MAINTENANCE": 3,
|
||||
"EMERGENCY_STOP": 4,
|
||||
"FIRST_START": 5
|
||||
"IDLE": 1,
|
||||
"PRODUCTION": 2,
|
||||
"MAINTENANCE": 8,
|
||||
"EMERGENCY_STOP": 9,
|
||||
"FIRST_START": 10
|
||||
}
|
||||
|
||||
if state not in state_map:
|
||||
|
|
@ -79,14 +79,14 @@ class CANBackend:
|
|||
|
||||
try:
|
||||
print(f"[DEBUG] Writing state {state_map[state]} to index 0x2024, subindex {pu_number}")
|
||||
self.node.sdo[0x2024][0x01].raw = state_map[state]
|
||||
self.node.sdo[0x2024][pu_number].raw = state_map[state]
|
||||
|
||||
# Write the ploop setpoint to its own index/subindex
|
||||
print(f"[DEBUG] Writing ploop_setpoint {ploop_setpoint} to index 0x2007, subindex {0x00}")
|
||||
self.node.sdo[2007][0x00].raw = int(ploop_setpoint * 100)
|
||||
print(f"[DEBUG] Writing ploop_setpoint {ploop_setpoint} to index 0x2007")
|
||||
self.node.sdo[0x2007].raw = int(ploop_setpoint * 100)
|
||||
|
||||
except Exception as e:
|
||||
print(f"[SDO WRITE ERROR] Failed to write to 0x2024:{pu_number} - {e}")
|
||||
print(f"[SDO WRITE ERROR] Failed to write to 0x2007:{e}")
|
||||
raise
|
||||
|
||||
|
||||
|
|
|
|||
95
main.py
95
main.py
|
|
@ -6,10 +6,8 @@ import os
|
|||
from fastapi import Request, APIRouter
|
||||
import subprocess
|
||||
import platform
|
||||
if platform.system() in ['Darwin']: # macOS or Windows
|
||||
from MockCAN import CANBackend
|
||||
else :
|
||||
from classCAN import CANBackend # Your real backend
|
||||
|
||||
from classCAN import CANBackend # Your real backend
|
||||
|
||||
app = FastAPI()
|
||||
router = APIRouter()
|
||||
|
|
@ -39,7 +37,7 @@ app.mount("/static", StaticFiles(directory="static"), name="static")
|
|||
# print(f"[WEBHOOK] Update failed:\n{e.stderr}")
|
||||
# return {"status": "Update failed", "error": str(e)}
|
||||
|
||||
|
||||
|
||||
@app.post("/connect_toggle")
|
||||
def connect_toggle():
|
||||
"""Toggle CAN connection."""
|
||||
|
|
@ -52,6 +50,7 @@ def connect_toggle():
|
|||
node_id=0x02,
|
||||
eds_path = os.path.join(os.path.dirname(__file__), "eds_file", "processBoard_0.eds")
|
||||
)
|
||||
|
||||
if not success:
|
||||
raise HTTPException(status_code=500, detail="Connection failed.")
|
||||
return {"connected": True}
|
||||
|
|
@ -59,87 +58,25 @@ def connect_toggle():
|
|||
@app.post("/command/{state}/pu/{pu_number}")
|
||||
def send_command(state: str, pu_number: int, ploop_setpoint: float = Query(...)):
|
||||
"""Send a state command to a specific PU."""
|
||||
logging.info(f"Sending state '{state}' to PU {pu_number} with ploop_setpoint {ploop_setpoint}")
|
||||
logging.info(f"Sending state '{state}' to PU {pu_number}")
|
||||
try:
|
||||
can_backend.send_state_command(state.upper(), pu_number, ploop_setpoint)
|
||||
return {"status": "success", "command": state.upper(), "pu": pu_number, "ploop_setpoint": ploop_setpoint}
|
||||
except Exception as e:
|
||||
raise HTTPException(status_code=500, detail=str(e))
|
||||
|
||||
|
||||
@app.get("/monitor")
|
||||
def get_monitor_data():
|
||||
# TODO : agree on the structure
|
||||
data = can_backend.get_latest_data()
|
||||
print(f"[MONITOR] Latest SDO: {data}")
|
||||
return {
|
||||
"PU_1": {
|
||||
"Qperm": data.get("FM2", 0.0),
|
||||
"Qdilute": data.get("FM3", 0.0),
|
||||
"Qdrain": data.get("FM4", 0.0),
|
||||
"Qrecirc": data.get("FM5", 0.0),
|
||||
"Pro": data.get("PS1", 0.0),
|
||||
"Pdilute": data.get("PS2", 0.0),
|
||||
"Prentate": data.get("PS3", 0.0),
|
||||
"Conductivity": data.get("Cond", 0.0),
|
||||
"MV02": data.get("MV02", 0.0),
|
||||
"MV02_sp": data.get("MV02_sp", 0.0),
|
||||
"MV03": data.get("MV03", 0.0),
|
||||
"MV03_sp": data.get("MV03_sp", 0.0),
|
||||
"MV05": data.get("MV05", 0.0),
|
||||
"MV05_sp": data.get("MV05_sp", 0.0),
|
||||
"MV06": data.get("MV06", 0.0),
|
||||
"MV06_sp": data.get("MV06_sp", 0.0),
|
||||
"MV07": data.get("MV07", 0.0),
|
||||
"MV07_sp": data.get("MV07_sp", 0.0),
|
||||
"MV08": data.get("MV08", 0.0),
|
||||
"MV08_sp": data.get("MV08_sp", 0.0)
|
||||
},
|
||||
"PU_2": {
|
||||
"Qperm": data.get("FM2", 0.0),
|
||||
"Qdilute": data.get("FM3", 0.0),
|
||||
"Qdrain": data.get("FM4", 0.0),
|
||||
"Qrecirc": data.get("FM5", 0.0),
|
||||
"Pro": data.get("PS1", 0.0),
|
||||
"Pdilute": data.get("PS2", 0.0),
|
||||
"Prentate": data.get("PS3", 0.0),
|
||||
"Conductivity": data.get("Cond", 0.0),
|
||||
"MV02": data.get("MV02", 0.0),
|
||||
"MV02_sp": data.get("MV02_sp", 0.0),
|
||||
"MV03": data.get("MV03", 0.0),
|
||||
"MV03_sp": data.get("MV03_sp", 0.0),
|
||||
"MV05": data.get("MV05", 0.0),
|
||||
"MV05_sp": data.get("MV05_sp", 0.0),
|
||||
"MV06": data.get("MV06", 0.0),
|
||||
"MV06_sp": data.get("MV06_sp", 0.0),
|
||||
"MV07": data.get("MV07", 0.0),
|
||||
"MV07_sp": data.get("MV07_sp", 0.0),
|
||||
"MV08": data.get("MV08", 0.0),
|
||||
"MV08_sp": data.get("MV08_sp", 0.0)
|
||||
},
|
||||
"PU_3": {
|
||||
"Qperm": data.get("FM2", 0.0),
|
||||
"Qdilute": data.get("FM3", 0.0),
|
||||
"Qdrain": data.get("FM4", 0.0),
|
||||
"Qrecirc": data.get("FM5", 0.0),
|
||||
"Pro": data.get("PS1", 0.0),
|
||||
"Pdilute": data.get("PS2", 0.0),
|
||||
"Prentate": data.get("PS3", 0.0),
|
||||
"Conductivity": data.get("Cond", 0.0),
|
||||
"MV02": data.get("MV02", 0.0),
|
||||
"MV02_sp": data.get("MV02_sp", 0.0),
|
||||
"MV03": data.get("MV03", 0.0),
|
||||
"MV03_sp": data.get("MV03_sp", 0.0),
|
||||
"MV05": data.get("MV05", 0.0),
|
||||
"MV05_sp": data.get("MV05_sp", 0.0),
|
||||
"MV06": data.get("MV06", 0.0),
|
||||
"MV06_sp": data.get("MV06_sp", 0.0),
|
||||
"MV07": data.get("MV07", 0.0),
|
||||
"MV07_sp": data.get("MV07_sp", 0.0),
|
||||
"MV08": data.get("MV08", 0.0),
|
||||
"MV08_sp": data.get("MV08_sp", 0.0)
|
||||
}
|
||||
"Qperm": [data.get("FM2", 0.0), data.get("FM2", 0.0), 0.0],
|
||||
"Pdilute": [data.get("PS1", 0.0), 0.0, 0.0],
|
||||
"Conductivity": [0.0, 0.0, 0.0],
|
||||
"Pro": [0.0, 0.0, 0.0],
|
||||
}
|
||||
|
||||
|
||||
@app.get("/can_status")
|
||||
def can_status():
|
||||
"""Return current CAN connection status."""
|
||||
|
|
@ -151,14 +88,6 @@ async def read_root():
|
|||
with open("static/index.html", "r") as file:
|
||||
return HTMLResponse(content=file.read(), status_code=200)
|
||||
|
||||
|
||||
@app.get("/monitor-page", response_class=HTMLResponse)
|
||||
async def read_monitor_page():
|
||||
"""Serve monitor HTML page."""
|
||||
with open("static/monitor.html", "r") as file:
|
||||
return HTMLResponse(content=file.read(), status_code=200)
|
||||
|
||||
|
||||
app.include_router(router)
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
|
@ -166,7 +95,7 @@ if __name__ == "__main__":
|
|||
uvicorn.run(
|
||||
"main:app",
|
||||
host="127.0.0.1",
|
||||
port=8000,
|
||||
port=8080,
|
||||
reload=True,
|
||||
reload_dirs=["."],
|
||||
)
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user