• メインページ
  • データ構造
  • ファイル
  • ファイル一覧
  • グローバル

OpenSSM/extmeter.c

説明を見る。
00001 /**************************************************************************************************
00002     Title           : External Meter
00003     Programmer      : Yosuke FURUSAWA.
00004     Copyright       : Copyright (C) 2010 Yosuke FURUSAWA.
00005     License         : 4-clause BSD License
00006     Since           : 2010/06/19
00007 
00008     Filename        : main.c
00009     Last up date    : 2010/08/10
00010     Kanji-Code      : Shift-JIS
00011     TAB Space       : 4
00012 **************************************************************************************************/
00013 
00014 
00015 /*================================================================================================
00016 ヘッダファイルをインクルード
00017 =================================================================================================*/
00018 #include <p24FJ64GA002.h>
00019 
00020 #include "types.h"
00021 #include "ssm.h"
00022 #include "extmeter.h"
00023 
00024 #include "libdac.h"
00025 
00026 
00027 /*=================================================================================================
00028 マクロ定義
00029 =================================================================================================*/
00030 
00031 
00032 /*=================================================================================================
00033 構造体
00034 =================================================================================================*/
00035 
00036 
00037 /*=================================================================================================
00038 グローバル変数
00039 =================================================================================================*/
00040 EXTMETER_T extmeter;
00041 
00042 
00043 /*=================================================================================================
00044 プロトタイプ宣言
00045 =================================================================================================*/
00046 
00047 
00048 /**************************************************************************************************
00049 初期化
00050 **************************************************************************************************/
00051 void EXTMETER_init(unsigned char target)
00052 {
00053     extmeter.target = target;
00054 
00055     /* extmeter.mapを 2次元配列にする方法もあるが... */
00056     switch(target){
00057     case EXTMETER_SPEED:
00058         extmeter.map[  0 ] =     0;
00059         extmeter.map[  1 ] =    12;
00060         extmeter.map[  2 ] =    24;
00061         extmeter.map[  3 ] =    36;
00062         extmeter.map[  4 ] =    48;
00063         extmeter.map[  5 ] =    60;
00064         extmeter.map[  6 ] =    72;
00065         extmeter.map[  7 ] =    84;
00066         extmeter.map[  8 ] =    96;
00067         extmeter.map[  9 ] =   108;
00068         extmeter.map[ 10 ] =   120;
00069         extmeter.map[ 11 ] =   132;
00070         extmeter.map[ 12 ] =   144;
00071         extmeter.map[ 13 ] =   156;
00072         extmeter.map[ 14 ] =   168;
00073         extmeter.map[ 15 ] =   180;
00074         break;
00075 
00076     case EXTMETER_ENGINE:
00077         extmeter.map[  0 ] =     0;
00078         extmeter.map[  1 ] =   600;
00079         extmeter.map[  2 ] =  1200;
00080         extmeter.map[  3 ] =  2800;
00081         extmeter.map[  4 ] =  3400;
00082         extmeter.map[  5 ] =  4000;
00083         extmeter.map[  6 ] =  4600;
00084         extmeter.map[  7 ] =  5200;
00085         extmeter.map[  8 ] =  5800;
00086         extmeter.map[  9 ] =  6400;
00087         extmeter.map[ 10 ] =  7000;
00088         extmeter.map[ 11 ] =  7600;
00089         extmeter.map[ 12 ] =  8200;
00090         extmeter.map[ 13 ] =  8800;
00091         extmeter.map[ 14 ] =  9400;
00092         extmeter.map[ 15 ] = 10000;
00093         break;
00094 
00095     case EXTMETER_BOOST:
00096         extmeter.map[  0 ] = -1.000;
00097         extmeter.map[  1 ] = -0.900;
00098         extmeter.map[  2 ] = -0.700;
00099         extmeter.map[  3 ] = -0.500;
00100         extmeter.map[  4 ] = -0.300;
00101         extmeter.map[  5 ] = -0.180;
00102         extmeter.map[  6 ] = -0.000;
00103         extmeter.map[  7 ] =  0.200;
00104         extmeter.map[  8 ] =  0.350;
00105         extmeter.map[  9 ] =  0.510;
00106         extmeter.map[ 10 ] =  0.700;
00107         extmeter.map[ 11 ] =  0.900;
00108         extmeter.map[ 12 ] =  1.050;
00109         extmeter.map[ 13 ] =  1.200;
00110         extmeter.map[ 14 ] =  1.400;
00111         extmeter.map[ 15 ] =  1.600;
00112         break;
00113 
00114     case EXTMETER_THROTTLE:
00115         extmeter.map[  0 ] =     00;
00116         extmeter.map[  1 ] =   6.60;
00117         extmeter.map[  2 ] =  13.20;
00118         extmeter.map[  3 ] =  19.80;
00119         extmeter.map[  4 ] =  26.40;
00120         extmeter.map[  5 ] =  33.00;
00121         extmeter.map[  6 ] =  39.60;
00122         extmeter.map[  7 ] =  46.20;
00123         extmeter.map[  8 ] =  52.80;
00124         extmeter.map[  9 ] =  59.40;
00125         extmeter.map[ 10 ] =  66.00;
00126         extmeter.map[ 11 ] =  72.60;
00127         extmeter.map[ 12 ] =  79.20;
00128         extmeter.map[ 13 ] =  85.80;
00129         extmeter.map[ 14 ] =  92.40;
00130         extmeter.map[ 15 ] = 100.00;
00131         break;
00132 
00133     case EXTMETER_COOLANT:
00134     case EXTMETER_INTAKEAIR:
00135     default:
00136         extmeter.map[  0 ] =   -40;
00137         extmeter.map[  1 ] =   -28;
00138         extmeter.map[  2 ] =   -16;
00139         extmeter.map[  3 ] =    -4;
00140         extmeter.map[  4 ] =     8;
00141         extmeter.map[  5 ] =    20;
00142         extmeter.map[  6 ] =    32;
00143         extmeter.map[  7 ] =    44;
00144         extmeter.map[  8 ] =    56;
00145         extmeter.map[  9 ] =    68;
00146         extmeter.map[ 10 ] =    80;
00147         extmeter.map[ 11 ] =    92;
00148         extmeter.map[ 12 ] =   104;
00149         extmeter.map[ 13 ] =   116;
00150         extmeter.map[ 14 ] =   128;
00151         extmeter.map[ 15 ] =   140;
00152         break;
00153     }
00154 
00155     return;
00156 }
00157 
00158 
00159 /**************************************************************************************************
00160 メイン
00161 
00162 高速化する場合、dataをポインタ変数にして data[ extmeter.target ]で対象を選択すると良いが、
00163 そのあとの forループはポインタ変数にしない方が速いかもしれない? 未確認。
00164 **************************************************************************************************/
00165 BOOL EXTMETER_main(void)
00166 {
00167     unsigned int i;
00168     double data;
00169 
00170     /* 出力するデータを選ぶ */
00171     switch(extmeter.target){
00172     case EXTMETER_SETTING:      DAC_setvalue(extmeter.setting); return(TRUE);
00173 
00174     case EXTMETER_SPEED:        data = ssm_data.speed;          break;
00175     case EXTMETER_ENGINE:       data = ssm_data.engine;         break;
00176     case EXTMETER_BOOST:        data = ssm_data.boost;          break;
00177     case EXTMETER_THROTTLE:     data = ssm_data.throttle;       break;
00178     case EXTMETER_COOLANT:      data = ssm_data.coolant;        break;
00179     case EXTMETER_INTAKEAIR:    data = ssm_data.intakeair;      break;
00180     default:                                                    break;
00181     }
00182 
00183 /*
00184     ssm_data.boost += 0.00001;
00185     if(ssm_data.boost > 2.0) ssm_data.boost = -1.1;
00186 */
00187 
00188     /* マップから出力値を選ぶ */
00189     for(i = 1; i < EXTMETER_DIV; i++){
00190         if(extmeter.map[i - 1] <= data && data < extmeter.map[i]){
00191             DAC_setvalue(((i << 4) & 0xf0) | ((unsigned char)(((data - extmeter.map[i - 1]) / (extmeter.map[i] - extmeter.map[i - 1])) * EXTMETER_DIV) & 0x0f));
00192         }
00193     }
00194 
00195 #if 0
00196     /* マップより小さいとき */
00197     if(extmeter.map[0] > data){
00198         DAC_setvalue(0x00);
00199 
00200     /* マップより大きいとき */
00201     } else if (extmeter.map[15] < data){
00202         DAC_setvalue(0xff);
00203 
00204     /* それ以外 */
00205     } else {
00206         /* 探索する */
00207         for(i = 1; i < EXTMETER_DIV; i++){
00208             if(extmeter.map[i - 1] <= data && data < extmeter.map[i]){
00209                 DAC_setvalue((((i - 1) << 4) & 0xf0) | ((unsigned char)(((data - extmeter.map[i - 1]) / (extmeter.map[i] - extmeter.map[i - 1])) * EXTMETER_DIV) & 0x0f));
00210             }
00211         }
00212     }
00213 #endif
00214 
00215     return(TRUE);
00216 }
00217 
00218 

OpenSSMに対してThu Sep 9 2010 00:03:04に生成されました。  doxygen 1.7.1