2

私は一日中このコードをいじっていますが、私は再び立ち往生しています...事前に感謝します

基本的に、このプログラムは私に問題を与えています、そして以下は私が問題を引き起こしていると私が信じるコードの断片です。基本的に、ユーザーは「現在の温度」を変更でき、上限または下限のしきい値を超えると、「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
4

1 に答える 1

2

.wavファイルを再生するためにBeep使用する代わりに、フラグを使用してすぐに戻り、非同期でサウンドを再生します。事前定義された値の1つでシステムサウンドの1つを使用することもできます。PlaySoundSND_ASYNC

于 2013-03-25T02:58:28.437 に答える