Changeset f58793


Ignore:
Timestamp:
01/05/12 14:35:18 (17 months ago)
Author:
Micke Prag <micke.prag@…>
Branches:
('master', 'a231b56d57a69513303d0061f5fa3e3cd51c85c1')('controller-upgrade', '72b31cc86eeeef18f1371a3067b6e8a5ca21abfc')('windows_service_fixes', 'df6bd2788365991d36d5af2a75833b8de2a5860f')
Children:
6fa59e9ca978efd34c2798cd97609d9f956f9bd5
Parents:
265daf4714ea69f99888ef035f64ea240f1115e9
git-author:
Micke Prag <micke.prag@telldus.se>2012-01-05 14:35:18+01:00
git-committer:
Micke Prag <micke.prag@telldus.se>2012-01-05 14:35:18+01:00
Message:

Implement decoding of Oregon 0x1A2D. This closes #144

File:
1 edited

Legend:

Unmodified
Added
Removed
  • telldus-core/service/ProtocolOregon.cpp

    rc03018 rf58793  
    1717        if (model.compare(L"0xEA4C") == 0) { 
    1818                return decodeEA4C(data); 
    19         } else if (model.compare(L"0x1A2D")) { 
     19        } else if (model.compare(L"0x1A2D") == 0) { 
    2020                return decode1A2D(data); 
    2121        } 
     
    7070 
    7171std::string ProtocolOregon::decode1A2D(const std::string &data) { 
    72         //TODO 
    73         return ""; 
     72        uint64_t value = strtol(data.c_str(), NULL, 16); 
     73        uint8_t checksum2 = value & 0xFF; 
     74        value >>= 8; 
     75        uint8_t checksum1 = value & 0xFF; 
     76        value >>= 8; 
     77 
     78        uint8_t checksum = ((value >> 4) & 0xF) + (value & 0xF); 
     79        uint8_t hum1 = value & 0xF; 
     80        value >>= 8; 
     81 
     82        checksum += ((value >> 4) & 0xF) + (value & 0xF); 
     83        uint8_t neg = value & (1 << 3); 
     84        uint8_t hum2 = (value >> 4) & 0xF; 
     85        value >>= 8; 
     86 
     87        checksum += ((value >> 4) & 0xF) + (value & 0xF); 
     88        uint8_t temp2 = value & 0xF; 
     89        uint8_t temp1 = (value >> 4) & 0xF; 
     90        value >>= 8; 
     91 
     92        checksum += ((value >> 4) & 0xF) + (value & 0xF); 
     93        uint8_t temp3 = (value >> 4) & 0xF; 
     94        value >>= 8; 
     95 
     96        checksum += ((value >> 4) & 0xF) + (value & 0xF); 
     97        uint8_t address = value & 0xFF; 
     98        value >>= 8; 
     99 
     100        checksum += ((value >> 4) & 0xF) + (value & 0xF); 
     101        uint8_t channel = (value >> 4) & 0x7; 
     102 
     103        checksum += 0x1 + 0xA + 0x2 + 0xD - 0xA; 
     104 
     105        //TODO: Find out how checksum2 works 
     106        if (checksum != checksum1) { 
     107                return ""; 
     108        } 
     109 
     110        double temperature = ((temp1 * 100) + (temp2 * 10) + temp3)/10.0; 
     111        if (neg) { 
     112                temperature = -temperature; 
     113        } 
     114 
     115        std::stringstream retString; 
     116        retString << "class:sensor;protocol:oregon;model:1A2D;id:" << (int)address 
     117                << ";temp:" << std::fixed << std::setprecision(1) << temperature << ";"; 
     118 
     119        return retString.str(); 
    74120} 
Note: See TracChangeset for help on using the changeset viewer.