PEBL 2.2
Psychology Experiment Building Language - Cross-platform psychological experiment development system
Chain.h
Go to the documentation of this file.
1// Chain.h - PEBL Chain data model
2// Copyright (c) 2026 Shane T. Mueller
3// Licensed under GPL
4
5#ifndef CHAIN_H
6#define CHAIN_H
7
8#include <string>
9#include <vector>
10#include <memory>
11
12// Chain item types
13enum class ItemType {
15 Consent,
17 Test
18};
19
20// Convert ItemType to string
21std::string ItemTypeToString(ItemType type);
22ItemType StringToItemType(const std::string& str);
23
24// Chain item
25struct ChainItem {
27
28 // For page items (instruction/consent/completion)
29 std::string title;
30 std::string content;
31
32 // For test items
33 std::string testName;
34 std::string paramVariant;
35 std::string language;
36 int randomGroup; // 0 = no randomization, >0 = randomization group ID
37
39 ChainItem(ItemType t) : type(t), paramVariant("default"), randomGroup(0) {}
40
41 // Create ChainPage.pbl JSON config for page items
42 std::string CreateChainPageConfig(const std::string& tempDir) const;
43
44 // Build PEBL command for test items
45 std::string BuildTestCommand(const std::string& studyPath,
46 const std::string& subjectID) const;
47
48 // Get display name for this item
49 std::string GetDisplayName() const;
50
51 // Check if this is a page item (instruction/consent/completion)
52 bool IsPageItem() const {
53 return type == ItemType::Instruction ||
56 }
57};
58
59// Chain data model
60class Chain {
61public:
62 Chain();
63 ~Chain();
64
65 // Load chain from JSON file
66 static std::shared_ptr<Chain> LoadFromFile(const std::string& path);
67
68 // Save chain to JSON file
69 bool Save();
70
71 // Create new empty chain
72 static std::shared_ptr<Chain> CreateNew(const std::string& path,
73 const std::string& name,
74 const std::string& description = "");
75
76 // Getters
77 const std::string& GetName() const { return mName; }
78 const std::string& GetDescription() const { return mDescription; }
79 const std::string& GetFilePath() const { return mFilePath; }
80 const std::vector<ChainItem>& GetItems() const { return mItems; }
81 int GetItemCount() const { return static_cast<int>(mItems.size()); }
82 int GetParticipantCounter() const { return mParticipantCounter; }
83 bool GetUploadEnabled() const { return mUploadEnabled; }
84 bool GetLSLEnabled() const { return mLSLEnabled; }
85 const std::string& GetLSLStreamName() const { return mLSLStreamName; }
86
87 // Setters
88 void SetName(const std::string& name) { mName = name; }
89 void SetDescription(const std::string& desc) { mDescription = desc; }
90 void SetParticipantCounter(int counter) { mParticipantCounter = counter; }
91 void SetUploadEnabled(bool enabled) { mUploadEnabled = enabled; }
92 void SetLSLEnabled(bool enabled) { mLSLEnabled = enabled; }
93 void SetLSLStreamName(const std::string& name) { mLSLStreamName = name; }
94
95 // Increment participant counter and save
97
98 // Item management
99 void AddItem(const ChainItem& item);
100 void InsertItem(int index, const ChainItem& item);
101 bool RemoveItem(int index);
102 bool MoveItem(int fromIndex, int toIndex);
103 ChainItem* GetItem(int index);
104 const ChainItem* GetItem(int index) const;
105
106 // Validation
108 std::vector<std::string> errors;
109 std::vector<std::string> warnings;
110 bool IsValid() const { return errors.empty(); }
111 };
112 ValidationResult Validate(const class Study* study = nullptr) const;
113
114private:
115 bool LoadFromJSON(const std::string& jsonPath);
116 bool SaveToJSON(const std::string& jsonPath);
117
118 std::string mFilePath; // Path to chain JSON file
119 std::string mName;
120 std::string mDescription;
121 int mParticipantCounter; // Auto-incrementing participant counter
122 std::vector<ChainItem> mItems;
123
124 // Upload configuration
125 bool mUploadEnabled; // Whether to upload data for tests in this chain
126
127 // LSL configuration
128 bool mLSLEnabled; // Whether to use LSL streaming for tests in this chain
129 std::string mLSLStreamName; // Stream name template (supports {test}, {subject} placeholders)
130};
131
132#endif // CHAIN_H
ItemType
Definition Chain.h:13
std::string ItemTypeToString(ItemType type)
Definition Chain.cpp:20
ItemType StringToItemType(const std::string &str)
Definition Chain.cpp:35
Definition Chain.h:60
bool GetUploadEnabled() const
Definition Chain.h:83
~Chain()
Definition Chain.cpp:124
void AddItem(const ChainItem &item)
Definition Chain.cpp:153
Chain()
Definition Chain.cpp:118
const std::vector< ChainItem > & GetItems() const
Definition Chain.h:80
void SetLSLEnabled(bool enabled)
Definition Chain.h:92
void SetUploadEnabled(bool enabled)
Definition Chain.h:91
void SetLSLStreamName(const std::string &name)
Definition Chain.h:93
const std::string & GetLSLStreamName() const
Definition Chain.h:85
int GetItemCount() const
Definition Chain.h:81
ValidationResult Validate(const class Study *study=nullptr) const
Definition Chain.cpp:220
void SetParticipantCounter(int counter)
Definition Chain.h:90
bool Save()
Definition Chain.cpp:138
void IncrementParticipantCounter()
Definition Chain.cpp:412
int GetParticipantCounter() const
Definition Chain.h:82
bool GetLSLEnabled() const
Definition Chain.h:84
const std::string & GetFilePath() const
Definition Chain.h:79
const std::string & GetName() const
Definition Chain.h:77
const std::string & GetDescription() const
Definition Chain.h:78
static std::shared_ptr< Chain > LoadFromFile(const std::string &path)
Definition Chain.cpp:127
ChainItem * GetItem(int index)
Definition Chain.cpp:204
static std::shared_ptr< Chain > CreateNew(const std::string &path, const std::string &name, const std::string &description="")
Definition Chain.cpp:142
bool RemoveItem(int index)
Definition Chain.cpp:165
void SetDescription(const std::string &desc)
Definition Chain.h:89
bool MoveItem(int fromIndex, int toIndex)
Definition Chain.cpp:174
void SetName(const std::string &name)
Definition Chain.h:88
void InsertItem(int index, const ChainItem &item)
Definition Chain.cpp:157
Definition Study.h:44
ChainItem()
Definition Chain.h:38
std::string testName
Definition Chain.h:33
bool IsPageItem() const
Definition Chain.h:52
std::string CreateChainPageConfig(const std::string &tempDir) const
Definition Chain.cpp:47
std::string title
Definition Chain.h:29
std::string GetDisplayName() const
Definition Chain.cpp:106
ChainItem(ItemType t)
Definition Chain.h:39
std::string content
Definition Chain.h:30
std::string BuildTestCommand(const std::string &studyPath, const std::string &subjectID) const
Definition Chain.cpp:79
std::string paramVariant
Definition Chain.h:34
ItemType type
Definition Chain.h:26
std::string language
Definition Chain.h:35
int randomGroup
Definition Chain.h:36
std::vector< std::string > warnings
Definition Chain.h:109
std::vector< std::string > errors
Definition Chain.h:108
bool IsValid() const
Definition Chain.h:110
Definition Study.h:24