This is the device firmware for the controlBoard in the DIY 3D Printable Raspberry Pi Raman Spectrometer. For more information please visit: http://hackaday.io/project/1279
Revision 0:14942e263231, committed 2014-08-15
- Comitter:
- flatcat
- Date:
- Fri Aug 15 10:38:50 2014 +0000
- Commit message:
- http://hackaday.io/project/1279
Changed in this revision
diff -r 000000000000 -r 14942e263231 DS18B20Multiple/DS18B20.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/DS18B20Multiple/DS18B20.cpp Fri Aug 15 10:38:50 2014 +0000 @@ -0,0 +1,103 @@ +/* +* DS18B20. Maxim DS18B20 One-Wire Thermometer. +* Uses the OneWireCRC library. +* +* Copyright (C) <2010> Petras Saduikis <petras@petras.co.uk> +* +* This file is part of OneWireThermometer. +* +* OneWireThermometer 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 3 of the License, or +* (at your option) any later version. +* +* OneWireThermometer 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 OneWireThermometer. If not, see <http://www.gnu.org/licenses/>. +*/ + +#include "DS18B20.h" +//#include "DebugTrace.h" + +//DebugTrace pc_ds18B20(OFF, TO_SERIAL); + +DS18B20::DS18B20( PinName pin) : + OneWireThermometer(pin, DS18B20_ID) +{ +} + +void DS18B20::setResolution(eResolution resln) +{ + // as the write to the configuration register involves a write to the + // high and low alarm bytes, need to read these registers first + // and copy them back on the write + + BYTE read_data[THERMOM_SCRATCHPAD_SIZE]; + BYTE write_data[ALARM_CONFIG_SIZE]; + + if (readAndValidateData(read_data)) + { + // copy alarm and config data to write data + for (int k = 2; k < 5; k++) + { + write_data[k - 2] = read_data[k]; + } + int config = write_data[2]; + config &= 0x9F; + config ^= (resln << 5); + write_data[2] = config; + + resetAndAddress(); + oneWire.writeByte(WRITESCRATCH); + for (int k = 0; k < 3; k++) + { + oneWire.writeByte(write_data[k]); + } + + // remember it so we can use the correct delay in reading the temperature + // for parasitic power + resolution = resln; + } +} + +float DS18B20::calculateTemperature(BYTE* data) +{ + bool signBit = false; + if (data[TEMPERATURE_MSB] & 0x80) signBit = true; + + int read_temp = (data[TEMPERATURE_MSB] << 8) + data[TEMPERATURE_LSB]; + if (signBit) + { + read_temp = (read_temp ^ 0xFFFF) + 1; // two's complement + read_temp *= -1; + } + + int resolution = (data[CONFIG_REG_BYTE] & 0x60) >> 5; // mask off bits 6,5 and move to 1,0 + switch (resolution) + { + case nineBit: // 0.5 deg C increments + read_temp &= 0xFFF8; // bits 2,1,0 are undefined + //pc_ds18B20.traceOut("9 bit resolution ...\r\n"); + break; + case tenBit: // 0.25 deg C increments + read_temp &= 0xFFFC; // bits 1,0 are undefined + //pc_ds18B20.traceOut("10 bit resolution ...\r\n"); + break; + case elevenBit: // 0.125 deg C increments + read_temp &= 0xFFFE; // bit 0 is undefined + //pc_ds18B20.traceOut("11 bit resolution ...\r\n"); + break; + case twelveBit: // 0.0625 deg C increments + //pc_ds18B20.traceOut("12 bit resolution ...\r\n"); + break; + } + float realTemp = (float)read_temp/16 ; + + //pc_ds18B20.traceOut("TEMP_READ/REAL TEMP: %f \r\n", realTemp); + + return realTemp; +} \ No newline at end of file
diff -r 000000000000 -r 14942e263231 DS18B20Multiple/DS18B20.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/DS18B20Multiple/DS18B20.h Fri Aug 15 10:38:50 2014 +0000 @@ -0,0 +1,41 @@ +/* +* DS18B20. Maxim DS18B20 One-Wire Thermometer. +* Uses the OneWireCRC library. +* +* Copyright (C) <2010> Petras Saduikis <petras@petras.co.uk> +* +* This file is part of OneWireThermometer. +* +* OneWireThermometer 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 3 of the License, or +* (at your option) any later version. +* +* OneWireThermometer 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 OneWireThermometer. If not, see <http://www.gnu.org/licenses/>. +*/ + +#ifndef SNATCH59_DS18B20_H +#define SNATCH59_DS18B20_H + +#include "OneWireThermometer.h" +#include "OneWireDefs.h" + +class DS18B20 : public OneWireThermometer +{ +public: + DS18B20( PinName pin); + + virtual void setResolution(eResolution resln); + +protected: + virtual float calculateTemperature(BYTE* data); +}; + + +#endif \ No newline at end of file
diff -r 000000000000 -r 14942e263231 DS18B20Multiple/OneWireCRC.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/DS18B20Multiple/OneWireCRC.cpp Fri Aug 15 10:38:50 2014 +0000 @@ -0,0 +1,459 @@ +/* +* OneWireCRC. This is a port to mbed of Jim Studt's Adruino One Wire +* library. Please see additional copyrights below this one, including +* references to other copyrights. +* +* Copyright (C) <2009> Petras Saduikis <petras@petras.co.uk> +* +* This file is part of OneWireCRC. +* +* OneWireCRC 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 3 of the License, or +* (at your option) any later version. +* +* OneWireCRC 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 OneWireCRC. If not, see <http://www.gnu.org/licenses/>. +*/ +/* +Copyright (c) 2007, Jim Studt + +Updated to work with arduino-0008 and to include skip() as of +2007/07/06. --RJL20 + +Modified to calculate the 8-bit CRC directly, avoiding the need for +the 256-byte lookup table to be loaded in RAM. Tested in arduino-0010 +-- Tom Pollard, Jan 23, 2008 + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Much of the code was inspired by Derek Yerger's code, though I don't +think much of that remains. In any event that was.. + (copyleft) 2006 by Derek Yerger - Free to distribute freely. + +The CRC code was excerpted and inspired by the Dallas Semiconductor +sample code bearing this copyright. +//--------------------------------------------------------------------------- +// Copyright (C) 2000 Dallas Semiconductor Corporation, All Rights Reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL DALLAS SEMICONDUCTOR BE LIABLE FOR ANY CLAIM, DAMAGES +// OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +// +// Except as contained in this notice, the name of Dallas Semiconductor +// shall not be used except as stated in the Dallas Semiconductor +// Branding Policy. +//-------------------------------------------------------------------------- +*/ + +#include "OneWireCRC.h" +#include "OneWireDefs.h" + +// recommended data sheet timings in micro seconds +const int standardT[] = {6, 64, 60, 10, 9, 55, 0, 480, 70, 410}; +const int overdriveT[] = {1.5, 7.5, 7.5, 2.5, 0.75, 7, 2.5, 70, 8.5, 40}; + +OneWireCRC::OneWireCRC(PinName oneWire, eSpeed speed) : oneWirePort(oneWire) +{ + if (STANDARD == speed) timing = standardT; + else timing = overdriveT; // overdrive + + resetSearch(); // reset address search state +} + +// Generate a 1-wire reset, return 1 if no presence detect was found, +// return 0 otherwise. +// (NOTE: does not handle alarm presence from DS2404/DS1994) +int OneWireCRC::reset() +{ + + BYTE result = 0; // sample presence pulse result + + wait_us(timing[6]); + oneWirePort.output(); + oneWirePort = 0; + wait_us(timing[7]); + oneWirePort.input(); + wait_us(timing[8]); + result = !(oneWirePort & 0x01); + wait_us(timing[9]); + + return result; +} + +// +// Write a bit. Port and bit is used to cut lookup time and provide +// more certain timing. +// +void OneWireCRC::writeBit(int bit) +{ + bit = bit & 0x01; + + if (bit) + { + // Write '1' bit + oneWirePort.output(); + oneWirePort = 0; + wait_us(timing[0]); + oneWirePort.input(); + wait_us(timing[1]); + } + else + { + // Write '0' bit + oneWirePort.output(); + oneWirePort = 0; + wait_us(timing[2]); + oneWirePort.input(); + wait_us(timing[3]); + } +} + +// +// Read a bit. Port and bit is used to cut lookup time and provide +// more certain timing. +// +int OneWireCRC::readBit() +{ + BYTE result; + + oneWirePort.output(); + oneWirePort = 0; + wait_us(timing[0]); + oneWirePort.input(); + wait_us(timing[4]); + result = oneWirePort & 0x01; + wait_us(timing[5]); + + return result; +} + +// +// Write a byte. The writing code uses the active drivers to raise the +// pin high, if you need power after the write (e.g. DS18S20 in +// parasite power mode) then set 'power' to 1, otherwise the pin will +// go tri-state at the end of the write to avoid heating in a short or +// other mishap. +// +void OneWireCRC::writeByte(int data) +{ + // Loop to write each bit in the byte, LS-bit first + for (int loop = 0; loop < 8; loop++) + { + writeBit(data & 0x01); + + // shift the data byte for the next bit + data >>= 1; + } +} + +// +// Read a byte +// +int OneWireCRC::readByte() +{ + int result = 0; + + for (int loop = 0; loop < 8; loop++) + { + // shift the result to get it ready for the next bit + result >>= 1; + + // if result is one, then set MS bit + if (readBit()) result |= 0x80; + } + + return result; +} + +int OneWireCRC::touchByte(int data) +{ + int result = 0; + + for (int loop = 0; loop < 8; loop++) + { + // shift the result to get it ready for the next bit + result >>= 1; + + // If sending a '1' then read a bit else write a '0' + if (data & 0x01) + { + if (readBit()) result |= 0x80; + } + else writeBit(0); + + // shift the data byte for the next bit + data >>= 1; + } + + return result; +} + +void OneWireCRC::block(BYTE* data, int data_len) +{ + for (int loop = 0; loop < data_len; loop++) + { + data[loop] = touchByte(data[loop]); + } +} + +int OneWireCRC::overdriveSkip(BYTE* data, int data_len) +{ + // set the speed to 'standard' + timing = standardT; + + // reset all devices + if (reset()) return 0; // if no devices found + + // overdrive skip command + writeByte(OVERDRIVE_SKIP); + + // set the speed to 'overdrive' + timing = overdriveT; + + // do a 1-Wire reset in 'overdrive' and return presence result + return reset(); +} + +// +// Do a ROM select +// +void OneWireCRC::matchROM(BYTE rom[8]) +{ + writeByte(MATCH_ROM); // Choose ROM + + for(int i = 0; i < 8; i++) writeByte(rom[i]); +} + +// +// Do a ROM skip +// +void OneWireCRC::skipROM() +{ + writeByte(SKIP_ROM); // Skip ROM +} + +// +// You need to use this function to start a search again from the beginning. +// You do not need to do it for the first search, though you could. +// +void OneWireCRC::resetSearch() +{ + searchJunction = -1; + searchExhausted = false; + for (int i = 0; i < 8; i++) + { + address[i] = 0; + } +} + +// +// Perform a search. If this function returns a '1' then it has +// enumerated the next device and you may retrieve the ROM from the +// OneWire::address variable. If there are no devices, no further +// devices, or something horrible happens in the middle of the +// enumeration then a 0 is returned. If a new device is found then +// its address is copied to newAddr. Use OneWire::reset_search() to +// start over. +// +BYTE OneWireCRC::search(BYTE* newAddr) +{ + BYTE i; + int lastJunction = -1; + BYTE done = 1; + + if (searchExhausted) return 0; + + if (!reset()) return 0; + + writeByte(SEARCH_ROM); + + for(i = 0; i < 64; i++) + { + BYTE a = readBit( ); + BYTE nota = readBit( ); + BYTE ibyte = i/8; + BYTE ibit = 1 << (i & 7); + + // I don't think this should happen, this means nothing responded, but maybe if + // something vanishes during the search it will come up. + if (a && nota) return 0; + + if (!a && !nota) + { + if (i == searchJunction) + { + // this is our time to decide differently, we went zero last time, go one. + a = 1; + searchJunction = lastJunction; + } + else if (i < searchJunction) + { + // take whatever we took last time, look in address + if (address[ibyte] & ibit) a = 1; + else + { + // Only 0s count as pending junctions, we've already exhasuted the 0 side of 1s + a = 0; + done = 0; + lastJunction = i; + } + } + else + { + // we are blazing new tree, take the 0 + a = 0; + searchJunction = i; + done = 0; + } + lastJunction = i; + } + + if (a) address[ibyte] |= ibit; + else address[ibyte] &= ~ibit; + + writeBit(a); + } + + if (done) searchExhausted = true; + + for (i = 0; i < 8; i++) newAddr[i] = address[i]; + + return 1; +} + +// The 1-Wire CRC scheme is described in Maxim Application Note 27: +// "Understanding and Using Cyclic Redundancy Checks with Maxim iButton Products" +// + +#if ONEWIRE_CRC8_TABLE +// This table comes from Dallas sample code where it is freely reusable, +// though Copyright (C) 2000 Dallas Semiconductor Corporation +static BYTE dscrc_table[] = +{ + 0, 94,188,226, 97, 63,221,131,194,156,126, 32,163,253, 31, 65, + 157,195, 33,127,252,162, 64, 30, 95, 1,227,189, 62, 96,130,220, + 35,125,159,193, 66, 28,254,160,225,191, 93, 3,128,222, 60, 98, + 190,224, 2, 92,223,129, 99, 61,124, 34,192,158, 29, 67,161,255, + 70, 24,250,164, 39,121,155,197,132,218, 56,102,229,187, 89, 7, + 219,133,103, 57,186,228, 6, 88, 25, 71,165,251,120, 38,196,154, + 101, 59,217,135, 4, 90,184,230,167,249, 27, 69,198,152,122, 36, + 248,166, 68, 26,153,199, 37,123, 58,100,134,216, 91, 5,231,185, + 140,210, 48,110,237,179, 81, 15, 78, 16,242,172, 47,113,147,205, + 17, 79,173,243,112, 46,204,146,211,141,111, 49,178,236, 14, 80, + 175,241, 19, 77,206,144,114, 44,109, 51,209,143, 12, 82,176,238, + 50,108,142,208, 83, 13,239,177,240,174, 76, 18,145,207, 45,115, + 202,148,118, 40,171,245, 23, 73, 8, 86,180,234,105, 55,213,139, + 87, 9,235,181, 54,104,138,212,149,203, 41,119,244,170, 72, 22, + 233,183, 85, 11,136,214, 52,106, 43,117,151,201, 74, 20,246,168, + 116, 42,200,150, 21, 75,169,247,182,232, 10, 84,215,137,107, 53}; + +// +// Compute a Dallas Semiconductor 8 bit CRC. These show up in the ROM +// and the registers. (note: this might better be done without the +// table, it would probably be smaller and certainly fast enough +// compared to all those delayMicrosecond() calls. But I got +// confused, so I use this table from the examples.) +// +BYTE OneWireCRC::crc8(BYTE* addr, BYTE len) +{ + BYTE i; + BYTE crc = 0; + + for (i = 0; i < len; i++) + { + crc = dscrc_table[crc ^ addr[i] ]; + } + + return crc; +} +#else +// +// Compute a Dallas Semiconductor 8 bit CRC directly. +// +BYTE OneWireCRC::crc8(BYTE* addr, BYTE len) +{ + BYTE i, j; + BYTE crc = 0; + + for (i = 0; i < len; i++) + { + BYTE inbyte = addr[i]; + for (j = 0; j < 8; j++) + { + BYTE mix = (crc ^ inbyte) & 0x01; + crc >>= 1; + if (mix) crc ^= 0x8C; + inbyte >>= 1; + } + } + + return crc; +} +#endif + +static short oddparity[16] = { 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0 }; + +// +// Compute a Dallas Semiconductor 16 bit CRC. I have never seen one of +// these, but here it is. +// +unsigned short OneWireCRC::crc16(unsigned short* data, unsigned short len) +{ + unsigned short i; + unsigned short crc = 0; + + for ( i = 0; i < len; i++) + { + unsigned short cdata = data[len]; + + cdata = (cdata ^ (crc & 0xff)) & 0xff; + crc >>= 8; + + if (oddparity[cdata & 0xf] ^ oddparity[cdata >> 4]) crc ^= 0xc001; + + cdata <<= 6; + crc ^= cdata; + cdata <<= 1; + crc ^= cdata; + } + + return crc; +} +
diff -r 000000000000 -r 14942e263231 DS18B20Multiple/OneWireCRC.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/DS18B20Multiple/OneWireCRC.h Fri Aug 15 10:38:50 2014 +0000 @@ -0,0 +1,138 @@ +/* +* OneWireCRC. This is a port to mbed of Jim Studt's Adruino One Wire +* library. Please see additional copyrights below this one, including +* references to other copyrights. +* +* Copyright (C) <2009> Petras Saduikis <petras@petras.co.uk> +* +* This file is part of OneWireCRC. +* +* OneWireCRC 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 3 of the License, or +* (at your option) any later version. +* +* OneWireCRC 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 OneWireCRC. If not, see <http://www.gnu.org/licenses/>. +*/ +/* +Copyright (c) 2007, Jim Studt + +Updated to work with arduino-0008 and to include skip() as of +2007/07/06. --RJL20 + +Modified to calculate the 8-bit CRC directly, avoiding the need for +the 256-byte lookup table to be loaded in RAM. Tested in arduino-0010 +-- Tom Pollard, Jan 23, 2008 + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Much of the code was inspired by Derek Yerger's code, though I don't +think much of that remains. In any event that was.. + (copyleft) 2006 by Derek Yerger - Free to distribute freely. + +The CRC code was excerpted and inspired by the Dallas Semiconductor +sample code bearing this copyright. +*/ +//--------------------------------------------------------------------------- +// Copyright (C) 2000 Dallas Semiconductor Corporation, All Rights Reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the "Software"), +// to deal in the Software without restriction, including without limitation +// the rights to use, copy, modify, merge, publish, distribute, sublicense, +// and/or sell copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +// IN NO EVENT SHALL DALLAS SEMICONDUCTOR BE LIABLE FOR ANY CLAIM, DAMAGES +// OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +// +// Except as contained in this notice, the name of Dallas Semiconductor +// shall not be used except as stated in the Dallas Semiconductor +// Branding Policy. +//-------------------------------------------------------------------------- + +#ifndef SNATCH59_ONEWIRECRC_H +#define SNATCH59_ONEWIRECRC_H + +#include <mbed.h> + +// Select the table-lookup method of computing the 8-bit CRC by setting this to 1 +#ifndef ONEWIRE_CRC8_TABLE +#define ONEWIRE_CRC8_TABLE 1 +#endif + +typedef unsigned char BYTE; // used to be uint8_t : something a byte wide, whatever .... + +enum eSpeed {OVERDRIVE, STANDARD}; + +class OneWireCRC +{ +public: + OneWireCRC(PinName oneWire, eSpeed); + + // reset, read, write functions + int reset(); + void writeByte(int data); + int readByte(); + int touchByte(int data); + void block(BYTE* data, int data_len); + int overdriveSkip(BYTE* data, int data_len); + + // address functions + void matchROM(BYTE rom[8]); + void skipROM(); + + // address search functions + void resetSearch(); + BYTE search(BYTE* newAddr); + + // CRC check functions + static BYTE crc8(BYTE* addr, BYTE len); + static unsigned short crc16(unsigned short* data, unsigned short len); + +private: + const int* timing; + + BYTE address[8]; + int searchJunction; // so we can set to it -1 somewhere + bool searchExhausted; + + DigitalInOut oneWirePort; + + // read/write bit functions + void writeBit(int bit); + int readBit(); +}; + +#endif
diff -r 000000000000 -r 14942e263231 DS18B20Multiple/OneWireDefs.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/DS18B20Multiple/OneWireDefs.h Fri Aug 15 10:38:50 2014 +0000 @@ -0,0 +1,66 @@ +/* +* OneWireCRC. This is a port to mbed of Jim Studt's Adruino One Wire +* library. +* +* Copyright (C) <2009> Petras Saduikis <petras@petras.co.uk> +* +* This file is part of OneWireCRC. +* +* OneWireCRC 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 3 of the License, or +* (at your option) any later version. +* +* OneWireCRC 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 OneWireCRC. If not, see <http://www.gnu.org/licenses/>. +*/ + +#ifndef SNATCH59_ONEWIREDEFS_H +#define SNATCH59_ONEWIREDEFS_H + +// device ids +#define DS18B20_ID 0x28 +#define DS18S20_ID 0x10 + +#define ALARM_CONFIG_SIZE 3 +#define THERMOM_SCRATCHPAD_SIZE 9 +#define THERMOM_CRC_BYTE 8 +#define ADDRESS_SIZE 8 +#define ADDRESS_CRC_BYTE 7 + +// One Wire command codes +#define OVERDRIVE_SKIP 0x3C +// ROM commands +#define SEARCH_ROM 0xF0 +#define READ_ROM 0x33 +#define MATCH_ROM 0x55 +#define SKIP_ROM 0xCC +#define ALARM_SEARCH 0xEC +// Functions Commnds +#define CONVERT 0x44 +#define WRITESCRATCH 0x4E +#define READSCRATCH 0xBE +#define COPYSCRATCH 0x48 +#define RECALLE2 0xB8 +#define READPOWERSUPPLY 0xB4 + +// temperature read resolutions +enum eResolution {nineBit = 0, tenBit, elevenBit, twelveBit}; +const int CONVERSION_TIME[] = {94, 188, 375, 750}; // milli-seconds + +// DS18B20/DS18S20 related +#define TEMPERATURE_LSB 0 +#define TEMPERATURE_MSB 1 +#define HIGH_ALARM_BYTE 2 +#define LOW_ALARM_BYTE 3 +#define CONFIG_REG_BYTE 4 +#define CONFIG_READ_END 5 +#define COUNT_REMAIN_BYTE 6 +#define COUNT_PER_DEG_BYTE 7 + +#endif
diff -r 000000000000 -r 14942e263231 DS18B20Multiple/OneWireThermometer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/DS18B20Multiple/OneWireThermometer.cpp Fri Aug 15 10:38:50 2014 +0000 @@ -0,0 +1,154 @@ +/* +* OneWireThermometer. Base class for Maxim One-Wire Thermometers. +* Uses the OneWireCRC library. +* +* Copyright (C) <2010> Petras Saduikis <petras@petras.co.uk> +* +* This file is part of OneWireThermometer. +* +* OneWireThermometer 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 3 of the License, or +* (at your option) any later version. +* +* OneWireThermometer 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 OneWireThermometer. If not, see <http://www.gnu.org/licenses/>. +*/ + +#include "OneWireThermometer.h" +#include "OneWireDefs.h" +//#include "DebugTrace.h" + +//DebugTrace pc(OFF, TO_SERIAL); + +// constructor specifies standard speed for the 1-Wire comms +// Used to have params for CRCon and useAddress, can't see why you wouldn't use CRC and you have to use address since there could be more than one. +OneWireThermometer::OneWireThermometer(PinName pin, int device_id) : + oneWire(pin, STANDARD), deviceId(device_id), resolution(twelveBit) +{ + // NOTE: the power-up resolution of a DS18B20 is 12 bits. The DS18S20's resolution is always + // 9 bits + enhancement, but we treat the DS18S20 as fixed to 12 bits for calculating the + // conversion time Tconv. + deviceCount = 0; +} + +bool OneWireThermometer::initialize() +{ + // get all the device addresses for use in selectROM() when reading the temperature + // pc.traceOut("\r\n"); + //pc.traceOut("New Scan\r\n"); + + oneWire.resetSearch(); + while (oneWire.search(address)) // search for 1-wire device address + { + //pc.traceOut("Address = "); + for (int i = 0; i < ADDRESS_SIZE; i++) + { + //pc.traceOut("%x ", (int)address[i]); + devices[deviceCount][i] = address[i]; + } + //pc.traceOut("\r\n"); + deviceCount++; + } + + if (OneWireCRC::crc8(address, ADDRESS_CRC_BYTE) != address[ADDRESS_CRC_BYTE]) // check address CRC is valid + { + //pc.traceOut("CRC is not valid!\r\n"); + wait(2); + return false; + } + + if (address[0] != deviceId) + { + // Make sure it is a one-wire thermometer device + if (DS18B20_ID == deviceId){} + //pc.traceOut("You need to use a DS1820 or DS18S20 for correct results.\r\n"); + else if (DS18S20_ID == deviceId){} + //pc.traceOut("You need to use a DS18B20 for correct results.\r\n"); + else{} + // pc.traceOut("Device is not a DS18B20/DS1820/DS18S20 device.\r\n"); + + wait(2); + return false; + } + else + { + if (DS18B20_ID == deviceId){} //pc.traceOut("DS18B20 present and correct.\r\n"); + if (DS18S20_ID == deviceId){} //pc.traceOut("DS1820/DS18S20 present and correct.\r\n"); + } + + return true; +} + +// NOTE ON USING SKIP ROM: ok to use before a Convert command to get all +// devices on the bus to do simultaneous temperature conversions. BUT can +// only use before a Read Scratchpad command if there is only one device on the +// bus. For purpose of this library it is assumed there is only one device +// on the bus. +void OneWireThermometer::resetAndAddress() +{ + oneWire.reset(); // reset device + oneWire.matchROM(address); // select which device to talk to +} + +bool OneWireThermometer::readAndValidateData(BYTE* data) +{ + bool dataOk = true; + + resetAndAddress(); + oneWire.writeByte(READSCRATCH); // read Scratchpad + + // pc.traceOut("read = "); + for (int i = 0; i < THERMOM_SCRATCHPAD_SIZE; i++) + { + // we need all bytes which includes CRC check byte + data[i] = oneWire.readByte(); + // pc.traceOut("%x ", (int)data[i]); + } + //pc.traceOut("\r\n"); + + // Check CRC is valid + if (!(OneWireCRC::crc8(data, THERMOM_CRC_BYTE) == data[THERMOM_CRC_BYTE])) + { + // CRC failed + // pc.traceOut("CRC FAILED... \r\n"); + dataOk = false; + } + + return dataOk; +} + +float OneWireThermometer::readTemperature(int device) +{ + BYTE data[THERMOM_SCRATCHPAD_SIZE]; + float realTemp = -999; + + // need to select which device here. + for (int i = 0; i < ADDRESS_SIZE; i++) + { + address[i] = devices[device][i]; + } + + resetAndAddress(); + oneWire.writeByte(CONVERT); // issue Convert command + + // Removed the check for parasitic power, since we waited the same time anyway. + wait_ms(CONVERSION_TIME[resolution]); + + if (readAndValidateData(data)) // issue Read Scratchpad commmand and get data + { + realTemp = calculateTemperature(data); + } + + return realTemp; +} + +int OneWireThermometer::getDeviceCount() +{ + return deviceCount; +} \ No newline at end of file
diff -r 000000000000 -r 14942e263231 DS18B20Multiple/OneWireThermometer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/DS18B20Multiple/OneWireThermometer.h Fri Aug 15 10:38:50 2014 +0000 @@ -0,0 +1,57 @@ +/* +* OneWireThermometer. Base class for Maxim One-Wire Thermometers. +* Uses the OneWireCRC library. +* +* Copyright (C) <2010> Petras Saduikis <petras@petras.co.uk> +* +* This file is part of OneWireThermometer. +* +* OneWireThermometer 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 3 of the License, or +* (at your option) any later version. +* +* OneWireThermometer 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 OneWireThermometer. If not, see <http://www.gnu.org/licenses/>. +*/ + +#ifndef SNATCH59_ONEWIRETHERMOMETER_H +#define SNATCH59_ONEWIRETHERMOMETER_H + +#include <mbed.h> +#include "OneWireCRC.h" +#include "OneWireDefs.h" + +typedef unsigned char BYTE; // something a byte wide +typedef unsigned char DEVADDRESS[8]; // stores the address of one device + +class OneWireThermometer +{ +public: + OneWireThermometer(PinName pin, int device_id); + + bool initialize(); + float readTemperature(int device); + virtual void setResolution(eResolution resln) = 0; + int getDeviceCount(); + +protected: + OneWireCRC oneWire; + const int deviceId; + + eResolution resolution; + BYTE address[8]; + DEVADDRESS devices[10]; + int deviceCount; + + void resetAndAddress(); + bool readAndValidateData(BYTE* data); + virtual float calculateTemperature(BYTE* data) = 0; // device specific +}; + +#endif \ No newline at end of file
diff -r 000000000000 -r 14942e263231 main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Fri Aug 15 10:38:50 2014 +0000 @@ -0,0 +1,601 @@ +#include "mbed.h" +#include "DS18B20.h" +#include "OneWireDefs.h" + +#define THERMOMETER DS18B20 + +#define msg_cuvette_tray 0x10 +#define msg_cuvette_temp 0x11 +#define msg_cuvette_status 0x12 +#define msg_cuvette_tray_pos 0x13 +#define msg_cuvette_pelt_status 0x14 +#define msg_cuvette_stepper 0x15 + +#define msg_filter_wheel 0x20 +#define msg_filter_pos 0x21 + +#define msg_laser_temp 0x30 +#define msg_laser_power_status 0x31 +#define msg_laser_ttl_status 0x32 +#define msg_laser_good_status 0x33 +#define msg_laser_color 0x34 +#define msg_uv_index 0x35 + +#define msg_ccd_pelt_status 0x40 + +#define msg_shutter_servo_pos 0x50 +#define msg_shutter_status 0x51 + +#define msg_board_ID 0x60 +#define msg_board_serial 0x61 +#define msg_board_status 0x62 +#define msg_board_time 0x63 +#define msg_board_model 0x64 +#define msg_board_version 0x65 +#define req_reboot 0x66 + +#define msg_ambient_temp 0x70 +#define req_baro 0x71 +#define req_humidity 0x72 + +#define cmd_cuvette 0xA0 +#define tray_open 0xA1 +#define tray_close 0xA2 +#define cuvette_peltier 0xA3 +#define req_cuvette_status 0xA4 +#define req_cuvette_temp 0xA5 +#define req_cuvette_pelt_status 0xA6 +#define req_cuvette_tray_pos 0xA7 + +#define cmd_filter_wheel 0xB0 +#define filter_select 0xB1 +#define filter_reset 0xB2 +#define req_filter_ID 0xB3 +#define req_filter_status 0xB4 +#define req_filter_count 0xB5 +#define req_filter_pos 0xB6 + +#define cmd_laser 0xC0 +#define laser_power 0xC1 +#define laser_ttl 0xC2 +#define req_laser_good_status 0xC3 +#define req_laser_color 0xC4 +#define req_laser_temp 0xC5 +#define req_uv_index 0xC6 + +#define cmd_ccd_peltier 0xD0 +#define cmd_ccd_pelt_power 0xD1 +#define cmd_cuvette_peltier 0xD2 +#define cmd_cuvette_pelt_power 0xD3 +#define req_pelt_cool 0xD4 +#define req_pelt_heat 0xD5 +#define req_pelt_off 0xD6 + +#define cmd_shutter_servo 0xE0 +#define shutter_open 0xE1 +#define shutter_close 0xE2 +#define shutter_deflect 0xE3 +#define shutter_alternate 0xE4 +#define req_shutter_state 0xE5 +#define req_shutter_status 0xE6 + +#define packet_start 0xF0 +#define packet_ack 0xF1 +#define packet_flag 0xF2 +#define packet_end 0xF3 +#define packet_err 0xF4 +#define cmd_err 0xF5 +#define req_err 0xF6 +#define brd_err 0xF7 + +#define env_err 0x80 +#define cuvette_err 0x81 +#define laser_err 0x82 +#define filter_err 0x83 +#define ccd_pelt_err 0x84 +#define cuvette_pelt_err 0x85 +#define shutter_err 0x86 +#define board_err 0x87 + +DigitalIn button(USER_BUTTON); +DigitalOut grnLED(LED1); +DigitalOut cuvette_IN1(PC_14); +DigitalOut cuvette_IN2(PC_15); +DigitalOut cuvette_IN3(PH_0); +DigitalOut cuvette_IN4(PH_1); +DigitalOut filter_IN1(PA_4); +DigitalOut filter_IN2(PB_0); +DigitalOut filter_IN3(PC_1); +DigitalOut filter_IN4(PC_0); +PwmOut cuvettePeltA(PB_13); // in4 +PwmOut cuvettePeltB(PB_14); // in3 +PwmOut ccdPeltA(PB_1); // in2 +PwmOut ccdPeltB(PB_15); // in1 +AnalogIn peltCurrent(PC_5); + +const int mDelay=1; +double temp; +int z; +int trayOpen; +THERMOMETER device(PC_8); +Serial raspi(USBTX, USBRX); + +typedef union bytes { + double d ; + char c[8]; +} bytes; + +void printDoubleToHex(double d) +{ + bytes b; + b.d = d; + raspi.printf("%f -> %x %x %x %x %x %x %x %x\r\n", b.d, b.c[0], b.c[1], b.c[2], b.c[3], b.c[4], b.c[5], b.c[6], b.c[7]); +} + +void printHexToDouble(char *arr) +{ + bytes b; + for (int i=0; i<8; ++i) + b.c[i] = arr[i]; + raspi.printf("received hex: %x %x %x %x %x %x %x %x \r\n", b.c[0], b.c[1], b.c[2], b.c[3], b.c[4], b.c[5], b.c[6], b.c[7]); + raspi.printf("convert to: %f\r\n", b.d); +} + +void readTemp(int deviceNum) +{ + temp = device.readTemperature(deviceNum); + if (deviceNum == 0) { +// raspi.printf("Cuvette Temperature: %f\r\n", temp); +// const char begin[2]= {packet_flag, packet_start}; +// raspi.printf(begin); + printDoubleToHex(temp); +// const char stop[2]= {packet_flag, packet_end}; +// raspi.printf(stop); + } + if (deviceNum == 1) { +// raspi.printf("Laser Emitter Temperature: %f\r\n", temp); +// const char begin[2]= {packet_flag, packet_start}; +// raspi.printf(begin); + printDoubleToHex(temp); +// const char stop[2]= {packet_flag, packet_end}; +// raspi.printf(stop); + } +// raspi.printf("Device %d is %f",deviceNum, temp); + wait(0.5); +} + +int openTray() +{ + while (z < 500) { + z++; + grnLED = 1; + wait_ms(1); + cuvette_IN1 = 0; + cuvette_IN2= 0; + cuvette_IN3= 0; + cuvette_IN4= 1; + wait_ms(mDelay); + + cuvette_IN1= 0; + cuvette_IN2= 0; + cuvette_IN3= 1; + cuvette_IN4= 1; + wait_ms(mDelay); + + cuvette_IN1= 0; + cuvette_IN2= 0; + cuvette_IN3= 1; + cuvette_IN4= 0; + wait_ms(mDelay); + + cuvette_IN1= 0; + cuvette_IN2= 1; + cuvette_IN3= 1; + cuvette_IN4= 0; + wait_ms(mDelay); + + cuvette_IN1= 0; + cuvette_IN2= 1; + cuvette_IN3= 0; + cuvette_IN4= 0; + wait_ms(mDelay); + + cuvette_IN1= 1; + cuvette_IN2= 1; + cuvette_IN3= 0; + cuvette_IN4= 0; + wait_ms(mDelay); + + cuvette_IN1= 1; + cuvette_IN2= 0; + cuvette_IN3= 0; + cuvette_IN4= 0; + wait_ms(mDelay); + + cuvette_IN1= 1; + cuvette_IN2= 0; + cuvette_IN3= 0; + cuvette_IN4= 1; + wait_ms(mDelay); + + cuvette_IN1= 0; + cuvette_IN2= 0; + cuvette_IN3= 0; + cuvette_IN4= 0; + } + trayOpen = 1; + z = 0; + return(0); +} + +int closeTray() +{ + while (z < 500) { + z++; + grnLED = 1; + wait_ms(1); + cuvette_IN1= 1; + cuvette_IN2= 0; + cuvette_IN3= 0; + cuvette_IN4= 1; + wait_ms(mDelay); + + cuvette_IN1= 1; + cuvette_IN2= 0; + cuvette_IN3= 0; + cuvette_IN4= 0; + wait_ms(mDelay); + + cuvette_IN1= 1; + cuvette_IN2= 1; + cuvette_IN3= 0; + cuvette_IN4= 0; + wait_ms(mDelay); + + cuvette_IN1= 0; + cuvette_IN2= 1; + cuvette_IN3= 0; + cuvette_IN4= 0; + wait_ms(mDelay); + + cuvette_IN1= 0; + cuvette_IN2= 1; + cuvette_IN3= 1; + cuvette_IN4= 0; + wait_ms(mDelay); + + cuvette_IN1= 0; + cuvette_IN2= 0; + cuvette_IN3= 1; + cuvette_IN4= 0; + wait_ms(mDelay); + + cuvette_IN1= 0; + cuvette_IN2= 0; + cuvette_IN3= 1; + cuvette_IN4= 1; + wait_ms(mDelay); + + cuvette_IN1= 0; + cuvette_IN2= 0; + cuvette_IN3= 0; + cuvette_IN4= 1; + wait_ms(mDelay); + + cuvette_IN1= 0; + cuvette_IN2= 0; + cuvette_IN3= 0; + cuvette_IN4= 0; + } + trayOpen = 0; + z = 0; + return(0); +} + +int filterForward() +{ + while (z < 500) { + z++; + grnLED = 1; + wait_ms(1); + filter_IN1 = 0; + filter_IN2= 0; + filter_IN3= 0; + filter_IN4= 1; + wait_ms(mDelay); + + filter_IN1= 0; + filter_IN2= 0; + filter_IN3= 1; + filter_IN4= 1; + wait_ms(mDelay); + + filter_IN1= 0; + filter_IN2= 0; + filter_IN3= 1; + filter_IN4= 0; + wait_ms(mDelay); + + filter_IN1= 0; + filter_IN2= 1; + filter_IN3= 1; + filter_IN4= 0; + wait_ms(mDelay); + + filter_IN1= 0; + filter_IN2= 1; + filter_IN3= 0; + filter_IN4= 0; + wait_ms(mDelay); + + filter_IN1= 1; + filter_IN2= 1; + filter_IN3= 0; + filter_IN4= 0; + wait_ms(mDelay); + + filter_IN1= 1; + filter_IN2= 0; + filter_IN3= 0; + filter_IN4= 0; + wait_ms(mDelay); + + filter_IN1= 1; + filter_IN2= 0; + filter_IN3= 0; + filter_IN4= 1; + wait_ms(mDelay); + + filter_IN1= 0; + filter_IN2= 0; + filter_IN3= 0; + filter_IN4= 0; + } + z = 0; + return(0); +} +int filterBack() +{ + while (z < 500) { + z++; + grnLED = 0; + wait_ms(1); + filter_IN1= 1; + filter_IN2= 0; + filter_IN3= 0; + filter_IN4= 1; + wait_ms(mDelay); + + filter_IN1= 1; + filter_IN2= 0; + filter_IN3= 0; + filter_IN4= 0; + wait_ms(mDelay); + + filter_IN1= 1; + filter_IN2= 1; + filter_IN3= 0; + filter_IN4= 0; + wait_ms(mDelay); + + filter_IN1= 0; + filter_IN2= 1; + filter_IN3= 0; + filter_IN4= 0; + wait_ms(mDelay); + + filter_IN1= 0; + filter_IN2= 1; + filter_IN3= 1; + filter_IN4= 0; + wait_ms(mDelay); + + filter_IN1= 0; + filter_IN2= 0; + filter_IN3= 1; + filter_IN4= 0; + wait_ms(mDelay); + + filter_IN1= 0; + filter_IN2= 0; + filter_IN3= 1; + filter_IN4= 1; + wait_ms(mDelay); + + filter_IN1= 0; + filter_IN2= 0; + filter_IN3= 0; + filter_IN4= 1; + wait_ms(mDelay); + + filter_IN1= 0; + filter_IN2= 0; + filter_IN3= 0; + filter_IN4= 0; + } + z = 0; + return(0); +} + +int cuvettePeltCycle(){ + cuvettePeltA = 0; + cuvettePeltB = 0; + wait(3); + cuvettePeltA = 1; + cuvettePeltB = 1; + wait(3); + cuvettePeltA = 1; + cuvettePeltB = 0; + wait(3); + cuvettePeltA = 0; + cuvettePeltB = 1; + wait(3); + cuvettePeltA = 0; + cuvettePeltB = 0; + return 0; +} + +int err; +char* command; +int packetFlag = 0; +int main() +{ + trayOpen = 0; + raspi.baud(921600); + + cuvettePeltCycle(); + + wait(10); +// raspi.printf("meridianScientific_ramanSpectrometer_controlBoard_V0\r\n"); + + while (!device.initialize()); // keep calling until it works + + int deviceCount = device.getDeviceCount(); +// raspi.printf("Located %d sensors\n\r",deviceCount); + + z = 0; + device.setResolution(twelveBit); + while(1) { +// for (int i = 0; i < deviceCount; i++) { +// readTemp(i); +// } + if (raspi.readable()) { // check if serial port is reaadable + switch (raspi.getc()) { // retrieve a character from serial + case packet_start: // case for packet start flag + switch (raspi.getc()) { // set condition for listening to another character + case packet_flag: // case for packet flag + packetFlag = 1; // turn the flag on + while (packetFlag == 1) { // start a loop that runs while the flag is on + switch (raspi.getc()) { // set another condition for listening to another character + case cmd_laser: // case for cmd_laser + grnLED = 1; // turn the led on + raspi.printf("%x", cmd_laser); // return cmd_laser to the raspi + switch (raspi.getc()) { // set another condition for listening to another character + case req_laser_temp: // case for req_laser_temp + raspi.printf("%x\r\n", req_laser_temp); // return req_laser_temp to the raspi + readTemp(0); // read the temperature for device 0 which is the laser temp sensor + grnLED = 0; // turn led off + continue; // continue through loop + default: // default if nothing matches + break; // break from loop + } + case cmd_cuvette: // case for cmd_cuvette + grnLED = 1; // turn led on + raspi.printf("%x", cmd_cuvette); // return cmd_cuvette to raspi + switch (raspi.getc()) { // set condition for listening to another character + case req_cuvette_temp: // case for req_cuvette_temp + raspi.printf("%x\r\n", req_cuvette_temp); // return req_cuvette_temp to raspi + readTemp(1); // read the temperature for device 1 which is the cuvette temp sensor + grnLED = 0; // turn the led off + continue; // continue through the loop + case tray_open: // case for tray_open + raspi.printf("%x\r\n", tray_open); // return tray_open to raspi + if (trayOpen == 0) { // check to see if the tray is closed + openTray(); // if not, open tray + } else { // otherwise + raspi.printf("%x\r\n", cuvette_err); // send a cuvette error to the raspi + } + grnLED = 0; // turn led off + continue; // continue through the loop + case tray_close: // case for tray close + raspi.printf("%x\r\n", tray_close); // return tray_close to raspi + if (trayOpen == 1) { // check to see if tray is open + closeTray(); // if not, close tray + } else { // otherwise + raspi.printf("%x\r\n", cuvette_err); // send a cuvette error to the raspi + } + grnLED = 0; // turn led off + continue; // continue through loop + default: // default if nothing matches + break; // break from loop + } + case cmd_filter_wheel: // case for cmd_filter_wheel + grnLED = 1; // turn led on + raspi.printf("%x", cmd_filter_wheel); // return cmd_filter_wheel to raspi + switch (raspi.getc()) { // set condidition for listening to another character + case filter_select: // case for filter_select + raspi.printf("%x\r\n", filter_select); // return filter_select to raspi + filterForward(); // move filter wheel forward one filter + filterBack(); // move filter wheel reverse one filter (this is just to test the commands) + grnLED = 0; // turn led off + continue; // continue through loop + default: // default if nothing matches + break; // break from loop + } + case cmd_cuvette_peltier: + grnLED = 1; // turn led on + raspi.printf("%x", cmd_cuvette_peltier); // return cmd_ccd_peltier to raspi + switch (raspi.getc()) { // set condidition for listening to another character + case cmd_cuvette_pelt_power: + switch (raspi.getc()) { // set condidition for listening to another character + case 0x00: // case for cmd_ccd_peltier OFF + raspi.printf("%x\r\n", cmd_cuvette_pelt_power); // return filter_select to raspi + cuvettePeltA = 0; // set PWM A to zero + cuvettePeltB = 0; // set PWM B to zero + grnLED = 0; // turn led off + break; + case 0x01: // case for cmd_cuvette_peltier COOL + raspi.printf("%x\r\n", cmd_cuvette_pelt_power); // return filter_select to raspi + cuvettePeltA = 0.5; // set PWM A to 0.5 + cuvettePeltB = 0; // set PWM B to zero + grnLED = 0; // turn led off + break; + case 0x02: // case for cmd_cuvette_peltier HEAT + raspi.printf("%x\r\n", cmd_cuvette_pelt_power); // return filter_select to raspi + cuvettePeltA = 0; // set PWM A to 0.5 + cuvettePeltB = 0.5; // set PWM B to zero + grnLED = 0; // turn led off + break; + default: + break; + } + continue; + default: + break; + } + case cmd_ccd_peltier: + grnLED = 1; // turn led on + raspi.printf("%x", cmd_ccd_peltier); // return cmd_ccd_peltier to raspi + switch (raspi.getc()) { // set condidition for listening to another character + case cmd_ccd_pelt_power: + switch (raspi.getc()) { // set condidition for listening to another character + case 0x00: // case for cmd_ccd_peltier OFF + raspi.printf("%x\r\n", cmd_ccd_pelt_power); // return filter_select to raspi + ccdPeltA = 0; // set PWM A to zero + ccdPeltB = 0; // set PWM B to zero + grnLED = 0; // turn led off + break; + case 0x01: // case for cmd_ccd_peltier COOL + raspi.printf("%x\r\n", cmd_ccd_pelt_power); // return filter_select to raspi + ccdPeltA = 0.5; // set PWM A to 0.5 + ccdPeltB = 0; // set PWM B to zero + grnLED = 0; // turn led off + break; + case 0x02: // case for cmd_ccd_peltier HEAT + raspi.printf("%x\r\n", cmd_ccd_pelt_power); // return filter_select to raspi + ccdPeltA = 0; // set PWM A to 0.5 + ccdPeltB = 0.5; // set PWM B to zero + grnLED = 0; // turn led off + break; + default: + break; + } + continue; + default: + break; + } case packet_end: // case for packed_end + packetFlag = 0; // set the packetFlag to 0 + break; // break from loop + default: // default if nothing matches + break; // break from loop + } + } + default: // defailt if nothing matches + break; // break from loop + } + default: // default if nothing matches + break; // break from loop + } + } + } +}
diff -r 000000000000 -r 14942e263231 mbed.bld --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Fri Aug 15 10:38:50 2014 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed/builds/04dd9b1680ae \ No newline at end of file