BEACON messages Parse as status
BEACON messages Parse as status
Status messages > are not over written by non > status's
Non timestamped weather Parsing
Settings menu expanding with basics of Map, Mode, and Beacon options
Check-box react input added

--- a/src/www/js/main/UI.js
+++ b/src/www/js/main/UI.js
@@ -95,9 +95,15 @@
 			var controls =  new React_Pane(React_Pane.VERTICAL),
 				address_bar =  new React_Pane(React_Pane.HORIZONTAL),
 				addr_mess =  new React_Pane(React_Pane.VERTICAL),
-				mess_addr_bts = new React_Pane(React_Pane.HORIZONTAL);
+				mess_addr_bts = new React_Pane(React_Pane.HORIZONTAL),
 				buttons = new React_Pane(React_Pane.HORIZONTAL),
 
+				map_page = new React_Paged(),
+				map_pane = new React_Pane(React_Pane.VERTICAL),
+				mode_page = new React_Paged(),
+				mode_pane = new React_Pane(React_Pane.VERTICAL),
+				beacon_page = new React_Paged(),
+				beacon_pane = new React_Pane(React_Pane.VERTICAL);
 				settings_page = new React_Paged(),
 				settings_btns = new React_Pane(React_Pane.VERTICAL),
 				decoder_set_pn = new React_Pane(React_Pane.VERTICAL),
@@ -111,6 +117,9 @@
 				freq1_in = new React_Input('Frequency 1',  {display_settings: {display: true}, type: 'text', def: settings.frequency_1, size_override: {width: 'fill'}}),
 
 				filler = new React_Pane(React_Pane.VERTICAL, {width: 'fill', height: 'fill'}),
+				filler2 = new React_Pane(React_Pane.VERTICAL, {width: 'fill', height: 'fill'}),
+				filler3 = new React_Pane(React_Pane.VERTICAL, {width: 'fill', height: 'fill'}),
+				filler4 = new React_Pane(React_Pane.VERTICAL, {width: 'fill', height: 'fill'}),
 
 				settings_save_btn = new React_Button('Save', function(){settings.save();settings_page.change_to(0);}),
 
@@ -130,14 +139,30 @@
 				 		]
 				 	),
 
+				auto_cache = new React_Input('Auto Cache', {display_settings: {display: true, position: 'right'}, type: 'checkbox'}),
+				phg_render = new React_Input('Render PHG', {display_settings: {display: true, position: 'right'}, type: 'checkbox'}),
+				show_position = new React_Input('Show Position', {display_settings: {display: true, position: 'right'}, type: 'checkbox'}),
+				clear_cache = new React_Button('Clear Cache'),
+				cache_tool = new React_Button('Cache Tool'),
+				map_back_btn = new React_Button('Back', function(){settings.save();settings_page.change_to(0);}),
+
+				digi_mode = new React_Input('Digipeater', {display_settings: {display: true, position: 'right'}, type: 'checkbox'}),
+				forward_url = new React_Input('Forward URL', {display_settings: {display: true, position: 'right'}, type: 'text'}),
+				mode_back_btn = new React_Button('Back', function(){settings.save();settings_page.change_to(0);}),
+
+				beacon_active = new React_Input('Active', {display_settings: {display: true, position: 'right'}, type: 'checkbox'}),
+				beacon_status = new React_Input('Status Message', {display_settings: {display: true, position: 'right'}, type: 'text'}),
+				beacon_back_btn = new React_Button('Back', function(){settings.save();settings_page.change_to(0);}),
+
 				source_input = new React_Input('Source', {display_settings: {display: true}, type: 'text', size_override: {width: 120}}),
-				ssid_input = new React_Input('SSID', {display_settings: {display: false, name_space: true}, type: 'select', def: '', type_properties: {options: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]}}),
+				ssid_input = new React_Input('S SSID', {display_settings: {display: false, name_space: true}, type: 'select', def: '', type_properties: {options: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]}}),
 				dest_input = new React_Input('Destination', {display_settings: {display: true}, type: 'text', size_override: {width: 120}}),
