Digital_VFO_with_analog_dial/VFOsys_astep/dial.cpp

1308 wiersze
36 KiB
C++

/*
* File: dial.cpp
* Author: JF3HZB / T.UEBO
*
* Created on 2019/02/10, 22:13
*/
#include <arduino.h>
#include "display.h"
#include "graph.h"
#include "dial_font.h"
#include "dial.h"
#include "dial_prm.h"
extern uint8_t R_GRAM[Nx][Ny];
extern uint8_t B_GRAM[Nx][Ny];
extern uint8_t G_GRAM[Nx][Ny];
int freq_tick = 1000;
long Dial_font[26][13];
int fontpitch;
float xoff_font, yoff_font;
float xoff_point;
int D_center, D_left, D_right;
int yry[Nx][4];
int D_R_inside;
float reso;
float reso_main;
int H_sub1, H_sub5, H_sub10;
int L_sub1, L_sub5, L_sub10;
int H_main1, H_main5, H_main10;
int L_main1, L_main5, L_main10;
/*-------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------*/
void init_Dial(void) {
int xg; //yg;
float xf, yf, arc_main, arc_sub;
int D_R_tmp;
if (f_dispmode == 0) {
D_left = 0; D_right = Nx - 1;
D_center = (Nx >> 1);
} else {
D_left = 0; D_right = Ny - 1;
D_center = (Ny >> 1);
}
D_R_inside = D_R - Dial_space;
if (f_main_outside == 1) {
reso = (float)tick_pitch / (float)D_R_inside;
reso_main = (float)tick_pitch_main / (float)D_R;
if ( D_R < (Nx / 2) ) arc_main = 1.6 * (float)D_R; else arc_main = 1.6 * 0.5 * (float)Nx;
if ( D_R_inside < (Nx / 2) ) arc_sub = 1.6 * (float)D_R_inside; else arc_sub = 1.6 * 0.5 * (float)Nx;
} else {
reso = (float)tick_pitch / (float)D_R;
reso_main = (float)tick_pitch_main / (float)D_R_inside;
if ( D_R < (Nx / 2) ) arc_sub = 1.6 * (float)D_R; else arc_sub = 1.6 * 0.5 * (float)Nx;
if ( D_R_inside < (Nx / 2) ) arc_main = 1.6 * (float)D_R_inside; else arc_main = 1.6 * 0.5 * (float)Nx;
}
reso = 0.1 * reso;
reso_main = 0.1 * reso_main;
H_main1 = (int)( (arc_main / ( 0.1 * (float)tick_pitch_main ) ) * 2.0 );
L_main1 = (int)( (arc_main / ( 0.1 * (float)tick_pitch_main ) ) * -1.0 );
H_main5 = (int)( (arc_main / ( 0.1 * (float)tick_pitch_main) / 5.0 ) * 2.0 );
L_main5 = (int)( (arc_main / ( 0.1 * (float)tick_pitch_main) / 5.0 ) * 0.75 );
L_main5 /= 2; L_main5++;
L_main5 *= 2; L_main5++;
L_main5 *= -1;
H_main10 = (int)( (arc_main / ( 0.1 * (float)tick_pitch_main) / 10.0) * 2.0 );
L_main10 = (int)( (arc_main / ( 0.1 * (float)tick_pitch_main) / 10.0) * 0.75 );
L_main10 /= 2; L_main10++;
L_main10 *= 2;
L_main10 *= -1;
H_sub1 = (int)( (arc_sub / ( 0.1 * (float)tick_pitch) ) * 2.0 );
L_sub1 = (int)( (arc_sub / ( 0.1 * (float)tick_pitch) ) * -1.0 );
H_sub5 = (int)( (arc_sub / ( 0.1 * (float)tick_pitch) / 5.0) * 2.0 );
L_sub5 = (int)( (arc_sub / ( 0.1 * (float)tick_pitch) / 5.0) * 0.75 );
L_sub5 /= 2; L_sub5++;
L_sub5 *= 2; L_sub5++;
L_sub5 *= -1;
H_sub10 = (int)( (arc_sub / ( 0.1 * (float)tick_pitch) / 10.0) * 2.0 );
L_sub10 = (int)( (arc_sub / ( 0.1 * (float)tick_pitch) / 10.0) * 0.75 );
L_sub10 /= 2; L_sub10++;
L_sub10 *= 2;
L_sub10 *= -1;
// Region settings yry[][]--------------------------------------------------------
for (xg = D_left; xg <= D_right; xg++) {
xf = (float)xg;
yf = (float)(D_R * D_R) -
(xf - (float)D_center) * (xf - (float)D_center);
if (yf > 0) {
yry[xg][0] = (int)( 0.5 + sqrt(yf) - (float)D_R + (float)D_height );
if (yry[xg][0] < 0) yry[xg][0] = 0;
} else {
yry[xg][0] = 0;
}
}
if (f_main_outside == 1) D_R_tmp = D_R - tick_main10;
else D_R_tmp = D_R - tick10;
for (xg = D_left; xg <= D_right; xg++) {
xf = (float)xg;
yf = (float)(D_R_tmp * D_R_tmp) -
(xf - (float)D_center) * (xf - (float)D_center);
if (yf > 0) {
yry[xg][1] = (int)( 0.5 + sqrt(yf) - (float)D_R + (float)D_height );
if (yry[xg][1] < 0) yry[xg][1] = 0;
} else {
yry[xg][1] = 0;
}
}
for (xg = D_left; xg <= D_right; xg++) {
xf = (float)xg;
yf = (float)( (D_R_inside + 1) * (D_R_inside + 1) ) -
(xf - (float)D_center) * (xf - (float)D_center);
if (yf > 0) {
yry[xg][2] = (int)( 0.5 + sqrt(yf) - (float)D_R + (float)D_height );
if (yry[xg][2] < 0) yry[xg][2] = 0;
} else {
yry[xg][2] = 0;
}
}
if (f_main_outside == 1) D_R_tmp = D_R_inside - tick10;
else D_R_tmp = D_R_inside - tick_main10;
for (xg = D_left; xg <= D_right; xg++) {
xf = (float)xg;
yf = (float)(D_R_tmp * D_R_tmp) -
(xf - (float)D_center) * (xf - (float)D_center);
if (yf > 0) {
yry[xg][3] = (int)( 0.5 + sqrt(yf) - (float)D_R + (float)D_height );
if (yry[xg][3] < 0) yry[xg][3] = 0;
} else {
yry[xg][3] = 0;
}
}
//------------------------------------------------------------------------
Sel_font12();
//if(f_FONT==0) Sel_font12();
if (f_FONT == 1) Sel_font14();
if (f_FONT == 2) Sel_font16();
}
/*-------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------*/
void Sel_font12(void) {
int k, j;
fontpitch = 8.5;
xoff_font = 2.5;
yoff_font = 10.0;
xoff_point = 0.5;
for (k = 0; k < 10; k++) {
for (j = 0; j < 13; j++) {
Dial_font[k+16][j] = Dial_font12[k][j];
}
}
}
void Sel_font14(void) {
int k, j;
fontpitch = 9;
xoff_font = 1.5;
yoff_font = 9.0;
xoff_point = 0.5;
for (k = 0; k < 10; k++) {
for (j = 0; j < 13; j++) {
Dial_font[k+16][j] = Dial_font14[k][j];
}
}
}
void Sel_font16(void) {
int k, j;
fontpitch = 10;
xoff_font = 2.0;
yoff_font = 8.0;
xoff_point = 0;
for (k = 0; k < 10; k++) {
for (j = 0; j < 13; j++) {
Dial_font[k+16][j] = Dial_font16[k][j];
}
}
}
/*-------------------------------------------------------------------------------
*
--------------------------------------------------------------------------------*/
void Dial(long freq)
{
int i, k;
int xg, yg, xi, yi;
float x, y, angle, a, s, c, xf, yf;
#define ZERO_rad 128
float sin_[ZERO_rad * 2], cos_[ZERO_rad * 2];
float xr, yr, fsign;
int d, dg, dgmax;
float dgf;
long fdisp;
long fx, fy;
int D_R_tmp;
if(f_rev==1) freq=-freq;
if (freq < 0) {
freq = - freq;
fsign = -1.0;
} else {
fsign = 1.0;
}
//----------------------------------------------------
if (f_dispmode == 0) {
for (xg = D_left; xg <= D_right; xg++) {
yg = yry[xg][0];
for (i = 0; i <= yg; i++) {
R_GRAM[xg][i] = 0;
G_GRAM[xg][i] = 0;
B_GRAM[xg][i] = 0;
}
}
} else {
for (xg = D_left; xg <= D_right; xg++) {
yg = yry[xg][0];
for (i = 0; i <= yg; i++) {
R_GRAM[Nx - 1 - i][xg] = 0;
G_GRAM[Nx - 1 - i][xg] = 0;
B_GRAM[Nx - 1 - i][xg] = 0;
}
}
}
//------------------------------------------------------------------------
// SUB DIAL
//------------------------------------------------------------------------
angle = -(float)( freq % (freq_tick * 10) ) * reso / (float)freq_tick;
angle *= fsign;
// Rotation matrix----------------------------------------------
for (i = -ZERO_rad + 1; i <= ZERO_rad - 1; i++) {
a = angle + i * reso;
sin_[i + ZERO_rad] = sin(a); cos_[i + ZERO_rad] = cos(a);
}
if (f_main_outside == 1) D_R_tmp = D_R_inside;
else D_R_tmp = D_R;
if (f_subtick10 == 1) {
// Tick 10kHz----------------------------------------
if (f_dispmode == 0) {
for (i = L_sub10; i <= H_sub10; i++) {
// every 10points
if (fsign > 0) k = i * 10 + ZERO_rad; else k = -i * 10 + ZERO_rad;
s = sin_[k]; c = cos_[k];
for (xg = -1 - tick_width; xg <= 1; xg++) {
for (yg = 1 + (D_R - D_R_tmp); yg < tick10 + (D_R - D_R_tmp); yg++) {
x = c * (float)xg - s * ((float)D_R - (float)yg);
y = s * (float)xg + c * ((float)D_R - (float)yg);
x = x + (float)D_center;
y = y - (float)D_R + (float)D_height;
xi = (int)x; yi = (int)y;
if ( xi >= D_left && xi <= D_right && yi >= 0 && yi <= D_height )
dot(x, y);
}
}
}
} else {
for (i = L_sub10; i <= H_sub10; i++) {
// every 10points
if (fsign > 0) k = i * 10 + ZERO_rad; else k = -i * 10 + ZERO_rad;
s = sin_[k]; c = cos_[k];
for (xg = -1 - tick_width; xg <= 1; xg++) {
for (yg = 1 + (D_R - D_R_tmp); yg < tick10 + (D_R - D_R_tmp); yg++) {
x = c * (float)xg - s * ((float)D_R - (float)yg);
y = s * (float)xg + c * ((float)D_R - (float)yg);
y = (float)(Nx - 1) - ( y - (float)D_R + (float)D_height);
x = x + (float)D_center;
xi = (int)x; yi = (int)y;
if ( xi >= D_left && xi <= D_right && yi >= Nx - 1 - D_height && yi <= Nx - 1 )
dot(y, x);
}
}
}
}
}
if (f_subtick5 == 1) {
// Tick 5kHz----------------------------------------
if (f_dispmode == 0) {
for (i = L_sub5; i <= H_sub5; i += 2) {
// every 5points
if (fsign > 0) k = i * 5 + ZERO_rad; else k = -i * 5 + ZERO_rad;
s = sin_[k]; c = cos_[k];
for (xg = -1 - tick_width; xg <= 1; xg++) {
for (yg = 1 + (D_R - D_R_tmp); yg < tick5 + (D_R - D_R_tmp); yg++) {
x = c * (float)xg - s * ((float)D_R - (float)yg);
y = s * (float)xg + c * ((float)D_R - (float)yg);
x = x + (float)D_center;
y = y - (float)D_R + (float)D_height;
xi = (int)x; yi = (int)y;
if ( xi >= D_left && xi <= D_right && yi >= 0 && yi <= D_height )
dot(x, y);
}
}
}
} else {
for (i = L_sub5; i <= H_sub5; i += 2) {
if (fsign > 0) k = i * 5 + ZERO_rad; else k = -i * 5 + ZERO_rad;
s = sin_[k]; c = cos_[k];
for (xg = -1 - tick_width; xg <= 1; xg++) {
for (yg = 1 + (D_R - D_R_tmp); yg < tick5 + (D_R - D_R_tmp); yg++) {
x = c * (float)xg - s * ((float)D_R - (float)yg);
y = s * (float)xg + c * ((float)D_R - (float)yg);
y = (float)(Nx - 1) - ( y - (float)D_R + (float)D_height);
x = x + (float)D_center;
xi = (int)x; yi = (int)y;
if ( xi >= D_left && xi <= D_right && yi >= Nx - 1 - D_height && yi <= Nx - 1 )
dot(y, x);
}
}
}
}
}
if (f_subtick1 == 1) {
//Tick 1kHz---------------------------------------------------------------------
if (f_dispmode == 0) {
for (i = L_sub1; i <= H_sub1; i++) {
if (i % 5 != 0 ) {
if (fsign > 0) k = i + ZERO_rad; else k = -i + ZERO_rad;
s = sin_[k]; c = cos_[k];
for (xg = -tick_width; xg <= 0; xg++) {
for (yg = 1 + (D_R - D_R_tmp); yg < tick1 + (D_R - D_R_tmp); yg++) {
x = c * (float)xg - s * ((float)D_R - (float)yg);
y = s * (float)xg + c * ((float)D_R - (float)yg);
x = x + (float)D_center;
y = y - (float)D_R + (float)D_height;
xi = (int)x; yi = (int)y;
if ( xi >= D_left && xi <= D_right && yi >= 0 && yi <= D_height ) dot(x, y);
}
}
}
}
} else {
for (i = L_sub1; i <= H_sub1; i++) {
if (i % 5 != 0 ) {
if (fsign > 0) k = i + ZERO_rad; else k = -i + ZERO_rad;
s = sin_[k]; c = cos_[k];
for (xg = -tick_width; xg <= 0; xg++) {
for (yg = 1 + (D_R - D_R_tmp); yg < tick1 + (D_R - D_R_tmp); yg++) {
x = c * (float)xg - s * ((float)D_R - (float)yg);
y = s * (float)xg + c * ((float)D_R - (float)yg);
y = (float)(Nx - 1) - ( y - (float)D_R + (float)D_height);
x = x + (float)D_center;
xi = (int)x; yi = (int)y;
if ( xi >= D_left && xi <= D_right && yi >= Nx - 1 - D_height && yi <= Nx - 1 ) dot(y, x);
}
}
}
}
}
}
if (f_subnum == 1) {
// Number(kHz)------------------------------------------
for (i = L_sub10; i <= H_sub10; i++) //
{
fdisp = freq + i * (10 * freq_tick);
if (fdisp >= 0) {
fdisp /= (10 * freq_tick);
fdisp *= 10;
// every 10kHz
if (fsign > 0) k = i * 10 + ZERO_rad; else k = -i * 10 + ZERO_rad;
s = sin_[k]; c = cos_[k];
dgmax = 3;
if (freq_tick_main == 10000) dgmax = 2;
//-------------------------------------------------------------------------------------
for (dg = 0; dg < dgmax; dg++)
{
d = fdisp % 10;
//for( xg=0; xg<13; xg++) // Scanning 13bit
for ( xg = 0; xg < 9; xg++)
{
fx = Dial_font[d + 0x10][xg];
//for( yg=0; yg<24; yg++) // Scanning 24bit
for ( yg = 10; yg < 24; yg++)
{
fy = (long)( 1 << ( 23 - yg) );
if (f_dispmode == 0) {
if ( ( fx & fy ) == fy )
{
if (dgmax == 1) xr = (float)xg - 6.0 + xoff_font; // (13-1)/2 = 6
if (dgmax == 2) xr = (float)xg - 6.0 + xoff_font - ( (float)(dg) - 0.5 ) * (float)fontpitch;
if (dgmax == 3) xr = (float)xg - 6.0 + xoff_font - ( (float)(dg) - 1.0 ) * (float)fontpitch;
yr = (float)( D_R_tmp - (yg + TNCL) ) + yoff_font;
xf = c * (xr) - s * (yr);
yf = s * (xr) + c * (yr);
xf = xf + (float)D_center;
yf = yf - (float)D_R + (float)D_height;
xi = (int)xf; yi = (int)yf;
if ( xi >= D_left && xi <= D_right && yi >= 0 && yi <= D_height ) dot(xf, yf);
}
} else {
if ( ( fx & fy ) == fy )
{
if (dgmax == 1) xr = (float)( (xg + TNCL) - D_R_tmp );
if (dgmax == 2) xr = (float)( (xg + TNCL) - D_R_tmp ) - ( (float)(dg) - 1.0 ) * (float)fontpitch;
if (dgmax == 3) xr = (float)( (xg + TNCL) - D_R_tmp ) - ( (float)(dg) - 2.0 ) * (float)fontpitch;
yr = (float)(12 - yg) + 0.5 * yoff_font;
xf = c * (xr) - s * (yr);
yf = s * (xr) + c * (yr);
xf = xf + (float)D_R - (float)D_height + (float)(Nx - 1);
yf = yf + (float)D_center;
xi = (int)xf; yi = (int)yf;
if ( yi >= D_left && yi <= D_right && xi >= Nx - 1 - D_height && xi <= Nx - 1 ) dot(xf, yf);
}
}
}
}
fdisp /= 10;
}
}
}
}
//------------------------------------------------------------------------------------
// MAIN DIAL
//------------------------------------------------------------------------------------
if (f_main_outside == 1) D_R_tmp = D_R;
else D_R_tmp = D_R_inside;
angle = -(float)( freq % (freq_tick_main * 10) ) * reso_main / (float)freq_tick_main;
angle *= fsign;
// Rotation matrix -------------------------------
for (i = -ZERO_rad + 1; i <= ZERO_rad - 1; i++) {
a = angle + i * reso_main;
sin_[i + ZERO_rad] = sin(a); cos_[i + ZERO_rad] = cos(a);
}
if (f_maintick10 == 1) {
// Tick 10--------------------------------------
if (f_dispmode == 0) {
for (i = L_main10; i <= H_main10; i++) {
if (fsign > 0) k = i * 10 + ZERO_rad; else k = -i * 10 + ZERO_rad;
s = sin_[k]; c = cos_[k];
for (xg = -1 - tick_width; xg <= 1; xg++) {
for (yg = 1 + (D_R - D_R_tmp); yg < tick_main10 + (D_R - D_R_tmp); yg++) {
x = c * (float)xg - s * ((float)D_R - (float)yg);
y = s * (float)xg + c * ((float)D_R - (float)yg);
x = x + (float)D_center;
y = y - (float)D_R + (float)D_height;
xi = (int)x; yi = (int)y;
if ( xi >= D_left && xi <= D_right && yi >= 0 && yi <= D_height )
dot(x, y);
}
}
}
} else {
for (i = L_main10; i <= H_main10; i++) {
if (fsign > 0) k = i * 10 + ZERO_rad; else k = -i * 10 + ZERO_rad;
s = sin_[k]; c = cos_[k];
for (xg = -1 - tick_width; xg <= 1; xg++) {
for (yg = 1 + (D_R - D_R_tmp); yg < tick_main10 + (D_R - D_R_tmp); yg++) {
x = c * (float)xg - s * ((float)D_R - (float)yg);
y = s * (float)xg + c * ((float)D_R - (float)yg);
y = (float)(Nx - 1) - ( y - (float)D_R + (float)D_height);
x = x + (float)D_center;
xi = (int)x; yi = (int)y;
if ( xi >= D_left && xi <= D_right && yi >= Nx - 1 - D_height && yi <= Nx - 1 )
dot(y, x);
}
}
}
}
}
if (f_maintick5 == 1) {
// Tick 5 ----------------------------------------
if (f_dispmode == 0) {
for (i = L_main5; i <= H_main5; i += 2) {
if (fsign > 0) k = i * 5 + ZERO_rad; else k = -i * 5 + ZERO_rad;
s = sin_[k]; c = cos_[k];
for (xg = -1 - tick_width; xg <= 1; xg++) {
for (yg = 1 + (D_R - D_R_tmp); yg < tick_main5 + (D_R - D_R_tmp); yg++) {
x = c * (float)xg - s * ((float)D_R - (float)yg);
y = s * (float)xg + c * ((float)D_R - (float)yg);
x = x + (float)D_center;
y = y - (float)D_R + (float)D_height;
xi = (int)x; yi = (int)y;
if ( xi >= D_left && xi <= D_right && yi >= 0 && yi <= D_height )
dot(x, y);
}
}
}
} else {
for (i = L_main5; i <= H_main5; i += 2) {
if (fsign > 0) k = i * 5 + ZERO_rad; else k = -i * 5 + ZERO_rad;
s = sin_[k]; c = cos_[k];
for (xg = -1 - tick_width; xg <= 1; xg++) {
for (yg = 1 + (D_R - D_R_tmp); yg < tick_main5 + (D_R - D_R_tmp); yg++) {
x = c * (float)xg - s * ((float)D_R - (float)yg);
y = s * (float)xg + c * ((float)D_R - (float)yg);
y = (float)(Nx - 1) - ( y - (float)D_R + (float)D_height);
x = x + (float)D_center;
xi = (int)x; yi = (int)y;
if ( xi >= D_left && xi <= D_right && yi >= Nx - 1 - D_height && yi <= Nx - 1 )
dot(y, x);
}
}
}
}
}
if (f_maintick1 == 1) {
// Tick 1---------------------------------------------
if (f_dispmode == 0) {
for (i = L_main1; i <= H_main1; i++) {
if (i % 5 != 0 ) {
if (fsign > 0) k = i + ZERO_rad; else k = -i + ZERO_rad;
s = sin_[k]; c = cos_[k];
for (xg = -tick_width; xg <= 0; xg++) {
for (yg = 1 + (D_R - D_R_tmp); yg < tick_main1 + (D_R - D_R_tmp); yg++) {
x = c * (float)xg - s * ((float)D_R - (float)yg);
y = s * (float)xg + c * ((float)D_R - (float)yg);
x = x + (float)D_center;
y = y - (float)D_R + (float)D_height;
xi = (int)x; yi = (int)y;
if ( xi >= D_left && xi <= D_right && yi >= 0 && yi <= D_height )
dot(x, y);
}
}
}
}
} else {
for (i = L_main1; i <= H_main1; i++) {
if (i % 5 != 0 ) {
if (fsign > 0) k = i + ZERO_rad; else k = -i + ZERO_rad;
s = sin_[k]; c = cos_[k];
for (xg = -tick_width; xg <= 0; xg++) {
for (yg = 1 + (D_R - D_R_tmp); yg < tick_main1 + (D_R - D_R_tmp); yg++) {
x = c * (float)xg - s * ((float)D_R - (float)yg);
y = s * (float)xg + c * ((float)D_R - (float)yg);
y = (float)(Nx - 1) - ( y - (float)D_R + (float)D_height);
x = x + (float)D_center;
xi = (int)x; yi = (int)y;
if ( xi >= D_left && xi <= D_right && yi >= Nx - 1 - D_height && yi <= Nx - 1 )
dot(y, x);
}
}
}
}
}
}
// Number -----------------------------------------------
if (f_mainnum == 1) {
for (i = L_main10; i <= H_main10; i++)
{
fdisp = freq + i * (10 * freq_tick_main);
if (fdisp >= 0)
{
fdisp /= (10 * freq_tick_main);
if (fsign > 0) k = i * 10 + ZERO_rad; else k = -i * 10 + ZERO_rad; //Step 10 point
s = sin_[k]; c = cos_[k];
dgmax = 1;
if (fdisp < 10) {
if (freq_tick_main == 10000) dgmax = 2;
} else if (fdisp < 100) {
dgmax = 2;
} else if (fdisp < 1000) {
dgmax = 3;
} else {
dgmax = 4;
}
//-------------------------------------------------
for (dg = 0; dg < dgmax; dg++)
{
d = fdisp % 10;
//for( xg=0; xg<13; xg++) // Scanning 13bit
for ( xg = 0; xg < 9; xg++)
{
fx = Dial_font[d + 0x10][xg];
//for( yg=0; yg<24; yg++) // Scanning 24bit
for ( yg = 10; yg < 24; yg++)
{
fy = (long)( 1 << ( 23 - yg) ); //23
if (f_dispmode == 0) {
if ( ( fx & fy ) == fy )
{
dgf = (float)dg;
if (dg == 0 && freq_tick_main == 10000)
dgf = (float)dg - 0.6;
if (dgmax == 1) xr = (float)xg - 6.0 + xoff_font; // (13-1)/2 = 6
if (dgmax == 2) xr = (float)xg - 6.0 + xoff_font - ( dgf - 0.5 ) * (float)fontpitch;
if (dgmax == 3) xr = (float)xg - 6.0 + xoff_font - ( dgf - 1.0 ) * (float)fontpitch;
if (dgmax == 4) xr = (float)xg - 6.0 + xoff_font - ( dgf - 1.5 ) * (float)fontpitch;
yr = (float)( D_R_tmp - (yg + TNCL_main) ) + yoff_font;
xf = c * (xr) - s * (yr);
yf = s * (xr) + c * (yr);
xf = xf + (float)D_center;
yf = yf - (float)D_R + (float)D_height;
xi = (int)xf; yi = (int)yf;
if ( xi >= D_left && xi <= D_right && yi >= 0 && yi <= D_height ) dot(xf, yf);
}
} else {
if ( ( fx & fy ) == fy )
{
dgf = (float)dg;
if (dg == 0 && freq_tick_main == 10000)
dgf = (float)dg - 0.6;
if (dgmax == 1) xr = (float)( (xg + TNCL_main) - D_R_tmp ); // (13-1)/2 = 6
if (dgmax == 2) xr = (float)( (xg + TNCL_main) - D_R_tmp ) - (dgf - 1.0 ) * (float)fontpitch;
if (dgmax == 3) xr = (float)( (xg + TNCL_main) - D_R_tmp ) - (dgf - 2.0 ) * (float)fontpitch;
if (dgmax == 4) xr = (float)( (xg + TNCL_main) - D_R_tmp ) - (dgf - 3.0 ) * (float)fontpitch;
yr = (float)(12 - yg) + 0.5 * yoff_font;
xf = c * (xr) - s * (yr);
yf = s * (xr) + c * (yr);
xf = xf + (float)D_R - (float)D_height + (float)(Nx - 1);
yf = yf + (float)D_center;
xi = (int)xf; yi = (int)yf;
if ( yi >= D_left && yi <= D_right && xi >= Nx - 1 - D_height && xi <= Nx - 1 ) dot(xf, yf);
}
}
}
}
// Decimal point---------------------------------------
if (dg == 0)
{
if (freq_tick_main == 10000)
{
for (xg = -5; xg <= -4; xg++) {
for (yg = 21; yg <= 22; yg++) {
if (
//(xg==-6 && yg==20)||
//(xg==-6 && yg==22)||
//(xg==-4 && yg==20)||
//(xg==-4 && yg==22)
0
)
{} else
{
if (f_dispmode == 0) {
if (dgmax == 1) xr = (float)xg + 0.29 * (float)fontpitch + xoff_point;
if (dgmax == 2) xr = (float)xg + 0.69 * (float)fontpitch + xoff_point;
if (dgmax == 3) xr = (float)xg + 1.29 * (float)fontpitch + xoff_point;
if (dgmax == 4) xr = (float)xg + 1.69 * (float)fontpitch + xoff_point;
yr = (float)( D_R_tmp - (yg + TNCL_main) ) + yoff_font;
xf = c * (xr) - s * (yr);
yf = s * (xr) + c * (yr);
xf = xf + (float)D_center;
yf = yf - (float)D_R + (float)D_height;
xi = (int)xf; yi = (int)yf;
if ( xi >= D_left && xi <= D_right && yi >= 0 && yi <= D_height ) {
dot(xf, yf);
if (tick_width == 1) dot(xf, yf + 0.3);
}
} else {
if (dgmax == 1) xr = (float)( (xg + TNCL_main) - D_R_tmp - 1) + 0.7 * (float)fontpitch + xoff_point;
if (dgmax == 2) xr = (float)( (xg + TNCL_main) - D_R_tmp - 1) + 1.7 * (float)fontpitch + xoff_point;
if (dgmax == 3) xr = (float)( (xg + TNCL_main) - D_R_tmp - 1) + 2.7 * (float)fontpitch + xoff_point;
if (dgmax == 4) xr = (float)( (xg + TNCL_main) - D_R_tmp - 1) + 3.7 * (float)fontpitch + xoff_point;
yr = (float)(12 - yg) + 0.5 * yoff_font;
xf = c * (xr) - s * (yr);
yf = s * (xr) + c * (yr);
xf = xf + (float)D_R - (float)D_height + (float)(Nx - 1);
yf = yf + (float)D_center;
xi = (int)xf; yi = (int)yf;
if ( yi >= D_left && yi <= D_right && xi >= Nx - 1 - D_height && xi <= Nx - 1 ) {
dot(xf, yf);
if (tick_width == 1) dot(xf + 0.3, yf);
}
}
}
}
}
}
}
fdisp /= 10;
}
}
}
}
//--------------------------------------------------------------------
// coloring
//--------------------------------------------------------------------
unsigned int cR, cG, cB;
unsigned int dcR, dcG, dcB;
int ccR, ccG, ccB;
float kido;
dcR = (cl_DIAL_BG >> 16) & 0xFF;
dcG = (cl_DIAL_BG >> 8) & 0xFF;
dcB = (cl_DIAL_BG) & 0xFF;
// Outside Tick
if (f_main_outside == 1) {
cR = (cl_TICK_main >> 16) & 0xFF;
cG = (cl_TICK_main >> 8 ) & 0xFF;
cB = cl_TICK_main & 0xFF;
} else {
cR = (cl_TICK >> 16) & 0xFF;
cG = (cl_TICK >> 8 ) & 0xFF;
cB = cl_TICK & 0xFF;
}
if (f_dispmode == 0){
for (xg = D_left; xg <= D_right; xg++) {
for (i = yry[xg][1]; i <= yry[xg][0]; i++) {
if ( R_GRAM[xg][i] != 0) {
kido = (float)R_GRAM[xg][i] / (float)255.0;
ccR = (int)(kido * (float)cR + (1.0 - kido) * (float)dcR + 0.5 );
ccG = (int)(kido * (float)cG + (1.0 - kido) * (float)dcG + 0.5 );
ccB = (int)(kido * (float)cB + (1.0 - kido) * (float)dcB + 1.0 );
if (ccR > 0xFF) ccR = 0xFF;
if (ccG > 0xFF) ccG = 0xFF;
if (ccB > 0xFF) ccB = 0xFF;
R_GRAM[xg][i] = (unsigned char)ccR;
G_GRAM[xg][i] = (unsigned char)ccG;
B_GRAM[xg][i] = (unsigned char)ccB;
}
}
}
}else{
for (xg = D_left; xg <= D_right; xg++) {
for (i = yry[xg][1]; i <= yry[xg][0]; i++) {
if ( R_GRAM[Nx - 1 - i][xg] != 0) {
kido = (float)R_GRAM[Nx - 1 - i][xg] / (float)255.0;
ccR = (int)(kido * (float)cR + (1.0 - kido) * (float)dcR + 0.5);
ccG = (int)(kido * (float)cG + (1.0 - kido) * (float)dcG + 0.5);
ccB = (int)(kido * (float)cB + (1.0 - kido) * (float)dcB + 1.0);
if (ccR > 0xFF) ccR = 0xFF;
if (ccG > 0xFF) ccG = 0xFF;
if (ccB > 0xFF) ccB = 0xFF;
R_GRAM[Nx - 1 - i][xg] = (unsigned char)ccR;
G_GRAM[Nx - 1 - i][xg] = (unsigned char)ccG;
B_GRAM[Nx - 1 - i][xg] = (unsigned char)ccB;
}
}
}
}
//Outside Number---------------------
if (f_main_outside == 1) {
cR = (cl_NUM_main >> 16) & 0xFF;
cG = (cl_NUM_main >> 8 ) & 0xFF;
cB = cl_NUM_main & 0xFF;
} else {
cR = (cl_NUM >> 16) & 0xFF;
cG = (cl_NUM >> 8 ) & 0xFF;
cB = cl_NUM & 0xFF;
}
if (f_dispmode == 0){
for (xg = D_left; xg <= D_right; xg++) {
for (i = yry[xg][2]; i < yry[xg][1]; i++) {
if (R_GRAM[xg][i] != 0) {
kido = (float)R_GRAM[xg][i] / (float)255.0;
ccR = (int)(kido * (float)cR + (1.0 - kido) * (float)dcR + 0.5);
ccG = (int)(kido * (float)cG + (1.0 - kido) * (float)dcG + 0.5);
ccB = (int)(kido * (float)cB + (1.0 - kido) * (float)dcB + 1.0);
if (ccR > 0xFF) ccR = 0xFF;
if (ccG > 0xFF) ccG = 0xFF;
if (ccB > 0xFF) ccB = 0xFF;
R_GRAM[xg][i] = (unsigned char)ccR;
G_GRAM[xg][i] = (unsigned char)ccG;
B_GRAM[xg][i] = (unsigned char)ccB;
}
}
}
}else{
for (xg = D_left; xg <= D_right; xg++) {
for (i = yry[xg][2]; i < yry[xg][1]; i++) {
if (R_GRAM[Nx - 1 - i][xg] != 0) {
kido = (float)R_GRAM[Nx - 1 - i][xg] / (float)255.0;
ccR = (int)(kido * (float)cR + (1.0 - kido) * (float)dcR + 0.5);
ccG = (int)(kido * (float)cG + (1.0 - kido) * (float)dcG + 0.5);
ccB = (int)(kido * (float)cB + (1.0 - kido) * (float)dcB + 1.0);
if (ccR > 0xFF) ccR = 0xFF;
if (ccG > 0xFF) ccG = 0xFF;
if (ccB > 0xFF) ccB = 0xFF;
R_GRAM[Nx - 1 - i][xg] = (unsigned char)ccR;
G_GRAM[Nx - 1 - i][xg] = (unsigned char)ccG;
B_GRAM[Nx - 1 - i][xg] = (unsigned char)ccB;
}
}
}
}
//Inside Tick---------------
if (f_main_outside == 1) {
cR = (cl_TICK >> 16) & 0xFF;
cG = (cl_TICK >> 8 ) & 0xFF;
cB = cl_TICK & 0xFF;
} else {
cR = (cl_TICK_main >> 16) & 0xFF;
cG = (cl_TICK_main >> 8 ) & 0xFF;
cB = cl_TICK_main & 0xFF;
}
if (f_dispmode == 0) {
for (xg = D_left; xg <= D_right; xg++) {
for (i = yry[xg][3]; i < yry[xg][2]; i++) {
if (R_GRAM[xg][i] != 0) {
kido = (float)R_GRAM[xg][i] / (float)255.0;
ccR = (int)(kido * (float)cR + (1.0 - kido) * (float)dcR + 0.5);
ccG = (int)(kido * (float)cG + (1.0 - kido) * (float)dcG + 0.5);
ccB = (int)(kido * (float)cB + (1.0 - kido) * (float)dcB + 1.0);
if (ccR > 0xFF) ccR = 0xFF;
if (ccG > 0xFF) ccG = 0xFF;
if (ccB > 0xFF) ccB = 0xFF;
R_GRAM[xg][i] = (unsigned char)ccR;
G_GRAM[xg][i] = (unsigned char)ccG;
B_GRAM[xg][i] = (unsigned char)ccB;
}
}
}
}else{
for (xg = D_left; xg <= D_right; xg++) {
for (i = yry[xg][3]; i < yry[xg][2]; i++) {
if (R_GRAM[Nx - 1 - i][xg] != 0) {
kido = (float)R_GRAM[Nx - 1 - i][xg] / (float)255.0;
ccR = (int)(kido * (float)cR + (1.0 - kido) * (float)dcR + 0.5);
ccG = (int)(kido * (float)cG + (1.0 - kido) * (float)dcG + 0.5);
ccB = (int)(kido * (float)cB + (1.0 - kido) * (float)dcB + 1.0);
if (ccR > 0xFF) ccR = 0xFF;
if (ccG > 0xFF) ccG = 0xFF;
if (ccB > 0xFF) ccB = 0xFF;
R_GRAM[Nx - 1 - i][xg] = (unsigned char)ccR;
G_GRAM[Nx - 1 - i][xg] = (unsigned char)ccG;
B_GRAM[Nx - 1 - i][xg] = (unsigned char)ccB;
}
}
}
}
//Inside Number--------------------------
if (f_main_outside == 1) {
cR = (cl_NUM >> 16) & 0xFF;
cG = (cl_NUM >> 8 ) & 0xFF;
cB = cl_NUM & 0xFF;
} else {
cR = (cl_NUM_main >> 16) & 0xFF;
cG = (cl_NUM_main >> 8 ) & 0xFF;
cB = cl_NUM_main & 0xFF;
}
if (f_dispmode == 0) {
for (xg = D_left; xg <= D_right; xg++) {
for (i = 0; i < yry[xg][3]; i++) {
if (R_GRAM[xg][i] != 0) {
kido = (float)R_GRAM[xg][i] / (float)255.0;
ccR = (int)(kido * (float)cR + (1.0 - kido) * (float)dcR + 0.5);
ccG = (int)(kido * (float)cG + (1.0 - kido) * (float)dcG + 0.5);
ccB = (int)(kido * (float)cB + (1.0 - kido) * (float)dcB + 1.0);
if (ccR > 0xFF) ccR = 0xFF;
if (ccG > 0xFF) ccG = 0xFF;
if (ccB > 0xFF) ccB = 0xFF;
R_GRAM[xg][i] = (unsigned char)ccR;
G_GRAM[xg][i] = (unsigned char)ccG;
B_GRAM[xg][i] = (unsigned char)ccB;
}
}
}
}else{
for (xg = D_left; xg <= D_right; xg++) {
for (i = 0; i < yry[xg][3]; i++) {
if (R_GRAM[Nx - 1 - i][xg] != 0) {
kido = (float)R_GRAM[Nx - 1 - i][xg] / (float)255.0;
ccR = (int)(kido * (float)cR + (1.0 - kido) * (float)dcR + 0.5);
ccG = (int)(kido * (float)cG + (1.0 - kido) * (float)dcG + 0.5);
ccB = (int)(kido * (float)cB + (1.0 - kido) * (float)dcB + 1.0);
if (ccR > 0xFF) ccR = 0xFF;
if (ccG > 0xFF) ccG = 0xFF;
if (ccB > 0xFF) ccB = 0xFF;
R_GRAM[Nx - 1 - i][xg] = (unsigned char)ccR;
G_GRAM[Nx - 1 - i][xg] = (unsigned char)ccG;
B_GRAM[Nx - 1 - i][xg] = (unsigned char)ccB;
}
}
}
}
//----DIAL base-----------------------------------------------------------------------
if (f_dispmode == 0) {
for (xg = D_left; xg <= D_right; xg++) {
yg = yry[xg][0];
for (i = 0; i <= yg; i++) {
if ((R_GRAM[xg][i] == 0) && (G_GRAM[xg][i] == 0) && (B_GRAM[xg][i] == 0))
{
R_GRAM[xg][i] = dcR;
G_GRAM[xg][i] = dcG;
B_GRAM[xg][i] = dcB;
}
}
}
} else {
for (xg = D_left; xg <= D_right; xg++) {
yg = yry[xg][0];
for (i = 0; i <= yg; i++) {
if ((R_GRAM[Nx - 1 - i][xg] == 0) && (G_GRAM[Nx - 1 - i][xg] == 0) && (B_GRAM[Nx - 1 - i][xg] == 0))
{
R_GRAM[Nx - 1 - i][xg] = dcR;
G_GRAM[Nx - 1 - i][xg] = dcG;
B_GRAM[Nx - 1 - i][xg] = dcB;
}
}
}
}
//-- Dial pointer ---------------------------------------------------------------
int ypt = D_height + DP_pos - DP_len;
if (ypt < 0) ypt = 0;
if (f_dispmode == 0) {
for (xg = D_center - (DP_width - 1); xg <= D_center + (DP_width - 1); xg++) {
for (yg = ypt; yg < (D_height + DP_pos); yg++) {
R_GRAM[xg][yg] = (cl_POINTER >> 16) & 0xFF;
G_GRAM[xg][yg] = (cl_POINTER >> 8) & 0xFF;
B_GRAM[xg][yg] = (cl_POINTER) & 0xFF;
}
}
} else {
for (xg = D_center - (DP_width - 1); xg <= D_center + (DP_width - 1); xg++) {
for (yg = ypt; yg < (D_height + DP_pos); yg++) {
R_GRAM[Nx - 1 - yg][xg] = (cl_POINTER >> 16) & 0xFF;
G_GRAM[Nx - 1 - yg][xg] = (cl_POINTER >> 8) & 0xFF;
B_GRAM[Nx - 1 - yg][xg] = (cl_POINTER) & 0xFF;
}
}
}
}
/*---------------------------------------------------------------------------
* End of void Dial(long freq)
---------------------------------------------------------------------------- */
void dot(float x, float y)
{
int xd, yd, xu, yu;
float Rxu, Rxd, Ryu, Ryd;
unsigned int dat;
if(x>0 && y>0)
{
if (f_dispmode == 0) x = x + 0.5 * (float)(tick_width);
else y = y + 0.5 * (float)(tick_width);
xd = (int)x; yd = (int)y;
if ( xd >= 0 && xd < Nx - 1 && yd >= 0 && yd < Ny - 1) {
xu = xd + 1; yu = yd + 1;
Rxd = ( (float)xu - x );
Rxu = ( x - (float)xd );
Ryd = ( (float)yu - y );
Ryu = ( y - (float)yd );
dat = (int)R_GRAM[xd][yd] + (int)(Rxd * Ryd * 256.0);
if (dat > 0xFF) dat = 0xFF;
R_GRAM[xd][yd] = (unsigned char)dat;
dat = (unsigned int)R_GRAM[xu][yd] + (unsigned int)(Rxu * Ryd * 256.0);
if (dat > 0xFF) dat = 0xFF;
R_GRAM[xu][yd] = (unsigned char)dat;
dat = (unsigned int)R_GRAM[xd][yu] + (unsigned int)(Rxd * Ryu * 256.0);
if (dat > 0xFF) dat = 0xFF;
R_GRAM[xd][yu] = (unsigned char)dat;
dat = (unsigned int)R_GRAM[xu][yu] + (unsigned int)(Rxu * Ryu * 256.0);
if (dat > 0xFF) dat = 0xFF;
R_GRAM[xu][yu] = (unsigned char)dat;
}
}
}
/*
void dot(float x, float y)
{
R_GRAM[(int)x][(int)y]=255;
}
*/