1 /*
2 * TriggerManager432.cpp
3 *
4 * Handles trigger resources on 432
5 *
6 * Copyright (C) 2007 - 2011 Texas Instruments Incorporated - http://www.ti.com/
7 *
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
11 * are met:
12 *
13 * Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer.
15 *
16 * Redistributions in binary form must reproduce the above copyright
17 * notice, this list of conditions and the following disclaimer in the
18 * documentation and/or other materials provided with the
19 * distribution.
20 *
21 * Neither the name of Texas Instruments Incorporated nor the names of
22 * its contributors may be used to endorse or promote products derived
23 * from this software without specific prior written permission.
24 *
25 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
26 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
27 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
28 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
29 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
30 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
31 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
32 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
33 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
34 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
35 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 */
37
38
39 #include <pch.h>
40
41 #include "../Trigger/Trigger432.h"
42 #include "../Trigger/DataAddressTrigger432.h"
43
44 #include "TriggerManager432.h"
45
46 #include "../Exceptions/Exceptions.h"
47
48 using namespace TI::DLL430;
49
TriggerManager432(std::vector<unsigned int> & vecCodeTriggers,std::vector<unsigned int> & vecLiteralTriggers,std::vector<unsigned int> & vecDataAddressTriggers,std::vector<unsigned int> & vecDataValueTriggers)50 TriggerManager432::TriggerManager432(std::vector<unsigned int>& vecCodeTriggers, std::vector<unsigned int>& vecLiteralTriggers, std::vector<unsigned int>& vecDataAddressTriggers, std::vector<unsigned int>& vecDataValueTriggers)
51 {
52 for (const unsigned int codeTrigger : vecCodeTriggers)
53 {
54 mCodeTriggers.push_back(Trigger432(Trigger432::CODE_TRIGGER, codeTrigger));
55 }
56
57 for (const unsigned int literalTrigger : vecLiteralTriggers)
58 {
59 mLiteralTriggers.push_back(Trigger432(Trigger432::LITERAL_TRIGGER, literalTrigger));
60 }
61
62 for (const unsigned int dataAddressTrigger : vecDataAddressTriggers)
63 {
64 mDataAddressTriggers.push_back(DataAddressTrigger432(DataTrigger432::DATA_TRIGGER, dataAddressTrigger));
65 }
66
67 for (const unsigned int dataValueTrigger : vecDataValueTriggers)
68 {
69 mDataValueTriggers.push_back(DataValueTrigger432(DataTrigger432::DATA_TRIGGER, dataValueTrigger));
70 }
71 //Configure always available options
72 DataTrigger432::accessTypeBits.clear();
73 DataTrigger432::accessTypeBits[AT_NO_FETCH] = 0x8;
74 DataTrigger432::accessTypeBits[AT_READ] = 0x5;
75 DataTrigger432::accessTypeBits[AT_WRITE] = 0x6;
76 DataTrigger432::accessTypeBits[AT_READ_WRITE] = 0x7;
77 }
78
79
getCodeTrigger()80 Trigger432* TriggerManager432::getCodeTrigger()
81 {
82 for (Trigger432& trigger : mCodeTriggers)
83 {
84 if (!trigger.isInUse())
85 {
86 trigger.isInUse(true);
87 return &trigger;
88 }
89 }
90 return nullptr;
91 }
92
93
getLiteralTrigger()94 Trigger432* TriggerManager432::getLiteralTrigger()
95 {
96 for (Trigger432& trigger : mLiteralTriggers)
97 {
98 if (!trigger.isInUse())
99 {
100 trigger.isInUse(true);
101 return &trigger;
102 }
103 }
104 return nullptr;
105 }
106
107
getDataAddressTrigger()108 DataTrigger432* TriggerManager432::getDataAddressTrigger()
109 {
110 for (DataAddressTrigger432& trigger : mDataAddressTriggers)
111 {
112 if (!trigger.isInUse())
113 {
114 trigger.isInUse(true);
115 return &trigger;
116 }
117 }
118 return nullptr;
119 }
120
getDataValueTrigger()121 DataTrigger432* TriggerManager432::getDataValueTrigger()
122 {
123 for (DataValueTrigger432& trigger : mDataValueTriggers)
124 {
125 if (!trigger.isInUse())
126 {
127 /* DataValueTrigger always requires a DataAddressTrigger */
128 DataTrigger432 *dependencyTrigger = getDataAddressTrigger();
129 if (dependencyTrigger == nullptr)
130 break;
131 trigger.isInUse(true);
132 trigger.setDependencyTrigger(dependencyTrigger);
133 return &trigger;
134 }
135 }
136 return nullptr;
137 }
138
139
releaseTrigger(Trigger432 * trigger)140 void TriggerManager432::releaseTrigger(Trigger432* trigger)
141 {
142 trigger->reset();
143 }
144
releaseDataTrigger432(DataTrigger432 * trigger)145 void TriggerManager432::releaseDataTrigger432(DataTrigger432* trigger)
146 {
147 trigger->reset();
148 }
149
150
numAvailableCodeTriggers() const151 int TriggerManager432::numAvailableCodeTriggers() const
152 {
153 int count = 0;
154
155 for (const Trigger432& trigger : mCodeTriggers)
156 {
157 if (!trigger.isInUse())
158 {
159 ++count;
160 }
161 }
162 return count;
163 }
164
numAvailableDataAddressTriggers() const165 int TriggerManager432::numAvailableDataAddressTriggers() const
166 {
167 int count = 0;
168
169 for (const DataAddressTrigger432& trigger : mDataAddressTriggers)
170 {
171 if (!trigger.isInUse())
172 {
173 ++count;
174 }
175 }
176 return count;
177 }
178
numAvailableDataValueTriggers() const179 int TriggerManager432::numAvailableDataValueTriggers() const
180 {
181 int count = 0;
182
183 for (const DataValueTrigger432& trigger : mDataValueTriggers)
184 {
185 if (!trigger.isInUse())
186 {
187 ++count;
188 }
189 }
190 return count;
191 }
192
numAvailableLiteralTriggers() const193 int TriggerManager432::numAvailableLiteralTriggers() const
194 {
195 int count = 0;
196
197 for (const Trigger432& trigger : mLiteralTriggers)
198 {
199 if (!trigger.isInUse())
200 {
201 ++count;
202 }
203 }
204 return count;
205 }
206
writeAllTriggers() const207 void TriggerManager432::writeAllTriggers() const
208 {
209 for (const Trigger432& trigger : mCodeTriggers)
210 {
211 trigger.write();
212 }
213 for (const Trigger432& trigger : mLiteralTriggers)
214 {
215 trigger.write();
216 }
217 for (const DataAddressTrigger432& trigger : mDataAddressTriggers)
218 {
219 trigger.write();
220 }
221
222 for (const DataValueTrigger432& trigger : mDataValueTriggers)
223 {
224 trigger.write();
225 }
226 }
227