私は一日中このコードをいじっていますが、私は再び立ち往生しています...事前に感謝します
基本的に、このプログラムは私に問題を与えています、そして以下は私が問題を引き起こしていると私が信じるコードの断片です。基本的に、ユーザーは「現在の温度」を変更でき、上限または下限のしきい値を超えると、「compareLimit」関数が呼び出されます...この関数は、他のさまざまな関数(ビープ音、1行センサーレコードの許可など)を呼び出します。画面に印刷されます)。ただし、以下が私の問題です(より良い方法がある場合はアドバイスしてくださいが、ビープ音を使用する必要があることに注意してください)。
ビープ音はお尻の痛みであり、私の「アラーム」モード全体はビープ音の持続時間を中心に展開します。これは、レポートを印刷するために文字「O」を押すたびに、ビープトリガーの終了と同時にその気まぐれに印刷されることを意味します。どうすればこれを排除できますか?
ユーザーがアラームモードの「whileループ」にいるときでも、コードの最後のブロック(caseステートメント)にアクセスできるようにし、rまたはfを押して変更することで実際にアラームモードを終了できるようにします。温度を上げて、システムを通常の状態に戻します。
void updateDisplay() { clrscr(); HANDLE hConsole; //standard c library call hConsole = GetStdHandle(STD_OUTPUT_HANDLE); //used for output screen buffer to allow for coloured text SetConsoleTextAttribute(hConsole, 2); //sets output screen colour for following text printf("\nCurrent Temperature for channel 1 is %d\n\n", temperatureSensor1Reading); printf("Upper Limit for channel 1 is %d\n\n", getHighLimit(CH1)); printf("Lower Limit for channel 1 is %d\n\n", getLowLimit(CH1)); setCurrentTemperature(CH1,temperatureSensor1Reading);
このコードブロックでは、同じプロジェクト内の他のcppソースファイルから関数を呼び出して、現在の温度と設定された制限の比較を開始します。
comparedLimits1 = compareLimit(CH1);
SetConsoleTextAttribute(hConsole, 14);
if (comparedLimits1 == TRUE) {
printf("please press O to print out a temperature report for channel %i \n \n", selectChannel + 1);
printf("please press P to silence the alarm for channel %i \n \n", selectChannel + 1);
}
while(comparedLimits1 == TRUE) {
activateAlarm(CH1,temperatureSensor1Reading);
comparedLogs1 = sensorLog();
if (comparedLogs1 == TRUE) {
printf("\n Channel %i has registered a temperature of %i \n \n ", selectChannel+1, temperatureSensor1Reading);
}
}
これは、現在の温度を設定された温度制限と比較し、他の関数を呼び出して「ビープ音」を鳴らしたり、ユーザーが1行の「レポート」を印刷できるようにする私の関数です。
temperature_t compareLimit (int channelID)
{
temperature_t limitIsExceeded = FALSE;
if ((temperatureChannel[channelID].currentTemperature > temperatureChannel[channelID].highLimit) | (temperatureChannel[channelID].currentTemperature < temperatureChannel[channelID].lowLimit))
limitIsExceeded = TRUE;
return limitIsExceeded;
}
void activateAlarm(int channelID, temperature_t temperature)
{
int key = 0;
if ((temperatureChannel[channelID].currentTemperature > temperatureChannel[channelID].highLimit) | (temperatureChannel[channelID].currentTemperature < temperatureChannel[channelID].lowLimit))
callBeep();
sensorLog();
if (_kbhit())
key = _getch();
if ((key == 'P') | (key == 'p')) {
silenceBeep();
}
}
void callBeep()
{
Beep(250,2000);
}
void silenceBeep()
{
Beep(0,2000);
}
temperature_t sensorLog()
{
int key = 0;
temperature_t notedLog = FALSE;
if (_kbhit())
key = _getch();
if ((key == 'O') | (key == 'o')) {
notedLog = TRUE;
return notedLog;
}
}
これは、ユーザーが「アラーム」モードのときに操作できるようにしたいコードです。ユーザーが「アラーム」モードから抜け出すには、現在の温度を下げることができる必要があります。これは、以下のケースステートメントから実行できます。
if( _kbhit() ) {
selectedCommand = _getch();
switch(selectedCommand) {
case 'R': //if user input is R
case 'r'://if user input is r
(*temperatureSensorReadings[selectChannel])++;
break; //exits loop
case 'F': //if user input is 'F'
case 'f': //if user input is 'f'
(*temperatureSensorReadings[selectChannel])--;
break; //exits loop