note description: "[ A parallel port connection with access to the well-defined Control, Data and Status registers. For more freedom over the parallel port connection with respects to read-write states, use {PRT_CONNECTION} directly. Members of {PRT_PARALLEL_ADDRESS} contain the port addresses of each well know parallel port, which should be used when initializing {PRT_CONNECTION}. ]" legal : "See notice at end of class." status : "See notice at end of class."; author : "Paul Bates (paul.a.bates@gmail.com)" date : "$Date$" revision: "$Revision$" class PRT_PARALLEL_CONNECTION inherit PRT_CONNECTION rename make as make_connection redefine safe_dispose end create make feature {NONE} -- Initialization make (a_port: detachable like parallel_port_address; a_factory: like stream_factory) -- Creates a new parallel port connection. -- -- `a_port': The parallel port address. -- `a_factory': Port stream factory to use when creating the port's reading and writing streams. require a_factory_attached: attached a_factory do make_connection (a_port.item, a_factory) ensure parallel_port_address_set: parallel_port_address = a_port address_set: address = a_port.item stream_factory_set: stream_factory = a_factory end feature {NONE} -- Clean Up safe_dispose (a_disposing: BOOLEAN) -- do dispose_utils.dispose_of (internal_control_register) dispose_utils.dispose_of (internal_data_register) dispose_utils.dispose_of (internal_status_register) Precursor (a_disposing) end feature -- Access parallel_port_address: PRT_PARALLEL_ADDRESS -- The parallel port address. feature -- Registers control_register: attached PRT_PARALLEL_CONTROL_REGISTER -- Parallel port control register. require is_interface_usable: is_interface_usable do if attached internal_control_register as l_result then Result := l_result else create Result.make (Current) internal_control_register := Result end ensure result_attached: attached Result result_consistent: Result = control_register end data_register: attached PRT_PARALLEL_DATA_REGISTER -- Parallel port data register. require is_interface_usable: is_interface_usable do if attached internal_data_register as l_result then Result := l_result else create Result.make (Current) internal_data_register := Result end ensure result_attached: attached Result result_consistent: Result = data_register end status_register: PRT_PARALLEL_STATUS_REGISTER -- Parallel port status register. require is_interface_usable: is_interface_usable do if attached internal_status_register as l_result then Result := l_result else create Result.make (Current) internal_status_register := Result end ensure result_attached: attached Result result_consistent: Result = status_register end feature {NONE} -- Internal implementation cache internal_control_register: detachable like control_register -- Cached `control_register' -- Do not use directly. note option: stable attribute end internal_status_register: detachable like status_register -- Cached `status_register' -- Do not use directly. note option: stable attribute end internal_data_register: detachable like data_register -- Cached `data_register' -- Do not use directly/ note option: stable attribute end invariant parallel_port_address_attached: attached parallel_port_address address_synchronized: address = parallel_port_address.item end