AKM Development Platform. This is the D7.014 version.

Dependencies:   AK09970 AK099XX AK7401 AK7451 AK8963X AK9750 AK9752 AkmSensor BLE_API I2CNano MCP342x SerialNano SpiNano TCA9554A mbed nRF51822

Fork of AKDP by Masahiko Fukasawa

Committer:
masahikofukasawa
Date:
Fri Jul 08 22:28:13 2016 +0000
Revision:
12:522a22a23f8a
Parent:
11:53e52f5f1051
Child:
14:76205d28fea2
RevD7 with AK09970. Release to Japan.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
masahikofukasawa 0:c240899240e7 1 #ifndef __MESSAGE_H__
masahikofukasawa 0:c240899240e7 2 #define __MESSAGE_H__
masahikofukasawa 0:c240899240e7 3
masahikofukasawa 0:c240899240e7 4 /**
masahikofukasawa 0:c240899240e7 5 * Message is sent from the host. A message consists of a command and arguments.
masahikofukasawa 0:c240899240e7 6 */
masahikofukasawa 0:c240899240e7 7 class Message {
masahikofukasawa 0:c240899240e7 8 public:
masahikofukasawa 0:c240899240e7 9 typedef enum {
masahikofukasawa 0:c240899240e7 10 CMD_GET_FW_VERSION = 0x01, /**< Gets FW version. */
masahikofukasawa 0:c240899240e7 11 CMD_GET_MAG_PART = 0x02, /**< Gets magnetic sensor ID */
masahikofukasawa 11:53e52f5f1051 12 // CMD_GET_THRESHOLD = 0x80, /**< Gets threshold of AK0997x */
masahikofukasawa 11:53e52f5f1051 13 // CMD_SET_THRESHOLD_FROM_HOST = 0x81, /**< Sets threshold of AK0997x from host. */
masahikofukasawa 11:53e52f5f1051 14 // CMD_SET_MEASUREMENT_FREQUENCY = 0x82, /**< Sets measurement frequency. */
masahikofukasawa 11:53e52f5f1051 15 // CMD_SEND_SWITCH_MODE_MEASUREMENT_DATA = 0x83, /**< Sends measurement data on/off */
masahikofukasawa 11:53e52f5f1051 16 // CMD_SWITCH_MODE_MEASUREMENT_DATA = 0x84, /**< Measurement data in switch mode */
masahikofukasawa 11:53e52f5f1051 17 // CMD_GET_POLARITY = 0x85, /**< Gets polarity of AK0997x */
masahikofukasawa 11:53e52f5f1051 18 // CMD_SET_POLARITY = 0x86, /**< Sets polarity of AK0997x */
masahikofukasawa 11:53e52f5f1051 19
masahikofukasawa 11:53e52f5f1051 20 CMD_PROGSW_GET_THRESHOLD = 0x80, /**< Gets threshold of AK09970. */
masahikofukasawa 11:53e52f5f1051 21 CMD_PROGSW_SET_THRESHOLD = 0x81, /**< Sets threshold of AK09970. */
masahikofukasawa 11:53e52f5f1051 22 // CMD_PROGSW_GET_READ_ADDRESS = 0x82, /**< Gets read address of AK09970. */
masahikofukasawa 11:53e52f5f1051 23 // CMD_PROGSW_SET_READ_ADDRESS = 0x83, /**< Sets read address of AK09970. */
masahikofukasawa 11:53e52f5f1051 24 // CMD_PROGSW_GET_SWITCH_MODE = 0x84, /**< Gets interrupt mode of AK09970. */
masahikofukasawa 11:53e52f5f1051 25 // CMD_PROGSW_SET_SWITCH_MODE = 0x85, /**< Sets interrupt mode of AK09970. */
masahikofukasawa 11:53e52f5f1051 26 CMD_PROGSW_GET_READ_COFIGURATION = 0x82, /**< Gets read configuration of AK09970. */
masahikofukasawa 11:53e52f5f1051 27 CMD_PROGSW_SET_READ_COFIGURATION = 0x83, /**< Sets read configuration of AK09970. */
masahikofukasawa 11:53e52f5f1051 28 CMD_PROGSW_GET_SWITCH_COFIGURATION = 0x84, /**< Gets switch configuration of AK09970. */
masahikofukasawa 11:53e52f5f1051 29 CMD_PROGSW_SET_SWITCH_COFIGURATION = 0x85, /**< Sets switch configuration of AK09970. */
masahikofukasawa 11:53e52f5f1051 30 CMD_PROGSW_GET_OPERATION_MODE = 0x86, /**< Gets operation mode of AK09970. */
masahikofukasawa 11:53e52f5f1051 31 CMD_PROGSW_SET_OPERATION_MODE = 0x87, /**< Sets operation mode of AK09970. */
masahikofukasawa 0:c240899240e7 32
masahikofukasawa 0:c240899240e7 33 CMD_IR_GET_THRESHOLD = 0x90, /**< Gets threshold of AK9750. */
masahikofukasawa 0:c240899240e7 34 CMD_IR_SET_THRESHOLD = 0x91, /**< Sets threshold of AK9750. */
masahikofukasawa 0:c240899240e7 35 CMD_IR_GET_HYSTERESIS = 0x92, /**< Gets hysteresis setting of AK9750 */
masahikofukasawa 0:c240899240e7 36 CMD_IR_SET_HYSTERESIS = 0x93, /**< Sets hysteresis to AK9750 */
masahikofukasawa 1:0914af311974 37 CMD_IR_GET_INTERRUPT = 0x94, /**< Gets interrupt mode of AK9750 */
masahikofukasawa 1:0914af311974 38 CMD_IR_SET_INTERRUPT = 0x95, /**< Sets interrupt mode of AK9750 */
masahikofukasawa 1:0914af311974 39 CMD_IR_GET_OPERATION_MODE = 0x96, /**< Gets operation mode of AK9750 */
masahikofukasawa 1:0914af311974 40 CMD_IR_SET_OPERATION_MODE = 0x97, /**< Sets operation mode of AK9750 */
masahikofukasawa 1:0914af311974 41 CMD_IR_GET_THRESHOLD_EEPROM = 0x98, /**< Gets EEPROM threshold of AK9750. */
masahikofukasawa 1:0914af311974 42 CMD_IR_SET_THRESHOLD_EEPROM = 0x99, /**< Sets EEPROM threshold of AK9750. */
masahikofukasawa 1:0914af311974 43 CMD_IR_GET_HYSTERESIS_EEPROM = 0x9A, /**< Gets EEPROM hysteresis setting of AK9750 */
masahikofukasawa 1:0914af311974 44 CMD_IR_SET_HYSTERESIS_EEPROM = 0x9B, /**< Sets EEPROM hysteresis to AK9750 */
masahikofukasawa 1:0914af311974 45 CMD_IR_GET_INTERRUPT_EEPROM = 0x9C, /**< Gets EEPROM interrupt mode of AK9750 */
masahikofukasawa 1:0914af311974 46 CMD_IR_SET_INTERRUPT_EEPROM = 0x9D, /**< Sets EEPROM interrupt mode of AK9750 */
masahikofukasawa 1:0914af311974 47 CMD_IR_GET_OPERATION_MODE_EEPROM = 0x9E, /**< Gets EEPROM operation mode of AK9750 */
masahikofukasawa 1:0914af311974 48 CMD_IR_SET_OPERATION_MODE_EEPROM = 0x9F, /**< Sets EEPROM operation mode of AK9750 */
masahikofukasawa 0:c240899240e7 49
masahikofukasawa 0:c240899240e7 50 CMD_DOOR_STATE_CHANGED = 0xA0, /**< Door state changed. */
masahikofukasawa 0:c240899240e7 51 CMD_UPDATE_MAG_VECTOR = 0xA1, /**< Update magnetic vector state. */
masahikofukasawa 0:c240899240e7 52 CMD_THRESHOLD_UPDATED = 0xA2, /**< Threshold updated. */
masahikofukasawa 0:c240899240e7 53 CMD_GET_CURRENT_DOOR_STATE = 0xA3, /**< Gets the current door state. */
masahikofukasawa 0:c240899240e7 54 CMD_IR_STATE_CHANGED = 0xA5, /**< IR state changed. */
masahikofukasawa 0:c240899240e7 55 CMD_UPDATE_IR_STATE = 0xA6, /**< Update IR state 1 or 2 */
masahikofukasawa 0:c240899240e7 56 CMD_GET_CURRENT_HUMAN_PRESENCE_STATE = 0xA7, /**< Gets the current human presence state. */
masahikofukasawa 0:c240899240e7 57 CMD_IR_THRESHOLD_UPDATED = 0xA8, /**< IR threshold updated. */
masahikofukasawa 0:c240899240e7 58
masahikofukasawa 0:c240899240e7 59 // CMD_MOTION_DETECTED = 0xB1, /**< Motion detected. */
masahikofukasawa 0:c240899240e7 60 // CMD_GET_MOTION_THRESHOLD = 0xB2, /**< Get motion threshold */
masahikofukasawa 0:c240899240e7 61 // CMD_SET_MOTION_THRESHOLD = 0xB3, /**< Set motion threshold */
masahikofukasawa 0:c240899240e7 62 CMD_UNKNOWN = 0x00, /**< Unknown command. */
masahikofukasawa 0:c240899240e7 63 CMD_SET_SERIAL_TARGET = 0x0A, /**< Set serial output target */
masahikofukasawa 0:c240899240e7 64 CMD_REG_WRITE = 0x11, /**< Register write 1 byte */
masahikofukasawa 0:c240899240e7 65 CMD_REG_WRITEN = 0x12, /**< Register write N bytes */
masahikofukasawa 0:c240899240e7 66 CMD_REG_READ = 0x13, /**< Register read 1 byte */
masahikofukasawa 0:c240899240e7 67 CMD_REG_READN = 0x14, /**< Register read N bytes */
masahikofukasawa 11:53e52f5f1051 68 CMD_COMPASS_GET_OPERATION_MODE = 0x16, /**< Gets operation mode of e-compass*/
masahikofukasawa 11:53e52f5f1051 69 CMD_COMPASS_SET_OPERATION_MODE = 0x17, /**< Sets operation mode of e-compass*/
masahikofukasawa 0:c240899240e7 70 CMD_GET_ID = 0xB0, /**< Get connected sensor ID */
masahikofukasawa 0:c240899240e7 71 CMD_STOP_MEASUREMENT = 0xBA, /**< Stop Measurement */
masahikofukasawa 0:c240899240e7 72 CMD_START_MEASUREMENT = 0xBB, /**< Start Measurement */
masahikofukasawa 0:c240899240e7 73 CMD_ANGLE_ZERO_RESET = 0xBC, /**< Angle sensor zero reset */
masahikofukasawa 0:c240899240e7 74 } Command;
masahikofukasawa 11:53e52f5f1051 75
masahikofukasawa 11:53e52f5f1051 76 // typedef enum {
masahikofukasawa 11:53e52f5f1051 77 // ARG_MAG_FREQ_1HZ = 0x00, /**< Frequency setting 1 Hz */
masahikofukasawa 11:53e52f5f1051 78 // ARG_MAG_FREQ_10HZ = 0x01, /**< Frequency setting 10 Hz */
masahikofukasawa 11:53e52f5f1051 79 // ARG_MAG_FREQ_20HZ = 0x02, /**< Frequency setting 20 Hz */
masahikofukasawa 11:53e52f5f1051 80 // ARG_MAG_FREQ_50HZ = 0x03, /**< Frequency setting 50 Hz */
masahikofukasawa 11:53e52f5f1051 81 // ARG_MAG_FREQ_100HZ = 0x04, /**< Frequency setting 100 Hz */
masahikofukasawa 11:53e52f5f1051 82 // ARG_MAG_FREQ_POWER_DOWN = 0x05, /**< Frequency setting 0 Hz (Power-down) */
masahikofukasawa 11:53e52f5f1051 83 // ARG_MAG_FREQ_0P5HZ = 0x06, /**< Frequency setting 0.5 Hz */
masahikofukasawa 11:53e52f5f1051 84 // ARG_MAG_FREQ_0P25HZ = 0x07, /**< Frequency setting 0.25 Hz */
masahikofukasawa 11:53e52f5f1051 85 // } MagFrequency;
masahikofukasawa 0:c240899240e7 86
masahikofukasawa 11:53e52f5f1051 87 typedef enum{
masahikofukasawa 11:53e52f5f1051 88 SW_OFF = 0x00,
masahikofukasawa 11:53e52f5f1051 89 SW_ON = 0x01,
masahikofukasawa 11:53e52f5f1051 90 } SwitchState;
masahikofukasawa 11:53e52f5f1051 91
masahikofukasawa 0:c240899240e7 92 typedef enum {
masahikofukasawa 0:c240899240e7 93 SUCCESS = 0,
masahikofukasawa 0:c240899240e7 94 END_OF_STR,
masahikofukasawa 0:c240899240e7 95 ERROR_ILLEGAL_CHAR,
masahikofukasawa 0:c240899240e7 96 ERROR_INDEX_OUT_OF_BOUNDS,
masahikofukasawa 0:c240899240e7 97 } Status;
masahikofukasawa 0:c240899240e7 98
masahikofukasawa 0:c240899240e7 99 /**
masahikofukasawa 0:c240899240e7 100 * Constructor.
masahikofukasawa 0:c240899240e7 101 */
masahikofukasawa 0:c240899240e7 102 Message() : cmd(CMD_UNKNOWN), num_arg(0){
masahikofukasawa 0:c240899240e7 103 };
masahikofukasawa 0:c240899240e7 104
masahikofukasawa 0:c240899240e7 105 /**
masahikofukasawa 0:c240899240e7 106 * Convert an ascii into one byte value.
masahikofukasawa 0:c240899240e7 107 * @param out Pointer to the buffer stores result value
masahikofukasawa 0:c240899240e7 108 * @param in Pointer to a hex format ascii value. The value must be expressed by two-byte ascii chars. For example, the value 5 must be expressed as "05", not "5".
masahikofukasawa 0:c240899240e7 109 */
masahikofukasawa 0:c240899240e7 110 static Status asciiToChar(char *out, const char *in);
masahikofukasawa 0:c240899240e7 111
masahikofukasawa 0:c240899240e7 112 /**
masahikofukasawa 0:c240899240e7 113 * Convert a byte value into a hex format ascii value. The result value have two-byte length. If the input value is 5, the result string is "05", not "5".
masahikofukasawa 0:c240899240e7 114 * @param out Pointer to the buffer stores result ascii. The buffer must have two byte length.
masahikofukasawa 0:c240899240e7 115 * @param in Pointer to a byte value to be converted.
masahikofukasawa 0:c240899240e7 116 */
masahikofukasawa 0:c240899240e7 117 static void charToAscii(char *out, const char *in);
masahikofukasawa 0:c240899240e7 118
masahikofukasawa 0:c240899240e7 119 /**
masahikofukasawa 0:c240899240e7 120 * Parses given string and construct a message object.
masahikofukasawa 0:c240899240e7 121 * @param msg Pointer to an message object.
masahikofukasawa 0:c240899240e7 122 * @param str Pointer to an string to be parsed.
masahikofukasawa 0:c240899240e7 123 * @return Returns SUCCESS if parsed successfully, otherwise returns other code.
masahikofukasawa 0:c240899240e7 124 */
masahikofukasawa 0:c240899240e7 125 static Status parse(Message *msg, const char *str);
masahikofukasawa 0:c240899240e7 126
masahikofukasawa 0:c240899240e7 127 /**
masahikofukasawa 0:c240899240e7 128 * Sets command of this message.
masahikofukasawa 0:c240899240e7 129 * @param cmd Command to be set.
masahikofukasawa 0:c240899240e7 130 */
masahikofukasawa 0:c240899240e7 131 void setCommand(Command cmd);
masahikofukasawa 0:c240899240e7 132
masahikofukasawa 0:c240899240e7 133 /**
masahikofukasawa 0:c240899240e7 134 * Sets argument(s) to this message.
masahikofukasawa 0:c240899240e7 135 * @param arg pointer to the argument(s) to be stored.
masahikofukasawa 0:c240899240e7 136 * @param len length of the argument in bytes
masahikofukasawa 0:c240899240e7 137 */
masahikofukasawa 0:c240899240e7 138 void setArguments(const char *arg, int len);
masahikofukasawa 0:c240899240e7 139
masahikofukasawa 0:c240899240e7 140 /**
masahikofukasawa 0:c240899240e7 141 * Sets argument at the specified index.
masahikofukasawa 0:c240899240e7 142 * @param arg value of the argument
masahikofukasawa 0:c240899240e7 143 */
masahikofukasawa 0:c240899240e7 144 void setArgument(int index, char arg);
masahikofukasawa 0:c240899240e7 145
masahikofukasawa 0:c240899240e7 146 /**
masahikofukasawa 0:c240899240e7 147 * Gets the command contained in this message.
masahikofukasawa 0:c240899240e7 148 * @return The command contained in this message.
masahikofukasawa 0:c240899240e7 149 */
masahikofukasawa 0:c240899240e7 150 Command getCommand() const;
masahikofukasawa 0:c240899240e7 151
masahikofukasawa 0:c240899240e7 152 /**
masahikofukasawa 0:c240899240e7 153 * Gets n th argument of the message.
masahikofukasawa 0:c240899240e7 154 * @param index argument to be gotten. Index must be less than the number obtained from getArgNum().
masahikofukasawa 0:c240899240e7 155 * @return Returns value of the argument specified by index. If the value larger than argsize is specified, returns 0.
masahikofukasawa 0:c240899240e7 156 */
masahikofukasawa 0:c240899240e7 157 char getArgument(int index) const;
masahikofukasawa 0:c240899240e7 158
masahikofukasawa 0:c240899240e7 159 /**
masahikofukasawa 0:c240899240e7 160 * Gets number of arguments.
masahikofukasawa 0:c240899240e7 161 * @return Returns number of arguments included in this message.
masahikofukasawa 0:c240899240e7 162 */
masahikofukasawa 0:c240899240e7 163 int getArgNum() const;
masahikofukasawa 0:c240899240e7 164
masahikofukasawa 0:c240899240e7 165 /**
masahikofukasawa 0:c240899240e7 166 * Gets maximum message length in byte unit.
masahikofukasawa 0:c240899240e7 167 * @return maximum length of message in byte.
masahikofukasawa 0:c240899240e7 168 */
masahikofukasawa 0:c240899240e7 169 static int getMaxMessageLength();
masahikofukasawa 0:c240899240e7 170
masahikofukasawa 0:c240899240e7 171 /**
masahikofukasawa 0:c240899240e7 172 * Gets arguments.
masahikofukasawa 0:c240899240e7 173 * @param buf
masahikofukasawa 0:c240899240e7 174 * @param maxNum maximum number of arguments to be get
masahikofukasawa 0:c240899240e7 175 */
masahikofukasawa 0:c240899240e7 176 void getArguments(char *buf, int maxNum) const;
masahikofukasawa 0:c240899240e7 177
masahikofukasawa 0:c240899240e7 178
masahikofukasawa 0:c240899240e7 179 private:
masahikofukasawa 12:522a22a23f8a 180 const static int NUM_MAX_ARG = 32; /**< Maximum number of arguments in message. */
masahikofukasawa 0:c240899240e7 181 const static int MAX_LEN = 1 + 2 + 2*NUM_MAX_ARG + 1 + 1; /**< Maximum length of message in byte unit. $ + command(2bytes) + data + \r + \n */
masahikofukasawa 0:c240899240e7 182
masahikofukasawa 0:c240899240e7 183 Command cmd; /**< Holds command. */
masahikofukasawa 0:c240899240e7 184 char arg[NUM_MAX_ARG]; /**< Holds arguments. */
masahikofukasawa 0:c240899240e7 185 int num_arg; /**< Holds number of arguments. */
masahikofukasawa 0:c240899240e7 186 };
masahikofukasawa 0:c240899240e7 187
masahikofukasawa 0:c240899240e7 188 #endif // __MESSAGE_H__