- FunctionCore:
- Improve Channel Events:
- Remove important actions from ChannelStateEvent()
(now only used for custom actions)
- Add new method UpdateChannelOutState()
- Add Channel Events to Link and Unlink actions
- Rename SetChannelState() -> SetChannelInState()
- Use Channel->Ref (instead of name) on all channel events
- DeviceCore/SelectableCore:
- Rename SetChannelState() -> SetChannelInState()
- DateTimeCore:
- Added new functions Get/SetDateTime() for combined date & time get/set
- Added LocalTime param to ReadDate/Time() and BuildDate/TimeStr()
- Allow input time to interpretted as ether UTC or local time
- DeviceCore:
- Added SourceRef to HandleCommand()
- FunctionCore
- Replace Channel->Ready with Channel->State (off/waiting/ready)
- Add Function reference to Handle
- SelectableBare/Core:
- Implement async address resolve with event handling
- Create ResolveHandler() signal handler (friend) function
- Change Create/Remove/DestroyHandle() methods to virtual methods
- Move socket specific code to SelectableCore
- Rename ChangeState() to virtual HandleState()
- Move ClearHandle() from SelectableBare -> SelectableCore
- Implement new/delete from THandle
- Set max TCP SYN count on connect
- FunctionCore
- So not set Function JSON "config" param to empty object by default
- Change TChannelLink to reference Channel direct
- Add Input/Output to TChannelLink
- Replace LinkChannel() Bidirectional param with Input/Output param
- Update JSON config as well
- Implement Channel "Ready" state and events
- Remove Input/OutputEnabled parameters and related methods
- Remove from JSON config as well
- Update AddChannel() method accordingly
- Add Ref param to struct TChannel
- SelectableCore:
- Convert inline ChangeState() to non-inline method
- Move ChangeState() to last step in open/close methods
- Add Channels in Not Ready state
- Change Channel state when Handle state changed
- DeviceCore:
- Add Channels in Ready state
- FileCore:
- Add Channel in Not Ready state
- FunctionCore:
- Set Function Type in Init()
- SelectableBare:
- Remove unnecesary initialisation in constructor
- SelectableCore:
- Remove code duplicated in SelectableBare
- Save reference to process config in Function Core
- Moved from DeviceCore to here as common feature
- "Config" : object
Allow additional config to be stored in application definition
- "Config" : string
Name reference to config object in main JSON file
- Remove from Device Core
- FunctionCore:
- Add OutputFormat param on Output() method - override output format
- SelectableCore:
- Update Log output formats (process/functionblock)
- DeviceCore:
- Updated device data format (different byte sequences)
- Added ID & Address fields to TDevice struct
- Add search methods for ID & Address
- Update AddDevice() method to check for duplicate ID & address
- Handle Invalid reply different from reply timeout
- Add methods ValidReplyReceived() for standardise operation
- Bug fix: DeviceTypes added as to Device List!
- Bug fix: Check if Device/DeviceType created before adding params
- Added correct handling of new Device Data types (LH & HL)
- Updated log messages
- Switch from malloc/free -> new/delete for structures
- Bug fix: Move Parameter groups to Device (not class)
- Update Parameter groups:
- Update Read/Write indicators as params are added
- Implement consistent Function addition to application
- Use TYPE_XXX constants to declare function type
- Use NewXXXX() methods to call constructor correctly
- Add FunctionType list (with constructor) to Application
- Create Function by comparison to FunctionType list
- Simplify LoadConfig() and Init() methods for functions
- Combine methods into Init() method
- Pass relevant data member to Init() method
- Remove all CDataMember references on functions
- ApplicationCore:
- Split ReadParam() method from LoadConfig() method
- Split main configuration into separate files:
- config/ - main config file, general application settings
- definition/ - application definition, e.g. function blocks
- Definition and Address List files specified in config file
- Load address file in address/ branch
- Made DataTree & JSONparser private
- Made Config, Definition & Address branches public
- Removed unnecessary branch references
- Improved event logging
- DataTreeCore:
- Allow GetChFirstChild & GetChElement to create parent branches
with correct type, ie. Object/Array
- Remove unnecessary Create param from GetXxx functions
- Bug fix: Print empty objects/arrays correct, ie. empty brackets
- Bug fix: Adding element at specific index
- Bug fix: Error when get/create string value with "null"
- FunctionCore:
- Type param now set as constant via constructor
- Create empty Handles & Channels objects if none in Config
- SelectableCore:
- Add Queue length parameter to handles for UNIX and TCP sockets
- DeviceCore:
- Bug fix: missing Process() method
- FunctionCore, SelectCore, SelectableCore, DeviceCore, FileCore:
- Update Logs to show [ProcessName]/[FunctionName]
- SelectableCore:
- Update ConnectTypeName array (more readable)
- Return THandle on all OpenXxxx() methods
- Do not remove select handle for UDPremoteClient (same handle as server)
- Add correct Handle when adding RemoteClient to Selector
- DataTreeCore:
- Renamed Get/SetMemXxx() methods to Get/SetChXxx()
- Renamed GetMember() to GetChild()
- Updated: JSONparse, ApplicationCore, FunctionCore, SelectableCore,
and WatchdogCore
- Remove unused PrevChild & Last vars in GetChild (GetMember)
- JSONparseCore:
- Use return values from write() and PrintXxx() methods to report fail
- SelectableCore:
- Fix possible uninitialised FlowCtrl & Parity value
- DateTimeCore:
- Fix possible memory overrun in temp buffer
- EventBufferCore:
- Fix possible uninitialised value error in AddEvent
- DataTreeCore:
- Merge TDataMember and CDataTree into => CDataMember
- Each node, incl root is now CDataMember object
- Modified function to not require BaseMember (Object is basemember)
- Split/duplicat most functions to require, or not require child path
- Added isNull/Object/Array/Sting() etc methods
- Many other methods removed or restructured
- Updated DataTree usage in: JSONparseCore,
ApplicationCore, FunctionCore, SelectableCore, WatchdogCore
- FunctionCore:
- Output() returns largest no of bytes written to linked input
- SelectableCore:
- Auto-manage:
- Add AutoManage param -> Persistent
- Will automatic open port if written to when Auto-Manage enabled
- Will keep port open (re-open if closed) if Persistent = true
- DNS resolve:
- Set AddressFailed if port could not open/bind
- Only use next resolved address if current address failed
- ItemBufferCore:
- New Class for storing items in a FIFO style buffer
- FunctionCore:
- Implemented pulled input:
- Function creates static output: StoredOutput & StoredOutputLen
- Other Function pulls static output from input linked functions
- FunctionCore-ChannelBuffer:
- Tried to create a processing buffer
- Abandoned for now
- Library Clean up:
- Removed all unused C/C++ libraries from source
- First C/C++ libraries then redA libraries
- Library changes:
- renamed BufferCore -> CharBufferCore
- added ItemBufferCore
- CharBufferCore:
- Derive RollingBuffer & ShiftBuffer from common class CharBuffer
- CharBuffer is mostly a virtual class (interface)
- FunctionCore:
- Do not auto create empty channel list
- SelectCore:
- Rename method: SetDebugLevel() -> LogLevel()
- SelectableCore:
- Do not auto create empty handles list
- Implement new ApplicationCore:
- Manage Tools: Log, DataTree, JSONparser & Selector
- Load configuration, Manage FunctionBlocks
- FunctionCore & dirived classes, SignalCore:
- affects: SelectableCore, DeviceCore, FileCore, WatchdogCore
- Do not pass Log()
- Define and pass Type
- Update/reduce included headers
- Use ProcessName and Application global vars
- Get Log, DataTree from Application
- Use virtual Init() function to set must have Channels/Handles
- DataTreeCore:
- Bug fix: Check if child members exist and destroy in SetValuePtr()
- Add method GetFirstChild with BaseMember & Path
- Bug fix: do not use RootMember if no Parent in GetChildxxx() methods
- SignalCore, SelectCore:
- Use Application->Log()
- FunctionCore:
- Add itself to Application (function list)
- Add parameter: LinkConfigMember, Type
- Use virtual LoadConfigData() to configure from DataTree
- Rename methods: LoadConfig() -> InitConfig(),
InitLogging() -> SetLogParam(), SetDebugLevel() -> SetLogLevel()
- Add method: GetType(), LoadChannelLinkData(), InitChannelLinks()
- Modify LinkIn/OutputChannel() to use name for InFunction, not pointer
- SelectableCore & Dirived classes:
- Affects DeviceCore & WatchdogClient
- Rename parameter: Select -> Selector, BaseMember -> ConfigMember
- Get Selector from Application->Selector
- Change Handles JSON structure from Array to Key:Value pairs
- Bug fix: check if Selector exist during Input()
- Bug fix: do not set PortNo if not exist
- FunctionCore:
- Fix Memory Leaks:
- Recreate Name in LoadConfig()
- Setting FirstChannel to NULL in LoadConfig()
- Fix fault on empty Log/Output in LoadConfig()
- Check if Log/Level exists in LoadConfig()
- Do not auto-create all config parameters
- SelectableCore:
- Fix Memory Leaks:
- Setting FirstHandle to NULL in LoadConfig()
- Do not auto-create all config parameters
- Update logs to specifically refer to "TCP" server/client
- SelectableCore:
- Made GetType() & GetState() public methods
- Update logs in Input()
- FunctionCore:
- Add Input/OutputEnabled parameters with Get/Set methods.
- Update logging in Input() and Output()
- Check if input/output enabled in Input() and Output()
- DataTree->GetStr return Member->Value or NULL if not found
- Rename DeviceCore EDataType to EMBDataType, avoid conflict with JSONpaser
- Add DataTree to FunctionCore with LoadConfig() method
- Change ProcessName to char * (from char[])
- JSONparse:
- Rename RootPath to BasePath on all methods to reduce confusion
- Allow FilePath to be NULL, add '/' if not present
- Fixed Parsing sequence in ParseObject & ParseArray
- Logging
- Created LogCore Class
- Updated LogCore to use file descriptors instead of stdout
- Add Log object reference to constructors for:
FunctionCore, SelectCore
- Use extern Log() object in SignalCore
- SelectableCore
- Added new connection type: ForkedPipe
Create pipe, fork process, connect pipe out to child stdin, exec
- Minor fix: Set correct names in comments at top of file
- New FileCore Class:
- Writing data to output file
- BufferCore:
- Check for "EAGAIN" on write and retry write
- FunctionCore:
- Add new Output method that references LocalIO directly
- SelectableCore:
- New method SetAutomanage to specify auto re-open parameters
- Re-open timer implemented to slow re-open events
- Only call ProcessBuffer() if data received on socket
- Force processing input data when no input marker set
- Use new Output method to simplify code
- Bug fix: Read correctly from buffer on multiple reads/writes on FD
- Check for "EAGAIN" on write to FD and retry write
- Updated all Logged messages, standardised DebugLevel:
- dlNone - Show startup and stop
- dlLow - Show creation/destruction of Function Blocks and Local IO
- dlMedium - Show connection events, eg. open/close
- dlHigh - Show data flow events
-LogCore:
- LogMessage and ShowOutput uses va_list
only run printf if DebugLevel correct
- Remove global LogStr[] variable
- SelectableCore:
- Implemented Auto-management of handles
auto open on startup/fail/close
- Changed simple Open/Close/Read/Write methods to inline
- Do not set Select Write trigger for server socket
- Memory leak, setting address twice on RemoteClient
- Bug fix, only send handle out data if DebugLevel = dlHigh
- Bug fix, do not Read/ProcessBuffer if no InputBuffer
- Implemented global var DebugLevel
- Update LogCore to check DebugLevel
- Added many log messages and standadised all log messages
- Further improved validation checks on all methods
- Updated SelectCore, only remove SelectHandle from list during Test()
- Close Handles in SelectableCore destructor
Bug fixes:
- Non-blocking Client Socket Connection now working correctly
- Remove FD from Select lists at the correct time
- General bug fixes
- Implement search for multi-character marker search in BufferCore
Replaced FindChar() method with FindStr() method
- Implemented LocalIO and LinkedIO in FunctionCore
- Connect LocalIO with FD in SelectableCore
- Implement Write buffer with Write Select in SelectableCore
- Improve validation checks in SelectableCore
- Use Handle ptr instead of Handle Names for Config methods
- Merged SelectCore and PortCore into new SelectableCore
Single well integrated Class
- Rename SelectCore.h to SelectableCore.h
- Create new TFileHandle structure for Ports/Sockets
- Moved buffer and Input Timeout from FunctionCore to TFileHandle
- Moved Read, Write and ProcessBuffer from FunctionCore to TFileHandle
Bug Fixes:
- malloc correct size for names
- Calculate MaxFD correctly when closing FDs
- Converted CSocketCore to Class/Object
- Implemented CFunctionCore as base class for CPortCore and CSocketCore
- Moved common functions to CFunctionCore and renamed
eg. Maintain() -> Process()
- Pass Objects directly to each other as OutputFunction
- New Input() method allows data transfer between objects