Files
LoraSA/src/OSD.cpp
Egor Shitikov 36e6f8f2a8 OSD + BT + WF
2024-08-18 23:21:29 -07:00

109 lines
2.9 KiB
C++

#ifdef OSD_ENABLED
void osd_spectrum()
{ // OSD enabled
for (int i = 0; i < OSD_WIDTH; i++)
{
max_bins_array[i] = 33;
max_bins_array_value[i] = 0;
}
// memset(max_bins_array, 33, 30);
max_bin = 0;
osd.displayString(12, 1, String(FREQ_BEGIN));
osd.displayString(12, 30 - 8, String(FREQ_END));
// Finding biggest in result
// Skiping 0 to avoid overflow
for (int i = 1; i < 32; i++)
{
// filter
if (result[i] > 0 && ((result[i - 1] != 0)))
{
max_bin = i;
#ifdef PRINT_DEBUG
Serial.print("MAX in bin:" + String(max_bin));
Serial.println();
#endif
break;
}
}
if (max_bins_array[col] > max_bin)
{
max_bins_array[col] = max_bin;
// Store RSSI value for RSSI Method
#ifdef METHOD_RSSI
max_bins_array_value[col] = result[max_bin];
#endif
}
// Going to the next OSD step
if (x % osd_steps == 0 && col < 30)
{
// OSD SIDE BAR with frequency log
#ifdef OSD_SIDE_BAR
{
osd.displayString(col, 30 - 7,
String(FREQ_BEGIN + (col * osd_mhz_in_bin)) + ":" +
String(max_bins_array[col]));
}
#endif
// Test with Random Result...
// max_bins_array[s] = rand() % 32;
#ifdef METHOD_RSSI
// With THe RSSI method we can get real RSSI value not just a bin
#endif
// PRINT SIGNAL CHAR ROW, COL, VALUE
osdPrintSignalLevelChart(col, max_bins_array[col]);
#ifdef PRINT_DEBUG
Serial.println("MAX:" + String(max_bins_array[col]));
#endif
col++;
}
}
#ifdef OSD_ENABLED
unsigned short selectFreqChar(int bin, int start_level = 0)
{
if (bin > start_level)
{
// level when we are starting show levels symbols
// you can override with your own character for example 0x100 = " " empty char
return power_level[33];
}
else if (bin >= 0 && bin < MAX_POWER_LEVELS)
return power_level[bin];
// when wrong bin number or noc har assigned we are showing "!" char
return 0x121;
}
#endif
#ifdef OSD_ENABLED
void osdPrintSignalLevelChart(int col, int signal_value)
{
// Third line
if (signal_value <= 9)
{
osd.displayChar(13, col + 2, 0x100);
osd.displayChar(14, col + 2, 0x100);
osd.displayChar(12, col + 2, selectFreqChar(signal_value, drone_detection_level));
}
// Second line
else if (max_bins_array[col] < 19)
{
osd.displayChar(12, col + 2, 0x100);
osd.displayChar(14, col + 2, 0x100);
osd.displayChar(13, col + 2, selectFreqChar(signal_value, drone_detection_level));
}
// First line
else
{
// Clean Up symbol
osd.displayChar(12, col + 2, 0x100);
osd.displayChar(13, col + 2, 0x100);
osd.displayChar(14, col + 2, selectFreqChar(signal_value, drone_detection_level));
}
}
#endif
#endif // END OSD ENABLED