![](/media/cache/group/default_image.jpg.50x50_q85.jpg)
Callum and Adel's changes on 12/02/19
Dependencies: Crypto
Diff: main.cpp
- Revision:
- 23:ab1cb51527d1
- Parent:
- 22:efa60ca0bfb7
- Child:
- 24:be5fef3dace1
diff -r efa60ca0bfb7 -r ab1cb51527d1 main.cpp --- a/main.cpp Sat Mar 16 13:27:17 2019 +0000 +++ b/main.cpp Sat Mar 16 14:06:41 2019 +0000 @@ -4,7 +4,7 @@ // #include "rtos.h" /*TODO: -Change +Change Indx newCmd MAXCMDLENGTH @@ -49,7 +49,7 @@ const int8_t driveTable[] = {0x12,0x18,0x09,0x21,0x24,0x06,0x00,0x00}; //Mapping from interrupter inputs to sequential rotor states. 0x00 and 0x07 are not valid -const int8_t stateMap[] = {0x07,0x05,0x03,0x04,0x01,0x00,0x02,0x07}; +const int8_t stateMap[] = {0x07,0x05,0x03,0x04,0x01,0x00,0x02,0x07}; //const int8_t stateMap[] = {0x07,0x01,0x03,0x02,0x05,0x00,0x04,0x07}; //Alternative if phase order of input or drive is reversed //Phase lead to make motor spin @@ -74,26 +74,26 @@ PwmOut pwmCtrl(PWMpin); /*//Declare and start threads class T_{ - + // protected: public: Thread *p_comm_in; Thread *p_comm_out; Thread *p_motor_ctrl; - - - + + + T_(){ - //(priority, stack size, + //(priority, stack size, Thread comm_in(osPriorityAboveNormal, 1024); Thread comm_out(osPriorityAboveNormal, 1024); Thread motor_ctrl(osPriorityAboveNormal, 1024); - + p_comm_in = &comm_in; p_comm_out = &comm_out; p_motor_ctrl = &motor_ctrl; - + } ~T_(){ @@ -107,300 +107,316 @@ };*/ class Comm /*: public T_*/{ - - public: + +public: + + Thread t_comm_out; + Thread t_motor_ctrl; + // Thread *p_motor_ctrl; - Thread t_comm_in; - Thread t_comm_out; - // Thread *p_motor_ctrl; - - bool _RUN; + bool _RUN; + + RawSerial pc; + // Queue<void, 8> inCharQ; // Input Character Queue + + + static const char MsgChar[11]; - RawSerial pc; - // Queue<void, 8> inCharQ; // Input Character Queue - + uint8_t MAXCMDLENGTH; + + volatile uint8_t cmdIndx; + volatile uint8_t inCharQIdx; - static const char MsgChar[11]; - - uint8_t MAXCMDLENGTH; - - volatile uint8_t cmdIndx; - volatile uint8_t inCharQIdx; + volatile uint32_t motorPower; // motor toque + volatile float targetVel; + volatile float targetRot; - volatile uint32_t motorPower; // motor toque - volatile float targetVel; - volatile float targetRot; + enum msgType {motorState, posIn, velIn, posOut, velOut, + + hashRate, keyAdded, nonceMatch, + + torque, rotations, - enum msgType {motorState, posIn, velIn, posOut, velOut, - - hashRate, keyAdded, nonceMatch, - - torque, rotations, - - error}; + error}; + + typedef struct { + msgType type; + uint32_t message; + } msg; + + Mail<msg, 32> mailStack; + + void serialISR(){ + if (pc.readable()) { + char newChar = pc.getc(); + // inCharQ.put((void*)newChar); // void* = pointer to an unknown type that cannot be dereferenced - typedef struct { - msgType type; - uint32_t message; - } msg; - - Mail<msg, 32> mailStack; - - void serialISR(){ - if (pc.readable()) { - char newChar = pc.getc(); - // inCharQ.put((void*)newChar); // void* = pointer to an unknown type that cannot be dereferenced - - if (inCharQIdx == (MAXCMDLENGTH)) { - inCharQ[MAXCMDLENGTH] = '\0'; // force the string to have an end character - putMessage(error, 1); - inCharQIdx = 0; // reset buffer index - // pc.putc('\r'); // carriage return moves to the start of the line - // for (int i = 0; i < MAXCMDLENGTH; ++i) - // { - // inCharQ[i] = ' '; - // pc.putc(' '); - // } - - // pc.putc('\r'); // carriage return moves to the start of the line + if (inCharQIdx == (MAXCMDLENGTH)) { + inCharQ[MAXCMDLENGTH] = '\0'; // force the string to have an end character + putMessage(error, 1); + inCharQIdx = 0; // reset buffer index + // pc.putc('\r'); // carriage return moves to the start of the line + // for (int i = 0; i < MAXCMDLENGTH; ++i) + // { + // inCharQ[i] = ' '; + // pc.putc(' '); + // } + + // pc.putc('\r'); // carriage return moves to the start of the line + } + else{ + if(newChar != '\r'){ //While the command is not over, + inCharQ[inCharQIdx] = newChar; //save input character and + inCharQIdx++; //advance index + pc.putc(newChar); } else{ - if(newChar != '\r'){ //While the command is not over, - inCharQ[inCharQIdx] = newChar; //save input character and - inCharQIdx++; //advance index - pc.putc(newChar); - } - else{ - inCharQ[inCharQIdx] = '\0'; //When the command is finally over, - strncpy(newCmd, inCharQ, MAXCMDLENGTH); // Will copy 18 characters from inCharQ to newCmd - cmdParser(); //parse the command for decoding. - for (int i = 0; i < MAXCMDLENGTH; ++i) // reset buffer - inCharQ[i] = ' '; - inCharQIdx = 0; // reset index - } - } - } - - - } - - /*void commInFn() { - // if (_RUN) - - while (_RUN) { - osEvent newEvent = inCharQ.get(); - uint8_t newChar = (uint8_t)(newEvent.value.p); // size_t to type cast the 64bit pointer properly - pc.putc(newChar); - if(cmdIndx >= MAXCMDLENGTH){ //Make sure there is no overflow in comand. - cmdIndx = 0; - putMessage(error, 1); + inCharQ[inCharQIdx] = '\0'; //When the command is finally over, + strncpy(newCmd, inCharQ, MAXCMDLENGTH); // Will copy 18 characters from inCharQ to newCmd + cmdParser(); //parse the command for decoding. + for (int i = 0; i < MAXCMDLENGTH; ++i) // reset buffer + inCharQ[i] = ' '; + inCharQIdx = 0; // reset index } - else{ - if(newChar != '\r'){ //While the command is not over, - newCmd[cmdIndx] = newChar; //save input character and - cmdIndx++; //advance index - } - else{ - newCmd[cmdIndx] = '\0'; //When the command is finally over, - cmdIndx = 0; //reset index and - cmdParser(); //parse the command for decoding. - } - } - } - }*/ - - void returnCursor() { - pc.putc('>'); - for (int i = 0; i < inCharQIdx; ++i) // reset cursor position - pc.putc(inCharQ[i]); - // for (int i = inCharQIdx; i < MAXCMDLENGTH; ++i) // fill remaining with blanks - // pc.putc(' '); - // pc.putc('<'); - } - - void cmdParser(){ - switch(newCmd[0]) { - case 'K': //(MsgChar[keyAdded]):// - newKey_mutex.lock(); //Ensure there is no deadlock - sscanf(newCmd, "K%x", &newKey); //Find desired the Key code - putMessage(keyAdded, newKey); //Print it out - newKey_mutex.unlock(); - break; - case 'V': //(MsgChar[velIn]):// - sscanf(newCmd, "V%f", &targetVel); //Find desired the target velocity - putMessage(velIn, targetVel); //Print it out - break; - case 'R': //(MsgChar[posIn]):// - sscanf(newCmd, "R%f", &targetRot); //Find desired target rotation - putMessage(posIn, targetRot); //Print it out - break; - case 'T': //(MsgChar[torque]):// - sscanf(newCmd, "T%d", &motorPower); //Find desired target torque - putMessage(torque, motorPower); //Print it out - break; - default: break; } } - //~~~~~Decode messages to print on serial port~~~~~ - void commOutFn() { - while (_RUN) { - osEvent newEvent = mailStack.get(); - msg *pMessage = (msg*)newEvent.value.p; + + } + + /*void commInFn() { + // if (_RUN) + + while (_RUN) { + osEvent newEvent = inCharQ.get(); + uint8_t newChar = (uint8_t)(newEvent.value.p); // size_t to type cast the 64bit pointer properly + pc.putc(newChar); + if(cmdIndx >= MAXCMDLENGTH){ //Make sure there is no overflow in comand. + cmdIndx = 0; + putMessage(error, 1); + } + else{ + if(newChar != '\r'){ //While the command is not over, + newCmd[cmdIndx] = newChar; //save input character and + cmdIndx++; //advance index + } + else{ + newCmd[cmdIndx] = '\0'; //When the command is finally over, + cmdIndx = 0; //reset index and + cmdParser(); //parse the command for decoding. + } + } + } + }*/ + + void returnCursor() { + pc.putc('>'); + for (int i = 0; i < inCharQIdx; ++i) // reset cursor position + pc.putc(inCharQ[i]); + // for (int i = inCharQIdx; i < MAXCMDLENGTH; ++i) // fill remaining with blanks + // pc.putc(' '); + // pc.putc('<'); + } + + void cmdParser(){ + switch(newCmd[0]) { + case 'K': //(MsgChar[keyAdded]):// + newKey_mutex.lock(); //Ensure there is no deadlock + sscanf(newCmd, "K%x", &newKey); //Find desired the Key code + putMessage(keyAdded, newKey); //Print it out + newKey_mutex.unlock(); + break; + case 'V': //(MsgChar[velIn]):// + sscanf(newCmd, "V%f", &targetVel); //Find desired the target velocity + putMessage(velIn, targetVel); //Print it out + break; + case 'R': //(MsgChar[posIn]):// + sscanf(newCmd, "R%f", &targetRot); //Find desired target rotation + putMessage(posIn, targetRot); //Print it out + break; + case 'T': //(MsgChar[torque]):// + sscanf(newCmd, "T%d", &motorPower); //Find desired target torque + putMessage(torque, motorPower); //Print it out + break; + default: break; + } + } - //Case switch to choose serial output based on incoming message - switch(pMessage->type) { - case motorState: - pc.printf("The motor is currently in state %x\n\r", pMessage->message); - break; - case hashRate: - pc.printf("\r>%s< Mining: %.4u Hash/s\r", inCharQ, (uint32_t)pMessage->message); - returnCursor(); - break; - case nonceMatch: - pc.printf("\r>%s< Nonce found: %x\r", inCharQ, pMessage->message); - returnCursor(); - break; - case keyAdded: - pc.printf("New Key Added:\t0x%016x\n\r", pMessage->message); - break; - case torque: - pc.printf("Motor Torque set to:\t%d\n\r", pMessage->message); - break; - case velIn: - pc.printf("Target Velocity set to:\t%.2f\n\r", targetVel); - break; - case velOut: - pc.printf("Current Velocity:\t%.2f\n\r", \ - (float)((int32_t)pMessage->message / 6)); - break; - case posIn: - pc.printf("Target Rotation set to:\t%.2f\n\r", \ - (float)((int32_t)pMessage->message / 6)); - break; - case posOut: - pc.printf("Current Position:\t%.2f\n\r", \ - (float)((int32_t)pMessage->message / 6)); - break; - case error: - pc.printf("\r>%s< Debugging position:%x\n\r", inCharQ, pMessage->message); - for (int i = 0; i < MAXCMDLENGTH; ++i) // reset buffer - inCharQ[i] = ' '; - break; - default: - pc.printf("Unknown Error. Message: %x\n\r", pMessage->message); - break; - } - mailStack.free(pMessage); + //~~~~~Decode messages to print on serial port~~~~~ + void commOutFn() { + while (_RUN) { + osEvent newEvent = mailStack.get(); + msg *pMessage = (msg *) newEvent.value.p; + + //Case switch to choose serial output based on incoming message + switch (pMessage->type) { + case motorState: + pc.printf("The motor is currently in state %x\n\r", pMessage->message); + break; + case hashRate: + pc.printf("\r>%s< Mining: %.4u Hash/s\r", inCharQ, (uint32_t) pMessage->message); + returnCursor(); + break; + case nonceMatch: + pc.printf("\r>%s< Nonce found: %x\r", inCharQ, pMessage->message); + returnCursor(); + break; + case keyAdded: + pc.printf("New Key Added:\t0x%016x\n\r", pMessage->message); + break; + case torque: + pc.printf("Motor Torque set to:\t%d\n\r", pMessage->message); + break; + case velIn: + pc.printf("Target Velocity set to:\t%.2f\n\r", targetVel); + break; + case velOut: + pc.printf("Current Velocity:\t%.2f\n\r", \ + (float) ((int32_t) pMessage->message / 6)); + break; + case posIn: + pc.printf("Target Rotation set to:\t%.2f\n\r", \ + (float) ((int32_t) pMessage->message / 6)); + break; + case posOut: + pc.printf("Current Position:\t%.2f\n\r", \ + (float) ((int32_t) pMessage->message / 6)); + break; + case error: + pc.printf("\r>%s< Debugging position:%x\n\r", inCharQ, pMessage->message); + for (int i = 0; i < MAXCMDLENGTH; ++i) // reset buffer + inCharQ[i] = ' '; + break; + default: + pc.printf("Unknown Error. Message: %x\n\r", pMessage->message); + break; } - } - - - //TODO: stop function, maybe use parent deconstructor - //void stop_comm{} - - // public: - - volatile uint64_t newKey; // hash key - Mutex newKey_mutex; // Restrict access to prevent deadlock. - - Comm() : pc(SERIAL_TX, SERIAL_RX), - t_comm_out(osPriorityAboveNormal, 1024) - { // inherit from the RawSerial constructor - - pc.printf("%s\n\r", "Welcome" ); - MAXCMDLENGTH = 18; + mailStack.free(pMessage); + } + } - // reset buffer - // MbedOS prints 'Embedded Systems are fun and do awesome things!' - // if you print a null terminator - pc.putc('>'); - for (int i = 0; i < MAXCMDLENGTH; ++i) { - inCharQ[i] = '.'; - pc.putc('.'); - } - pc.putc('<'); - pc.putc('\r'); - - inCharQ[MAXCMDLENGTH] = '\0'; - strncpy(newCmd, inCharQ, MAXCMDLENGTH); + // attach_us -> runs funtion every 100ms + void motorCtrlFn() { + Ticker motorCtrlTicker; + motorCtrlTicker.attach_us(callback(this,&Comm::motorCtrlTick), 1e5); + while (1) { + t_motor_ctrl.signal_wait((int32_t)0x1); + pc.printf("B4115"); + } + } - cmdIndx = 0; - - inCharQIdx = 0; - // inCharQIdx = MAXCMDLENGTH-1; - + void motorCtrlTick(){ + t_motor_ctrl.signal_set(0x1); + } - pc.attach(callback(this, &Comm::serialISR)); + //TODO: stop function, maybe use parent de-constructor + //void stop_comm{} + + // public: + + volatile uint64_t newKey; // hash key + Mutex newKey_mutex; // Restrict access to prevent deadlock. - // Thread t_comm_in(osPriorityAboveNormal, 1024); - // Thread t_comm_out(osPriorityAboveNormal, 1024); - // Thread t_motor_ctrl(osPriorityAboveNormal, 1024); - - motorPower = 300; - targetVel = 45.0; - targetRot = 459.0; + Comm() : pc(SERIAL_TX, SERIAL_RX), + t_comm_out(osPriorityAboveNormal, 1024), + t_motor_ctrl(osPriorityAboveNormal, 1024) + { // inherit from the RawSerial constructor - + pc.printf("%s\n\r", "Welcome" ); + MAXCMDLENGTH = 18; - /*MsgChar = {'m', 'R', 'V', 'r', 'v', - - 'h', 'K', 'n', - - 'T', 'r', - - 'e'};*/ + // reset buffer + // MbedOS prints 'Embedded Systems are fun and do awesome things!' + // if you print a null terminator + pc.putc('>'); + for (int i = 0; i < MAXCMDLENGTH; ++i) { + inCharQ[i] = '.'; + pc.putc('.'); } - - - void putMessage(msgType type, uint32_t message){ - msg *p_msg = mailStack.alloc(); - p_msg->type = type; - p_msg->message = message; - mailStack.put(p_msg); - } - - void start_comm(){ - _RUN = true; + pc.putc('<'); + pc.putc('\r'); + + inCharQ[MAXCMDLENGTH] = '\0'; + strncpy(newCmd, inCharQ, MAXCMDLENGTH); + + cmdIndx = 0; + + inCharQIdx = 0; + // inCharQIdx = MAXCMDLENGTH-1; + + + + pc.attach(callback(this, &Comm::serialISR)); + + // Thread t_comm_in(osPriorityAboveNormal, 1024); + // Thread t_comm_out(osPriorityAboveNormal, 1024); + // Thread t_motor_ctrl(osPriorityAboveNormal, 1024); + + motorPower = 300; + targetVel = 45.0; + targetRot = 459.0; + - // reset buffer - // MbedOS prints 'Embedded Systems are fun and do awesome things!' - // if you print a null terminator - pc.putc('>'); - for (int i = 0; i < MAXCMDLENGTH; ++i) { - inCharQ[i] = '.'; - pc.putc('.'); - } - pc.putc('<'); - pc.putc('\r'); - - inCharQ[MAXCMDLENGTH] = '\0'; - strncpy(newCmd, inCharQ, MAXCMDLENGTH); + /*MsgChar = {'m', 'R', 'V', 'r', 'v', + + 'h', 'K', 'n', + + 'T', 'r', + + 'e'};*/ + } + + + void putMessage(msgType type, uint32_t message){ + msg *p_msg = mailStack.alloc(); + p_msg->type = type; + p_msg->message = message; + mailStack.put(p_msg); + } + + void start_comm(){ + _RUN = true; + - // returnCursor(); - - // t_comm_in.start(callback(this, &Comm::commInFn)); - // this::thread::wait() - // wait(1.0); - t_comm_out.start(callback(this, &Comm::commOutFn)); + // reset buffer + // MbedOS prints 'Embedded Systems are fun and do awesome things!' + // if you print a null terminator + pc.putc('>'); + for (int i = 0; i < MAXCMDLENGTH; ++i) { + inCharQ[i] = '.'; + pc.putc('.'); + } + pc.putc('<'); + pc.putc('\r'); + + inCharQ[MAXCMDLENGTH] = '\0'; + strncpy(newCmd, inCharQ, MAXCMDLENGTH); - - } + // returnCursor(); - char newCmd[]; // because unallocated must be defined at the bottom of the class - char inCharQ[]; + // t_comm_in.start(callback(this, &Comm::commInFn)); + // this::thread::wait() + // wait(1.0); + t_comm_out.start(callback(this, &Comm::commOutFn)); + t_motor_ctrl.start(callback(this, &Comm::motorCtrlFn)); + + + } + + char newCmd[]; // because unallocated must be defined at the bottom of the class + char inCharQ[]; }; //Set a given drive state void motorOut(int8_t driveState){ - + //Lookup the output byte from the drive state. int8_t driveOut = driveTable[driveState & 0x07]; - + //Turn off first if (~driveOut & 0x01) L1L = 0; if (~driveOut & 0x02) L1H = 1; @@ -408,7 +424,7 @@ if (~driveOut & 0x08) L2H = 1; if (~driveOut & 0x10) L3L = 0; if (~driveOut & 0x20) L3H = 1; - + //Then turn on if (driveOut & 0x01) L1L = 1; if (driveOut & 0x02) L1H = 0; @@ -416,41 +432,41 @@ if (driveOut & 0x08) L2H = 0; if (driveOut & 0x10) L3L = 1; if (driveOut & 0x20) L3H = 0; - } - - //Convert photointerrupter inputs to a rotor state +} + +//Convert photointerrupter inputs to a rotor state inline int8_t readRotorState(){ return stateMap[I1 + 2*I2 + 4*I3]; - } +} -//Basic synchronisation routine +//Basic synchronisation routine int8_t motorHome() { //Put the motor in drive state 0 and wait for it to stabilise motorOut(0); wait(2.0); - + //Get the rotor state return readRotorState(); } void stateUpdate(int8_t *params[]) { // () { // **params - *params[0] = readRotorState(); + *params[0] = readRotorState(); int8_t currentState = *params[0]; int8_t offset = *params[1]; - + motorOut((currentState - offset + lead + 6) % 6); } //Main int main() { - // std::ios::sync_with_stdio(false); - Comm comm_plz; + // std::ios::sync_with_stdio(false); + Comm comm_plz; // comm_plz.pc.printf("%s\n", "do i work bruh" ); // using printf of class is calm SHA256 Miner; - + uint8_t sequence[] = {0x45,0x6D,0x62,0x65,0x64,0x64,0x65,0x64, 0x20,0x53,0x79,0x73,0x74,0x65,0x6D,0x73, 0x20,0x61,0x72,0x65,0x20,0x66,0x75,0x6E, @@ -464,8 +480,8 @@ uint8_t hash[32]; uint32_t length64 = 64; uint32_t hashCounter = 0; - Timer timer; - + Timer timer; + float dutyC = 1; // 100% float mtrPeriod = 2e-3; // motor period @@ -480,36 +496,36 @@ int8_t stateList[6]; //Rotot offset at motor state 0 //Run the motor synchronisation orState = motorHome(); - + // Add callbacks - // I1.fall(&stateUpdate); - // I2.fall(&stateUpdate); - // I3.fall(&stateUpdate); + // I1.fall(&stateUpdate); + // I2.fall(&stateUpdate); + // I3.fall(&stateUpdate); int8_t* params[2]; params[0] = ¤tState; params[1] = &orState; - + I1.fall(callback(&stateUpdate,params)); I2.fall(callback(&stateUpdate,params)); I3.fall(callback(&stateUpdate,params)); - + I1.rise(callback(&stateUpdate,params)); I2.rise(callback(&stateUpdate,params)); I3.rise(callback(&stateUpdate,params)); - + // Push motor to move currentState = readRotorState(); motorOut((currentState-orState+lead+6)%6); // We push it digitally - + // pc.printf("Rotor origin: %x\n\r",orState); // orState is subtracted from future rotor state inputs to align rotor and motor states // intState = readRotorState(); //if (intState != intStateOld) { - // pc.printf("old:%d \t new:%d \t next:%d \n\r",intStateOld, intState, (intState-orState+lead+6)%6); - // intStateOld = intState; - // motorOut((intState-orState+lead+6)%6); //+6 to make sure the remainder is positive - // } - + // pc.printf("old:%d \t new:%d \t next:%d \n\r",intStateOld, intState, (intState-orState+lead+6)%6); + // intStateOld = intState; + // motorOut((intState-orState+lead+6)%6); //+6 to make sure the remainder is positive + // } + dutyC = 0.8; pwmCtrl.pulsewidth(mtrPeriod*dutyC); @@ -518,10 +534,10 @@ timer.start(); // start timer int stateCount = 0; while (1) { - // pc.printf("Current:%d \t Next:%d \n\r", currentState, (currentState-orState+lead+6)%6); - comm_plz.newKey_mutex.lock(); + // pc.printf("Current:%d \t Next:%d \n\r", currentState, (currentState-orState+lead+6)%6); + comm_plz.newKey_mutex.lock(); *key = comm_plz.newKey; - comm_plz.newKey_mutex.unlock(); + comm_plz.newKey_mutex.unlock(); Miner.computeHash(hash, sequence, length64); hashCounter++; if ((hash[0]==0) && (hash[1]==0)){ @@ -538,9 +554,9 @@ else { //pc.printf("states"); //for(int i = 0; i < 6; ++i) - //pc.printf("%02i,", stateList[i]); - //pc.printf("\n\r"); - stateCount = 0; + //pc.printf("%02i,", stateList[i]); + //pc.printf("\n\r"); + stateCount = 0; } // Per Second i.e. when greater or equal to 1 @@ -551,5 +567,5 @@ timer.reset(); } } - + } \ No newline at end of file