summaryrefslogtreecommitdiffstats
path: root/src/main/java/org/uic/barcode/ssbFrame/SsbStations.java
blob: e3b765424fbc26a16f58e074aa635b456910c9d3 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
package org.uic.barcode.ssbFrame;

import org.uic.barcode.asn1.uper.BitBuffer;
import org.uic.barcode.asn1.uper.ByteBitBuffer;
import org.uic.barcode.ticket.EncodingFormatException;

public class SsbStations {
	
	/*
	 * Station code       1	bit	0 = Num; or 1=Bilateral AlphaNum 6Char

       Numeric:
       Station code List             4 bit 1= NRT; 2=Reservation
	   Departure station Location 	28 bit 
	   Arrival Station              28 bit

	   AlphaNum:
	   Departure: 30 bit
	   Arrival =  30 bit

	 */
	
	protected String arrivalStationCode = "      ";
	protected String departureStationCode = "      ";
	protected SsbStationCodeTable codeTable = SsbStationCodeTable.NRT;
	
	public int encode(int offset, byte[] bytes) throws EncodingFormatException {
		
		boolean isAlphaNumeric = false;
		
		BitBuffer bits = new ByteBitBuffer(bytes);
		
		try {
			Integer.parseInt(arrivalStationCode);
			Integer.parseInt(departureStationCode);
			isAlphaNumeric  = false;
		} catch(NumberFormatException e) {
			isAlphaNumeric  = true;
		}
		bits.put(offset, isAlphaNumeric);
		offset++;
		
		if (isAlphaNumeric) {
			if (departureStationCode.length() > 6) {
				throw new EncodingFormatException("SSB departure station too long");
			}	
			bits.putChar6String(offset,30, departureStationCode);
			offset = offset + 30;
			
			if (arrivalStationCode.length() > 6) {
				throw new EncodingFormatException("SSB arrival station too long");
			}	
			bits.putChar6String(offset,30, arrivalStationCode);
			offset = offset + 30;
		} else {
			bits.putInteger(offset, 4, codeTable.ordinal());
			offset = offset + 4;
			
			int stationCode = Integer.parseInt(departureStationCode);
			if (stationCode < 0 || stationCode > 9999999) {
				throw new EncodingFormatException("SSB departure station code too long");
			}	
			bits.putInteger(offset, 28, stationCode);
			offset = offset + 28;
			
			stationCode = Integer.parseInt(arrivalStationCode);
			if (stationCode < 0 || stationCode > 9999999) {
				throw new EncodingFormatException("SSB arrival station code too long");
			}	
			bits.putInteger(offset, 28, stationCode);
			offset = offset + 28;
		}
		
		return offset;
		
	}
	
	public int decode(int offset, byte[] bytes) {
		
		BitBuffer bits = new ByteBitBuffer(bytes);
		
		boolean isAlphaNumeric = bits.get(offset);
		offset++;
		
		if (isAlphaNumeric) {
			departureStationCode = bits.getChar6String(offset,30);
			offset = offset + 30;
			arrivalStationCode = bits.getChar6String(offset,30);
			offset = offset + 30;
		} else {
			codeTable = SsbStationCodeTable.values()[bits.getInteger(offset, 4)];
			offset = offset + 4;
			departureStationCode = Integer.toString(bits.getInteger(offset, 28));
			offset = offset + 28;
			arrivalStationCode = Integer.toString(bits.getInteger(offset, 28));
			offset = offset + 28;
		}

		
		
		return offset;
		
	}

	public String getArrivalStationCode() {
		return arrivalStationCode;
	}

	public void setArrivalStationCode(String arrivalStationCode) {
		this.arrivalStationCode = arrivalStationCode;
	}

	public String getDepartureStationCode() {
		return departureStationCode;
	}

	public void setDepartureStationCode(String departureStationCode) {
		this.departureStationCode = departureStationCode;
	}

	public SsbStationCodeTable getCodeTable() {
		return codeTable;
	}

	public void setCodeTable(SsbStationCodeTable codeTable) {
		this.codeTable = codeTable;
	}
	
	
	

}