Manipulate[
(*Nasser M. Abbasi, july 7, 2014*)
tick;

Module[{j,x,t,graph,h,i,fun,len=1,end=-1},
h=len/(nPoints-1);
t=h/c;
fun=Which[f==1,f1,f==2,f2];

If[dataChanged==True,
dataChanged=False;
n=0];

Which[
n==0,
uNow=Table[0,{i,nPoints}];
uNext=uLast=uNow;
grid=Table[j h,{j,0,nPoints-1}];
uNow=fun[#]&/@ grid,

n==1,
uNext[[1]]=0;
uNext[[2;;-2]]=(1/2)(uNow[[1;;end-2]]+uNow[[3;;end]]);
uNext[[end]]=0;
uLast=uNow;
uNow=uNext,

n>1,
uNext[[1]]=0;
uNext[[2;;(end-1)]]=uNow[[1;;(end-2)]]+uNow[[3;;end]]-uLast[[2;;(end-1)]];
uNext[[end]]=0;
uLast=uNow;
uNow=uNext
];

graph=Grid[{
{Row[{"time",Spacer[5],padIt2[N[n*t],{6,5}],Spacer[5],"step number",Spacer[2],padIt2[n,6]}]},
(*{ScientificForm[N@(n-1)*t,4]},*)
{ListLinePlot[Transpose[{grid,uNow}],PlotRange->{{-.1,1.1},{-1,1}},ImageSize->400,GridLines->Automatic,GridLinesStyle->LightGray],SpanFromLeft}
},Alignment->Center
];

Which[state=="RUN"||state=="STEP",
n++;
If[state=="RUN",
tick=Not[tick]
]
];

graph
],

Grid[{
{
Grid[{
{ Button[Text@Style["run",12],{state="RUN";tick=Not[tick]},ImageSize->{60,40}],
Button[Text@Style["step",12],{state="STEP";tick=Not[tick]},ImageSize->{60,40}],
Button[Text@Style["stop",12],{state="STOP";tick=Not[tick]},ImageSize->{60,40}],
Button[Text@Style["reset",12],{state="RESET";nPoints=300;dataChanged=True;n=0;c=351;f=2;tick=Not[tick]},ImageSize->{60,40}]}
},Spacings->{.5,0},Frame->True,FrameStyle->Gray
],SpanFromLeft
},
{"number of x-points",Manipulator[Dynamic[nPoints,{nPoints=#;dataChanged=True;tick=Not[tick]}&],{5,1000,1},ImageSize->Tiny],Dynamic[padIt2[nPoints,4]],SpanFromLeft},
{"wave speed",Manipulator[Dynamic[c,{c=#;dataChanged=True;tick=Not[tick]}&],{1,1000,1},ImageSize->Tiny],Dynamic[padIt2[c,4]],SpanFromLeft},
{"select initial data",
SetterBar[Dynamic[f,{f=#;dataChanged=True;tick=Not[tick]}&],{1,2}
],SpanFromLeft
}
},Alignment->Center,Spacings->{0.5,.2}],

{{f,2},None},
{{state,"STOP"},None},
{{n,0},None},
{{c,351},None},
{{dataChanged,True},None},
{{nPoints,300},None},
{{tick,False},None},
{{uNow,{}},None},
{{uNext,{}},None},
{{uLast,{}},None},
{{grid,{}},None},
TrackedSymbols:> {tick},
ControlPlacement->Left,Alignment->Center,ImageMargins->0,FrameMargins->0,
Initialization:>
(
f1[x_]:=Piecewise[{{Sin[2 Pi (x-0.2)/0.4],0.2<=x≤0.6},{0,True}}];
f2[x_]:=Piecewise[{{x,0<=x≤0.5},{1-x,True}}];
len=1;
integerStrictPositive=(IntegerQ[#]&&#>0&);
integerPositive=(IntegerQ[#]&&#≥0&);
numericStrictPositive=(Element[#,Reals]&&#>0&);
numericPositive=(Element[#,Reals]&&#≥0&);
numericStrictNegative=(Element[#,Reals]&&#<0&);
numericNegative=(Element[#,Reals]&&#≤0&);
bool=(Element[#,Booleans]&);
numeric=(Element[#,Reals]&);
integer=(Element[#,Integers]&);
(*--------------------------------------------*)
padIt1[v_?numeric,f_List]:=AccountingForm[v,
f,NumberSigns->{"-","+"},NumberPadding->{"0","0"},SignPadding->True];
(*--------------------------------------------*)
padIt1[v_?numeric,f_Integer]:=AccountingForm[Chop[v],
f,NumberSigns->{"-","+"},NumberPadding->{"0","0"},SignPadding->True];
(*--------------------------------------------*)
padIt2[v_?numeric,f_List]:=AccountingForm[v,
f,NumberSigns->{"",""},NumberPadding->{"0","0"},SignPadding->True];
(*--------------------------------------------*)
padIt2[v_?numeric,f_Integer]:=AccountingForm[Chop[v],
f,NumberSigns->{"",""},NumberPadding->{"0","0"},SignPadding->True]
(*--------------------------------------------*)
)

]