Skip to content

Commit 1405d2e

Browse files
graph channel update
1 parent ba22321 commit 1405d2e

File tree

19 files changed

+288
-313
lines changed

19 files changed

+288
-313
lines changed

app/build.properties

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#Build Properties
2-
#Sun Mar 23 19:56:25 EDT 2025
3-
version_build=9
2+
#Tue Mar 25 22:01:30 EDT 2025
3+
version_build=10
44
version_major=3
55
version_minor=1
66
version_patch=4

app/src/main/kotlin/com/vrem/wifianalyzer/wifi/band/WiFiBand.kt

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,15 @@ internal val availableGHZ2: Available = { true }
2727
internal val availableGHZ5: Available = { MainContext.INSTANCE.wiFiManagerWrapper.is5GHzBandSupported() }
2828
internal val availableGHZ6: Available = { MainContext.INSTANCE.wiFiManagerWrapper.is6GHzBandSupported() }
2929

30-
enum class WiFiBand(
31-
@StringRes val textResource: Int,
32-
val wiFiChannels: WiFiChannels,
33-
val available: Available,
34-
val maxX: Int = 9
35-
) {
30+
/**
31+
* @see <a href="https://en.wikipedia.org/wiki/List_of_WLAN_channels">List of WLAN channels</a>
32+
*
33+
* WiFi Bands
34+
* 2.4GHz: 1, 2412 -> 13, 2472
35+
* 5GHz: 36, 5180 -> 177, 5885
36+
* 6GHz: 1, 5955 -> 233, 7115
37+
*/
38+
enum class WiFiBand(@StringRes val textResource: Int, val wiFiChannels: WiFiChannels, val available: Available) {
3639
GHZ2(R.string.wifi_band_2ghz, WiFiChannelsGHZ2(), availableGHZ2),
3740
GHZ5(R.string.wifi_band_5ghz, WiFiChannelsGHZ5(), availableGHZ5),
3841
GHZ6(R.string.wifi_band_6ghz, WiFiChannelsGHZ6(), availableGHZ6);

app/src/main/kotlin/com/vrem/wifianalyzer/wifi/band/WiFiChannelCountryGHZ5.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ private val countriesETSI: Set<String> = setOf(
6161
"IL" // ETSI Israel
6262
)
6363

64+
// FIXME ... Rules are updated
6465
internal class WiFiChannelCountryGHZ5 {
6566
private val channelsSet1: Set<Int> = setOf(36, 40, 44, 48, 52, 56, 60, 64)
6667
private val channelsSet2: Set<Int> = setOf(100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 144)

app/src/main/kotlin/com/vrem/wifianalyzer/wifi/band/WiFiChannelCountryGHZ6.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ package com.vrem.wifianalyzer.wifi.band
1919

2020
import java.util.SortedSet
2121

22+
// FIXME ... Rules are updated
2223
internal class WiFiChannelCountryGHZ6 {
2324

2425
fun findChannels(): SortedSet<Int> = sortedSetOf(

app/src/main/kotlin/com/vrem/wifianalyzer/wifi/band/WiFiChannels.kt

Lines changed: 31 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -17,59 +17,57 @@
1717
*/
1818
package com.vrem.wifianalyzer.wifi.band
1919

20+
import com.vrem.util.EMPTY
21+
2022
typealias WiFiRange = Pair<Int, Int>
2123
typealias WiFiChannelPair = Pair<WiFiChannel, WiFiChannel>
2224

23-
abstract class WiFiChannels(private val wiFiRange: WiFiRange, private val wiFiChannelPairs: List<WiFiChannelPair>) {
24-
fun inRange(frequency: Int): Boolean =
25-
frequency in wiFiRange.first..wiFiRange.second
25+
abstract class WiFiChannels(val channelRange: WiFiChannelPair, val graphChannels: Set<Int>) {
26+
abstract fun availableChannels(countryCode: String): List<WiFiChannel>
27+
abstract fun channelAvailable(countryCode: String, channel: Int): Boolean
28+
29+
fun inRange(frequency: Int): Boolean = frequency in channelRange.first.frequency..channelRange.second.frequency
2630

2731
fun wiFiChannelByFrequency(frequency: Int): WiFiChannel =
2832
if (inRange(frequency)) {
29-
wiFiChannelPairs.firstOrNull { WiFiChannel.UNKNOWN != wiFiChannel(frequency, it) }
30-
?.let { wiFiChannel(frequency, it) }
31-
?: WiFiChannel.UNKNOWN
33+
wiFiChannel(frequency, channelRange)
3234
} else {
3335
WiFiChannel.UNKNOWN
3436
}
3537

3638
fun wiFiChannelByChannel(channel: Int): WiFiChannel =
37-
wiFiChannelPairs.firstOrNull { channel >= it.first.channel && channel <= it.second.channel }
38-
?.let { WiFiChannel(channel, it.first.frequency + (channel - it.first.channel) * FREQUENCY_SPREAD) }
39-
?: WiFiChannel.UNKNOWN
40-
41-
fun wiFiChannelFirst(): WiFiChannel = wiFiChannelPairs[0].first
42-
43-
fun wiFiChannelLast(): WiFiChannel = wiFiChannelPairs[wiFiChannelPairs.size - 1].second
44-
45-
fun wiFiChannel(frequency: Int, wiFiChannelPair: WiFiChannelPair): WiFiChannel {
46-
val first: WiFiChannel = wiFiChannelPair.first
47-
val last: WiFiChannel = wiFiChannelPair.second
48-
val channel: Int = ((frequency - first.frequency).toDouble() / FREQUENCY_SPREAD + first.channel + 0.5).toInt()
49-
return if (channel >= first.channel && channel <= last.channel)
50-
WiFiChannel(channel, frequency)
51-
else
39+
if (channel in channelRange.first.channel..channelRange.second.channel) {
40+
WiFiChannel(channel, channelRange.first.frequency + (channel - channelRange.first.channel) * FREQUENCY_SPREAD)
41+
} else {
5242
WiFiChannel.UNKNOWN
43+
}
44+
45+
open fun graphChannelCount(): Int {
46+
return channelRange.second.channel - channelRange.first.channel + 1
5347
}
5448

55-
abstract fun availableChannels(countryCode: String): List<WiFiChannel>
56-
abstract fun channelAvailable(countryCode: String, channel: Int): Boolean
57-
abstract fun wiFiChannelPairs(): List<WiFiChannelPair>
58-
59-
fun wiFiChannelByFrequency(frequency: Int, wiFiChannelPair: WiFiChannelPair): WiFiChannel =
60-
if (inRange(frequency)) wiFiChannel(frequency, wiFiChannelPair) else WiFiChannel.UNKNOWN
49+
fun graphChannelByFrequency(frequency: Int): String {
50+
val wiFiChannel: WiFiChannel = wiFiChannelByFrequency(frequency)
51+
return if (WiFiChannel.UNKNOWN == wiFiChannel) {
52+
String.EMPTY
53+
} else {
54+
if (graphChannels.contains(wiFiChannel.channel)) "${wiFiChannel.channel}" else String.EMPTY
55+
}
56+
}
6157

6258
fun availableChannels(channels: Set<Int>): List<WiFiChannel> = channels.map { this.wiFiChannelByChannel(it) }
6359

64-
fun wiFiChannels(): List<WiFiChannel> = wiFiChannelPairs.flatMap { transform(it) }
60+
fun wiFiChannels(): List<WiFiChannel> = (channelRange.first.channel..channelRange.second.channel).map { wiFiChannelByChannel(it) }
6561

66-
private fun transform(wiFiChannelPair: WiFiChannelPair): List<WiFiChannel> =
67-
(wiFiChannelPair.first.channel..wiFiChannelPair.second.channel).map { wiFiChannelByChannel(it) }
62+
private fun wiFiChannel(frequency: Int, wiFiChannelPair: WiFiChannelPair): WiFiChannel {
63+
val (first, last) = wiFiChannelPair
64+
val firstChannel: Int = (first.channel + if (first.channel < 0) -0.5 else 0.5).toInt()
65+
val channel: Int = ((frequency - first.frequency).toDouble() / FREQUENCY_SPREAD + firstChannel).toInt()
66+
return if (frequency in first.frequency..last.frequency) WiFiChannel(channel, frequency) else WiFiChannel.UNKNOWN
67+
}
6868

6969
companion object {
70-
const val FREQUENCY_SPREAD = 5
71-
const val CHANNEL_OFFSET = 2
72-
const val FREQUENCY_OFFSET = FREQUENCY_SPREAD * CHANNEL_OFFSET
70+
internal const val FREQUENCY_SPREAD = 5
7371
}
7472

7573
}

app/src/main/kotlin/com/vrem/wifianalyzer/wifi/band/WiFiChannelsGHZ2.kt

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,21 +17,15 @@
1717
*/
1818
package com.vrem.wifianalyzer.wifi.band
1919

20-
class WiFiChannelsGHZ2 : WiFiChannels(RANGE, SETS) {
21-
override fun wiFiChannelPairs(): List<WiFiChannelPair> = listOf(SET)
22-
20+
class WiFiChannelsGHZ2 : WiFiChannels(channelRange, graphChannels) {
2321
override fun availableChannels(countryCode: String): List<WiFiChannel> =
2422
availableChannels(WiFiChannelCountry.find(countryCode).channelsGHZ2())
2523

2624
override fun channelAvailable(countryCode: String, channel: Int): Boolean =
2725
WiFiChannelCountry.find(countryCode).channelAvailableGHZ2(channel)
2826

2927
companion object {
30-
private val RANGE: WiFiRange = WiFiRange(2400, 2499)
31-
private val SETS: List<WiFiChannelPair> = listOf(
32-
WiFiChannelPair(WiFiChannel(1, 2412), WiFiChannel(13, 2472)),
33-
WiFiChannelPair(WiFiChannel(14, 2484), WiFiChannel(14, 2484))
34-
)
35-
private val SET: WiFiChannelPair = WiFiChannelPair(SETS[0].first, SETS[SETS.size - 1].second)
28+
private val channelRange: WiFiChannelPair = WiFiChannelPair(WiFiChannel(-1, 2402), WiFiChannel(15, 2482))
29+
private val graphChannels: Set<Int> = (1..13).toSet()
3630
}
3731
}

app/src/main/kotlin/com/vrem/wifianalyzer/wifi/band/WiFiChannelsGHZ5.kt

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,20 +17,20 @@
1717
*/
1818
package com.vrem.wifianalyzer.wifi.band
1919

20-
class WiFiChannelsGHZ5 : WiFiChannels(RANGE, SETS) {
21-
override fun wiFiChannelPairs(): List<WiFiChannelPair> = SETS
22-
20+
class WiFiChannelsGHZ5 : WiFiChannels(channelRange, graphChannels) {
2321
override fun availableChannels(countryCode: String): List<WiFiChannel> =
2422
availableChannels(WiFiChannelCountry.find(countryCode).channelsGHZ5())
2523

2624
override fun channelAvailable(countryCode: String, channel: Int): Boolean =
2725
WiFiChannelCountry.find(countryCode).channelAvailableGHZ5(channel)
2826

27+
override fun graphChannelCount(): Int {
28+
return super.graphChannelCount() / 2
29+
}
30+
2931
companion object {
30-
private val SET1 = WiFiChannelPair(WiFiChannel(36, 5180), WiFiChannel(64, 5320))
31-
private val SET2 = WiFiChannelPair(WiFiChannel(100, 5500), WiFiChannel(144, 5720))
32-
private val SET3 = WiFiChannelPair(WiFiChannel(149, 5745), WiFiChannel(177, 5885))
33-
private val SETS = listOf(SET1, SET2, SET3)
34-
private val RANGE = WiFiRange(4900, 5899)
32+
private val channelRange = WiFiChannelPair(WiFiChannel(30, 5150), WiFiChannel(179, 5895))
33+
private val graphChannels: Set<Int> = setOf(42, 58, 74, 90, 106, 122, 138, 156, 171)
34+
3535
}
3636
}

app/src/main/kotlin/com/vrem/wifianalyzer/wifi/band/WiFiChannelsGHZ6.kt

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,18 +17,20 @@
1717
*/
1818
package com.vrem.wifianalyzer.wifi.band
1919

20-
class WiFiChannelsGHZ6 : WiFiChannels(RANGE, SETS) {
21-
override fun wiFiChannelPairs(): List<WiFiChannelPair> = SETS
22-
20+
class WiFiChannelsGHZ6 : WiFiChannels(channelRange, graphChannels) {
2321
override fun availableChannels(countryCode: String): List<WiFiChannel> =
2422
availableChannels(WiFiChannelCountry.find(countryCode).channelsGHZ6())
2523

2624
override fun channelAvailable(countryCode: String, channel: Int): Boolean =
2725
WiFiChannelCountry.find(countryCode).channelAvailableGHZ6(channel)
2826

27+
override fun graphChannelCount(): Int {
28+
return super.graphChannelCount() / 2
29+
}
30+
2931
companion object {
30-
private val SET = WiFiChannelPair(WiFiChannel(1, 5955), WiFiChannel(229, 7095))
31-
private val SETS = listOf(SET)
32-
private val RANGE = WiFiRange(5925, 7125)
32+
private val channelRange = WiFiChannelPair(WiFiChannel(-1, 5945), WiFiChannel(235, 7125))
33+
private val graphChannels: Set<Int> = setOf(15, 47, 79, 110, 142, 174, 208)
3334
}
35+
3436
}

app/src/main/kotlin/com/vrem/wifianalyzer/wifi/channelgraph/ChannelAxisLabel.kt

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -21,39 +21,27 @@ import com.jjoe64.graphview.LabelFormatter
2121
import com.jjoe64.graphview.Viewport
2222
import com.vrem.util.EMPTY
2323
import com.vrem.wifianalyzer.wifi.band.WiFiBand
24-
import com.vrem.wifianalyzer.wifi.band.WiFiChannel
2524
import com.vrem.wifianalyzer.wifi.graphutils.MAX_Y
2625
import com.vrem.wifianalyzer.wifi.graphutils.MIN_Y
2726

2827
internal class ChannelAxisLabel(private val wiFiBand: WiFiBand) : LabelFormatter {
2928
override fun formatLabel(value: Double, isValueX: Boolean): String {
3029
val valueAsInt = (value + if (value < 0) -0.5 else 0.5).toInt()
3130
return if (isValueX) {
32-
xValue(valueAsInt)
31+
wiFiBand.wiFiChannels.graphChannelByFrequency(valueAsInt)
3332
} else {
3433
yValue(valueAsInt)
3534
}
3635
}
3736

38-
private fun yValue(value: Int): String {
39-
return if (value in (MIN_Y + 1)..MAX_Y) {
37+
private fun yValue(value: Int): String =
38+
if (value in (MIN_Y + 1)..MAX_Y) {
4039
"$value"
4140
} else {
4241
String.EMPTY
4342
}
44-
}
45-
46-
private fun xValue(value: Int): String {
47-
val wiFiChannel: WiFiChannel = wiFiBand.wiFiChannels.wiFiChannelByFrequency(value)
48-
return if (wiFiChannel == WiFiChannel.UNKNOWN) {
49-
String.EMPTY
50-
} else {
51-
"${wiFiChannel.channel}"
52-
}
53-
}
5443

5544
override fun setViewport(viewport: Viewport) {
5645
// ignore
5746
}
58-
59-
}
47+
}

app/src/main/kotlin/com/vrem/wifianalyzer/wifi/channelgraph/ChannelGraphView.kt

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,7 @@ import com.vrem.wifianalyzer.R
2626
import com.vrem.wifianalyzer.settings.Settings
2727
import com.vrem.wifianalyzer.settings.ThemeStyle
2828
import com.vrem.wifianalyzer.wifi.band.WiFiBand
29-
import com.vrem.wifianalyzer.wifi.band.WiFiChannels
30-
import com.vrem.wifianalyzer.wifi.graphutils.GraphDataPoint
31-
import com.vrem.wifianalyzer.wifi.graphutils.GraphViewBuilder
32-
import com.vrem.wifianalyzer.wifi.graphutils.GraphViewNotifier
33-
import com.vrem.wifianalyzer.wifi.graphutils.GraphViewWrapper
34-
import com.vrem.wifianalyzer.wifi.graphutils.MIN_Y
35-
import com.vrem.wifianalyzer.wifi.graphutils.THICKNESS_INVISIBLE
36-
import com.vrem.wifianalyzer.wifi.graphutils.transparent
29+
import com.vrem.wifianalyzer.wifi.graphutils.*
3730
import com.vrem.wifianalyzer.wifi.model.WiFiData
3831
import com.vrem.wifianalyzer.wifi.predicate.Predicate
3932
import com.vrem.wifianalyzer.wifi.predicate.makeOtherPredicate
@@ -46,17 +39,17 @@ internal fun makeGraphView(
4639
): GraphView {
4740
val resources = mainContext.resources
4841

49-
return GraphViewBuilder(wiFiBand.maxX, graphMaximumY, themeStyle, true)
42+
return GraphViewBuilder(wiFiBand.wiFiChannels.graphChannelCount(), graphMaximumY, themeStyle, true)
5043
.setLabelFormatter(ChannelAxisLabel(wiFiBand))
5144
.setVerticalTitle(resources.getString(R.string.graph_axis_y))
5245
.setHorizontalTitle(resources.getString(R.string.graph_channel_axis_x))
5346
.build(mainContext.context)
5447
}
5548

56-
internal fun makeDefaultSeries(frequencyEnd: Int, minX: Int): TitleLineGraphSeries<GraphDataPoint> {
49+
internal fun makeDefaultSeries(frequencyStart: Int, frequencyEnd: Int): TitleLineGraphSeries<GraphDataPoint> {
5750
val dataPoints = arrayOf(
58-
GraphDataPoint(minX, MIN_Y),
59-
GraphDataPoint(frequencyEnd + WiFiChannels.FREQUENCY_OFFSET, MIN_Y)
51+
GraphDataPoint(frequencyStart, MIN_Y),
52+
GraphDataPoint(frequencyEnd, MIN_Y)
6053
)
6154
val series = TitleLineGraphSeries(dataPoints)
6255
series.color = transparent.primary.toInt()
@@ -73,9 +66,10 @@ internal fun makeGraphViewWrapper(wiFiBand: WiFiBand): GraphViewWrapper {
7366
val graphViewWrapper = GraphViewWrapper(graphView, settings.channelGraphLegend(), themeStyle)
7467
configuration.size = graphViewWrapper.size(graphViewWrapper.calculateGraphType())
7568
val wiFiChannels = wiFiBand.wiFiChannels.wiFiChannels()
76-
val minX = wiFiChannels.first().frequency - WiFiChannels.FREQUENCY_OFFSET
77-
val maxX = wiFiChannels.last().frequency + WiFiChannels.FREQUENCY_SPREAD
69+
val minX = wiFiChannels.first().frequency
70+
val maxX = wiFiChannels.last().frequency
7871
graphViewWrapper.setViewport(minX, maxX)
72+
graphViewWrapper.addSeries(makeDefaultSeries(minX, maxX))
7973
return graphViewWrapper
8074
}
8175

0 commit comments

Comments
 (0)