📄 temp.c
字号:
/* myTemp is used to connect PalmOS PDAs to Dallas Microlan(tm) Devices It currently supports DS1820/DS18S20 Digital Thermometers Copyright (C) 2000 Christof Klaiber This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Christof Klaiber <christof.klaiber@gmx.de> Lachnerstr. 22 76131 Karlsruhe Germany*/#include <PalmOS.h>#include <SerialMgrOld.h>#include "com.h"#include "temp.h"#include "ds1820.h"/* Name: TempConvertTemp Purpose: compute the temperature from the values read from sensor Input: Int16* temp <out> temperature UInt8 scratchPad[kScratchPadLength] the nine values read from the sensor's scratchpad Result: error Name: Christof Klaiber <cklaiber@sourceforge.net> Versions: 11.12.2003 introduced 12.12.2003 error handling*/UInt32 TempConvertTemp(Int16*, UInt8[kScratchPadLength]);UInt32 TempGetTemp(Int16* temp, UInt32* state, UInt16* serialRefNum){ Err err = 0; UInt32 tempErr = tempNoError; UInt8 scratchPad[kScratchPadLength]; switch (*state) { case OpenSerialState: err = SysLibFind("Serial Library", serialRefNum); if(err == sysErrLibNotFound ) { err = SysLibLoad('libr', 'swrp', serialRefNum); } if (err) { tempErr = tempSerErrLibCantLoad; break; } err = SerOpen(*serialRefNum, 0, 115200); if (err) { if(err == serErrAlreadyOpen) { SerClose(*serialRefNum); tempErr = serErrAlreadyOpen; } else { tempErr = tempSerErrCantOpen; } break; } *state = SkipRomForConvState; break; /* falls through */ case SkipRomForConvState: tempErr = DSSkipROM(*serialRefNum); if (tempErr) { break; } case TempConvState: tempErr = DSReadTemperature(*serialRefNum); if (tempErr) { break; } *state = TempConvResetState; break;/* falls through */ case TempConvResetState: tempErr = DSResetTemperature(*serialRefNum); if (tempErr) { break; }/* falls through*/ case SkipRomForReadState: tempErr = DSSkipROM(*serialRefNum); if (tempErr) { break; } case ReadScratchpadState: tempErr = DSReadScratchpad(*serialRefNum, scratchPad); if (tempErr) { break; } tempErr = TempConvertTemp(temp, scratchPad); if (tempErr) { break; } err = SerClose(*serialRefNum); if (err) { tempErr = tempSerErrCantClose; break; } else { *state = TempReadyState; } break; default: break; } if (tempErr && tempErr != tempSerErrCantClose) { err = SerClose(*serialRefNum); if (err) { tempErr = tempSerErrCantClose; } } return tempErr;}UInt32 TempConvertTemp(Int16* temp, UInt8 scratchPad[kScratchPadLength]){ UInt16 hiPrec; if (scratchPad[1] == 0) { *temp = scratchPad[0] >> 1; } else { *temp = -1 * (0x100 - scratchPad[0]) >> 1; } *temp *= 100; *temp -= 25; hiPrec = scratchPad[7] - scratchPad[6]; hiPrec *= 100; if (!scratchPad[7]) { return tempErrConvErr; } hiPrec /= scratchPad[7]; *temp += hiPrec; return tempNoError;}UInt32 TempStopLogging(UInt32* state, UInt16* serialRefNum){ UInt32 tempErr = tempNoError; Err err; if (*state != TempReadyState && *state != OpenSerialState) { err = SerClose(*serialRefNum); if (err) { tempErr = tempSerErrCantClose; } else { *state = OpenSerialState; } } return tempErr;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -