1 /*
2  * transline.h - base for a transmission line class definition
3  *
4  * Copyright (C) 2005 Stefan Jahn <stefan@lkcc.org>
5  * Modifications 2018 for Kicad: Jean-Pierre Charras
6  *
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License
9  * as published by the Free Software Foundation; either version 2
10  * of the License, or (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this package; see the file COPYING.  If not, write to
19  * the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor,
20  * Boston, MA 02110-1301, USA.
21  *
22  */
23 
24 #ifndef __TRANSLINE_H
25 #define __TRANSLINE_H
26 
27 #include <gal/color4d.h>
28 
29 #define TRANSLINE_OK 0
30 #define TRANSLINE_WARNING 1
31 #define TRANSLINE_ERROR 2
32 
33 // IDs for lines parameters used in calculation:
34 // (Used to retrieve these parameters from UI.
35 // DUMMY_PRM is used to skip a param line in dialogs. It is not really a parameter
36 enum PRMS_ID
37 {
38     UNKNOWN_ID = -1,
39     EPSILONR_PRM,          // dielectric constant
40     TAND_PRM,              // Dielectric Loss Tangent
41     RHO_PRM,               // Conductivity of conductor
42     H_PRM,                 // height of substrate
43     TWISTEDPAIR_TWIST_PRM, // Twists per length
44     H_T_PRM,
45     STRIPLINE_A_PRM, // Stripline : distance from line to top metal
46     T_PRM,           // thickness of top metal
47     ROUGH_PRM,
48     MUR_PRM, // magnetic permeability of substrate
49     TWISTEDPAIR_EPSILONR_ENV_PRM,
50     MURC_PRM,      // magnetic permeability of conductor
51     FREQUENCY_PRM, // Frequency of operation
52     Z0_PRM,        // characteristic impedance
53     Z0_E_PRM,
54     Z0_O_PRM,
55     ANG_L_PRM, // Electrical length in angle
56     PHYS_WIDTH_PRM,
57     PHYS_DIAM_IN_PRM,  // Inner diameter of cable
58     PHYS_S_PRM,        // width of gap between line and ground
59     PHYS_DIAM_OUT_PRM, // Outer diameter of cable
60     PHYS_LEN_PRM,      // Length of cable
61     DUMMY_PRM
62 };
63 
64 
65 // IDs for lines parameters used in calculation that are not given by the UI
66 enum EXTRA_PRMS_ID
67 {
68     EXTRA_PRMS_START = DUMMY_PRM - 1,
69     SIGMA_PRM,            // Conductivity of the metal
70     SKIN_DEPTH_PRM,       // Skin depth
71     LOSS_DIELECTRIC_PRM,  // Loss in dielectric (dB)
72     LOSS_CONDUCTOR_PRM,   // Loss in conductors (dB)
73     CUTOFF_FREQUENCY_PRM, // Cutoff frequency for higher order modes
74     EPSILON_EFF_PRM,      // Effective dielectric constant
75     EXTRA_PRMS_COUNT,
76 };
77 
78 class TRANSLINE
79 {
80 public:
81     TRANSLINE();
82     virtual ~TRANSLINE();
83 
84     const char* m_Name;
85     void        setProperty( enum PRMS_ID aPrmId, double aValue );
86     double      getProperty( enum PRMS_ID aPrmId );
87 
88 
89     void getProperties();
90     void checkProperties();
91     void setResult( int, double, const char* );
92     void setResult( int, const char* );
93     bool isSelected( enum PRMS_ID aPrmId );
94 
95     void         Init();
96     virtual void synthesize();
calc()97     virtual void calc() {}
98 
99     /**
100      * Computation for analysis
101      */
calcAnalyze()102     virtual void calcAnalyze(){};
103 
104     /**
105      * Computation for synthesis
106      **/
calcSynthesize()107     virtual void calcSynthesize() {}
108 
109     /**
110      * Shows synthesis results and checks for errors / warnings.
111      **/
showAnalyze()112     virtual void showAnalyze() {}
113 
114     /**
115      * Shows analysis results and checks for errors / warnings.
116      **/
showSynthesize()117     virtual void showSynthesize() {}
118 
119     /**
120      * Shows results
121      **/
show_results()122     virtual void   show_results() {}
123 
124     void           analyze();
125 
126     KIGFX::COLOR4D errCol  = KIGFX::COLOR4D( 1, 0.63, 0.63, 1 );
127     KIGFX::COLOR4D warnCol = KIGFX::COLOR4D( 1, 1, 0.57, 1 );
128     KIGFX::COLOR4D okCol   = KIGFX::COLOR4D( 1, 1, 1, 1 );
129 
130 protected:
131     double m_parameters[EXTRA_PRMS_COUNT];
132     double len;         // length of line
133     double er_eff;      // effective dielectric constant
134     double ang_l;       // Electrical length in angle
135 
136     bool   minimizeZ0Error1D( double* );
137     double skin_depth();
138     void   ellipke( double, double&, double& );
139     double ellipk( double );
140     void   setErrorLevel( PRMS_ID, char );
141 };
142 
143 #endif /* __TRANSLINE_H */
144