/// <summary> /// There are 4 braking force levels /// These are communicated to the braking systems via pins 8-12 of GPIOC. /// --> Pin 8 on means minimum braking force /// --> Pin 12 on means maximum braking force /// Pins 8-11 are used to report the position of the braking lever. /// Pin 12 is used only for emergency braking. /// Outputs must be configured as push-pull. /// </summary> private void WriteOutput(lever_position lever_Position) { switch (lever_Position) { case lever_position.minimum_acceleration: this._variables.WritePinOutput(4); break; case lever_position.medium_acceleration: this._variables.WritePinOutput(5); break; case lever_position.maximum_acceleration: this._variables.WritePinOutput(6); break; case lever_position.no_acceleration: this._variables.WritePinOutput(7); break; case lever_position.minimum_braking: this._variables.WritePinOutput(8); break; case lever_position.medium_braking: this._variables.WritePinOutput(9); break; case lever_position.strong_braking: this._variables.WritePinOutput(10); break; } }
private void ReadInput(string value) { if (value[0] == '1') { CurrentState = state.EMERGENCY; CurrentLeverPosition = lever_position.strong_braking; _is_emergency_ON = true; } if (value[1] == '1') { CurrentState = state.STOP; CurrentLeverPosition = lever_position.medium_braking; _is_stop_ON = true; } if (value[2] == '1') { CurrentState = state.NORMAL; CurrentLeverPosition = lever_position.strong_braking; } if (value[3] == '1') { CurrentState = state.NORMAL; CurrentLeverPosition = lever_position.medium_braking; } if (value[4] == '1') { CurrentState = state.NORMAL; CurrentLeverPosition = lever_position.minimum_braking; } if (value[5] == '1') { CurrentState = state.NORMAL; CurrentLeverPosition = lever_position.no_acceleration; } if (value[6] == '1') { CurrentState = state.NORMAL; CurrentLeverPosition = lever_position.minimum_acceleration; } if (value[7] == '1') { CurrentState = state.NORMAL; CurrentLeverPosition = lever_position.medium_acceleration; } //if (value[8] == '1') //{ // CurrentState = state.NORMAL; // CurrentLeverPosition = lever_position.maximum_acceleration; //} }
public void WriteInput(state state, lever_position lever_position) { switch (state) { case state.NORMAL: WritePinInput((int)lever_position); break; case state.EMERGENCY: WritePinInput(0); break; case state.STOP: WritePinInput(1); break; } }
// The thread procedure performs the task, such as formatting // and printing a document. public void Run() { try { Console.WriteLine(""); Console.WriteLine("TrainController started"); while (true) { ReadInput(this._variables.GPIO_B); PrintGPIOValues(); if (_is_emergency_ON) { CurrentState = state.EMERGENCY; CurrentLeverPosition = lever_position.strong_braking; PrintMyStatus(); continue; } if (_is_stop_ON) { CurrentState = state.STOP; CurrentLeverPosition = lever_position.medium_braking; ManageStopSignal(); PrintMyStatus(); continue; } switch (CurrentState) { case state.EMERGENCY: this._is_emergency_ON = true; WriteOutput(lever_position.strong_braking); break; case state.STOP: this._is_stop_ON = true; WriteOutput(lever_position.medium_braking); break; case state.NORMAL: WriteOutput(CurrentLeverPosition); break; } PrintMyStatus(); tic++; } } catch (Exception ex) { Console.WriteLine(""); Console.WriteLine("TrainController Exception"); Console.WriteLine(ex.Message); } }