-
-				decoder_btn = new React_Button('Decoder', function(){settings_page.change_to(1);});
-				map_btn = new React_Button('Map', function(){/*settings_page.change_to(2);*/}),
-				mode_btn = new React_Button('Mode', function(){/*settings_page.change_to(3);*/}),
-				beacon_btn = new React_Button('Beacon', function(){/*settings_page.change_to(4);*/}),
+				dest_ssid_input = new React_Input('D SSID', {display_settings: {display: false, name_space: true}, type: 'select', def: '', type_properties: {options: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]}}),
+
+				decoder_btn = new React_Button('Decoder', function(){settings_page.change_to(1);}),
+				map_btn = new React_Button('Map', function(){settings_page.change_to(2);}),
+				mode_btn = new React_Button('Mode', function(){settings_page.change_to(3);}),
+				beacon_btn = new React_Button('Beacon', function(){settings_page.change_to(4);}),
 
 				message_input = new React_Input('Message', {display_settings: false, type: 'text_area'}),
 
@@ -184,8 +209,35 @@
 			decoder_set_pn.add(filler);
 			decoder_set_pn.add(settings_save_btn);
 
+			map_pane.add(auto_cache);
+			map_pane.add(phg_render);
+			map_pane.add(show_position);
+			map_pane.add(clear_cache);
+			map_pane.add(cache_tool);
+			map_pane.add(filler2);
+			map_pane.add(map_back_btn);
+
+			map_page.add(map_pane);
+
+			mode_pane.add(digi_mode);
+			mode_pane.add(forward_url);
+			mode_pane.add(filler3);
+			mode_pane.add(mode_back_btn);
+
+			mode_page.add(mode_pane);
+
+			beacon_pane.add(beacon_active);
+			beacon_pane.add(beacon_status);
+			beacon_pane.add(filler4);
+			beacon_pane.add(beacon_back_btn);
+
+			beacon_page.add(beacon_pane);
+
 			settings_page.add(settings_btns);
 			settings_page.add(decoder_set_pn);
+			settings_page.add(map_page);
+			settings_page.add(mode_page);
+			settings_page.add(beacon_page);
 
 			buttons.add(listen_button);
 			buttons.add(iss_button);
@@ -194,6 +246,7 @@
 			address_bar.add(source_input);
 			address_bar.add(ssid_input);
 			address_bar.add(dest_input);
+			address_bar.add(dest_ssid_input);
 
 			message_bts.add(send_button);
 			message_bts.add(loc_button);

--- a/src/www/js/packet/APRSMessages/APRS_Parser.js
+++ b/src/www/js/packet/APRSMessages/APRS_Parser.js
@@ -27,7 +27,13 @@
 
 		APRS_Parser.update_extensions = function(info, status){
 
-			status.status = info.status;
+			if(info.status_official){
+				status.status = info.status;
+				status.status_official = info.status_official;
+			}
+
+			if(!status.status_official && info.status)
+				status.status = info.status;
 
 			if(info.altitude !== undefined){
 				status.altitude = info.altitude;
@@ -53,9 +59,6 @@
 				status.speed = info.speed;
 				status.speed_unit = info.speed_unit;
 			}
-
-			if(info.status)
-				status.status = info.status;
 
 		};
 
@@ -181,26 +184,9 @@
 
 			var finished = false;
 
