OSDN Git Service

[dennco] re-working the doTick process flow. The work is still in progress.
[dennco/dennco.git] / Source / layer1 / TKCell.cpp
1 //  Copyright (c) 2012 Dennco Project
2 //
3 // This program is free software: you can redistribute it and/or modify
4 // it under the terms of the GNU General Public License as published by
5 // the Free Software Foundation, either version 3 of the License, or
6 // (at your option) any later version.
7 //
8 // This program is distributed in the hope that it will be useful,
9 // but WITHOUT ANY WARRANTY; without even the implied warranty of
10 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11 // GNU General Public License for more details.
12 //
13 // You should have received a copy of the GNU General Public License
14 // along with this program.  If not, see <http://www.gnu.org/licenses/>.
15
16 //
17 //  Created by tkawata on 12/11/2011.
18 //
19
20 #include "TKCell.h"
21 #include "TKReceptor.h"
22 #include "TKContainer.h"
23 #include "TKCellCode.h"
24 #include "TKAxon.h"
25 #include "TKCellCodeInstance.h"
26 #include "TKLog.h"
27 #include <string>
28
29 TKCell::TKCell(TKContainer *container, std::string location, std::string name, bool canIntarfaceIn, bool canInterfaceOut)
30 : mName(name), mLocation(location), mContainer(container), mAxon(NULL), mCellCodeInstance(NULL),
31   mCanInterfaceIn(canIntarfaceIn), mCanInterfaceOut(canInterfaceOut), mReceptorValueUpdated(false)
32 {
33 }
34
35 TKCell::~TKCell()
36 {
37     if (mCellCodeInstance)
38     {
39         delete mCellCodeInstance;
40         mCellCodeInstance = NULL;
41     }
42
43     for ( TKReceptorMap::iterator it = mReceptors.begin(); it != mReceptors.end(); ++it ) {
44         delete it->second;
45     }
46     mReceptors.clear();
47
48     if (mAxon)
49     {
50         delete mAxon;
51         mAxon = NULL;
52     }
53 }
54
55 void TKCell::init()
56 {
57     if (!mAxon)
58         mAxon = mContainer->axonFactory(this);
59 }
60
61 float TKCell::getAxonValue() const
62 {
63     if (!mAxon)
64         return 0.0;
65     return mAxon->getValue();
66 }
67
68 void  TKCell::setAxonValue(float value)
69 {
70     if (!mAxon)
71         return;
72     mAxon->setValue(value);
73 }
74
75 bool TKCell::setCellCode(TKCellCode *code, const void *data)
76 {
77     if (mCellCodeInstance)
78         delete mCellCodeInstance;
79
80     mCellCodeInstance = code->createCellCodeInstance(this, data);
81     return mCellCodeInstance != NULL;
82 }
83
84 bool TKCell::connectTo(std::string connectionName, TKCell *targetCell)
85 {
86     TKReceptor *receptor = targetCell->createReceptor(connectionName);
87     if (receptor)
88     {
89         TKAxonTerminal *terminal = mAxon->addTerminal();
90         receptor->setTarget(terminal);
91
92         return true;
93     }
94     else
95     {
96         return false;
97     }
98 }
99
100 TKReceptor* TKCell::createReceptor(std::string name)
101 {
102     TKReceptor *receptor;
103     TKReceptorMap::iterator it = mReceptors.find(name);
104     if (it != mReceptors.end())
105     {
106         receptor = NULL;
107     }
108     else
109     {
110         receptor = mContainer->receptorFactory(this);
111         if (receptor)
112         {
113             mReceptors.insert( TKReceptorMap::value_type( name, receptor ) );
114         }
115     }
116
117     return receptor;
118 }
119
120 bool TKCell::enterDoTick(float time, bool forceUpdate)
121 {
122     if (!forceUpdate && !mReceptorValueUpdated)
123         return false;
124
125     bool r = doTick(time);
126     mReceptorValueUpdated = false;
127
128     return r;
129 }
130
131 void TKCell::updateReceptorValue()
132 {
133     for ( TKReceptorMap::iterator it = mReceptors.begin(); it != mReceptors.end(); ++it )
134     {
135         if (it->second->update())
136         {
137             mReceptorValueUpdated = true;
138         }
139     }
140 }