A bare to the bones, SUMP compatible, simple Logical Analyser. Mainly for the F401RE platform, but portable to many other platforms.

Dependencies:   mbed

Committer:
jpbarraca
Date:
Sat Mar 12 00:18:53 2016 +0000
Revision:
0:41db3ed6754d
v0.1.2.1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jpbarraca 0:41db3ed6754d 1 /*
jpbarraca 0:41db3ed6754d 2 This program is free software: you can redistribute it and/or modify
jpbarraca 0:41db3ed6754d 3 it under the terms of the GNU General Public License as published by
jpbarraca 0:41db3ed6754d 4 the Free Software Foundation, either version 3 of the License, or
jpbarraca 0:41db3ed6754d 5 (at your option) any later version.
jpbarraca 0:41db3ed6754d 6
jpbarraca 0:41db3ed6754d 7 This program is distributed in the hope that it will be useful,
jpbarraca 0:41db3ed6754d 8 but WITHOUT ANY WARRANTY; without even the implied warranty of
jpbarraca 0:41db3ed6754d 9 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
jpbarraca 0:41db3ed6754d 10 GNU General Public License for more details.
jpbarraca 0:41db3ed6754d 11
jpbarraca 0:41db3ed6754d 12 Author: Joao Paulo Barraca <jpbarraca@gmail.com>
jpbarraca 0:41db3ed6754d 13 */
jpbarraca 0:41db3ed6754d 14
jpbarraca 0:41db3ed6754d 15 #include "mbed.h"
jpbarraca 0:41db3ed6754d 16 #include "Sampler.h"
jpbarraca 0:41db3ed6754d 17
jpbarraca 0:41db3ed6754d 18 #define SUMP_RESET 0x00
jpbarraca 0:41db3ed6754d 19 #define SUMP_ARM 0x01
jpbarraca 0:41db3ed6754d 20 #define SUMP_QUERY 0x02
jpbarraca 0:41db3ed6754d 21 #define SUMP_TEST 0x03
jpbarraca 0:41db3ed6754d 22 #define SUMP_GET_METADATA 0x04
jpbarraca 0:41db3ed6754d 23 #define SUMP_RLE_FINISH 0x05
jpbarraca 0:41db3ed6754d 24 #define SUMP_XON 0x11
jpbarraca 0:41db3ed6754d 25 #define SUMP_XOFF 0x13
jpbarraca 0:41db3ed6754d 26 #define SUMP_SET_TRIGGER_MASK 0xC0
jpbarraca 0:41db3ed6754d 27 #define SUMP_SET_TRIGGER_VALUES 0xC1
jpbarraca 0:41db3ed6754d 28 #define SUMP_SET_TRIGGER_CONF 0xC2
jpbarraca 0:41db3ed6754d 29 #define SUMP_SET_DIVIDER 0x80
jpbarraca 0:41db3ed6754d 30 #define SUMP_SET_READ_DELAY_COUNT 0x81
jpbarraca 0:41db3ed6754d 31 #define SUMP_SET_FLAGS 0x82
jpbarraca 0:41db3ed6754d 32
jpbarraca 0:41db3ed6754d 33
jpbarraca 0:41db3ed6754d 34 #define BYTE1(v) ((uint8_t)v & 0xff) //LSB
jpbarraca 0:41db3ed6754d 35 #define BYTE2(v) ((uint8_t)(v >> 8) & 0xff) //
jpbarraca 0:41db3ed6754d 36 #define BYTE3(v) ((uint8_t)(v >> 16) & 0xff) //
jpbarraca 0:41db3ed6754d 37 #define BYTE4(v) ((uint8_t)(v >> 24) & 0xff) //MSB
jpbarraca 0:41db3ed6754d 38
jpbarraca 0:41db3ed6754d 39 #define printChar(v) pc.putc(v); while(!pc.writeable());
jpbarraca 0:41db3ed6754d 40
jpbarraca 0:41db3ed6754d 41 #define printUInt(v)\
jpbarraca 0:41db3ed6754d 42 printChar(BYTE4(v));\
jpbarraca 0:41db3ed6754d 43 printChar(BYTE3(v));\
jpbarraca 0:41db3ed6754d 44 printChar(BYTE2(v));\
jpbarraca 0:41db3ed6754d 45 printChar(BYTE1(v));
jpbarraca 0:41db3ed6754d 46
jpbarraca 0:41db3ed6754d 47
jpbarraca 0:41db3ed6754d 48 #define printString(v)\
jpbarraca 0:41db3ed6754d 49 for(unsigned int i =0;i<strlen(v);i++) printChar(v[i]);
jpbarraca 0:41db3ed6754d 50
jpbarraca 0:41db3ed6754d 51 Serial pc(USBTX, USBRX);
jpbarraca 0:41db3ed6754d 52 DigitalOut led(LED2);
jpbarraca 0:41db3ed6754d 53 Sampler sampler(&pc);
jpbarraca 0:41db3ed6754d 54
jpbarraca 0:41db3ed6754d 55 inline void blink(unsigned int onTime,unsigned int offTime, unsigned int num){
jpbarraca 0:41db3ed6754d 56 for(unsigned int i=0;i<num;i++){
jpbarraca 0:41db3ed6754d 57 led = 1;
jpbarraca 0:41db3ed6754d 58 wait_ms(onTime);
jpbarraca 0:41db3ed6754d 59 led = 0;
jpbarraca 0:41db3ed6754d 60 wait_ms(offTime);
jpbarraca 0:41db3ed6754d 61 }
jpbarraca 0:41db3ed6754d 62 }
jpbarraca 0:41db3ed6754d 63
jpbarraca 0:41db3ed6754d 64 void handleSerial()
jpbarraca 0:41db3ed6754d 65 {
jpbarraca 0:41db3ed6754d 66 uint8_t cmd_buffer[5];
jpbarraca 0:41db3ed6754d 67 uint8_t cmd_index = 0;
jpbarraca 0:41db3ed6754d 68 memset(cmd_buffer, 0, sizeof(cmd_buffer));
jpbarraca 0:41db3ed6754d 69
jpbarraca 0:41db3ed6754d 70 led = 0;
jpbarraca 0:41db3ed6754d 71
jpbarraca 0:41db3ed6754d 72 //Looping through the serial.
jpbarraca 0:41db3ed6754d 73 while (1) {
jpbarraca 0:41db3ed6754d 74 led = 0;
jpbarraca 0:41db3ed6754d 75
jpbarraca 0:41db3ed6754d 76 while(!pc.readable());
jpbarraca 0:41db3ed6754d 77
jpbarraca 0:41db3ed6754d 78 led = 1;
jpbarraca 0:41db3ed6754d 79 cmd_buffer[cmd_index] = pc.getc();
jpbarraca 0:41db3ed6754d 80 switch(cmd_buffer[0]) {
jpbarraca 0:41db3ed6754d 81 case SUMP_RESET : {
jpbarraca 0:41db3ed6754d 82 break;
jpbarraca 0:41db3ed6754d 83 }
jpbarraca 0:41db3ed6754d 84 case SUMP_QUERY: {
jpbarraca 0:41db3ed6754d 85 printString("1ALS");
jpbarraca 0:41db3ed6754d 86 break;
jpbarraca 0:41db3ed6754d 87 }
jpbarraca 0:41db3ed6754d 88 case SUMP_GET_METADATA: {
jpbarraca 0:41db3ed6754d 89 uint32_t bufferSize = sampler.getBufferSize();
jpbarraca 0:41db3ed6754d 90 uint32_t maxFrequency = sampler.getMaxFrequency();
jpbarraca 0:41db3ed6754d 91
jpbarraca 0:41db3ed6754d 92 while(!pc.writeable());
jpbarraca 0:41db3ed6754d 93 //NAME
jpbarraca 0:41db3ed6754d 94 printChar(0x01);
jpbarraca 0:41db3ed6754d 95 printString("LogicalNucleo");
jpbarraca 0:41db3ed6754d 96 printChar(0x00);
jpbarraca 0:41db3ed6754d 97
jpbarraca 0:41db3ed6754d 98 //SAMPLE MEM
jpbarraca 0:41db3ed6754d 99 printChar(0x21);
jpbarraca 0:41db3ed6754d 100 printUInt(bufferSize);
jpbarraca 0:41db3ed6754d 101
jpbarraca 0:41db3ed6754d 102 //DYNAMIC MEM
jpbarraca 0:41db3ed6754d 103 printChar(0x22);
jpbarraca 0:41db3ed6754d 104 printUInt(0);
jpbarraca 0:41db3ed6754d 105
jpbarraca 0:41db3ed6754d 106 //SAMPLE RATE
jpbarraca 0:41db3ed6754d 107 printChar(0x23);
jpbarraca 0:41db3ed6754d 108 printUInt(maxFrequency);
jpbarraca 0:41db3ed6754d 109
jpbarraca 0:41db3ed6754d 110 //Number of Probes
jpbarraca 0:41db3ed6754d 111 printChar(0x40);
jpbarraca 0:41db3ed6754d 112 printChar(0x08);
jpbarraca 0:41db3ed6754d 113
jpbarraca 0:41db3ed6754d 114 //Protocol Version
jpbarraca 0:41db3ed6754d 115 printChar(0x41);
jpbarraca 0:41db3ed6754d 116 printChar(0x02);
jpbarraca 0:41db3ed6754d 117
jpbarraca 0:41db3ed6754d 118 //END
jpbarraca 0:41db3ed6754d 119 printChar(0x00);
jpbarraca 0:41db3ed6754d 120 break;
jpbarraca 0:41db3ed6754d 121 }
jpbarraca 0:41db3ed6754d 122 case SUMP_TEST:{
jpbarraca 0:41db3ed6754d 123 sampler.runTest();
jpbarraca 0:41db3ed6754d 124 break;
jpbarraca 0:41db3ed6754d 125 }
jpbarraca 0:41db3ed6754d 126 case SUMP_ARM: {
jpbarraca 0:41db3ed6754d 127 sampler.arm();
jpbarraca 0:41db3ed6754d 128 break;
jpbarraca 0:41db3ed6754d 129 }
jpbarraca 0:41db3ed6754d 130 case SUMP_XON: {
jpbarraca 0:41db3ed6754d 131 sampler.start();
jpbarraca 0:41db3ed6754d 132 break;
jpbarraca 0:41db3ed6754d 133 }
jpbarraca 0:41db3ed6754d 134 case SUMP_XOFF: {
jpbarraca 0:41db3ed6754d 135 sampler.stop();
jpbarraca 0:41db3ed6754d 136 break;
jpbarraca 0:41db3ed6754d 137 }
jpbarraca 0:41db3ed6754d 138 case SUMP_SET_READ_DELAY_COUNT: {
jpbarraca 0:41db3ed6754d 139 cmd_index ++;
jpbarraca 0:41db3ed6754d 140 if(cmd_index < 5)
jpbarraca 0:41db3ed6754d 141 continue;
jpbarraca 0:41db3ed6754d 142
jpbarraca 0:41db3ed6754d 143 uint16_t readCount = 1 + *((uint16_t*)(cmd_buffer + 1));
jpbarraca 0:41db3ed6754d 144 uint16_t delayCount = * ((uint16_t*)(cmd_buffer + 3));
jpbarraca 0:41db3ed6754d 145 sampler.setSampleNumber(4 * readCount);
jpbarraca 0:41db3ed6754d 146 sampler.setSamplingDelay(4 * delayCount);
jpbarraca 0:41db3ed6754d 147 break;
jpbarraca 0:41db3ed6754d 148 }
jpbarraca 0:41db3ed6754d 149 case SUMP_SET_DIVIDER: {
jpbarraca 0:41db3ed6754d 150 cmd_index ++;
jpbarraca 0:41db3ed6754d 151 if(cmd_index < 5)
jpbarraca 0:41db3ed6754d 152 continue;
jpbarraca 0:41db3ed6754d 153
jpbarraca 0:41db3ed6754d 154 uint32_t divider = *((uint32_t *)(cmd_buffer + 1));
jpbarraca 0:41db3ed6754d 155 sampler.setSamplingDivider(divider);
jpbarraca 0:41db3ed6754d 156 break;
jpbarraca 0:41db3ed6754d 157 }
jpbarraca 0:41db3ed6754d 158 case SUMP_SET_TRIGGER_MASK:{
jpbarraca 0:41db3ed6754d 159 cmd_index ++;
jpbarraca 0:41db3ed6754d 160 if(cmd_index < 5)
jpbarraca 0:41db3ed6754d 161 continue;
jpbarraca 0:41db3ed6754d 162 sampler.setTriggerMask(*(uint32_t *)(cmd_buffer + 1));
jpbarraca 0:41db3ed6754d 163 break;
jpbarraca 0:41db3ed6754d 164 }
jpbarraca 0:41db3ed6754d 165 case SUMP_SET_TRIGGER_VALUES:{
jpbarraca 0:41db3ed6754d 166 cmd_index ++;
jpbarraca 0:41db3ed6754d 167 if(cmd_index < 5)
jpbarraca 0:41db3ed6754d 168 continue;
jpbarraca 0:41db3ed6754d 169
jpbarraca 0:41db3ed6754d 170 sampler.setTriggerValue(*(uint32_t *)(cmd_buffer + 1));
jpbarraca 0:41db3ed6754d 171 break;
jpbarraca 0:41db3ed6754d 172 }
jpbarraca 0:41db3ed6754d 173 case SUMP_SET_TRIGGER_CONF:{
jpbarraca 0:41db3ed6754d 174 cmd_index ++;
jpbarraca 0:41db3ed6754d 175 if(cmd_index < 5)
jpbarraca 0:41db3ed6754d 176 continue;
jpbarraca 0:41db3ed6754d 177
jpbarraca 0:41db3ed6754d 178 uint8_t serial = (*((uint8_t*)(cmd_buffer + 4)) & 0x04) > 0 ? 1 : 0;
jpbarraca 0:41db3ed6754d 179 uint8_t state = (*((uint8_t*)(cmd_buffer + 4)) & 0x08) > 0 ? 1 : 0;
jpbarraca 0:41db3ed6754d 180
jpbarraca 0:41db3ed6754d 181 if(serial == 1)
jpbarraca 0:41db3ed6754d 182 sampler.setTriggerState(0);//Not supported
jpbarraca 0:41db3ed6754d 183 else
jpbarraca 0:41db3ed6754d 184 sampler.setTriggerState(state);
jpbarraca 0:41db3ed6754d 185
jpbarraca 0:41db3ed6754d 186 break;
jpbarraca 0:41db3ed6754d 187 }
jpbarraca 0:41db3ed6754d 188 case SUMP_SET_FLAGS:{
jpbarraca 0:41db3ed6754d 189 cmd_index ++;
jpbarraca 0:41db3ed6754d 190 if(cmd_index < 5)
jpbarraca 0:41db3ed6754d 191 continue;
jpbarraca 0:41db3ed6754d 192
jpbarraca 0:41db3ed6754d 193 sampler.setFlags(*(uint32_t *)(cmd_buffer + 1));
jpbarraca 0:41db3ed6754d 194 break;
jpbarraca 0:41db3ed6754d 195 }
jpbarraca 0:41db3ed6754d 196 default: {
jpbarraca 0:41db3ed6754d 197 }
jpbarraca 0:41db3ed6754d 198 }
jpbarraca 0:41db3ed6754d 199
jpbarraca 0:41db3ed6754d 200 cmd_index = 0;
jpbarraca 0:41db3ed6754d 201 memset(cmd_buffer, 0, sizeof(cmd_buffer));
jpbarraca 0:41db3ed6754d 202 }
jpbarraca 0:41db3ed6754d 203 }
jpbarraca 0:41db3ed6754d 204
jpbarraca 0:41db3ed6754d 205
jpbarraca 0:41db3ed6754d 206
jpbarraca 0:41db3ed6754d 207 int main()
jpbarraca 0:41db3ed6754d 208 {
jpbarraca 0:41db3ed6754d 209 pc.baud(115200);
jpbarraca 0:41db3ed6754d 210
jpbarraca 0:41db3ed6754d 211 //Flush it
jpbarraca 0:41db3ed6754d 212 while(pc.readable() == 1)
jpbarraca 0:41db3ed6754d 213 pc.getc();
jpbarraca 0:41db3ed6754d 214
jpbarraca 0:41db3ed6754d 215 blink(50,100,5);
jpbarraca 0:41db3ed6754d 216
jpbarraca 0:41db3ed6754d 217 handleSerial();
jpbarraca 0:41db3ed6754d 218 }