📄 halmax136xcontrolp.nc
字号:
/* $Id: HalMAX136xControlP.nc,v 1.4 2006/12/12 18:23:06 vlahan Exp $ *//* * Copyright (c) 2005 Arch Rock Corporation * All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of the Arch Rock Corporation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ARCHED * ROCK OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. *//** * * @author Kaisen Lin * @author Phil Buonadonna */#include "MAX136x.h"module HalMAX136xControlP { provides interface HalMAX136xAdvanced; uses interface Resource; uses interface HplMAX136x;}implementation { enum { S_IDLE, S_SETSCANMODE, S_SETMONMODE, S_SETCONVMODE, S_SETCLK, S_SETREF, S_ENALERT, S_GETSTATUS, }; uint8_t state = S_IDLE; uint8_t mI2CBuffer[8]; uint8_t configByteShadow = 0x01; uint8_t setupByteShadow = 0x83; // 0x82 actually, but we want extended monitor write uint8_t monitorByteShadow = 0x0; error_t clientResult; task void alert_Task() { signal HalMAX136xAdvanced.alertThreshold(); } task void signalDone_Task() { switch(state) { case S_SETSCANMODE: state = S_IDLE; call Resource.release(); signal HalMAX136xAdvanced.setScanModeDone(clientResult); break; case S_SETMONMODE: state = S_IDLE; call Resource.release(); signal HalMAX136xAdvanced.setMonitorModeDone(clientResult); break; case S_SETCONVMODE: state = S_IDLE; call Resource.release(); signal HalMAX136xAdvanced.setConversionModeDone(clientResult); break; case S_SETCLK: state = S_IDLE; call Resource.release(); signal HalMAX136xAdvanced.setClockDone(clientResult); break; case S_SETREF: state = S_IDLE; call Resource.release(); signal HalMAX136xAdvanced.setRefDone(clientResult); break; case S_ENALERT: state = S_IDLE; call Resource.release(); signal HalMAX136xAdvanced.enableAlertDone(clientResult); break; case S_GETSTATUS: state = S_IDLE; call Resource.release(); signal HalMAX136xAdvanced.getStatusDone(clientResult, mI2CBuffer[0], 0); break; default: break; } } command error_t HalMAX136xAdvanced.setScanMode(max136x_scanflag_t mode, uint8_t chanlow, uint8_t chanhigh) { // chanlow is always 0 no matter what client says error_t status; if(state != S_IDLE) return FAIL; status = call Resource.immediateRequest(); if(status != SUCCESS) return status; state = S_SETSCANMODE; configByteShadow &= ~(MAX136X_CONFIG_SCAN(0x3) | MAX136X_CONFIG_CS(0xF)); configByteShadow |= MAX136X_CONFIG_SCAN(0x0); configByteShadow |= MAX136X_CONFIG_CS(chanhigh); mI2CBuffer[0] = configByteShadow; call HplMAX136x.setConfig(mI2CBuffer, 1); return SUCCESS; } command error_t HalMAX136xAdvanced.setMonitorMode(uint8_t chanlow, uint8_t chanhigh, max136x_delayflag_t delay, uint8_t thresholds[12]) { // chanlow is always 0 no matter what client says uint8_t i; error_t status; if(state != S_IDLE) return FAIL; status = call Resource.immediateRequest(); if(status != SUCCESS) return status; state = S_SETMONMODE; configByteShadow &= ~(MAX136X_CONFIG_SCAN(0x3) | MAX136X_CONFIG_CS(0xF)); configByteShadow |= MAX136X_CONFIG_SCAN(0x2); configByteShadow |= MAX136X_CONFIG_CS(chanhigh); monitorByteShadow &= ~MAX136X_MONITOR_DELAY(7); monitorByteShadow |= MAX136X_MONITOR_DELAY(delay); mI2CBuffer[0] = configByteShadow; mI2CBuffer[1] = setupByteShadow; mI2CBuffer[2] = monitorByteShadow; for(i = 0; i < 12; i++) mI2CBuffer[i+3] = thresholds[i]; call HplMAX136x.setConfig(mI2CBuffer, 15); return SUCCESS; } command error_t HalMAX136xAdvanced.setConversionMode(bool bDifferential, bool bBipolar) { error_t status; if(state != S_IDLE) return FAIL; status = call Resource.immediateRequest(); if(status != SUCCESS) return status; state = S_SETCONVMODE; if(bDifferential) configByteShadow &= ~MAX136X_CONFIG_SE; else configByteShadow |= MAX136X_CONFIG_SE; if(bBipolar) setupByteShadow |= MAX136X_SETUP_BIP; else setupByteShadow &= ~MAX136X_SETUP_BIP; mI2CBuffer[0] = configByteShadow; mI2CBuffer[1] = setupByteShadow; call HplMAX136x.setConfig(mI2CBuffer, 2); return SUCCESS; } command error_t HalMAX136xAdvanced.setClock(bool bExtClk) { error_t status; if(state != S_IDLE) return FAIL; status = call Resource.immediateRequest(); if(status != SUCCESS) return status; state = S_SETCLK; if(bExtClk) setupByteShadow |= MAX136X_SETUP_EXTCLK; else setupByteShadow &= ~MAX136X_SETUP_EXTCLK; mI2CBuffer[0] = setupByteShadow; call HplMAX136x.setConfig(mI2CBuffer, 1); return SUCCESS; } command error_t HalMAX136xAdvanced.setRef(max136x_selflag_t sel, bool bInRefPwr) { error_t status; if(state != S_IDLE) return FAIL; status = call Resource.immediateRequest(); if(status != SUCCESS) return status; state = S_SETREF; if(bInRefPwr) setupByteShadow |= MAX136X_SETUP_INTREFOFF; else setupByteShadow &= ~MAX136X_SETUP_INTREFOFF; setupByteShadow &= ~MAX136X_SETUP_REFAIN3SEL(3); setupByteShadow |= MAX136X_SETUP_REFAIN3SEL(sel); mI2CBuffer[0] = setupByteShadow; call HplMAX136x.setConfig(mI2CBuffer, 1); return SUCCESS; } command error_t HalMAX136xAdvanced.getStatus() { error_t status; if(state != S_IDLE) return FAIL; status = call Resource.immediateRequest(); if(status != SUCCESS) return status; state = S_GETSTATUS; return call HplMAX136x.readStatus(mI2CBuffer, 2); } command error_t HalMAX136xAdvanced.enableAlert(bool bEnable) { error_t status; if(state != S_IDLE) return FAIL; status = call Resource.immediateRequest(); if(status != SUCCESS) return status; state = S_ENALERT; if(bEnable) monitorByteShadow |= MAX136X_MONITOR_INTEN; else monitorByteShadow &= ~MAX136X_MONITOR_INTEN; mI2CBuffer[0] = setupByteShadow; mI2CBuffer[1] = (0xF0 | monitorByteShadow); call HplMAX136x.setConfig(mI2CBuffer, 2); return SUCCESS; } event void Resource.granted() { // intentionally left blank } async event void HplMAX136x.readStatusDone(error_t error, uint8_t* buf) { clientResult = error; post signalDone_Task(); } async event void HplMAX136x.measureChannelsDone( error_t error, uint8_t *buf, uint8_t len ) { /* intentionally left blank */ } async event void HplMAX136x.setConfigDone( error_t error , uint8_t *cfgbuf, uint8_t len) { clientResult = error; post signalDone_Task(); } async event void HplMAX136x.alertThreshold() { post alert_Task(); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -