Version FC
Dependencies: DmTftLibrary eeprom SX1280Lib filesystem mbed
Fork of MSNV2-Terminal_V1-5 by
COMPONENTS/generic_component.hpp@41:5a436163dddf, 2018-10-22 (annotated)
- Committer:
- FCH_31
- Date:
- Mon Oct 22 09:37:50 2018 +0000
- Revision:
- 41:5a436163dddf
- Parent:
- 32:3bef9b81f639
avec radio;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
lo | 31:2b8b98f3feed | 1 | /* |
lo | 31:2b8b98f3feed | 2 | * generic_component.hpp |
lo | 31:2b8b98f3feed | 3 | * |
lo | 31:2b8b98f3feed | 4 | * Created on: 18 sept. 2018 |
lo | 31:2b8b98f3feed | 5 | * Author: hoel |
lo | 31:2b8b98f3feed | 6 | */ |
lo | 31:2b8b98f3feed | 7 | |
lo | 31:2b8b98f3feed | 8 | #ifndef COMPONENTS_GENERIC_COMPONENT_HPP_ |
lo | 31:2b8b98f3feed | 9 | #define COMPONENTS_GENERIC_COMPONENT_HPP_ |
lo | 31:2b8b98f3feed | 10 | |
lo | 31:2b8b98f3feed | 11 | #include <iostream> |
lo | 31:2b8b98f3feed | 12 | #include <cstdlib> |
lo | 31:2b8b98f3feed | 13 | #include "mbed.h" |
lo | 31:2b8b98f3feed | 14 | #include "Context.h" |
lo | 31:2b8b98f3feed | 15 | #include "Service.hpp" |
lo | 31:2b8b98f3feed | 16 | #include "Component.hpp" |
lo | 31:2b8b98f3feed | 17 | |
lo | 31:2b8b98f3feed | 18 | using namespace std; |
lo | 31:2b8b98f3feed | 19 | using namespace misnet; |
lo | 31:2b8b98f3feed | 20 | |
lo | 31:2b8b98f3feed | 21 | typedef union{ |
lo | 31:2b8b98f3feed | 22 | float val; |
lo | 31:2b8b98f3feed | 23 | char bytes[4]; |
lo | 31:2b8b98f3feed | 24 | } FLOATUNION_t; |
lo | 32:3bef9b81f639 | 25 | typedef union{ |
lo | 32:3bef9b81f639 | 26 | double val; |
lo | 32:3bef9b81f639 | 27 | char bytes[8]; |
lo | 32:3bef9b81f639 | 28 | } DOUBLEUNION_t; |
lo | 31:2b8b98f3feed | 29 | |
lo | 31:2b8b98f3feed | 30 | class generic_component : public Component{ |
lo | 31:2b8b98f3feed | 31 | |
lo | 31:2b8b98f3feed | 32 | public: |
lo | 31:2b8b98f3feed | 33 | generic_component(COMPONENT_ID id, vector<Service*>& services,PinName sda, PinName scl, char slave_adr): |
lo | 31:2b8b98f3feed | 34 | |
lo | 31:2b8b98f3feed | 35 | i2c_p(new I2C(sda, scl)), |
lo | 31:2b8b98f3feed | 36 | i2c(*i2c_p), |
lo | 31:2b8b98f3feed | 37 | address(slave_adr) |
lo | 31:2b8b98f3feed | 38 | { |
lo | 31:2b8b98f3feed | 39 | i2c.frequency(100000); |
lo | 31:2b8b98f3feed | 40 | } |
lo | 31:2b8b98f3feed | 41 | ~generic_component(); |
lo | 31:2b8b98f3feed | 42 | void init(void){ |
lo | 31:2b8b98f3feed | 43 | |
lo | 31:2b8b98f3feed | 44 | } |
lo | 31:2b8b98f3feed | 45 | void readValues(void){ |
lo | 31:2b8b98f3feed | 46 | for (std::vector<misnet::Service*>::iterator |
lo | 31:2b8b98f3feed | 47 | srvIt = this->getServices().begin(); |
lo | 31:2b8b98f3feed | 48 | srvIt != this->getServices().end(); |
lo | 31:2b8b98f3feed | 49 | srvIt++) { |
lo | 31:2b8b98f3feed | 50 | (*srvIt)->readValue(); |
lo | 31:2b8b98f3feed | 51 | } |
lo | 32:3bef9b81f639 | 52 | } |
lo | 31:2b8b98f3feed | 53 | InterruptIn interrupt(D9); |
lo | 31:2b8b98f3feed | 54 | |
lo | 31:2b8b98f3feed | 55 | private: |
lo | 31:2b8b98f3feed | 56 | I2C *i2c_p; |
lo | 31:2b8b98f3feed | 57 | I2C &i2c; |
lo | 31:2b8b98f3feed | 58 | char address; |
lo | 31:2b8b98f3feed | 59 | |
lo | 31:2b8b98f3feed | 60 | class generic_value : public Service{ |
lo | 26:271d2d510f6c | 61 | |
lo | 31:2b8b98f3feed | 62 | public: |
lo | 31:2b8b98f3feed | 63 | generic_value( |
lo | 31:2b8b98f3feed | 64 | DEVICE_TYPE type, |
lo | 31:2b8b98f3feed | 65 | MISNET_CODE misnet_code, |
lo | 31:2b8b98f3feed | 66 | STATE state, |
lo | 31:2b8b98f3feed | 67 | ACCESS_TYPE access_type, |
lo | 31:2b8b98f3feed | 68 | REQUEST_MODE request_mode, |
lo | 31:2b8b98f3feed | 69 | UP_MODE up_mode, |
lo | 31:2b8b98f3feed | 70 | ACCESS_PIN access_pins[6], |
lo | 31:2b8b98f3feed | 71 | uint32_t subsample_rate, |
lo | 31:2b8b98f3feed | 72 | ACTION action, |
lo | 31:2b8b98f3feed | 73 | OUTPUT_MODE output_mode, |
lo | 31:2b8b98f3feed | 74 | string comment, |
lo | 31:2b8b98f3feed | 75 | generic_component* parent |
lo | 32:3bef9b81f639 | 76 | ) : |
lo | 32:3bef9b81f639 | 77 | Service(type, misnet_code, state, access_type, request_mode, |
lo | 32:3bef9b81f639 | 78 | up_mode, access_pins, subsample_rate, action, output_mode, comment) |
lo | 31:2b8b98f3feed | 79 | { |
lo | 31:2b8b98f3feed | 80 | this->parent = parent; |
lo | 31:2b8b98f3feed | 81 | } |
lo | 31:2b8b98f3feed | 82 | virtual ~generic_value() {} |
lo | 32:3bef9b81f639 | 83 | bool readValue(void){ |
lo | 31:2b8b98f3feed | 84 | |
lo | 31:2b8b98f3feed | 85 | FLOATUNION_t flt; |
lo | 31:2b8b98f3feed | 86 | char bfr[8]; |
lo | 31:2b8b98f3feed | 87 | |
lo | 31:2b8b98f3feed | 88 | bfr[0] = this->getMisnetCode(); // service code |
lo | 32:3bef9b81f639 | 89 | // TODO handle async calls |
lo | 32:3bef9b81f639 | 90 | //switch(this.CALL_TYPE){ |
lo | 32:3bef9b81f639 | 91 | // case SYNC: bfr[1] = 0x01; break; |
lo | 32:3bef9b81f639 | 92 | // case ASYNC: bfr[1] = 0x02; break; |
lo | 32:3bef9b81f639 | 93 | //} |
lo | 32:3bef9b81f639 | 94 | bfr[1] = 0x01; |
lo | 31:2b8b98f3feed | 95 | i2c.write(address, bfr, 2, false); |
lo | 32:3bef9b81f639 | 96 | // switch(this.CALL_TYPE){ |
lo | 32:3bef9b81f639 | 97 | // case SYNC: |
lo | 32:3bef9b81f639 | 98 | // switch(this->getValueAddress().VALUE_TYPE){ |
lo | 32:3bef9b81f639 | 99 | // case Value::NOT_SET : break; |
lo | 32:3bef9b81f639 | 100 | // case Value::BOOLEAN : break; |
lo | 32:3bef9b81f639 | 101 | // case Value::CHAR : break; |
lo | 32:3bef9b81f639 | 102 | // case Value::UINT8_T : break; |
lo | 32:3bef9b81f639 | 103 | // case Value::INT8_T : break; |
lo | 32:3bef9b81f639 | 104 | // case Value::UINT16_T : break; |
lo | 32:3bef9b81f639 | 105 | // case Value::INT16_T : break; |
lo | 32:3bef9b81f639 | 106 | // case Value::UINT32_T : break; |
lo | 32:3bef9b81f639 | 107 | // case Value::INT32_T : break; |
lo | 32:3bef9b81f639 | 108 | // case Value::FLOAT : i2c.read(address, &flt.bytes[0], 4); this->getValueAddress().setFloatValue(flt.val); break; // 32 bits |
lo | 32:3bef9b81f639 | 109 | // case Value::DOUBLE : break; // 64 bits |
lo | 32:3bef9b81f639 | 110 | // case Value::TIME : break; // unix time |
lo | 32:3bef9b81f639 | 111 | // } |
lo | 32:3bef9b81f639 | 112 | // break; |
lo | 32:3bef9b81f639 | 113 | // case ASYNC: break; |
lo | 32:3bef9b81f639 | 114 | // } |
lo | 31:2b8b98f3feed | 115 | i2c.read(address, &flt.bytes[0], 4); |
lo | 32:3bef9b81f639 | 116 | this->getValueAddress().setFloatValue(flt.val); |
lo | 32:3bef9b81f639 | 117 | this->savePreviousValue(); |
lo | 31:2b8b98f3feed | 118 | DEBUG("received from I2C : %3f - 0x%02x 0x%02x 0x%02x 0x%02x\n",flt.val, flt.bytes[0],flt.bytes[1],flt.bytes[2],flt.bytes[3]); |
lo | 32:3bef9b81f639 | 119 | return false; |
lo | 31:2b8b98f3feed | 120 | } |
lo | 31:2b8b98f3feed | 121 | bool setIrqParams(Service* service, Value threshold, Value up, Value down ){ |
lo | 31:2b8b98f3feed | 122 | |
lo | 31:2b8b98f3feed | 123 | char bfr[16]; |
lo | 31:2b8b98f3feed | 124 | misnet::Value val; |
lo | 31:2b8b98f3feed | 125 | FLOATUNION_t flt; |
lo | 31:2b8b98f3feed | 126 | |
lo | 31:2b8b98f3feed | 127 | bfr[0] = service->getMisnetCode(); // service code |
lo | 31:2b8b98f3feed | 128 | bfr[1] = 0x02; // threshold cmd |
lo | 31:2b8b98f3feed | 129 | i2c.write(address, bfr, 2, false); |
lo | 31:2b8b98f3feed | 130 | flt.val = threshold.getFloatValue(); |
lo | 31:2b8b98f3feed | 131 | i2c.write(address, flt.bytes, 4, false); |
lo | 31:2b8b98f3feed | 132 | bfr[0] = 0x03; // value up cmd |
lo | 31:2b8b98f3feed | 133 | i2c.write(address, bfr, 1, false); |
lo | 31:2b8b98f3feed | 134 | i2c.write(address, flt.bytes, 4, false); |
lo | 31:2b8b98f3feed | 135 | bfr[0] = 0x04; // value down cmd |
lo | 31:2b8b98f3feed | 136 | i2c.write(address, bfr, 1, false); |
lo | 31:2b8b98f3feed | 137 | i2c.write(address, flt.bytes, 4, true); |
lo | 31:2b8b98f3feed | 138 | //i2c.read(address, bfr[0], 1); // ack |
lo | 31:2b8b98f3feed | 139 | //if (bfr[0] = 0x11) return 0 |
lo | 31:2b8b98f3feed | 140 | //else return 1; |
lo | 31:2b8b98f3feed | 141 | return 0; |
lo | 31:2b8b98f3feed | 142 | } |
lo | 31:2b8b98f3feed | 143 | void setIrq(Callback <void()> cbck, bool enable){ |
lo | 31:2b8b98f3feed | 144 | |
lo | 31:2b8b98f3feed | 145 | //parent->interrupt.rise(cbck); |
lo | 31:2b8b98f3feed | 146 | //if (enable) parent->interrupt.enable_irq(); |
lo | 31:2b8b98f3feed | 147 | //else parent->interrupt.disable_irq(); |
lo | 31:2b8b98f3feed | 148 | } |
lo | 31:2b8b98f3feed | 149 | private: |
lo | 31:2b8b98f3feed | 150 | generic_component *parent; |
lo | 32:3bef9b81f639 | 151 | Timeout reader; |
lo | 31:2b8b98f3feed | 152 | }; |
lo | 31:2b8b98f3feed | 153 | }; |
lo | 31:2b8b98f3feed | 154 | |
lo | 31:2b8b98f3feed | 155 | #endif /* COMPONENTS_GENERIC_COMPONENT_HPP_ */ |