A simple 128x32 graphical LCD program to quickstart with LCD on ARM mbed IoT Starter Kit. This requires mbed Applciation Shield with FRDM-K64F platform.

Dependencies:   C12832

Committer:
tushki7
Date:
Sun Apr 12 15:45:52 2015 +0000
Revision:
1:eb68c94a8ee5
Parent:
0:60d829a0353a
A simple 128x32 LCD program with ARM mbed IoT Starter Kit;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
tushki7 0:60d829a0353a 1 /* mbed Microcontroller Library
tushki7 0:60d829a0353a 2 * Copyright (c) 2006-2013 ARM Limited
tushki7 0:60d829a0353a 3 *
tushki7 0:60d829a0353a 4 * Licensed under the Apache License, Version 2.0 (the "License");
tushki7 0:60d829a0353a 5 * you may not use this file except in compliance with the License.
tushki7 0:60d829a0353a 6 * You may obtain a copy of the License at
tushki7 0:60d829a0353a 7 *
tushki7 0:60d829a0353a 8 * http://www.apache.org/licenses/LICENSE-2.0
tushki7 0:60d829a0353a 9 *
tushki7 0:60d829a0353a 10 * Unless required by applicable law or agreed to in writing, software
tushki7 0:60d829a0353a 11 * distributed under the License is distributed on an "AS IS" BASIS,
tushki7 0:60d829a0353a 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
tushki7 0:60d829a0353a 13 * See the License for the specific language governing permissions and
tushki7 0:60d829a0353a 14 * limitations under the License.
tushki7 0:60d829a0353a 15 */
tushki7 0:60d829a0353a 16 #ifndef MBED_CAN_H
tushki7 0:60d829a0353a 17 #define MBED_CAN_H
tushki7 0:60d829a0353a 18
tushki7 0:60d829a0353a 19 #include "platform.h"
tushki7 0:60d829a0353a 20
tushki7 0:60d829a0353a 21 #if DEVICE_CAN
tushki7 0:60d829a0353a 22
tushki7 0:60d829a0353a 23 #include "can_api.h"
tushki7 0:60d829a0353a 24 #include "can_helper.h"
tushki7 0:60d829a0353a 25 #include "FunctionPointer.h"
tushki7 0:60d829a0353a 26
tushki7 0:60d829a0353a 27 namespace mbed {
tushki7 0:60d829a0353a 28
tushki7 0:60d829a0353a 29 /** CANMessage class
tushki7 0:60d829a0353a 30 */
tushki7 0:60d829a0353a 31 class CANMessage : public CAN_Message {
tushki7 0:60d829a0353a 32
tushki7 0:60d829a0353a 33 public:
tushki7 0:60d829a0353a 34 /** Creates empty CAN message.
tushki7 0:60d829a0353a 35 */
tushki7 0:60d829a0353a 36 CANMessage() : CAN_Message() {
tushki7 0:60d829a0353a 37 len = 8;
tushki7 0:60d829a0353a 38 type = CANData;
tushki7 0:60d829a0353a 39 format = CANStandard;
tushki7 0:60d829a0353a 40 id = 0;
tushki7 0:60d829a0353a 41 memset(data, 0, 8);
tushki7 0:60d829a0353a 42 }
tushki7 0:60d829a0353a 43
tushki7 0:60d829a0353a 44 /** Creates CAN message with specific content.
tushki7 0:60d829a0353a 45 */
tushki7 0:60d829a0353a 46 CANMessage(int _id, const char *_data, char _len = 8, CANType _type = CANData, CANFormat _format = CANStandard) {
tushki7 0:60d829a0353a 47 len = _len & 0xF;
tushki7 0:60d829a0353a 48 type = _type;
tushki7 0:60d829a0353a 49 format = _format;
tushki7 0:60d829a0353a 50 id = _id;
tushki7 0:60d829a0353a 51 memcpy(data, _data, _len);
tushki7 0:60d829a0353a 52 }
tushki7 0:60d829a0353a 53
tushki7 0:60d829a0353a 54 /** Creates CAN remote message.
tushki7 0:60d829a0353a 55 */
tushki7 0:60d829a0353a 56 CANMessage(int _id, CANFormat _format = CANStandard) {
tushki7 0:60d829a0353a 57 len = 0;
tushki7 0:60d829a0353a 58 type = CANRemote;
tushki7 0:60d829a0353a 59 format = _format;
tushki7 0:60d829a0353a 60 id = _id;
tushki7 0:60d829a0353a 61 memset(data, 0, 8);
tushki7 0:60d829a0353a 62 }
tushki7 0:60d829a0353a 63 };
tushki7 0:60d829a0353a 64
tushki7 0:60d829a0353a 65 /** A can bus client, used for communicating with can devices
tushki7 0:60d829a0353a 66 */
tushki7 0:60d829a0353a 67 class CAN {
tushki7 0:60d829a0353a 68
tushki7 0:60d829a0353a 69 public:
tushki7 0:60d829a0353a 70 /** Creates an CAN interface connected to specific pins.
tushki7 0:60d829a0353a 71 *
tushki7 0:60d829a0353a 72 * @param rd read from transmitter
tushki7 0:60d829a0353a 73 * @param td transmit to transmitter
tushki7 0:60d829a0353a 74 *
tushki7 0:60d829a0353a 75 * Example:
tushki7 0:60d829a0353a 76 * @code
tushki7 0:60d829a0353a 77 * #include "mbed.h"
tushki7 0:60d829a0353a 78 *
tushki7 0:60d829a0353a 79 * Ticker ticker;
tushki7 0:60d829a0353a 80 * DigitalOut led1(LED1);
tushki7 0:60d829a0353a 81 * DigitalOut led2(LED2);
tushki7 0:60d829a0353a 82 * CAN can1(p9, p10);
tushki7 0:60d829a0353a 83 * CAN can2(p30, p29);
tushki7 0:60d829a0353a 84 *
tushki7 0:60d829a0353a 85 * char counter = 0;
tushki7 0:60d829a0353a 86 *
tushki7 0:60d829a0353a 87 * void send() {
tushki7 0:60d829a0353a 88 * if(can1.write(CANMessage(1337, &counter, 1))) {
tushki7 0:60d829a0353a 89 * printf("Message sent: %d\n", counter);
tushki7 0:60d829a0353a 90 * counter++;
tushki7 0:60d829a0353a 91 * }
tushki7 0:60d829a0353a 92 * led1 = !led1;
tushki7 0:60d829a0353a 93 * }
tushki7 0:60d829a0353a 94 *
tushki7 0:60d829a0353a 95 * int main() {
tushki7 0:60d829a0353a 96 * ticker.attach(&send, 1);
tushki7 0:60d829a0353a 97 * CANMessage msg;
tushki7 0:60d829a0353a 98 * while(1) {
tushki7 0:60d829a0353a 99 * if(can2.read(msg)) {
tushki7 0:60d829a0353a 100 * printf("Message received: %d\n\n", msg.data[0]);
tushki7 0:60d829a0353a 101 * led2 = !led2;
tushki7 0:60d829a0353a 102 * }
tushki7 0:60d829a0353a 103 * wait(0.2);
tushki7 0:60d829a0353a 104 * }
tushki7 0:60d829a0353a 105 * }
tushki7 0:60d829a0353a 106 * @endcode
tushki7 0:60d829a0353a 107 */
tushki7 0:60d829a0353a 108 CAN(PinName rd, PinName td);
tushki7 0:60d829a0353a 109 virtual ~CAN();
tushki7 0:60d829a0353a 110
tushki7 0:60d829a0353a 111 /** Set the frequency of the CAN interface
tushki7 0:60d829a0353a 112 *
tushki7 0:60d829a0353a 113 * @param hz The bus frequency in hertz
tushki7 0:60d829a0353a 114 *
tushki7 0:60d829a0353a 115 * @returns
tushki7 0:60d829a0353a 116 * 1 if successful,
tushki7 0:60d829a0353a 117 * 0 otherwise
tushki7 0:60d829a0353a 118 */
tushki7 0:60d829a0353a 119 int frequency(int hz);
tushki7 0:60d829a0353a 120
tushki7 0:60d829a0353a 121 /** Write a CANMessage to the bus.
tushki7 0:60d829a0353a 122 *
tushki7 0:60d829a0353a 123 * @param msg The CANMessage to write.
tushki7 0:60d829a0353a 124 *
tushki7 0:60d829a0353a 125 * @returns
tushki7 0:60d829a0353a 126 * 0 if write failed,
tushki7 0:60d829a0353a 127 * 1 if write was successful
tushki7 0:60d829a0353a 128 */
tushki7 0:60d829a0353a 129 int write(CANMessage msg);
tushki7 0:60d829a0353a 130
tushki7 0:60d829a0353a 131 /** Read a CANMessage from the bus.
tushki7 0:60d829a0353a 132 *
tushki7 0:60d829a0353a 133 * @param msg A CANMessage to read to.
tushki7 0:60d829a0353a 134 * @param handle message filter handle (0 for any message)
tushki7 0:60d829a0353a 135 *
tushki7 0:60d829a0353a 136 * @returns
tushki7 0:60d829a0353a 137 * 0 if no message arrived,
tushki7 0:60d829a0353a 138 * 1 if message arrived
tushki7 0:60d829a0353a 139 */
tushki7 0:60d829a0353a 140 int read(CANMessage &msg, int handle = 0);
tushki7 0:60d829a0353a 141
tushki7 0:60d829a0353a 142 /** Reset CAN interface.
tushki7 0:60d829a0353a 143 *
tushki7 0:60d829a0353a 144 * To use after error overflow.
tushki7 0:60d829a0353a 145 */
tushki7 0:60d829a0353a 146 void reset();
tushki7 0:60d829a0353a 147
tushki7 0:60d829a0353a 148 /** Puts or removes the CAN interface into silent monitoring mode
tushki7 0:60d829a0353a 149 *
tushki7 0:60d829a0353a 150 * @param silent boolean indicating whether to go into silent mode or not
tushki7 0:60d829a0353a 151 */
tushki7 0:60d829a0353a 152 void monitor(bool silent);
tushki7 0:60d829a0353a 153
tushki7 0:60d829a0353a 154 enum Mode {
tushki7 0:60d829a0353a 155 Reset = 0,
tushki7 0:60d829a0353a 156 Normal,
tushki7 0:60d829a0353a 157 Silent,
tushki7 0:60d829a0353a 158 LocalTest,
tushki7 0:60d829a0353a 159 GlobalTest,
tushki7 0:60d829a0353a 160 SilentTest
tushki7 0:60d829a0353a 161 };
tushki7 0:60d829a0353a 162
tushki7 0:60d829a0353a 163 /** Change CAN operation to the specified mode
tushki7 0:60d829a0353a 164 *
tushki7 0:60d829a0353a 165 * @param mode The new operation mode (CAN::Normal, CAN::Silent, CAN::LocalTest, CAN::GlobalTest, CAN::SilentTest)
tushki7 0:60d829a0353a 166 *
tushki7 0:60d829a0353a 167 * @returns
tushki7 0:60d829a0353a 168 * 0 if mode change failed or unsupported,
tushki7 0:60d829a0353a 169 * 1 if mode change was successful
tushki7 0:60d829a0353a 170 */
tushki7 0:60d829a0353a 171 int mode(Mode mode);
tushki7 0:60d829a0353a 172
tushki7 0:60d829a0353a 173 /** Filter out incomming messages
tushki7 0:60d829a0353a 174 *
tushki7 0:60d829a0353a 175 * @param id the id to filter on
tushki7 0:60d829a0353a 176 * @param mask the mask applied to the id
tushki7 0:60d829a0353a 177 * @param format format to filter on (Default CANAny)
tushki7 0:60d829a0353a 178 * @param handle message filter handle (Optional)
tushki7 0:60d829a0353a 179 *
tushki7 0:60d829a0353a 180 * @returns
tushki7 0:60d829a0353a 181 * 0 if filter change failed or unsupported,
tushki7 0:60d829a0353a 182 * new filter handle if successful
tushki7 0:60d829a0353a 183 */
tushki7 0:60d829a0353a 184 int filter(unsigned int id, unsigned int mask, CANFormat format = CANAny, int handle = 0);
tushki7 0:60d829a0353a 185
tushki7 0:60d829a0353a 186 /** Returns number of read errors to detect read overflow errors.
tushki7 0:60d829a0353a 187 */
tushki7 0:60d829a0353a 188 unsigned char rderror();
tushki7 0:60d829a0353a 189
tushki7 0:60d829a0353a 190 /** Returns number of write errors to detect write overflow errors.
tushki7 0:60d829a0353a 191 */
tushki7 0:60d829a0353a 192 unsigned char tderror();
tushki7 0:60d829a0353a 193
tushki7 0:60d829a0353a 194 enum IrqType {
tushki7 0:60d829a0353a 195 RxIrq = 0,
tushki7 0:60d829a0353a 196 TxIrq,
tushki7 0:60d829a0353a 197 EwIrq,
tushki7 0:60d829a0353a 198 DoIrq,
tushki7 0:60d829a0353a 199 WuIrq,
tushki7 0:60d829a0353a 200 EpIrq,
tushki7 0:60d829a0353a 201 AlIrq,
tushki7 0:60d829a0353a 202 BeIrq,
tushki7 0:60d829a0353a 203 IdIrq
tushki7 0:60d829a0353a 204 };
tushki7 0:60d829a0353a 205
tushki7 0:60d829a0353a 206 /** Attach a function to call whenever a CAN frame received interrupt is
tushki7 0:60d829a0353a 207 * generated.
tushki7 0:60d829a0353a 208 *
tushki7 0:60d829a0353a 209 * @param fptr A pointer to a void function, or 0 to set as none
tushki7 0:60d829a0353a 210 * @param event Which CAN interrupt to attach the member function to (CAN::RxIrq for message received, CAN::TxIrq for transmitted or aborted, CAN::EwIrq for error warning, CAN::DoIrq for data overrun, CAN::WuIrq for wake-up, CAN::EpIrq for error passive, CAN::AlIrq for arbitration lost, CAN::BeIrq for bus error)
tushki7 0:60d829a0353a 211 */
tushki7 0:60d829a0353a 212 void attach(void (*fptr)(void), IrqType type=RxIrq);
tushki7 0:60d829a0353a 213
tushki7 0:60d829a0353a 214 /** Attach a member function to call whenever a CAN frame received interrupt
tushki7 0:60d829a0353a 215 * is generated.
tushki7 0:60d829a0353a 216 *
tushki7 0:60d829a0353a 217 * @param tptr pointer to the object to call the member function on
tushki7 0:60d829a0353a 218 * @param mptr pointer to the member function to be called
tushki7 0:60d829a0353a 219 * @param event Which CAN interrupt to attach the member function to (CAN::RxIrq for message received, TxIrq for transmitted or aborted, EwIrq for error warning, DoIrq for data overrun, WuIrq for wake-up, EpIrq for error passive, AlIrq for arbitration lost, BeIrq for bus error)
tushki7 0:60d829a0353a 220 */
tushki7 0:60d829a0353a 221 template<typename T>
tushki7 0:60d829a0353a 222 void attach(T* tptr, void (T::*mptr)(void), IrqType type=RxIrq) {
tushki7 0:60d829a0353a 223 if((mptr != NULL) && (tptr != NULL)) {
tushki7 0:60d829a0353a 224 _irq[type].attach(tptr, mptr);
tushki7 0:60d829a0353a 225 can_irq_set(&_can, (CanIrqType)type, 1);
tushki7 0:60d829a0353a 226 }
tushki7 0:60d829a0353a 227 else {
tushki7 0:60d829a0353a 228 can_irq_set(&_can, (CanIrqType)type, 0);
tushki7 0:60d829a0353a 229 }
tushki7 0:60d829a0353a 230 }
tushki7 0:60d829a0353a 231
tushki7 0:60d829a0353a 232 static void _irq_handler(uint32_t id, CanIrqType type);
tushki7 0:60d829a0353a 233
tushki7 0:60d829a0353a 234 protected:
tushki7 0:60d829a0353a 235 can_t _can;
tushki7 0:60d829a0353a 236 FunctionPointer _irq[9];
tushki7 0:60d829a0353a 237 };
tushki7 0:60d829a0353a 238
tushki7 0:60d829a0353a 239 } // namespace mbed
tushki7 0:60d829a0353a 240
tushki7 0:60d829a0353a 241 #endif
tushki7 0:60d829a0353a 242
tushki7 0:60d829a0353a 243 #endif // MBED_CAN_H