Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ classifiers = [
]
description = "A softioc to control a PandABlocks-FPGA."
dependencies = [
"fastcs[epicspva]~=0.11.1",
"fastcs[epicspva]~=0.12.0",
"pandablocks~=0.10.0",
"numpy<2", # until https://github.com/mdavidsaver/p4p/issues/145 is fixed
"pydantic>2",
Expand Down
13 changes: 8 additions & 5 deletions src/fastcs_pandablocks/panda/blocks/data.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,16 @@
from collections import deque
from collections.abc import AsyncGenerator, Callable
from dataclasses import dataclass
from enum import Enum
from importlib.util import find_spec
from pathlib import Path
from typing import Union
from typing import Generic, TypeVar, Union

import numpy as np
from fastcs.attributes import AttrR, AttrRW
from fastcs.controllers import Controller
from fastcs.datatypes import Bool, Enum, Float, Int, String, Table
from fastcs.datatypes import Bool, Float, Int, String, Table
from fastcs.datatypes import Enum as FastCSEnum
from numpy.typing import DTypeLike
from pandablocks.hdf import (
EndData,
Expand All @@ -27,6 +29,7 @@

from fastcs_pandablocks.types import PandaName

E = TypeVar("E", bound=Enum)
HDFReceived = Union[ReadyData, StartData, FrameData, EndData]


Expand Down Expand Up @@ -311,11 +314,11 @@ async def handle_data(self, data: HDFReceived):


@dataclass
class DatasetAttributes:
class DatasetAttributes(Generic[E]):
"""A dataset name and capture mode"""

name: AttrRW[str]
capture: AttrRW[enum.Enum]
capture: AttrRW[E]


class DatasetTableWrapper:
Expand Down Expand Up @@ -427,7 +430,7 @@ class DataController(Controller):
Bool(), description="Start/stop HDF5 capture.", initial_value=False
)
capture_mode = AttrRW(
Enum(CaptureMode),
FastCSEnum(CaptureMode),
description="Choose how to hdf writer flushes",
initial_value=CaptureMode.FIRST_N,
)
Expand Down
4 changes: 1 addition & 3 deletions src/fastcs_pandablocks/panda/client_wrapper.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
from pprint import pformat

from fastcs.datatypes import DataType
from fastcs.logging import bind_logger
from fastcs.logging import logger
from pandablocks.asyncio import AsyncioClient
from pandablocks.commands import (
Arm,
Expand All @@ -28,8 +28,6 @@
RawInitialValuesType,
)

logger = bind_logger(__name__)


class RawPanda:
"""A wrapper for interacting with pandablocks-client."""
Expand Down
10 changes: 4 additions & 6 deletions src/fastcs_pandablocks/panda/panda_controller.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
from fastcs.attributes import Attribute, AttrR
from fastcs.controllers import Controller
from fastcs.datatypes import Table
from fastcs.logging import bind_logger
from fastcs.logging import logger
from fastcs.methods import scan
from pandablocks.utils import words_to_table

Expand All @@ -18,8 +18,6 @@
from fastcs_pandablocks.panda.utils import panda_value_to_attribute_value
from fastcs_pandablocks.types import PandaName

logger = bind_logger(__name__)


@dataclass
class PandaControllerSettings:
Expand All @@ -38,19 +36,19 @@ def __init__(self, settings: PandaControllerSettings) -> None:
self._raw_panda = RawPanda(settings.address)
self._ios = [ArmIO(), DefaultFieldIO(), TableFieldIO(), UnitsIO()]
self._blocks: Blocks = Blocks(self._raw_panda, ios=self._ios)
self.connected = False
self._connected = False

super().__init__(ios=self._ios)

async def connect(self) -> None:
if self.connected:
if self._connected:
# `connect` needs to be called in `initialise`,
# then FastCS will attempt to call it again.
return
await self._raw_panda.connect()
await self._blocks.parse_introspected_data()
await self._blocks.setup_post_introspection()
self.connected = True
self._connected = True

async def initialise(self) -> None:
await self.connect()
Expand Down
Loading
Loading