-			while(!finished){
+			while(!finished && i < packet.message_data.length){
 
 				var type = String.fromCharCode(packet.message_data[i]);
-
-				if((packet.message_data[i+1] < 0x30 && packet.message_data[i+1] != 0x2E) || packet.message_data[i+1] > 0x39){
-	
-					info.software_type = String.fromCharCode(packet.message_data[i++]);
-
-					info.WX_unit = '';
-					var start = i;
-					while(i < packet.message_data.length && i < start + 4 && string.is_printable(packet.message_data[i])){
-
-						info.WX_unit += String.fromCharCode(packet.message_data[i]);
-						i++;
-
-					}
-
-					break;
-	
-				}
 
 				i++;
 
@@ -259,7 +245,18 @@
 						i += 5;
 						break;
 					default:
-						finished = true;
+
+						info.software_type = String.fromCharCode(packet.message_data[i++]);
+
+						info.WX_unit = '';
+						var start = i;
+						while(i < packet.message_data.length && i < start + 4 && string.is_printable(packet.message_data[i])){
+
+							info.WX_unit += String.fromCharCode(packet.message_data[i]);
+							i++;
+
+						}
+
 						break;
 				}
 	

--- a/src/www/js/packet/APRSMessages/APRS_Pos_no_TS.js
+++ b/src/www/js/packet/APRSMessages/APRS_Pos_no_TS.js
@@ -27,6 +27,13 @@
 			i = APRS_Parser.parse_lat_lon(this, packet, i);
 			i++;
 
+			if(this.symbol_code === '_'){
+
+				i = APRS_Parser.parse_wind(this, packet, i);
+				i = APRS_Parser.parse_WX(this, packet, i);
+
+			}
+
 			// Search for APRS Extensions here
 			APRS_Parser.parse_extensions(this, packet, i);
 
@@ -34,6 +41,7 @@
 
 		APRS_Pos_no_TS.prototype.update_status = function(status){
 
+			APRS_Parser.update_WX(this, status);
 			APRS_Parser.update_extensions(this, status);
 
 		};

--- a/src/www/js/packet/APRSMessages/APRS_Status.js
+++ b/src/www/js/packet/APRSMessages/APRS_Status.js
@@ -9,6 +9,8 @@
 		var APRS_Status = function(packet){
 
 			var i = 1;
+
+			this.status_official = true;
 
 			i = APRS_Parser.parse_time_stamp(this, packet, i);
 

--- /dev/null
+++ b/src/www/js/packet/APRSMessages/APRS_beacon_stat.js
@@ -1,1 +1,37 @@
+define(
+	[
+	 	'packet/APRSMessages/APRS_Parser'
+	],
+	function(
+		APRS_Parser
+	){
 
+		var APRS_beacon_stat = function(packet){
+
+			var i = 0;
+
+			i = APRS_Parser.parse_time_stamp(this, packet, i);
+
+			if(isNaN(this.time_stamp)){
+				this.time_stamp = undefined;
+				i = 0;
+			} else {
+				i++; 
+			}
+
+			APRS_Parser.parse_extensions(this, packet, i);
+
+			// TODO Timestamp, ERP, Maidenhead
+
+		};
+
+		APRS_beacon_stat.prototype.update_status = function(status){
+
+			APRS_Parser.update_extensions(this, status);
+
+		};
+
+		return APRS_beacon_stat;
+
+	}
+);

--- a/src/www/js/packet/APRSPacket.js
+++ b/src/www/js/packet/APRSPacket.js
@@ -20,6 +20,7 @@
 	 	'packet/APRSMessages/APRS_Pos_TS',
 	 	'packet/APRSMessages/APRS_Pos_no_TS',
 	 	'packet/APRSMessages/APRS_Status',
+	 	'packet/APRSMessages/APRS_beacon_stat',
 	 	'packet/APRSMessages/APRS_no_Pos_WX'
 	],
 	function(
@@ -30,6 +31,7 @@
 		APRS_Pos_TS,
 		APRS_Pos_no_TS,
 		APRS_Status,
+		APRS_beacon_stat,
 		APRS_no_Pos_WX
 	){
 
@@ -110,11 +112,12 @@
 		if(APRS_message_type)
 			packet.aprs_info = new APRS_message_type(packet);
 
-		else {
-			// Check if desination is beacon and if it is parse as status
+		// Check if desination is beacon and if it is parse as status		
+		else if(packet.destination_address == 'BEACON' && packet.destination_ssid == 0)
+				packet.aprs_info = new APRS_beacon_stat(packet);
+
+		else
 			packet.aprs_info = null;
-		}
-
 
 		packet.fcs = (data[data.length-1] << 8) + data[data.length-2];
 

--- a/src/www/js/reactive/React_Input.js
+++ b/src/www/js/reactive/React_Input.js
@@ -38,6 +38,11 @@
 					name_plate.style.height = '20px';
 					this.self.appendChild(name_plate);
 
+					if(properties.display_settings.position){
+						if(properties.display_settings.position == 'right')
+							name_plate.style.cssFloat = 'left';
+					}
+					
 				} else if(properties.display_settings.name_space){
 
 					var name_plate = document.createElement('div');
@@ -61,6 +66,13 @@
 
 						this.input.style.width = '100%';
 					}
+					break;
+				case 'checkbox':
+
+					this.input = document.createElement('input');
+
+					this.input.type = 'checkbox';
+
 					break;
 				case 'text':
 					{
@@ -95,6 +107,9 @@
 			}
 
 			this.input.classList.add('react-input');
+
+			if(properties.display_settings.position && properties.display_settings.position == 'right')
+				this.input.style.cssFloat = 'right';
 
 			this.self.appendChild(this.input);