Taylor Street / AkmSensor

Fork of AkmSensor by AKM Development Platform

Committer:
masahikofukasawa
Date:
Fri May 06 17:51:15 2016 +0000
Revision:
3:a817a3b3e9ae
Parent:
1:b46b8653331f
Child:
7:e269411568c9
Modified for IR interrupt

Who changed what in which revision?

UserRevisionLine numberNew contents of line
masahikofukasawa 0:7a00359e701e 1 #include "akmirsensor.h"
masahikofukasawa 0:7a00359e701e 2 #include "debug.h"
masahikofukasawa 0:7a00359e701e 3
masahikofukasawa 1:b46b8653331f 4 #define CONV16I(high,low) ((int16_t)(((high) << 8) | (low)))
masahikofukasawa 1:b46b8653331f 5
masahikofukasawa 0:7a00359e701e 6 /**
masahikofukasawa 0:7a00359e701e 7 * Constructor.
masahikofukasawa 0:7a00359e701e 8 *
masahikofukasawa 0:7a00359e701e 9 */
masahikofukasawa 0:7a00359e701e 10 AkmIrSensor::AkmIrSensor(){
masahikofukasawa 0:7a00359e701e 11 ak9750 = NULL;
masahikofukasawa 0:7a00359e701e 12 event = false;
masahikofukasawa 1:b46b8653331f 13 interrupt = NULL;
masahikofukasawa 0:7a00359e701e 14 }
masahikofukasawa 0:7a00359e701e 15
masahikofukasawa 0:7a00359e701e 16 /**
masahikofukasawa 0:7a00359e701e 17 * Destructor.
masahikofukasawa 0:7a00359e701e 18 *
masahikofukasawa 0:7a00359e701e 19 */
masahikofukasawa 0:7a00359e701e 20 AkmIrSensor::~AkmIrSensor(){
masahikofukasawa 0:7a00359e701e 21 if (ak9750) delete ak9750;
masahikofukasawa 1:b46b8653331f 22 if (interrupt) delete interrupt;
masahikofukasawa 0:7a00359e701e 23 }
masahikofukasawa 0:7a00359e701e 24
masahikofukasawa 0:7a00359e701e 25 AkmSensor::Status AkmIrSensor::init(const uint8_t id, const uint8_t subid){
masahikofukasawa 0:7a00359e701e 26 primaryId = id;
masahikofukasawa 0:7a00359e701e 27 subId = subid;
masahikofukasawa 0:7a00359e701e 28
masahikofukasawa 1:b46b8653331f 29 interrupt = new InterruptIn(DRDY);
masahikofukasawa 1:b46b8653331f 30
masahikofukasawa 0:7a00359e701e 31 I2C* i2c = new I2C(I2C_SDA,I2C_SCL);
masahikofukasawa 0:7a00359e701e 32 i2c->frequency(I2C_SPEED_100KHZ);
masahikofukasawa 0:7a00359e701e 33
masahikofukasawa 0:7a00359e701e 34 if(subId == SUB_ID_AK9750){
masahikofukasawa 1:b46b8653331f 35 ak9750 = new AK9750();
masahikofukasawa 0:7a00359e701e 36 }
masahikofukasawa 0:7a00359e701e 37 else{
masahikofukasawa 0:7a00359e701e 38 return AkmSensor::ERROR;
masahikofukasawa 0:7a00359e701e 39 }
masahikofukasawa 0:7a00359e701e 40
masahikofukasawa 1:b46b8653331f 41 bool foundSensor = false;
masahikofukasawa 1:b46b8653331f 42
masahikofukasawa 1:b46b8653331f 43 AK9750::SlaveAddress slaveAddr[]
masahikofukasawa 1:b46b8653331f 44 = { AK9750::SLAVE_ADDR_1,
masahikofukasawa 1:b46b8653331f 45 AK9750::SLAVE_ADDR_2,
masahikofukasawa 1:b46b8653331f 46 AK9750::SLAVE_ADDR_3};
masahikofukasawa 1:b46b8653331f 47
masahikofukasawa 1:b46b8653331f 48 for(int i=0; i<sizeof(slaveAddr); i++)
masahikofukasawa 1:b46b8653331f 49 {
masahikofukasawa 1:b46b8653331f 50 ak9750->init(i2c, slaveAddr[i]);
masahikofukasawa 1:b46b8653331f 51 // Checks connectivity
masahikofukasawa 1:b46b8653331f 52 if(ak9750->checkConnection() == AkmIrSensor::SUCCESS) {
masahikofukasawa 1:b46b8653331f 53 // found
masahikofukasawa 1:b46b8653331f 54 foundSensor = true;
masahikofukasawa 1:b46b8653331f 55 break;
masahikofukasawa 1:b46b8653331f 56 }
masahikofukasawa 1:b46b8653331f 57 }
masahikofukasawa 1:b46b8653331f 58 if(foundSensor != true) return AkmSensor::ERROR;
masahikofukasawa 1:b46b8653331f 59
masahikofukasawa 1:b46b8653331f 60 // reset
masahikofukasawa 1:b46b8653331f 61 if (ak9750->reset() != AK9750::SUCCESS) {
masahikofukasawa 1:b46b8653331f 62 MSG("#Failed to reset AK9750.\n");
masahikofukasawa 1:b46b8653331f 63 }
masahikofukasawa 1:b46b8653331f 64
masahikofukasawa 1:b46b8653331f 65 // Set to EEPROM mode to EEPROM access
masahikofukasawa 1:b46b8653331f 66 if(ak9750->setOperationMode(AK9750::MODE_EEPROM_ACCESS, AK9750::DF_0P3HZ) != AK9750::SUCCESS) {
masahikofukasawa 1:b46b8653331f 67 MSG("#Error setOperationMode to EEPROM mode. AK9750.\n");
masahikofukasawa 1:b46b8653331f 68 return AkmSensor::ERROR;
masahikofukasawa 1:b46b8653331f 69 }
masahikofukasawa 1:b46b8653331f 70 // Gets threshold from EEPROM
masahikofukasawa 1:b46b8653331f 71 AK9750::Threshold th;
masahikofukasawa 1:b46b8653331f 72 if (ak9750->getThresholdFromEEPROM(&th) != AK9750::SUCCESS) {
masahikofukasawa 1:b46b8653331f 73 MSG("#Failed to get threshold from EEPROM AK9750.\n");
masahikofukasawa 1:b46b8653331f 74 }
masahikofukasawa 1:b46b8653331f 75 // Gets hysteresis from EEPROM
masahikofukasawa 1:b46b8653331f 76 AK9750::Hysteresis hys;
masahikofukasawa 1:b46b8653331f 77 if (ak9750->getHysteresisFromEEPROM(&hys) != AK9750::SUCCESS) {
masahikofukasawa 1:b46b8653331f 78 MSG("#Failed to get hysteresis from EEPROM AK9750.\n");
masahikofukasawa 1:b46b8653331f 79 }
masahikofukasawa 1:b46b8653331f 80 // Gets interrupt status from EEPROM
masahikofukasawa 1:b46b8653331f 81 AK9750::InterruptStatus intStatus;
masahikofukasawa 3:a817a3b3e9ae 82 if ((ak9750->getInterruptEnableFromEEPROM(&intStatus)) != AK9750::SUCCESS) {
masahikofukasawa 1:b46b8653331f 83 MSG("#Failed to get interrupts of AK9750 from EEPROM.\n");
masahikofukasawa 1:b46b8653331f 84 }
masahikofukasawa 1:b46b8653331f 85
masahikofukasawa 1:b46b8653331f 86 // Gets operation mode from EEPROM
masahikofukasawa 1:b46b8653331f 87 if ((ak9750->getOperationModeFromEEPROM(&mode,&filter)) != AK9750::SUCCESS) {
masahikofukasawa 1:b46b8653331f 88 MSG("#Failed to get operation mode of AK9750 from EEPROM.\n");
masahikofukasawa 1:b46b8653331f 89 }
masahikofukasawa 1:b46b8653331f 90 MSG("#Operation Mode:(0x%02X,0x%02X)\n",mode, filter);
masahikofukasawa 1:b46b8653331f 91
masahikofukasawa 1:b46b8653331f 92 // Back to Stand-by Mode for register access
masahikofukasawa 1:b46b8653331f 93 if(ak9750->setOperationMode(AK9750::MODE_STANDBY, filter) != AK9750::SUCCESS) {
masahikofukasawa 1:b46b8653331f 94 MSG("#Error setOperationMode to stand-by mode of AK9750.\n");
masahikofukasawa 1:b46b8653331f 95 return AkmSensor::ERROR;
masahikofukasawa 1:b46b8653331f 96 }
masahikofukasawa 1:b46b8653331f 97
masahikofukasawa 1:b46b8653331f 98 // Sets threshold from the red EEPROM values
masahikofukasawa 1:b46b8653331f 99 if (ak9750->setThreshold(&th) != AK9750::SUCCESS) {
masahikofukasawa 1:b46b8653331f 100 MSG("#Failed to set threshold to AK9750.\n");
masahikofukasawa 1:b46b8653331f 101 }
masahikofukasawa 1:b46b8653331f 102 MSG("#Threshold:(0x%02X,0x%02X,0x%02X,0x%02X)\n",th.eth13h,th.eth13l,th.eth24h,th.eth24l);
masahikofukasawa 1:b46b8653331f 103
masahikofukasawa 1:b46b8653331f 104 // Sets hysteresis from the red EEPROM values
masahikofukasawa 1:b46b8653331f 105 if (ak9750->setHysteresis(&hys) != AK9750::SUCCESS) {
masahikofukasawa 1:b46b8653331f 106 MSG("#Failed to set hysteresis to AK9750.\n");
masahikofukasawa 1:b46b8653331f 107 }
masahikofukasawa 1:b46b8653331f 108 MSG("#Hysteresis:(0x%02X,0x%02X)\n",hys.ehys13,hys.ehys24);
masahikofukasawa 1:b46b8653331f 109
masahikofukasawa 1:b46b8653331f 110 // Sets interruput status from the red EEPROM values
masahikofukasawa 1:b46b8653331f 111 AK9750::Status status;
masahikofukasawa 3:a817a3b3e9ae 112 if ((status=ak9750->setInterruptEnable(&intStatus)) != AK9750::SUCCESS) {
masahikofukasawa 1:b46b8653331f 113 MSG("#Failed to set interrupts of AK9750. Status = 0x%02X\n", status);
masahikofukasawa 1:b46b8653331f 114 }
masahikofukasawa 1:b46b8653331f 115 MSG("#Interrupt:(0x%02X,0x%02X,0x%02X,0x%02X,0x%02X)\n",intStatus.drdy,intStatus.ir13h,intStatus.ir13l,intStatus.ir24h,intStatus.ir24l);
masahikofukasawa 1:b46b8653331f 116
masahikofukasawa 1:b46b8653331f 117 MSG("#Init success AK9750.\n");
masahikofukasawa 0:7a00359e701e 118 return AkmSensor::SUCCESS;
masahikofukasawa 0:7a00359e701e 119 }
masahikofukasawa 0:7a00359e701e 120
masahikofukasawa 0:7a00359e701e 121 void AkmIrSensor::detectINT(){
masahikofukasawa 0:7a00359e701e 122 event = true;
masahikofukasawa 0:7a00359e701e 123 }
masahikofukasawa 0:7a00359e701e 124
masahikofukasawa 0:7a00359e701e 125 bool AkmIrSensor::isEvent(){
masahikofukasawa 0:7a00359e701e 126 return event;
masahikofukasawa 0:7a00359e701e 127 }
masahikofukasawa 0:7a00359e701e 128
masahikofukasawa 1:b46b8653331f 129 void AkmIrSensor::checkINT(){
masahikofukasawa 1:b46b8653331f 130
masahikofukasawa 1:b46b8653331f 131 }
masahikofukasawa 1:b46b8653331f 132
masahikofukasawa 0:7a00359e701e 133 AkmSensor::Status AkmIrSensor::startSensor(){
masahikofukasawa 1:b46b8653331f 134 if(ak9750->setOperationMode(mode,filter) != AK9750::SUCCESS) {
masahikofukasawa 1:b46b8653331f 135 MSG("#Error setOperationMode. AK9750.\n");
masahikofukasawa 1:b46b8653331f 136 return AkmSensor::ERROR;
masahikofukasawa 1:b46b8653331f 137 }
masahikofukasawa 1:b46b8653331f 138
masahikofukasawa 1:b46b8653331f 139 interrupt->fall(this, &AkmIrSensor::detectINT);
masahikofukasawa 1:b46b8653331f 140 MSG("#Start Sensor success AK9750.\n");
masahikofukasawa 0:7a00359e701e 141 return AkmSensor::SUCCESS;
masahikofukasawa 0:7a00359e701e 142 }
masahikofukasawa 0:7a00359e701e 143
masahikofukasawa 0:7a00359e701e 144 AkmSensor::Status AkmIrSensor::startSensor(const float sec){
masahikofukasawa 1:b46b8653331f 145 interrupt->fall(this, &AkmIrSensor::detectINT);
masahikofukasawa 0:7a00359e701e 146 return AkmSensor::ERROR;
masahikofukasawa 0:7a00359e701e 147 }
masahikofukasawa 0:7a00359e701e 148
masahikofukasawa 0:7a00359e701e 149 AkmSensor::Status AkmIrSensor::stopSensor(){
masahikofukasawa 0:7a00359e701e 150 event = false;
masahikofukasawa 1:b46b8653331f 151 interrupt->fall(0);
masahikofukasawa 1:b46b8653331f 152 if(ak9750->setOperationMode(AK9750::MODE_STANDBY, filter) != AK9750::SUCCESS) {
masahikofukasawa 1:b46b8653331f 153 MSG("#Error setOperationMode. AK9750.\n");
masahikofukasawa 1:b46b8653331f 154 return AkmSensor::ERROR;
masahikofukasawa 1:b46b8653331f 155 }
masahikofukasawa 1:b46b8653331f 156
masahikofukasawa 1:b46b8653331f 157 // read one data to clear INT pin
masahikofukasawa 1:b46b8653331f 158 Message msg;
masahikofukasawa 1:b46b8653331f 159 AkmIrSensor::readSensorData(&msg);
masahikofukasawa 1:b46b8653331f 160
masahikofukasawa 0:7a00359e701e 161 return AkmSensor::SUCCESS;
masahikofukasawa 0:7a00359e701e 162 }
masahikofukasawa 0:7a00359e701e 163
masahikofukasawa 0:7a00359e701e 164 AkmSensor::Status AkmIrSensor::readSensorData(Message* msg){
masahikofukasawa 0:7a00359e701e 165 event = false;
masahikofukasawa 1:b46b8653331f 166
masahikofukasawa 1:b46b8653331f 167 // check interrupt status to release INT pin status
masahikofukasawa 1:b46b8653331f 168 AK9750::InterruptStatus interrupt;
masahikofukasawa 1:b46b8653331f 169 AK9750::Status status = ak9750->getInterruptStatus(&interrupt);
masahikofukasawa 1:b46b8653331f 170 if( status != AK9750::SUCCESS){
masahikofukasawa 1:b46b8653331f 171 MSG("#Error getInterruptStatus. AK9750.\n");
masahikofukasawa 1:b46b8653331f 172 return AkmSensor::ERROR;
masahikofukasawa 1:b46b8653331f 173 }
masahikofukasawa 1:b46b8653331f 174
masahikofukasawa 1:b46b8653331f 175 AK9750::SensorData data;
masahikofukasawa 1:b46b8653331f 176 status = ak9750->getSensorData(&data);
masahikofukasawa 1:b46b8653331f 177 if( status != AK9750::SUCCESS){
masahikofukasawa 1:b46b8653331f 178 MSG("#Error getSensorData. AK9750.\n");
masahikofukasawa 1:b46b8653331f 179 return AkmSensor::ERROR;
masahikofukasawa 1:b46b8653331f 180 }
masahikofukasawa 1:b46b8653331f 181 msg->setCommand(Message::CMD_START_MEASUREMENT);
masahikofukasawa 1:b46b8653331f 182 msg->setArgument( 0, interrupt.drdy);
masahikofukasawa 1:b46b8653331f 183 msg->setArgument( 1, interrupt.ir13h);
masahikofukasawa 1:b46b8653331f 184 msg->setArgument( 2, interrupt.ir13l);
masahikofukasawa 1:b46b8653331f 185 msg->setArgument( 3, interrupt.ir24h);
masahikofukasawa 1:b46b8653331f 186 msg->setArgument( 4, interrupt.ir24l);
masahikofukasawa 1:b46b8653331f 187 msg->setArgument( 5,(char)((int32_t)(data.ir1) >> 8));
masahikofukasawa 1:b46b8653331f 188 msg->setArgument( 6, (char)((int32_t)(data.ir1) & 0x00FF) );
masahikofukasawa 1:b46b8653331f 189 msg->setArgument( 7,(char)((int32_t)(data.ir2) >> 8));
masahikofukasawa 1:b46b8653331f 190 msg->setArgument( 8, (char)((int32_t)(data.ir2) & 0x00FF) );
masahikofukasawa 1:b46b8653331f 191 msg->setArgument( 9,(char)((int32_t)(data.ir3) >> 8));
masahikofukasawa 1:b46b8653331f 192 msg->setArgument( 10, (char)((int32_t)(data.ir3) & 0x00FF) );
masahikofukasawa 1:b46b8653331f 193 msg->setArgument( 11,(char)((int32_t)(data.ir4) >> 8));
masahikofukasawa 1:b46b8653331f 194 msg->setArgument( 12, (char)((int32_t)(data.ir4) & 0x00FF) );
masahikofukasawa 1:b46b8653331f 195 msg->setArgument( 13,(char)((int32_t)(data.temperature) >> 8));
masahikofukasawa 1:b46b8653331f 196 msg->setArgument( 14, (char)((int32_t)(data.temperature) & 0x00FF) );
masahikofukasawa 1:b46b8653331f 197
masahikofukasawa 0:7a00359e701e 198 return AkmSensor::SUCCESS;
masahikofukasawa 0:7a00359e701e 199 }
masahikofukasawa 0:7a00359e701e 200
masahikofukasawa 0:7a00359e701e 201 AkmSensor::Status AkmIrSensor::requestCommand(Message* in, Message* out){
masahikofukasawa 0:7a00359e701e 202 AkmSensor::Status status = AkmSensor::SUCCESS;
masahikofukasawa 1:b46b8653331f 203 Message::Command cmd = in->getCommand();
masahikofukasawa 1:b46b8653331f 204 AK9750::Threshold th;
masahikofukasawa 1:b46b8653331f 205 AK9750::Hysteresis hys;
masahikofukasawa 1:b46b8653331f 206 AK9750::InterruptStatus interrupt;
masahikofukasawa 1:b46b8653331f 207
masahikofukasawa 1:b46b8653331f 208 out->setCommand(cmd);
masahikofukasawa 1:b46b8653331f 209
masahikofukasawa 1:b46b8653331f 210 switch(cmd){
masahikofukasawa 1:b46b8653331f 211 case Message::CMD_IR_GET_THRESHOLD:
masahikofukasawa 1:b46b8653331f 212 {
masahikofukasawa 1:b46b8653331f 213 if (ak9750->getThreshold(&th) != AK9750::SUCCESS) {
masahikofukasawa 1:b46b8653331f 214 status = AkmSensor::ERROR;
masahikofukasawa 1:b46b8653331f 215 MSG("#Failed to set threshold to AK9750.\n");
masahikofukasawa 1:b46b8653331f 216 }
masahikofukasawa 1:b46b8653331f 217 out->setArgument(0,(char)((int32_t)(th.eth13h) >> 8));
masahikofukasawa 1:b46b8653331f 218 out->setArgument(1,(char)((int32_t)(th.eth13h) & 0x00FF));
masahikofukasawa 1:b46b8653331f 219 out->setArgument(2,(char)((int32_t)(th.eth13l) >> 8));
masahikofukasawa 1:b46b8653331f 220 out->setArgument(3,(char)((int32_t)(th.eth13l) & 0x00FF));
masahikofukasawa 1:b46b8653331f 221 out->setArgument(4,(char)((int32_t)(th.eth24h) >> 8));
masahikofukasawa 1:b46b8653331f 222 out->setArgument(5,(char)((int32_t)(th.eth24h) & 0x00FF));
masahikofukasawa 1:b46b8653331f 223 out->setArgument(6,(char)((int32_t)(th.eth24l) >> 8));
masahikofukasawa 1:b46b8653331f 224 out->setArgument(7,(char)((int32_t)(th.eth24l) & 0x00FF));
masahikofukasawa 1:b46b8653331f 225 break;
masahikofukasawa 1:b46b8653331f 226 }
masahikofukasawa 1:b46b8653331f 227 case Message::CMD_IR_SET_THRESHOLD:
masahikofukasawa 1:b46b8653331f 228 {
masahikofukasawa 1:b46b8653331f 229 th.eth13h = CONV16I(in->getArgument(0), in->getArgument(1));
masahikofukasawa 1:b46b8653331f 230 th.eth13l = CONV16I(in->getArgument(2), in->getArgument(3));
masahikofukasawa 1:b46b8653331f 231 th.eth24h = CONV16I(in->getArgument(4), in->getArgument(5));
masahikofukasawa 1:b46b8653331f 232 th.eth24l = CONV16I(in->getArgument(6), in->getArgument(7));
masahikofukasawa 1:b46b8653331f 233 if (ak9750->setThreshold(&th) != AK9750::SUCCESS) {
masahikofukasawa 1:b46b8653331f 234 status = AkmSensor::ERROR;
masahikofukasawa 1:b46b8653331f 235 MSG("#Failed to set threshold to AK9750.\n");
masahikofukasawa 1:b46b8653331f 236 }
masahikofukasawa 1:b46b8653331f 237 out->setArgument(0,(char)status);
masahikofukasawa 1:b46b8653331f 238 break;
masahikofukasawa 1:b46b8653331f 239 }
masahikofukasawa 1:b46b8653331f 240 case Message::CMD_IR_GET_HYSTERESIS:
masahikofukasawa 1:b46b8653331f 241 {
masahikofukasawa 1:b46b8653331f 242 if (ak9750->getHysteresis(&hys) != AK9750::SUCCESS) {
masahikofukasawa 1:b46b8653331f 243 status = AkmSensor::ERROR;
masahikofukasawa 1:b46b8653331f 244 MSG("#Failed to set hysteresis to AK9750.\n");
masahikofukasawa 1:b46b8653331f 245 }
masahikofukasawa 1:b46b8653331f 246 out->setArgument(0,hys.ehys13);
masahikofukasawa 1:b46b8653331f 247 out->setArgument(1,hys.ehys24);
masahikofukasawa 1:b46b8653331f 248 break;
masahikofukasawa 1:b46b8653331f 249 }
masahikofukasawa 1:b46b8653331f 250 case Message::CMD_IR_SET_HYSTERESIS:
masahikofukasawa 1:b46b8653331f 251 {
masahikofukasawa 1:b46b8653331f 252 hys.ehys13 = in->getArgument(0);
masahikofukasawa 1:b46b8653331f 253 hys.ehys24 = in->getArgument(1);
masahikofukasawa 1:b46b8653331f 254 if (ak9750->setHysteresis(&hys) != AK9750::SUCCESS) {
masahikofukasawa 1:b46b8653331f 255 status = AkmSensor::ERROR;
masahikofukasawa 1:b46b8653331f 256 MSG("#Failed to set hysteresis to AK9750.\n");
masahikofukasawa 1:b46b8653331f 257 }
masahikofukasawa 1:b46b8653331f 258 out->setArgument(0,(char)status);
masahikofukasawa 1:b46b8653331f 259 break;
masahikofukasawa 1:b46b8653331f 260 }
masahikofukasawa 1:b46b8653331f 261 case Message::CMD_IR_GET_INTERRUPT:
masahikofukasawa 1:b46b8653331f 262 {
masahikofukasawa 3:a817a3b3e9ae 263 if (ak9750->getInterruptEnable(&interrupt) != AK9750::SUCCESS) {
masahikofukasawa 1:b46b8653331f 264 status = AkmSensor::ERROR;
masahikofukasawa 1:b46b8653331f 265 MSG("#Failed to set hysteresis to AK9750.\n");
masahikofukasawa 1:b46b8653331f 266 }
masahikofukasawa 1:b46b8653331f 267 out->setArgument(0, interrupt.drdy);
masahikofukasawa 1:b46b8653331f 268 out->setArgument(1, interrupt.ir13h);
masahikofukasawa 1:b46b8653331f 269 out->setArgument(2, interrupt.ir13l);
masahikofukasawa 1:b46b8653331f 270 out->setArgument(3, interrupt.ir24h);
masahikofukasawa 1:b46b8653331f 271 out->setArgument(4, interrupt.ir24l);
masahikofukasawa 1:b46b8653331f 272 break;
masahikofukasawa 1:b46b8653331f 273 }
masahikofukasawa 1:b46b8653331f 274 case Message::CMD_IR_SET_INTERRUPT:
masahikofukasawa 1:b46b8653331f 275 {
masahikofukasawa 1:b46b8653331f 276 interrupt.drdy = in->getArgument(0);
masahikofukasawa 1:b46b8653331f 277 interrupt.ir13h = in->getArgument(1);
masahikofukasawa 1:b46b8653331f 278 interrupt.ir13l = in->getArgument(2);
masahikofukasawa 1:b46b8653331f 279 interrupt.ir24h = in->getArgument(3);
masahikofukasawa 1:b46b8653331f 280 interrupt.ir24l = in->getArgument(4);
masahikofukasawa 3:a817a3b3e9ae 281 if (ak9750->setInterruptEnable(&interrupt) != AK9750::SUCCESS) {
masahikofukasawa 1:b46b8653331f 282 status = AkmSensor::ERROR;
masahikofukasawa 1:b46b8653331f 283 MSG("#Failed to set hysteresis to AK9750.\n");
masahikofukasawa 1:b46b8653331f 284 }
masahikofukasawa 1:b46b8653331f 285 out->setArgument(0,(char)status);
masahikofukasawa 1:b46b8653331f 286 break;
masahikofukasawa 1:b46b8653331f 287 }
masahikofukasawa 1:b46b8653331f 288 case Message::CMD_IR_GET_OPERATION_MODE:
masahikofukasawa 1:b46b8653331f 289 {
masahikofukasawa 1:b46b8653331f 290 AK9750::OperationMode mode;
masahikofukasawa 1:b46b8653331f 291 AK9750::DigitalFilter filter;
masahikofukasawa 1:b46b8653331f 292 if(ak9750->getOperationMode(&mode, &filter) != AK9750::SUCCESS) {
masahikofukasawa 1:b46b8653331f 293 status = AkmSensor::ERROR;
masahikofukasawa 1:b46b8653331f 294 MSG("#Error setOperationMode. AK9750.\n");
masahikofukasawa 1:b46b8653331f 295 }
masahikofukasawa 1:b46b8653331f 296 out->setArgument(0,(char)mode);
masahikofukasawa 1:b46b8653331f 297 out->setArgument(1,(char)filter);
masahikofukasawa 1:b46b8653331f 298 break;
masahikofukasawa 1:b46b8653331f 299 }
masahikofukasawa 1:b46b8653331f 300 case Message::CMD_IR_SET_OPERATION_MODE:
masahikofukasawa 1:b46b8653331f 301 {
masahikofukasawa 1:b46b8653331f 302 char mode = in->getArgument(0);
masahikofukasawa 1:b46b8653331f 303 char filter = in->getArgument(1);
masahikofukasawa 1:b46b8653331f 304 if(ak9750->setOperationMode((AK9750::OperationMode)mode, (AK9750::DigitalFilter)filter) != AK9750::SUCCESS) {
masahikofukasawa 1:b46b8653331f 305 status = AkmSensor::ERROR;
masahikofukasawa 1:b46b8653331f 306 MSG("#Error setOperationMode. AK9750.\n");
masahikofukasawa 1:b46b8653331f 307 }
masahikofukasawa 1:b46b8653331f 308 out->setArgument(0,(char)status);
masahikofukasawa 1:b46b8653331f 309 break;
masahikofukasawa 1:b46b8653331f 310 }
masahikofukasawa 1:b46b8653331f 311 case Message::CMD_IR_GET_THRESHOLD_EEPROM:
masahikofukasawa 1:b46b8653331f 312 {
masahikofukasawa 1:b46b8653331f 313 if (ak9750->getThresholdFromEEPROM(&th) != AK9750::SUCCESS) {
masahikofukasawa 1:b46b8653331f 314 status = AkmSensor::ERROR;
masahikofukasawa 1:b46b8653331f 315 MSG("#Failed to set threshold to AK9750(EEPROM).\n");
masahikofukasawa 1:b46b8653331f 316 }
masahikofukasawa 1:b46b8653331f 317 out->setArgument(0,(char)((int32_t)(th.eth13h) >> 8));
masahikofukasawa 1:b46b8653331f 318 out->setArgument(1,(char)((int32_t)(th.eth13h) & 0x00FF));
masahikofukasawa 1:b46b8653331f 319 out->setArgument(2,(char)((int32_t)(th.eth13l) >> 8));
masahikofukasawa 1:b46b8653331f 320 out->setArgument(3,(char)((int32_t)(th.eth13l) & 0x00FF));
masahikofukasawa 1:b46b8653331f 321 out->setArgument(4,(char)((int32_t)(th.eth24h) >> 8));
masahikofukasawa 1:b46b8653331f 322 out->setArgument(5,(char)((int32_t)(th.eth24h) & 0x00FF));
masahikofukasawa 1:b46b8653331f 323 out->setArgument(6,(char)((int32_t)(th.eth24l) >> 8));
masahikofukasawa 1:b46b8653331f 324 out->setArgument(7,(char)((int32_t)(th.eth24l) & 0x00FF));
masahikofukasawa 1:b46b8653331f 325 break;
masahikofukasawa 1:b46b8653331f 326 }
masahikofukasawa 1:b46b8653331f 327 case Message::CMD_IR_SET_THRESHOLD_EEPROM:
masahikofukasawa 1:b46b8653331f 328 {
masahikofukasawa 1:b46b8653331f 329 th.eth13h = CONV16I(in->getArgument(0), in->getArgument(1));
masahikofukasawa 1:b46b8653331f 330 th.eth13l = CONV16I(in->getArgument(2), in->getArgument(3));
masahikofukasawa 1:b46b8653331f 331 th.eth24h = CONV16I(in->getArgument(4), in->getArgument(5));
masahikofukasawa 1:b46b8653331f 332 th.eth24l = CONV16I(in->getArgument(6), in->getArgument(7));
masahikofukasawa 1:b46b8653331f 333 if (ak9750->setThresholdToEEPROM(&th) != AK9750::SUCCESS) {
masahikofukasawa 1:b46b8653331f 334 status = AkmSensor::ERROR;
masahikofukasawa 1:b46b8653331f 335 MSG("#Failed to set threshold to AK9750(EEPROM).\n");
masahikofukasawa 1:b46b8653331f 336 }
masahikofukasawa 1:b46b8653331f 337 out->setArgument(0,(char)status);
masahikofukasawa 1:b46b8653331f 338 break;
masahikofukasawa 1:b46b8653331f 339 }
masahikofukasawa 1:b46b8653331f 340 case Message::CMD_IR_GET_HYSTERESIS_EEPROM:
masahikofukasawa 1:b46b8653331f 341 {
masahikofukasawa 1:b46b8653331f 342 if (ak9750->getHysteresisFromEEPROM(&hys) != AK9750::SUCCESS) {
masahikofukasawa 1:b46b8653331f 343 status = AkmSensor::ERROR;
masahikofukasawa 1:b46b8653331f 344 MSG("#Failed to set hysteresis to AK9750(EEPROM).\n");
masahikofukasawa 1:b46b8653331f 345 }
masahikofukasawa 1:b46b8653331f 346 out->setArgument(0,hys.ehys13);
masahikofukasawa 1:b46b8653331f 347 out->setArgument(1,hys.ehys24);
masahikofukasawa 1:b46b8653331f 348 break;
masahikofukasawa 1:b46b8653331f 349 }
masahikofukasawa 1:b46b8653331f 350 case Message::CMD_IR_SET_HYSTERESIS_EEPROM:
masahikofukasawa 1:b46b8653331f 351 {
masahikofukasawa 1:b46b8653331f 352 hys.ehys13 = in->getArgument(0);
masahikofukasawa 1:b46b8653331f 353 hys.ehys24 = in->getArgument(1);
masahikofukasawa 1:b46b8653331f 354 if (ak9750->setHysteresisToEEPROM(&hys) != AK9750::SUCCESS) {
masahikofukasawa 1:b46b8653331f 355 status = AkmSensor::ERROR;
masahikofukasawa 1:b46b8653331f 356 MSG("#Failed to set hysteresis to AK9750(EEPROM).\n");
masahikofukasawa 1:b46b8653331f 357 }
masahikofukasawa 1:b46b8653331f 358 out->setArgument(0,(char)status);
masahikofukasawa 1:b46b8653331f 359 break;
masahikofukasawa 1:b46b8653331f 360 }
masahikofukasawa 1:b46b8653331f 361 case Message::CMD_IR_GET_INTERRUPT_EEPROM:
masahikofukasawa 1:b46b8653331f 362 {
masahikofukasawa 3:a817a3b3e9ae 363 if (ak9750->getInterruptEnableFromEEPROM(&interrupt) != AK9750::SUCCESS) {
masahikofukasawa 1:b46b8653331f 364 status = AkmSensor::ERROR;
masahikofukasawa 1:b46b8653331f 365 MSG("#Failed to set interrupt to AK9750(EEPROM).\n");
masahikofukasawa 1:b46b8653331f 366 }
masahikofukasawa 1:b46b8653331f 367 out->setArgument(0, interrupt.drdy);
masahikofukasawa 1:b46b8653331f 368 out->setArgument(1, interrupt.ir13h);
masahikofukasawa 1:b46b8653331f 369 out->setArgument(2, interrupt.ir13l);
masahikofukasawa 1:b46b8653331f 370 out->setArgument(3, interrupt.ir24h);
masahikofukasawa 1:b46b8653331f 371 out->setArgument(4, interrupt.ir24l);
masahikofukasawa 1:b46b8653331f 372 break;
masahikofukasawa 1:b46b8653331f 373 }
masahikofukasawa 1:b46b8653331f 374 case Message::CMD_IR_SET_INTERRUPT_EEPROM:
masahikofukasawa 1:b46b8653331f 375 {
masahikofukasawa 1:b46b8653331f 376 interrupt.drdy = in->getArgument(0);
masahikofukasawa 1:b46b8653331f 377 interrupt.ir13h = in->getArgument(1);
masahikofukasawa 1:b46b8653331f 378 interrupt.ir13l = in->getArgument(2);
masahikofukasawa 1:b46b8653331f 379 interrupt.ir24h = in->getArgument(3);
masahikofukasawa 1:b46b8653331f 380 interrupt.ir24l = in->getArgument(4);
masahikofukasawa 3:a817a3b3e9ae 381 if (ak9750->setInterruptEnableToEEPROM(&interrupt) != AK9750::SUCCESS) {
masahikofukasawa 1:b46b8653331f 382 status = AkmSensor::ERROR;
masahikofukasawa 1:b46b8653331f 383 MSG("#Failed to set interrupt to AK9750(EEPROM).\n");
masahikofukasawa 1:b46b8653331f 384 }
masahikofukasawa 1:b46b8653331f 385 out->setArgument(0,(char)status);
masahikofukasawa 1:b46b8653331f 386 break;
masahikofukasawa 1:b46b8653331f 387 }
masahikofukasawa 1:b46b8653331f 388 case Message::CMD_IR_GET_OPERATION_MODE_EEPROM:
masahikofukasawa 1:b46b8653331f 389 {
masahikofukasawa 1:b46b8653331f 390 AK9750::OperationMode mode;
masahikofukasawa 1:b46b8653331f 391 AK9750::DigitalFilter filter;
masahikofukasawa 1:b46b8653331f 392 if(ak9750->getOperationModeFromEEPROM(&mode, &filter) != AK9750::SUCCESS) {
masahikofukasawa 1:b46b8653331f 393 status = AkmSensor::ERROR;
masahikofukasawa 1:b46b8653331f 394 MSG("#Error getOperationMode. AK9750(EEPROM).\n");
masahikofukasawa 1:b46b8653331f 395 }
masahikofukasawa 1:b46b8653331f 396 out->setArgument(0,(char)mode);
masahikofukasawa 1:b46b8653331f 397 out->setArgument(1,(char)filter);
masahikofukasawa 1:b46b8653331f 398 break;
masahikofukasawa 1:b46b8653331f 399 }
masahikofukasawa 1:b46b8653331f 400 case Message::CMD_IR_SET_OPERATION_MODE_EEPROM:
masahikofukasawa 1:b46b8653331f 401 {
masahikofukasawa 1:b46b8653331f 402 char mode = in->getArgument(0);
masahikofukasawa 1:b46b8653331f 403 char filter = in->getArgument(1);
masahikofukasawa 1:b46b8653331f 404 if(ak9750->setOperationModeToEEPROM((AK9750::OperationMode)mode, (AK9750::DigitalFilter)filter) != AK9750::SUCCESS) {
masahikofukasawa 1:b46b8653331f 405 status = AkmSensor::ERROR;
masahikofukasawa 1:b46b8653331f 406 MSG("#Error setOperationMode. AK9750(EEPROM).\n");
masahikofukasawa 1:b46b8653331f 407 }
masahikofukasawa 1:b46b8653331f 408 out->setArgument(0,(char)status);
masahikofukasawa 1:b46b8653331f 409 break;
masahikofukasawa 1:b46b8653331f 410 }
masahikofukasawa 1:b46b8653331f 411 default:
masahikofukasawa 1:b46b8653331f 412 {
masahikofukasawa 1:b46b8653331f 413 MSG("#Error no command.\n");
masahikofukasawa 1:b46b8653331f 414 status = AkmSensor::ERROR;
masahikofukasawa 1:b46b8653331f 415 break;
masahikofukasawa 1:b46b8653331f 416 }
masahikofukasawa 1:b46b8653331f 417 }
masahikofukasawa 0:7a00359e701e 418 return status;
masahikofukasawa 0:7a00359e701e 419 }