diff --git a/payload/user/remote_access/pager-webui/server.py b/payload/user/remote_access/pager-webui/server.py index 4fcd064..5f9994a 100644 --- a/payload/user/remote_access/pager-webui/server.py +++ b/payload/user/remote_access/pager-webui/server.py @@ -1594,6 +1594,55 @@ def _uci_wifi_iface(name): return _uci_values('wireless.%s' % name) +BAND_2G = '2.4' +BAND_5G = '5' +BAND_6G = '6' + +CHANNEL_BANDS = { + BAND_2G: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], + BAND_5G: [36, 40, 44, 48, 52, 56, 60, 64, + 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 144, + 149, 153, 157, 161, 165], + BAND_6G: list(range(1, 234, 4)), +} +DFS_CHANNELS = frozenset([52, 56, 60, 64, 100, 104, 108, 112, 116, 120, + 124, 128, 132, 136, 140, 144]) + + +def channel_band(ch): + if ch is None: + return None + try: + ch = int(ch) + except (TypeError, ValueError): + return None + if 1 <= ch <= 14: + return BAND_2G + if 36 <= ch <= 177: + return BAND_5G + if 1 <= ch <= 233 and (ch - 1) % 4 == 0: + return BAND_6G + return None + + +def channel_freq(band, ch): + if band == BAND_2G: + return 2412 + (ch - 1) * 5 + if band == BAND_5G: + return 5180 + (ch - 36) * 5 + if band == BAND_6G: + return 5955 + (ch - 1) * 5 + return None + + +def band_htmode(band): + return {BAND_2G: 'HT20', BAND_5G: 'VHT80', BAND_6G: 'HE80'}.get(band) + + +def band_radio(band): + return 'radio0' if band == BAND_2G else 'radio1' + + def _uci_section(section): return _uci_values(section) diff --git a/tests/test_pineap_bands.py b/tests/test_pineap_bands.py new file mode 100644 index 0000000..773b5b5 --- /dev/null +++ b/tests/test_pineap_bands.py @@ -0,0 +1,59 @@ +import os +import sys +import unittest + +sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..', 'payload', 'user', 'remote_access', 'pager-webui')) +import server + + +def setUpModule(): + __import__('importlib').reload(server) + + +class ChannelBandTest(unittest.TestCase): + def test_2g_channels(self): + for ch in (1, 6, 11, 14): + self.assertEqual(server.channel_band(ch), server.BAND_2G) + + def test_5g_channels(self): + for ch in (36, 48, 100, 149, 165, 177): + self.assertEqual(server.channel_band(ch), server.BAND_5G) + + def test_6g_channels(self): + for ch in (181, 189, 197, 205, 213, 225, 233): + self.assertEqual(server.channel_band(ch), server.BAND_6G) + + def test_invalid(self): + for ch in (0, 15, 35, 178, 234, None, 'x'): + self.assertIsNone(server.channel_band(ch)) + + +class ChannelFreqTest(unittest.TestCase): + def test_freqs(self): + self.assertEqual(server.channel_freq(server.BAND_2G, 1), 2412) + self.assertEqual(server.channel_freq(server.BAND_2G, 11), 2462) + self.assertEqual(server.channel_freq(server.BAND_5G, 36), 5180) + self.assertEqual(server.channel_freq(server.BAND_5G, 165), 5825) + self.assertEqual(server.channel_freq(server.BAND_6G, 1), 5955) + self.assertEqual(server.channel_freq(server.BAND_6G, 233), 7115) + + +class BandAuxTest(unittest.TestCase): + def test_htmode(self): + self.assertEqual(server.band_htmode(server.BAND_2G), 'HT20') + self.assertEqual(server.band_htmode(server.BAND_5G), 'VHT80') + self.assertEqual(server.band_htmode(server.BAND_6G), 'HE80') + + def test_radio(self): + self.assertEqual(server.band_radio(server.BAND_2G), 'radio0') + self.assertEqual(server.band_radio(server.BAND_5G), 'radio1') + self.assertEqual(server.band_radio(server.BAND_6G), 'radio1') + + def test_dfs_marker(self): + self.assertIn(52, server.DFS_CHANNELS) + self.assertIn(144, server.DFS_CHANNELS) + self.assertNotIn(149, server.DFS_CHANNELS) + + +if __name__ == '__main__': + unittest.main()