fork of what I have been writing

Dependencies:   Crypto

Committer:
kubitz
Date:
Sun Mar 01 16:07:53 2020 +0000
Revision:
8:c30a4106d08c
Parent:
7:aef5b29d7a7c
Child:
9:4135d0c8dc10
added case for decode function in thread_processor

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kubitz 5:de6430aee646 1
kubitz 0:19fd8c1944fb 2 #include "mbed.h"
kubitz 0:19fd8c1944fb 3 #include "SHA256.h"
kubitz 6:5f4a954cb8bc 4 #include "rtos.h"
kubitz 7:aef5b29d7a7c 5 #include<string.h>
kubitz 7:aef5b29d7a7c 6
kubitz 6:5f4a954cb8bc 7 typedef struct {
kubitz 6:5f4a954cb8bc 8 uint8_t hash[32]; /* hash of successful nonce */
kubitz 6:5f4a954cb8bc 9 } mail_t;
kubitz 8:c30a4106d08c 10
kubitz 8:c30a4106d08c 11
kubitz 0:19fd8c1944fb 12 Timer timer_nonce;
kubitz 7:aef5b29d7a7c 13 Mail<mail_t, 16> crypto_mail;
kubitz 7:aef5b29d7a7c 14 Mail<uint8_t, 8> inCharQ;
kubitz 7:aef5b29d7a7c 15 RawSerial pc;
kubitz 6:5f4a954cb8bc 16 Thread thread_crypto;
kubitz 7:aef5b29d7a7c 17 Thread thread_processor;
kubitz 0:19fd8c1944fb 18
kubitz 3:8443825642d1 19
kubitz 0:19fd8c1944fb 20 uint8_t sequence[] = {0x45,0x6D,0x62,0x65,0x64,0x64,0x65,0x64,
kubitz 0:19fd8c1944fb 21 0x20,0x53,0x79,0x73,0x74,0x65,0x6D,0x73,
kubitz 0:19fd8c1944fb 22 0x20,0x61,0x72,0x65,0x20,0x66,0x75,0x6E,
kubitz 0:19fd8c1944fb 23 0x20,0x61,0x6E,0x64,0x20,0x64,0x6F,0x20,
kubitz 0:19fd8c1944fb 24 0x61,0x77,0x65,0x73,0x6F,0x6D,0x65,0x20,
kubitz 0:19fd8c1944fb 25 0x74,0x68,0x69,0x6E,0x67,0x73,0x21,0x20,
kubitz 0:19fd8c1944fb 26 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
kubitz 0:19fd8c1944fb 27 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
kubitz 0:19fd8c1944fb 28 uint64_t* key = (uint64_t*)&sequence[48];
kubitz 0:19fd8c1944fb 29 uint64_t* nonce = (uint64_t*)&sequence[56];
kubitz 0:19fd8c1944fb 30 uint32_t successful_nonce = 0;
kubitz 0:19fd8c1944fb 31 uint32_t last_nonce_number = 0;
kubitz 5:de6430aee646 32
kubitz 0:19fd8c1944fb 33 uint8_t hash[32];
kubitz 8:c30a4106d08c 34 // Max size of serial input is 49 + Null character
kubitz 8:c30a4106d08c 35 char serial_input[50];
kubitz 8:c30a4106d08c 36
kubitz 0:19fd8c1944fb 37 uint32_t previous_time;
kubitz 0:19fd8c1944fb 38 //Photointerrupter input pins
kubitz 0:19fd8c1944fb 39 #define I1pin D3
kubitz 0:19fd8c1944fb 40 #define I2pin D6
kubitz 0:19fd8c1944fb 41 #define I3pin D5
kubitz 0:19fd8c1944fb 42
kubitz 0:19fd8c1944fb 43 //Incremental encoder input pins
kubitz 0:19fd8c1944fb 44 #define CHApin D12
kubitz 0:19fd8c1944fb 45 #define CHBpin D11
kubitz 0:19fd8c1944fb 46
kubitz 0:19fd8c1944fb 47 //Motor Drive output pins //Mask in output byte
kubitz 0:19fd8c1944fb 48 #define L1Lpin D1 //0x01
kubitz 0:19fd8c1944fb 49 #define L1Hpin A3 //0x02
kubitz 0:19fd8c1944fb 50 #define L2Lpin D0 //0x04
kubitz 0:19fd8c1944fb 51 #define L2Hpin A6 //0x08
kubitz 0:19fd8c1944fb 52 #define L3Lpin D10 //0x10
kubitz 0:19fd8c1944fb 53 #define L3Hpin D2 //0x20
kubitz 0:19fd8c1944fb 54
kubitz 0:19fd8c1944fb 55 #define PWMpin D9
kubitz 0:19fd8c1944fb 56
kubitz 0:19fd8c1944fb 57 //Motor current sense
kubitz 0:19fd8c1944fb 58 #define MCSPpin A1
kubitz 0:19fd8c1944fb 59 #define MCSNpin A0
kubitz 0:19fd8c1944fb 60
kubitz 0:19fd8c1944fb 61 //Test outputs
kubitz 0:19fd8c1944fb 62 #define TP0pin D4
kubitz 0:19fd8c1944fb 63 #define TP1pin D13
kubitz 0:19fd8c1944fb 64 #define TP2pin A2
kubitz 0:19fd8c1944fb 65
kubitz 0:19fd8c1944fb 66 //Mapping from sequential drive states to motor phase outputs
kubitz 0:19fd8c1944fb 67 /*
kubitz 0:19fd8c1944fb 68 State L1 L2 L3
kubitz 0:19fd8c1944fb 69 0 H - L
kubitz 0:19fd8c1944fb 70 1 - H L
kubitz 0:19fd8c1944fb 71 2 L H -
kubitz 0:19fd8c1944fb 72 3 L - H
kubitz 0:19fd8c1944fb 73 4 - L H
kubitz 0:19fd8c1944fb 74 5 H L -
kubitz 0:19fd8c1944fb 75 6 - - -
kubitz 0:19fd8c1944fb 76 7 - - -
kubitz 0:19fd8c1944fb 77 */
kubitz 0:19fd8c1944fb 78 //Drive state to output table
kubitz 0:19fd8c1944fb 79 const int8_t driveTable[] = {0x12,0x18,0x09,0x21,0x24,0x06,0x00,0x00};
kubitz 0:19fd8c1944fb 80
kubitz 0:19fd8c1944fb 81 //Mapping from interrupter inputs to sequential rotor states. 0x00 and 0x07 are not valid
kubitz 0:19fd8c1944fb 82 const int8_t stateMap[] = {0x07,0x05,0x03,0x04,0x01,0x00,0x02,0x07};
kubitz 0:19fd8c1944fb 83 //const int8_t stateMap[] = {0x07,0x01,0x03,0x02,0x05,0x00,0x04,0x07}; //Alternative if phase order of input or drive is reversed
kubitz 0:19fd8c1944fb 84
kubitz 0:19fd8c1944fb 85 //Phase lead to make motor spin
kubitz 0:19fd8c1944fb 86 const int8_t lead = 2; //2 for forwards, -2 for backwards
kubitz 0:19fd8c1944fb 87
kubitz 0:19fd8c1944fb 88 //Status LED
kubitz 0:19fd8c1944fb 89 DigitalOut led1(LED1);
kubitz 0:19fd8c1944fb 90
kubitz 0:19fd8c1944fb 91 //Photointerrupter inputs
kubitz 0:19fd8c1944fb 92 InterruptIn I1(I1pin);
kubitz 0:19fd8c1944fb 93 InterruptIn I2(I2pin);
kubitz 0:19fd8c1944fb 94 InterruptIn I3(I3pin);
kubitz 0:19fd8c1944fb 95
kubitz 0:19fd8c1944fb 96 //Motor Drive outputs
kubitz 0:19fd8c1944fb 97 DigitalOut L1L(L1Lpin);
kubitz 0:19fd8c1944fb 98 DigitalOut L1H(L1Hpin);
kubitz 0:19fd8c1944fb 99 DigitalOut L2L(L2Lpin);
kubitz 0:19fd8c1944fb 100 DigitalOut L2H(L2Hpin);
kubitz 0:19fd8c1944fb 101 DigitalOut L3L(L3Lpin);
kubitz 0:19fd8c1944fb 102 DigitalOut L3H(L3Hpin);
kubitz 0:19fd8c1944fb 103
kubitz 0:19fd8c1944fb 104 DigitalOut TP1(TP1pin);
kubitz 0:19fd8c1944fb 105 PwmOut MotorPWM(PWMpin);
kubitz 0:19fd8c1944fb 106
kubitz 0:19fd8c1944fb 107 int8_t orState = 0; //Rotot offset at motor state 0
kubitz 0:19fd8c1944fb 108 int8_t intState = 0;
kubitz 0:19fd8c1944fb 109 int8_t intStateOld = 0;
kubitz 0:19fd8c1944fb 110
kubitz 0:19fd8c1944fb 111
kubitz 0:19fd8c1944fb 112 //Set a given drive state
kubitz 0:19fd8c1944fb 113 void motorOut(int8_t driveState){
kubitz 0:19fd8c1944fb 114
kubitz 0:19fd8c1944fb 115 //Lookup the output byte from the drive state.
kubitz 0:19fd8c1944fb 116 int8_t driveOut = driveTable[driveState & 0x07];
kubitz 0:19fd8c1944fb 117
kubitz 0:19fd8c1944fb 118 //Turn off first
kubitz 0:19fd8c1944fb 119 if (~driveOut & 0x01) L1L = 0;
kubitz 0:19fd8c1944fb 120 if (~driveOut & 0x02) L1H = 1;
kubitz 0:19fd8c1944fb 121 if (~driveOut & 0x04) L2L = 0;
kubitz 0:19fd8c1944fb 122 if (~driveOut & 0x08) L2H = 1;
kubitz 0:19fd8c1944fb 123 if (~driveOut & 0x10) L3L = 0;
kubitz 0:19fd8c1944fb 124 if (~driveOut & 0x20) L3H = 1;
kubitz 0:19fd8c1944fb 125
kubitz 0:19fd8c1944fb 126 //Then turn on
kubitz 0:19fd8c1944fb 127 if (driveOut & 0x01) L1L = 1;
kubitz 0:19fd8c1944fb 128 if (driveOut & 0x02) L1H = 0;
kubitz 0:19fd8c1944fb 129 if (driveOut & 0x04) L2L = 1;
kubitz 0:19fd8c1944fb 130 if (driveOut & 0x08) L2H = 0;
kubitz 0:19fd8c1944fb 131 if (driveOut & 0x10) L3L = 1;
kubitz 0:19fd8c1944fb 132 if (driveOut & 0x20) L3H = 0;
kubitz 0:19fd8c1944fb 133 }
kubitz 0:19fd8c1944fb 134
kubitz 0:19fd8c1944fb 135 //Convert photointerrupter inputs to a rotor state
kubitz 0:19fd8c1944fb 136 inline int8_t readRotorState(){
kubitz 0:19fd8c1944fb 137 return stateMap[I1 + 2*I2 + 4*I3];
kubitz 0:19fd8c1944fb 138 }
kubitz 0:19fd8c1944fb 139
kubitz 0:19fd8c1944fb 140 //Basic synchronisation routine
kubitz 0:19fd8c1944fb 141 int8_t motorHome() {
kubitz 0:19fd8c1944fb 142 //Put the motor in drive state 0 and wait for it to stabilise
kubitz 0:19fd8c1944fb 143 motorOut(0);
kubitz 0:19fd8c1944fb 144 wait(2.0);
kubitz 0:19fd8c1944fb 145
kubitz 0:19fd8c1944fb 146 //Get the rotor state
kubitz 0:19fd8c1944fb 147 return readRotorState();
kubitz 0:19fd8c1944fb 148 }
kubitz 0:19fd8c1944fb 149
kubitz 0:19fd8c1944fb 150 void move() {
kubitz 0:19fd8c1944fb 151 intState = readRotorState();
kubitz 0:19fd8c1944fb 152 motorOut((intState-orState+lead+6)%6); //+6 to make sure the remainder is positive
kubitz 0:19fd8c1944fb 153 intStateOld = intState;
kubitz 0:19fd8c1944fb 154 }
kubitz 0:19fd8c1944fb 155
kubitz 6:5f4a954cb8bc 156 // Thread to print successful Hashes
kubitz 7:aef5b29d7a7c 157 void thread_crypto_print() {
kubitz 6:5f4a954cb8bc 158 while (true) {
kubitz 7:aef5b29d7a7c 159 osEvent evt = crypto_mail.get();
kubitz 6:5f4a954cb8bc 160 if (evt.status == osEventMail) {
kubitz 6:5f4a954cb8bc 161 mail_t *mail = (mail_t*)evt.value.p;
kubitz 6:5f4a954cb8bc 162 for (int i = 0; i < 32; i++)
kubitz 7:aef5b29d7a7c 163 printf("%02x", mail->hash[i]);
kubitz 7:aef5b29d7a7c 164 printf("\n");
kubitz 7:aef5b29d7a7c 165 crypto_mail.free(mail);
kubitz 6:5f4a954cb8bc 166 }
kubitz 6:5f4a954cb8bc 167 }
kubitz 6:5f4a954cb8bc 168 }
kubitz 6:5f4a954cb8bc 169
kubitz 7:aef5b29d7a7c 170 // Thread processor raw serial inputs:
kubitz 7:aef5b29d7a7c 171 void thread_processor(){
kubitz 8:c30a4106d08c 172 uint8_t index = 0;
kubitz 7:aef5b29d7a7c 173 while(true) {
kubitz 7:aef5b29d7a7c 174 osEvent newEvent = inCharQ.get();
kubitz 7:aef5b29d7a7c 175 if (evt.status == osEventMail){
kubitz 7:aef5b29d7a7c 176 uint8_t* newChar = (uint8_t*)newEvent.value.p;
kubitz 7:aef5b29d7a7c 177 //Store the new character
kubitz 8:c30a4106d08c 178 serial_input[index] = *newChar;
kubitz 7:aef5b29d7a7c 179 inCharQ.free(newChar);
kubitz 7:aef5b29d7a7c 180 }
kubitz 7:aef5b29d7a7c 181 //Decode the command if it is complete
kubitz 8:c30a4106d08c 182 if (serial_input[index]=='\r'){
kubitz 8:c30a4106d08c 183 char command_type;
kubitz 8:c30a4106d08c 184 *command_type = serial_input[0];
kubitz 8:c30a4106d08c 185
kubitz 8:c30a4106d08c 186 switch(command_type){
kubitz 8:c30a4106d08c 187 case 'R':
kubitz 8:c30a4106d08c 188 // Rotation command
kubitz 8:c30a4106d08c 189 break;
kubitz 8:c30a4106d08c 190
kubitz 8:c30a4106d08c 191 case 'V':
kubitz 8:c30a4106d08c 192 // Speed command
kubitz 8:c30a4106d08c 193 break;
kubitz 8:c30a4106d08c 194
kubitz 8:c30a4106d08c 195 case 'K':
kubitz 8:c30a4106d08c 196 // Bitcoin key command
kubitz 8:c30a4106d08c 197 break;
kubitz 8:c30a4106d08c 198
kubitz 8:c30a4106d08c 199 case 'T':
kubitz 8:c30a4106d08c 200 // Melody command
kubitz 8:c30a4106d08c 201 break;
kubitz 8:c30a4106d08c 202
kubitz 8:c30a4106d08c 203 default:
kubitz 8:c30a4106d08c 204 // Out of format input
kubitz 8:c30a4106d08c 205 printf("Wrong input command - please try again");
kubitz 8:c30a4106d08c 206 }
kubitz 8:c30a4106d08c 207
kubitz 8:c30a4106d08c 208 }
kubitz 8:c30a4106d08c 209 index++;
kubitz 7:aef5b29d7a7c 210 }
kubitz 7:aef5b29d7a7c 211 }
kubitz 7:aef5b29d7a7c 212
kubitz 6:5f4a954cb8bc 213 // Put message in Mail box
kubitz 7:aef5b29d7a7c 214 void putMessage(uint8_t* hash){
kubitz 7:aef5b29d7a7c 215 mail_t *mail = crypto_mail.alloc();
kubitz 7:aef5b29d7a7c 216
kubitz 7:aef5b29d7a7c 217 for(int loop = 0; loop < 32; loop++) {
kubitz 7:aef5b29d7a7c 218 mail->hash[loop] = hash[loop];
kubitz 7:aef5b29d7a7c 219 }
kubitz 7:aef5b29d7a7c 220 crypto_mail.put(mail);
kubitz 7:aef5b29d7a7c 221 }
kubitz 7:aef5b29d7a7c 222 // ISR routine to get charachter from Serial command
kubitz 7:aef5b29d7a7c 223 void serialISR(){
kubitz 8:c30a4106d08c 224 uint8_t* newChar = inCharQ.alloc();
kubitz 8:c30a4106d08c 225 *newChar = pc.getc();
kubitz 8:c30a4106d08c 226 inCharQ.put(newChar);
kubitz 7:aef5b29d7a7c 227 }
kubitz 7:aef5b29d7a7c 228 // Attach interrupt routine on received character
kubitz 7:aef5b29d7a7c 229 pc.attach(&serialISR);
kubitz 6:5f4a954cb8bc 230
kubitz 0:19fd8c1944fb 231 //Main
kubitz 0:19fd8c1944fb 232 int main() {
kubitz 0:19fd8c1944fb 233
kubitz 0:19fd8c1944fb 234 const int32_t PWM_PRD = 2500;
kubitz 0:19fd8c1944fb 235 MotorPWM.period_us(PWM_PRD);
kubitz 0:19fd8c1944fb 236 MotorPWM.pulsewidth_us(PWM_PRD);
kubitz 0:19fd8c1944fb 237
kubitz 0:19fd8c1944fb 238 //Initialise the serial port
kubitz 7:aef5b29d7a7c 239 RawSerial pc(SERIAL_TX, SERIAL_RX);
kubitz 0:19fd8c1944fb 240 pc.printf("Hello\n\r");
kubitz 0:19fd8c1944fb 241
kubitz 0:19fd8c1944fb 242 //Run the motor synchronisation
kubitz 0:19fd8c1944fb 243 orState = motorHome();
kubitz 0:19fd8c1944fb 244 pc.printf("Rotor origin: %x\n\r",orState);
kubitz 0:19fd8c1944fb 245
kubitz 0:19fd8c1944fb 246 I1.rise(&move);
kubitz 0:19fd8c1944fb 247 I1.fall(&move);
kubitz 0:19fd8c1944fb 248 I2.rise(&move);
kubitz 0:19fd8c1944fb 249 I2.fall(&move);
kubitz 0:19fd8c1944fb 250 I3.rise(&move);
kubitz 0:19fd8c1944fb 251 I3.fall(&move);
kubitz 0:19fd8c1944fb 252 timer_nonce.start();
kubitz 5:de6430aee646 253 pc.printf("time is %d\n\r", timer_nonce.read_ms());
kubitz 5:de6430aee646 254 pc.printf("time is %d\n\r", (timer_nonce.read_ms()-previous_time));
kubitz 8:c30a4106d08c 255
kubitz 7:aef5b29d7a7c 256 thread_crypto.start(thread_crypto_print);
kubitz 7:aef5b29d7a7c 257 thread_processor.start(thread_processor);
kubitz 5:de6430aee646 258 while (1){
kubitz 5:de6430aee646 259
kubitz 5:de6430aee646 260 *nonce = *nonce + 1;
kubitz 5:de6430aee646 261
kubitz 0:19fd8c1944fb 262 SHA256::computeHash(hash, (uint8_t*)sequence, 64);
kubitz 5:de6430aee646 263
kubitz 0:19fd8c1944fb 264 if ((hash[0]==0)&&(hash[1]==0)){
kubitz 0:19fd8c1944fb 265 last_nonce_number = successful_nonce;
kubitz 0:19fd8c1944fb 266 successful_nonce++;
kubitz 6:5f4a954cb8bc 267 putMessage(hash);
kubitz 0:19fd8c1944fb 268 }
kubitz 5:de6430aee646 269
kubitz 5:de6430aee646 270 if ((timer_nonce.read_ms()-previous_time) > 1000){
kubitz 5:de6430aee646 271 pc.printf("Computation Rate: %lu computation /sec\n\r" , (*nonce-last_nonce_number));
kubitz 0:19fd8c1944fb 272 last_nonce_number = *nonce;
kubitz 5:de6430aee646 273 previous_time = timer_nonce.read_ms();
kubitz 5:de6430aee646 274
kubitz 0:19fd8c1944fb 275 }
kubitz 0:19fd8c1944fb 276
kubitz 0:19fd8c1944fb 277 }
kubitz 0:19fd8c1944fb 278
kubitz 0:19fd8c1944fb 279 return 0;
kubitz 0:19fd8c1944fb 280
kubitz 0:19fd8c1944fb 281 }
kubitz 0:19fd8c1944fb 282