//---------------------------------------------------------------------- // affect //---------------------------------------------------------------------- void EffectTransportCreature::affect(Creature* pCreature) throw(Error) { __BEGIN_TRY Timeval nextTime = getNextTime(); Timeval deadLine = getDeadline(); Turn_t RemainTime = deadLine.tv_sec - nextTime.tv_sec; // StringStream msg; // msg << (int)RemainTime << "초 후에 " << m_ZoneName << "로 이동됩니다."; char msg[50]; sprintf(msg, g_pStringPool->c_str(STRID_TRANSPORT_CREATURE ), (int)RemainTime, m_ZoneName.c_str()); string sMsg(msg); GCSystemMessage gcSystemMessage; gcSystemMessage.setMessage(sMsg); pCreature->getPlayer()->sendPacket(&gcSystemMessage); setNextTime(m_MessageTick); __END_CATCH }
// called by fmi2GetReal, fmi2GetInteger, fmi2GetBoolean, fmi2GetString, fmi2ExitInitialization // if setStartValues or environment set new values through fmi2SetXXX. // Lazy set values for all variable that are computed from other variables. void calculateValues(ModelInstance *comp) { if (comp->state == modelInitializationMode) { eventQueue = malloc(sizeof(node_t)); eventQueue->next = NULL; parseSequence(comp); } else { if (!isEmpty()) { double epsilon = 0.00000000001; long t = getTime(); double v = getValue(); while (!isEmpty() && comp->time > t) { getEvent(); t = getTime(); v = getValue(); i(i_) = 0; } if ( comp->time < t ) return; if (comp->time == t && i(i_) == 0) { if ( v < (r(input_) + epsilon) && v > (r(input_) - epsilon) ) { b(output_) = fmi2True; i(i_) = 1; } else { b(output_) = fmi2False; i(i_) = 1; } } else if (comp->time == t && i(i_) == 1) { if ( v < (r(input_) + epsilon) && v > (r(input_) - epsilon) ) { b(output_) = fmi2True; } else { if (getTime() == getNextTime()) { getEvent(); t = getTime(); v = getValue(); if ( v < (r(input_) + epsilon) && v > (r(input_) - epsilon) ) { b(output_) = fmi2True; } else { b(output_) = fmi2False; } } } } } } }
void Scheduler(void *pvParameters) //dont use printf/ printk in this function... extremely dangerous { static int count=0; int x; int task_id; while(1) { if(EXECUTED<10) //scheduler logic...dont put printk here...dangling pointers issue will arise and system will halt...uses a lot of internal work { x=getNextTime(); //printk(KERN_ALERT "Next timer expires in %d\n",getExpireTime()); //printf("Next timer expires for task %d\n",x); if(x!=80) //error code --- no active timers vTaskPrioritySet(handles[x],4); //else schedule EXECUTED++; //keep track of how many RT task scheduled } else { for(x=0;x<10;x++) vTaskSuspend(handles[x]); //suspend the tasks so that idle tasks get some execution time vTaskDelay(MAX_DELAY); //suspend till next time frame for(x=0;x<10;x++) //wake up RT tasks and reset their timers { vTimerReset(handles[x]); vTaskResume(handles[x]); } EXECUTED=0; //reset their status } } }