// This may look like C code, but it is really -*- C++ -*-
// RTSS --- Railway Total System Simulator
// (c) TAKAGI Ryo (at Prof. SONE's Laboratory, the Univ. of Tokyo.)
// trstncom.cc --- communication between classes train & station_obj
// $Id: trstncom.cc,v 2.4 1994/12/27 11:49:38 rt Exp $

#include <cstdio>
#include <cstdlib>
#include <cmath>

#include "train.hh"

#define INVLIM 1e-5

//#define DEBUG
//#define CVPRINT	// V1, V2 の値を吐き出す

#define NO_JERK

#define MINCL	10.0
#define REGEN_OFF_TETA	5.0

// station_obj に与える to_station の初期値
to_station train::to_station_emit
() {
    to_station push_val;
    push_val.tr_ptr = this;		// 列車へのポインタ
    push_val.voie = nxx->voienum();	// 入るべき駅番線
    push_val.ilno = nxx->ilinenum();	// 駅にアプローチする線路番号
    push_val.olno = nxx->olinenum();	// 駅を出る線路番号
    push_val.notrw = nxx->trwaitnum();	// 駅で待つべき列車数
    push_val.is_pass = nxx->pass_stn();	// 通過列車であるかどうか
    push_val.taudx = taudx;		// この列車が駅出発時に持っている遅れ
    push_val.tarrive = tdept - taudx
        + nxx->tarrive( pfirst );	// 次駅到着「したい」時刻
    push_val.tarr_delay = 0.0;		// とりあえず初期化
    push_val.tstop = nxx->stoptime();	// 次駅停車「したい」時分
    return push_val;
}

// station_obj に与える from_station の初期値
from_station train::from_station_emit
() {
    from_station push_val;
    push_val.tr_ptr = this;		// 列車へのポインタ
    push_val.voie = nxx->voienum();	// 入るべき駅番線
    push_val.olno = nxx->olinenum();	// 駅を出る線路番号
    push_val.notrw = nxx->trwaitnum();	// 駅で待つべき列車数(とりあえず)
    push_val.is_pass = nxx->pass_stn();	// 通過列車であるかどうか
    push_val.is_at_station = true;	// とりあえずいるんでしょ
    push_val.do_not_depart = false;	// とりあえず初期化
    push_val.tarrive = tarr_real;	// 当該駅到着時刻
    push_val.taudx = taudx;		// この列車が駅出発時に持っている遅れ
    push_val.tdept = tdept;		// tdept は計算されているとする
    push_val.tdept_delay = 0.0;		// とりあえず初期化
    return push_val;
}

void train::stnobj_init
() {
    if ( carstat() == Stn_stop ) {
        push_from_station_init( from_station_emit() );
    } else {
        push_to_station_init( to_station_emit() );	// 時隔計算しない
    }
}



// station_obj に to_station を与える
void
train :: stnobj_comm
() {
  // nxx->push_to_station( to_station_emit() );		// 時隔計算する
  if ( g_sw_station_object_valid )
  {
    station_obj * _stnobj = nxx -> stnobj () ;
    to_station emitted = to_station_emit () ;
#ifdef DEBUG
    cerr << "train::stnobj_comm(): pushing emitted, Car No. " ;
    cerr << emitted . tr_ptr -> car_number () << ", stnobj.get_stnno (): " ;
    cerr << _stnobj -> get_stnno () << endl ;
#endif
    ( * _stnobj ) += emitted ;
#ifdef DEBUG
    cerr << "train::stnobj_comm(): pushed emitted, Car No. " ;
    cerr << ( * _stnobj ) [ _stnobj -> number () - 1 ] . tr_ptr
      -> car_number () ;
    cerr << ", stnobj.get_stnno (): " ;
    cerr << _stnobj -> get_stnno () << endl ;
#endif
    _stnobj -> headway_cal () ;
  }
}



// to_station オブジェクトを station_obj にたたきこむ
// 初期化時なので時隔計算を同時には行わない
void train::push_to_station_init
( to_station emitted ) {
    if ( g_sw_station_object_valid ) {
#ifdef DEBUG
        cerr << "push_to_station_init: pushing emitted, Car No. ";
        cerr << emitted.tr_ptr->car_number() << ", stnobj.get_stnno(): ";
        cerr << x_stnobj->get_stnno() << "\n";
#endif
        stnobj_now->to_station_init( emitted );
#ifdef DEBUG
        cerr << "push_to_station_init: pushed emitted, Car No. ";
        cerr << ( *x_stnobj )[x_stnobj->number() - 1].tr_ptr->car_number();
        cerr << ", stnobj.get_stnno(): ";
        cerr << x_stnobj->get_stnno() << "\n";
#endif
    }
}

// from_station オブジェクトを station_obj にたたきこむ
// 初期化時なので時隔計算を同時には行わない
void train::push_from_station_init
( from_station emitted ) {
    if ( g_sw_station_object_valid ) {
#ifdef DEBUG
        cerr << "push_from_station_init: pushing emitted, Car No. ";
        cerr << emitted.tr_ptr->car_number() << ", stnobj.get_stnno(): ";
        cerr << x_stnobj->get_stnno() << "\n";
#endif
        stnobj_now->from_station_init( emitted );
#ifdef DEBUG
        cerr << "push_from_station_init: pushed emitted, Car No. ";
        cerr << x_stnobj->train_departure[0].tr_ptr->car_number();
        cerr << ", stnobj.get_stnno(): ";
        cerr << x_stnobj->get_stnno() << "\n";
#endif
    }
}
