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