MethodRelay, file condensing, working towards gui

Added MethodRelay code from Quark. Some fixes and changes as well. Condesed some things into fewer files for so the ide is easier to use, but they will be moved back into their own files as version 1.0 approaches. Everything is prep for adding gui elements (MethodRelay included)
This commit is contained in:
61616
2022-04-30 17:53:08 -04:00
parent bce04a90eb
commit 193b6994ba
16 changed files with 832 additions and 559 deletions

View File

@@ -0,0 +1,126 @@
class ClickHandler{
LiveMethodRelay[] mrs;
ClickHandler(){
mrs = new LiveMethodRelay[0];
}
void addl(MethodRelay l){
clean();
mrs = (LiveMethodRelay[])append(mrs,l);
}
void clean(){
if(mrs.length == 0) return;
for(int i = mrs.length; i >= 0; i--){
if(!mrs[i].live){
mrs[i] = mrs[mrs.length - 1];
mrs = (LiveMethodRelay[])shorten(mrs);
}
}
}
void cascade(float x, float y){
for(int i = 0; i < mrs.length; i++){
mrs[i].execute(x,y);
}
}
}
class LiveMethodRelay extends MethodRelay{
boolean live;
LiveMethodRelay(Object obj, String name, Class... args){
super(obj, name, args);
live = true;
}
LiveMethodRelay(Object obj, String name){
super(obj, name);
live = true;
}
void kill(){
live = false;
}
}
import java.lang.reflect.*;
/**
A class that encapsulates a named method to be invoked.
Quark 2015
see https://forum.processing.org/two/discussion/13093/how-to-call-function-by-string-content.html
*/
public static class MethodRelay {
/** The object to handle the draw event */
private Object handlerObject = null;
/** The method in drawHandlerObject to execute */
private Method handlerMethod = null;
/** the name of the method to handle the event */
private String handlerMethodName;
/** An array of classes that represent the function
parameters in order */
private Class[] parameters = null;
/**
Register a method that has parameters.
parameter obj the object that contains the method to invoke
parameter name the name of the method
parameter args a comma separated list of
*/
MethodRelay(Object obj, String name, Class... args) {
try {
handlerMethodName = name;
parameters = args;
handlerMethod = obj.getClass().getMethod(handlerMethodName, parameters);
handlerObject = obj;
}
catch (Exception e) {
println("Unable to find the function -");
print(handlerMethodName + "( ");
if (parameters != null) {
for (Class c : parameters)
print(c.getSimpleName() + " ");
println(")");
}
}
}
/**
Register a method that has no parameters.
parameter obj the object that contains the method to invoke
parameter name the name of the method
*/
MethodRelay(Object obj, String name) {
this(obj, name, (Class[])null);
}
/**
Execute a paramerterless method
*/
void execute() {
execute((Object[])null);
}
/**
Execute a method with parameters
parameter data a comma separated list of values
to be passed to the method
*/
void execute(Object... data) {
if (handlerObject != null) {
try {
handlerMethod.invoke(handlerObject, data);
}
catch (Exception e) {
println("Error on invoke");
}
}
}
}

328
B12NumbersV3/B12Base.pde Normal file
View File

@@ -0,0 +1,328 @@
class B12Digit{
byte value;
PVector refPos;
B12Digit(int _value){
if(_value >= 12 || _value < 0){
throw new IllegalArgumentException("B12Digit only accepts decimal integers 0 through 11");
}
value = byte(_value);
refPos = new PVector(0,0);
}
B12Digit(char _c){
String valid = "+-*/.:"; // Defines valid input characters
if(!inStr(valid, _c)){ throw new IllegalArgumentException("B12Char only accepts \'+ - * / . :'"); }
value = byte(_c);
refPos = new PVector(0,0);
}
// SETTERS
void setRefPos(PVector _refPos){ refPos = _refPos; }
void setRefPos(float _x, float _y){ refPos = new PVector(_x,_y); }
void setValue(int _value){ value = byte(_value); }
// GETTERS
PVector getRefPos(){ return refPos; }
int getValue(){ return value; }
// RENDER CHARACTERS
void display(){
pushMatrix();
translate(refPos.x,refPos.y);
strokeWeight(1);
noFill();
ellipseMode(CORNERS);
switch(value) {
// NUMBERS //
case 0:
line0(); break;
case 1:
line1(); break;
case 2:
line1(); line2(); break;
case 3:
line1(); line2(); line3(); break;
case 4:
line4(); break;
case 5:
line4(); line1(); break;
case 6:
line4(); line1(); line2(); break;
case 7:
line4(); line1(); line2(); line3(); break;
case 8:
line8(); line4(); break;
case 9:
line8(); line4(); line1(); break;
case 10:
line8(); line4(); line1(); line2(); break;
case 11:
line8(); line4(); line1(); line2(); line3(); break;
// CHARACTERS //
case '+':
lineMinus(); linePlus(); break;
case '-':
lineMinus(); break;
case '*':
lineTimes(); break;
case '/':
lineMinus(); dotsDiv(); break;
case '.':
strokeWeight(2); period(); break;
case ':':
strokeWeight(2); colon(); break;
}
popMatrix();
}
// Individual shape components to build any B12 number
void line0(){ ellipse(0,-13,8,0); }
void line1(){ line(6,0,9,-10); }
void line2(){ line(3,-10,6,0); }
void line3(){ line(0,0,3,-10); }
void line4(){ line(9,-10,2,-13); }
void line8(){ line(2,-13,9,-16); }
// Individual shape components to build any B12 character
void lineTimes(){ line(4,-7,8,-3); line(4,-3,8,-7); }
void dotsDiv(){ point(6,-8); point(6,-2); }
void lineMinus(){ line(3,-5,9,-5); }
void linePlus(){ line(6,-8,6,-2); }
void period(){ point(5,0); }
void colon(){ point(5,-2); point(5,-8); }
// HELPER FUNCTIONS //
boolean inStr(String st, char _c){
try{
int x = st.indexOf(_c);
return true;
}
catch (Exception e){
return false;
}
}
}
class B12Int {
private ArrayList<B12Digit> digits;
private int value;
private PVector pos;
private boolean arrayLoaded;
private boolean inPosition;
private int mode;// Can be RIGHT (39), CENTER (3), or LEFT (37)
private int minLen;
B12Int(int _value){
value = _value;
pos = new PVector(0,0);
arrayLoaded = false;
inPosition = false;
mode = LEFT;
minLen = 0;
}
int getValue(){ return value; }
void setValue(int _value){ value = _value; arrayLoaded = false; }
void setPos(PVector _pos){ pos = _pos.copy(); inPosition = false; }
void setPos(float _x, float _y){ pos = new PVector(_x, _y); inPosition = false; }
PVector getPos(){ return pos; }
void setMinLen(int i){ minLen = i; }
void setAlignMode(int _mode){
if(_mode == DECIMAL || _mode == LEFT || _mode == RIGHT){ mode = _mode; }
else{ println("Alignment only accepts LEFT, RIGHT, and DECIMAL"); }
}
void display(){
if(!arrayLoaded){ loadArray(); }
if(!inPosition){ positionDigits(); }
pushMatrix();
translate(pos.x,pos.y);
for(int i = 0; i < digits.size(); i++){
digits.get(i).display();
}
popMatrix();
}
private void positionDigits(){
if(mode == LEFT || mode == DECIMAL){
for(int i = 0; i < digits.size(); i++){
digits.get(i).setRefPos((-12 * (i+1)), 0);
}
}else if(mode == RIGHT){
int count = 0;
for(int i = digits.size() - 1; i >= 0; i--){
digits.get(count).setRefPos((12 * i) + 3, 0);
count++;
}
}
inPosition = true;
}
private void loadArray(){
digits = new ArrayList<B12Digit>();
int mval = abs(value);
if(mval == 0){ digits.add(new B12Digit(0)); }
while(mval != 0){
if(mval < 12){
digits.add(new B12Digit(mval));
mval = 0;
}else{
digits.add(new B12Digit(mval % 12));
mval /= 12;
}
}
if(digits.size() < minLen){
digits.add(new B12Digit(0));
}
if(value < 0){
digits.add(new B12Digit('-'));
}
arrayLoaded = true;
}
}
class B12Float {
private ArrayList<B12Digit> digits;
private float value;
private PVector pos;
private boolean arrayLoaded;
private boolean inPosition;
private int mode;// Can be RIGHT (39), CENTER (3), or LEFT (37)
private int places;
private int pointPlace;
B12Float(float _value){
value = _value;
pos = new PVector(0,0);
arrayLoaded = false;
inPosition = false;
mode = DECIMAL;
places = 4;
}
float getValue(){ return value; }
void setValue(float _value){ value = _value; arrayLoaded = false; }
PVector getPos(){ return pos; }
void setPos(PVector _pos){ pos = _pos.copy(); inPosition = false; }
void setPos(float _x, float _y){ pos = new PVector(_x, _y); inPosition = false; }
int getPlaces(){ return places; }
void setPlaces(int _places){
if(_places > 12 || _places < 0){
throw new IllegalArgumentException("B12Float ncan only display to 12 duodecimal points");
}else{
places = _places;
}
}
void setAlignMode(int _mode){
if(_mode == DECIMAL || _mode == LEFT || _mode == RIGHT){ mode = _mode; }
else{ println("Alignment only accepts LEFT, RIGHT, and DECIMAL"); }
}
void display(){
if(!arrayLoaded){ loadArray(); }
if(!inPosition){ positionDigits(); }
pushMatrix();
translate(pos.x,pos.y);
for(int i = 0; i < digits.size(); i++){
digits.get(i).display();
}
popMatrix();
}
private void positionDigits(){
int curPos = 0;
int count = 0;
if(mode == LEFT){
for(int i = 0; i < pointPlace; i++){
curPos += -12;
digits.get(i).setRefPos(curPos, 0);
count++;
}
curPos += -8;
digits.get(count).setRefPos(curPos, 0);
count++;
curPos += -6;
digits.get(count).setRefPos(curPos, 0);
count++;
for(int i = count; i < digits.size(); i++){
curPos += -12;
digits.get(i).setRefPos(curPos, 0);
}
}else if(mode == DECIMAL){
curPos = -5;
digits.get(pointPlace).setRefPos(curPos,0);
curPos += -2;
for(int i = pointPlace - 1; i >= 0; i--){
curPos += 12;
digits.get(i).setRefPos(curPos,0);
}
curPos = -2;
for(int i = pointPlace + 1; i < digits.size(); i++){
curPos += -12;
digits.get(i).setRefPos(curPos,0);
}
}else if(mode == RIGHT){
for(int i = digits.size() - 1; i >= 0; i--){
digits.get(count).setRefPos((12 * i) + 3, 0);
count++;
}
}
inPosition = true;
}
private void loadArray(){
digits = new ArrayList<B12Digit>();
B12Digit[] temp = new B12Digit[places];
float mval = abs(value);
int whole = int(mval);
float deci = mval - float(whole);
for(int i = 0; i < places; i++){
deci *= 12;
temp[i] = new B12Digit(int(deci));
deci -= float(int(deci));
}
for(int i = places - 1; i >= 0; i--){
digits.add(temp[i]);
}
pointPlace = digits.size();
digits.add(new B12Digit('.'));
while(whole > 0){
if(whole < 12){
digits.add(new B12Digit(whole));
whole = 0;
}else{
digits.add(new B12Digit(whole % 12));
whole /= 12;
}
}
if(value < 0){
digits.add(new B12Digit('-'));
}
arrayLoaded = true;
inPosition = false;
}
}

View File

@@ -1,107 +0,0 @@
class B12Digit{
byte value;
PVector refPos;
B12Digit(int _value){
if(_value >= 12 || _value < 0){
throw new IllegalArgumentException("B12Digit only accepts decimal integers 0 through 11");
}
value = byte(_value);
refPos = new PVector(0,0);
}
B12Digit(char _c){
String valid = "+-*/.:"; // Defines valid input characters
if(!inStr(valid, _c)){ throw new IllegalArgumentException("B12Char only accepts \'+ - * / . :'"); }
value = byte(_c);
refPos = new PVector(0,0);
}
// SETTERS
void setRefPos(PVector _refPos){ refPos = _refPos; }
void setRefPos(float _x, float _y){ refPos = new PVector(_x,_y); }
void setValue(int _value){ value = byte(_value); }
// GETTERS
PVector getRefPos(){ return refPos; }
int getValue(){ return value; }
// RENDER CHARACTERS
void display(){
pushMatrix();
translate(refPos.x,refPos.y); //<>//
strokeWeight(1);
noFill();
ellipseMode(CORNERS);
switch(value) {
// NUMBERS //
case 0:
line0(); break;
case 1:
line1(); break;
case 2:
line1(); line2(); break;
case 3:
line1(); line2(); line3(); break;
case 4:
line4(); break;
case 5:
line4(); line1(); break;
case 6:
line4(); line1(); line2(); break;
case 7:
line4(); line1(); line2(); line3(); break;
case 8:
line8(); line4(); break;
case 9:
line8(); line4(); line1(); break;
case 10:
line8(); line4(); line1(); line2(); break;
case 11:
line8(); line4(); line1(); line2(); line3(); break;
// CHARACTERS //
case '+':
lineMinus(); linePlus(); break;
case '-':
lineMinus(); break;
case '*':
lineTimes(); break;
case '/':
lineMinus(); dotsDiv(); break;
case '.':
strokeWeight(2); period(); break;
case ':':
strokeWeight(2); colon(); break;
}
popMatrix();
}
// Individual shape components to build any B12 number
void line0(){ ellipse(0,-13,8,0); }
void line1(){ line(6,0,9,-10); }
void line2(){ line(3,-10,6,0); }
void line3(){ line(0,0,3,-10); }
void line4(){ line(9,-10,2,-13); }
void line8(){ line(2,-13,9,-16); }
// Individual shape components to build any B12 character
void lineTimes(){ line(4,-7,8,-3); line(4,-3,8,-7); }
void dotsDiv(){ point(6,-8); point(6,-2); }
void lineMinus(){ line(3,-5,9,-5); }
void linePlus(){ line(6,-8,6,-2); }
void period(){ point(5,0); }
void colon(){ point(5,-2); point(5,-8); }
// HELPER FUNCTIONS //
boolean inStr(String st, char _c){
try{
int x = st.indexOf(_c);
return true;
}
catch (Exception e){
return false;
}
}
}

View File

@@ -1,133 +0,0 @@
class B12Float {
private ArrayList<B12Digit> digits;
private float value;
private PVector pos;
private boolean arrayLoaded;
private boolean inPosition;
private int mode;// Can be RIGHT (39), CENTER (3), or LEFT (37)
private int places;
private int pointPlace;
B12Float(float _value){
value = _value;
pos = new PVector(0,0);
arrayLoaded = false;
inPosition = false;
mode = DECIMAL;
places = 4;
}
float getValue(){ return value; }
void setValue(float _value){ value = _value; arrayLoaded = false; }
PVector getPos(){ return pos; }
void setPos(PVector _pos){ pos = _pos.copy(); inPosition = false; }
void setPos(float _x, float _y){ pos = new PVector(_x, _y); inPosition = false; }
int getPlaces(){ return places; }
void setPlaces(int _places){
if(_places > 12 || _places < 0){
throw new IllegalArgumentException("B12Float ncan only display to 12 duodecimal points");
}else{
places = _places;
}
}
void setAlignMode(int _mode){
if(_mode == DECIMAL || _mode == LEFT || _mode == RIGHT){ mode = _mode; }
else{ println("Alignment only accepts LEFT, RIGHT, and DECIMAL"); }
}
void display(){
if(!arrayLoaded){ loadArray(); }
if(!inPosition){ positionDigits(); }
pushMatrix();
translate(pos.x,pos.y);
for(int i = 0; i < digits.size(); i++){
digits.get(i).display();
}
popMatrix();
}
private void positionDigits(){
int curPos = 0;
int count = 0;
if(mode == LEFT){
for(int i = 0; i < pointPlace; i++){
curPos += -12;
digits.get(i).setRefPos(curPos, 0);
count++;
}
curPos += -8;
digits.get(count).setRefPos(curPos, 0);
count++;
curPos += -6;
digits.get(count).setRefPos(curPos, 0);
count++;
for(int i = count; i < digits.size(); i++){
curPos += -12;
digits.get(i).setRefPos(curPos, 0);
}
}else if(mode == DECIMAL){
curPos = -5;
digits.get(pointPlace).setRefPos(curPos,0);
curPos += -2;
for(int i = pointPlace - 1; i >= 0; i--){
curPos += 12;
digits.get(i).setRefPos(curPos,0);
}
curPos = -2;
for(int i = pointPlace + 1; i < digits.size(); i++){
curPos += -12;
digits.get(i).setRefPos(curPos,0);
}
}else if(mode == RIGHT){
for(int i = digits.size() - 1; i >= 0; i--){
digits.get(count).setRefPos((12 * i) + 3, 0);
count++;
}
}
inPosition = true;
}
private void loadArray(){
digits = new ArrayList<B12Digit>();
B12Digit[] temp = new B12Digit[places];
float mval = abs(value);
int whole = int(mval);
float deci = mval - float(whole);
for(int i = 0; i < places; i++){
deci *= 12;
temp[i] = new B12Digit(int(deci));
deci -= float(int(deci));
}
for(int i = places - 1; i >= 0; i--){
digits.add(temp[i]);
}
pointPlace = digits.size();
digits.add(new B12Digit('.'));
while(whole > 0){
if(whole < 12){
digits.add(new B12Digit(whole));
whole = 0;
}else{
digits.add(new B12Digit(whole % 12));
whole /= 12;
}
}
if(value < 0){
digits.add(new B12Digit('-'));
}
arrayLoaded = true;
inPosition = false;
}
}

View File

@@ -1,81 +0,0 @@
class B12Int {
private ArrayList<B12Digit> digits;
private int value;
private PVector pos;
private boolean arrayLoaded;
private boolean inPosition;
private int mode;// Can be RIGHT (39), CENTER (3), or LEFT (37)
private int minLen;
B12Int(int _value){
value = _value;
pos = new PVector(0,0);
arrayLoaded = false;
inPosition = false;
mode = LEFT;
minLen = 0;
}
int getValue(){ return value; }
void setValue(int _value){ value = _value; arrayLoaded = false; }
void setPos(PVector _pos){ pos = _pos.copy(); inPosition = false; }
void setPos(float _x, float _y){ pos = new PVector(_x, _y); inPosition = false; }
PVector getPos(){ return pos; }
void setMinLen(int i){ minLen = i; }
void setAlignMode(int _mode){
if(_mode == DECIMAL || _mode == LEFT || _mode == RIGHT){ mode = _mode; }
else{ println("Alignment only accepts LEFT, RIGHT, and DECIMAL"); }
}
void display(){
if(!arrayLoaded){ loadArray(); }
if(!inPosition){ positionDigits(); }
pushMatrix();
translate(pos.x,pos.y);
for(int i = 0; i < digits.size(); i++){
digits.get(i).display();
}
popMatrix();
}
private void positionDigits(){
if(mode == LEFT || mode == DECIMAL){
for(int i = 0; i < digits.size(); i++){
digits.get(i).setRefPos((-12 * (i+1)), 0);
}
}else if(mode == RIGHT){
int count = 0;
for(int i = digits.size() - 1; i >= 0; i--){
digits.get(count).setRefPos((12 * i) + 3, 0);
count++;
}
}
inPosition = true;
}
private void loadArray(){
digits = new ArrayList<B12Digit>();
int mval = abs(value);
if(mval == 0){ digits.add(new B12Digit(0)); }
while(mval != 0){
if(mval < 12){
digits.add(new B12Digit(mval));
mval = 0;
}else{
digits.add(new B12Digit(mval % 12));
mval /= 12;
}
}
if(digits.size() < minLen){
digits.add(new B12Digit(0));
}
if(value < 0){
digits.add(new B12Digit('-'));
}
arrayLoaded = true;
}
}

View File

@@ -3,11 +3,21 @@
Beta version of a clock in base 12. Beta version of a clock in base 12.
by Nayan Sawyer by Nayan Sawyer
started Mar 2022 started Mar 2022
version 0.1.3 April 29 2022 version 0.1.4.0 April 30 2022
Characters are a variation of Kaktovik Inupiaq numerals Characters are a variation of Kaktovik Inupiaq numerals
reversed and in base 12 instead of 20. I take no credit reversed and in base 12 instead of 20. I take no credit
for the design. for the design.
Includes method relay code be Quark - see https://forum.processing.org/two/discussion/13093/how-to-call-function-by-string-content.html
for more details.
changelog 0.1.4.0
- Added MethodRelay code from Quark. Some fixes and
changes as well. Condesed some things into fewer files
for so the ide is easier to use, but they will be moved
back into their own files as version 1.0 approaches.
Everything is prep for adding gui elements (MethodRelay
included)
changelog 0.1.3 changelog 0.1.3
- Deprecated B12Char by rolling it's code into B12Digit. - Deprecated B12Char by rolling it's code into B12Digit.
@@ -18,7 +28,8 @@
to be fine with simply swithing out the reference. to be fine with simply swithing out the reference.
*/ */
public static int DECIMAL = 65; public static final int DECIMAL = 65;
ClickHandler ch; // Mouse event handler
Clock clock; //<>// Clock clock; //<>//
B12Digit p; B12Digit p;
@@ -26,6 +37,8 @@ B12Digit t;
void setup(){ void setup(){
size(400,400); size(400,400);
ch = new ClickHandler();
clock = new Clock(new STime48()); clock = new Clock(new STime48());
println("waiting"); println("waiting");
p = new B12Digit('+'); p = new B12Digit('+');
@@ -43,9 +56,12 @@ void draw(){
} }
void mouseClicked(){ void mouseClicked(){
clock.setTime(new Time48(16,0,0)); //clock.setTime(new Time48(16,0,0));
// Decide which element is on top at mouse position (maybe by state?)
method("");
// Every clickable element needs check whether the mouse is over it every frame, and if both clicked and mouseover then do action.
ch.cascade(mouseX,mouseY);
}
void call(String _call){
method(_call);
} }

207
B12NumbersV3/B12TimeAll.pde Normal file
View File

@@ -0,0 +1,207 @@
class Time48 extends Thread{
private int sec48;
private int min48;
private int hour48;
private int tsec48; // Total seconds
private boolean initialized;
// CONSTRUCTORS //
// TODO add exceptions to all contructors
Time48(){
sec48 = 0;
min48 = 0;
hour48 = 0;
tsec48 = 0;
initialized = false;
}
Time48(int _tsec48){
tsec48 = _tsec48;
flattenTSec();
initialized = true;
}
Time48(Time48 t48){
tsec48 = t48.tsec();
flattenTSec();
initialized = true;
}
Time48(int h, int m, int s){
if(h >= 0 && h < 24){ hour48 = h;}else{throw new IllegalArgumentException();}
if(m >= 0 && m < 48){ min48 = m;}else{throw new IllegalArgumentException();}
if(s >= 0 && s < 48){ sec48 = s;}else{throw new IllegalArgumentException();}
flattenOther();
initialized = true;
}
// GETTERS //
int hours(){return hour48;}
int mins(){return min48;}
int secs(){return sec48;}
int tsec(){return tsec48;}
int[] t48(){int[] out = {hour48,min48,sec48}; return out;}
boolean initialized(){return initialized;}
int b10millis(){return int(float(tsec48) * 1562.5);}
Time48 copy(){ return new Time48(this); }
// SETTERS //
void setHour(int h){
if(h < 0 || h >= 24) throw new IllegalArgumentException();
hour48 = h;
flattenOther();
initialized = true;
}
void setMin(int m){
if(m < 0 || m >= 48) throw new IllegalArgumentException();
min48 = m;
flattenOther();
initialized = true;
}
void setSec(int s){
if(s < 0 || s >= 48) throw new IllegalArgumentException();
sec48 = s;
flattenOther();
initialized = true;
}
void setTsec(int s){ // TODO add exception
tsec48 = s;
flattenTSec();
initialized = true;
}
// PRIVATE FUNCTIONS //
private void flattenTSec(){
sec48 = tsec48;
min48 = sec48 / 48;
hour48 = min48 / 48;
sec48 -= min48 * 48;
min48 -= hour48 * 48;
}
private void flattenOther(){
tsec48 = hour48*48*48 + min48*48 + sec48;
}
// PLACEHOLDER FUNCTIONS //
public void run(){}
}
class STime48 extends Time48{
private int offset; // Time offset in milliseconds
private int tmillis; // Actual time at which time was synced to real world in milliseconds
private int syncedat; // Offset between the start of the program (when millis() starts counting from) and when the time was last synced
private boolean synced;
STime48(){
super();
offset = 0;
tmillis = 0;
syncedat = 0;
synced = false;
this.start();
}
// Public sync functions
public boolean synced(){return synced;}
public void syncTime(){ synced = false; } // Allows syncing after time starts running
public void setTime(Time48 _time){
// To get offset we subtract where the current clock is from where we want it to be
offset = _time.b10millis() - millis() - tmillis + syncedat;
}
// Threaded code
@Override
public void run(){
while(true){
if(!synced){sync();}
delay(1); // MUST USE DELAY OR OFFSET DOES NOT GET CALCULATED
if(tmillis + millis() + offset > 86400000){ tmillis -= 86400000; } // Fall over at 00:00
setTsec(int((tmillis + millis() - syncedat + offset) / 1562.5)); // Add time at sync, millis since program start, and offset, and subtract the millis between program start and sync (because we're adding millis())
}
}
// Initial sync code
private void sync(){
int sec = second();
tmillis = 0;
while(true){
if(sec != second()){ // Wait until seconds changes so as to be as accurate as possible
tmillis = second()*1000 + minute()*60*1000 + hour()*60*60*1000; // Current time in total millis
syncedat = millis();
synced = true;
println("synced");
break;
}
}
}
}
class Clock {
PVector pos;
STime48 t48;
B12Int hours;
B12Int minutes;
B12Int seconds;
B12Digit sep; // TODO Just deprecated B12Char. Refactor to single array of B12Digits?
int tmillis;
Clock(STime48 _t48) {
pos = new PVector(0, 0);
t48 = _t48;
hours = new B12Int(t48.hours());
minutes = new B12Int(t48.mins());
seconds = new B12Int(t48.secs());
sep = new B12Digit(':'); // Seperation character between time columns
hours.setMinLen(2);
minutes.setMinLen(2); // Format all the ints to show a 0 in the 12s column if they are less than 12
seconds.setMinLen(2);
}
// GETTERS and SETTERS //
PVector getPos() { return pos; }
void setPos(PVector _pos) { pos = _pos.copy(); }
void setPos(float _x, float _y) { pos = new PVector(_x, _y);}
void setTime(Time48 _time) { t48.setTime(_time); }
void resetTime() { t48.setTime(new Time48(0)); }
void display() {
if (t48.synced()) {
// Time
hours.setValue(t48.hours());
minutes.setValue(t48.mins());
seconds.setValue(t48.secs());
// Position
hours.setPos(-64, 0);
minutes.setPos(-32, 0);
seconds.setPos(0, 0);
B12Digit c1 = new B12Digit(':');
B12Digit c2 = new B12Digit(':');
c1.setRefPos(-34, 0);
c2.setRefPos(-66, 0);
// Display
pushMatrix();
translate(pos.x, pos.y);
hours.display();
c2.display();
minutes.display();
c1.display();
seconds.display();
popMatrix();
} else {
text("fetching current time", pos.x, pos.y);
}
}
}

View File

@@ -1,60 +0,0 @@
class Clock {
PVector pos;
STime48 t48;
B12Int hours;
B12Int minutes;
B12Int seconds;
B12Digit sep; // TODO Just deprecated B12Char. Refactor to single array of B12Digits?
int tmillis;
Clock(STime48 _t48) {
pos = new PVector(0, 0);
t48 = _t48;
hours = new B12Int(t48.hours());
minutes = new B12Int(t48.mins());
seconds = new B12Int(t48.secs());
sep = new B12Digit(':'); // Seperation character between time columns
hours.setMinLen(2);
minutes.setMinLen(2); // Format all the ints to show a 0 in the 12s column if they are less than 12
seconds.setMinLen(2);
}
// GETTERS and SETTERS //
PVector getPos() { return pos; }
void setPos(PVector _pos) { pos = _pos.copy(); }
void setPos(float _x, float _y) { pos = new PVector(_x, _y);}
void setTime(Time48 _time) { t48.setTime(_time); }
void resetTime() { t48.setTime(new Time48(0)); }
void display() {
if (t48.synced()) {
// Time
hours.setValue(t48.hours());
minutes.setValue(t48.mins());
seconds.setValue(t48.secs());
// Position
hours.setPos(-64, 0);
minutes.setPos(-32, 0);
seconds.setPos(0, 0);
B12Digit c1 = new B12Digit(':');
B12Digit c2 = new B12Digit(':');
c1.setRefPos(-34, 0);
c2.setRefPos(-66, 0);
// Display
pushMatrix();
translate(pos.x, pos.y);
hours.display();
c2.display();
minutes.display();
c1.display();
seconds.display();
popMatrix();
} else {
text("fetching current time", pos.x, pos.y);
}
}
}

View File

@@ -1,16 +0,0 @@
class MathPad{
B12Math math;
MathPad(B12Math _math){
math = _math;
}
// TODO draw a grid for buttons
// TODO draw characters in grid
// TODO detect mousepresses on the buttons (maybe a global mouse handler?)
// TODO send characters to math
void addchar(){
//math.expression.add(new B12Char('/'));
}
}

View File

@@ -1,16 +0,0 @@
class MouseHandler{
StringList clickListeners;
MouseHandler(){
clickListeners = new StringList();
}
void listen(){
}
}
class Listen{
}

View File

@@ -1,50 +0,0 @@
class STime48 extends Time48{
private int offset; // Time offset in milliseconds
private int tmillis; // Actual time at which time was synced to real world in milliseconds
private int syncedat; // Offset between the start of the program (when millis() starts counting from) and when the time was last synced
private boolean synced;
STime48(){
super();
offset = 0;
tmillis = 0;
syncedat = 0;
synced = false;
this.start();
}
// Public sync functions
public boolean synced(){return synced;}
public void syncTime(){ synced = false; } // Allows syncing after time starts running
public void setTime(Time48 _time){
// To get offset we subtract where the current clock is from where we want it to be
offset = _time.b10millis() - millis() - tmillis + syncedat;
}
// Threaded code
@Override
public void run(){
while(true){
if(!synced){sync();}
delay(1); // MUST USE DELAY OR OFFSET DOES NOT GET CALCULATED
if(tmillis + millis() + offset > 86400000){ tmillis -= 86400000; } // Fall over at 00:00
setTsec(int((tmillis + millis() - syncedat + offset) / 1562.5)); // Add time at sync, millis since program start, and offset, and subtract the millis between program start and sync (because we're adding millis())
}
}
// Initial sync code
private void sync(){
int sec = second();
tmillis = 0;
while(true){
if(sec != second()){ // Wait until seconds changes so as to be as accurate as possible
tmillis = second()*1000 + minute()*60*1000 + hour()*60*60*1000; // Current time in total millis
syncedat = millis();
synced = true;
println("synced");
break;
}
}
}
}

View File

@@ -1,90 +0,0 @@
class Time48 extends Thread{
private int sec48;
private int min48;
private int hour48;
private int tsec48; // Total seconds
private boolean initialized;
// CONSTRUCTORS //
// TODO add exceptions to all contructors
Time48(){
sec48 = 0;
min48 = 0;
hour48 = 0;
tsec48 = 0;
initialized = false;
}
Time48(int _tsec48){
tsec48 = _tsec48;
flattenTSec();
initialized = true;
}
Time48(Time48 t48){
tsec48 = t48.tsec();
flattenTSec();
initialized = true;
}
Time48(int h, int m, int s){
if(h >= 0 && h < 24){ hour48 = h;}else{throw new IllegalArgumentException();}
if(m >= 0 && m < 48){ min48 = m;}else{throw new IllegalArgumentException();}
if(s >= 0 && s < 48){ sec48 = s;}else{throw new IllegalArgumentException();}
flattenOther();
initialized = true;
}
// GETTERS //
int hours(){return hour48;}
int mins(){return min48;}
int secs(){return sec48;}
int tsec(){return tsec48;}
int[] t48(){int[] out = {hour48,min48,sec48}; return out;}
boolean initialized(){return initialized;}
int b10millis(){return int(float(tsec48) * 1562.5);}
Time48 copy(){ return new Time48(this); }
// SETTERS //
void setHour(int h){
if(h < 0 || h >= 24) throw new IllegalArgumentException();
hour48 = h;
flattenOther();
initialized = true;
}
void setMin(int m){
if(m < 0 || m >= 48) throw new IllegalArgumentException();
min48 = m;
flattenOther();
initialized = true;
}
void setSec(int s){
if(s < 0 || s >= 48) throw new IllegalArgumentException();
sec48 = s;
flattenOther();
initialized = true;
}
void setTsec(int s){ // TODO add exception
tsec48 = s;
flattenTSec();
initialized = true;
}
// PRIVATE FUNCTIONS //
private void flattenTSec(){
sec48 = tsec48;
min48 = sec48 / 48;
hour48 = min48 / 48;
sec48 -= min48 * 48;
min48 -= hour48 * 48;
}
private void flattenOther(){
tsec48 = hour48*48*48 + min48*48 + sec48;
}
// PLACEHOLDER FUNCTIONS //
public void run(){}
}

View File

@@ -0,0 +1,99 @@
class Button{
ClickHandler ch;
PVector pos; // Position to render from
PVector dim; // Second coordinate for CORNERS or len/wid for CORNER and CENTER
int radius; // Optional corner radius
int mode;
color c;
boolean mouseOver;
Button(ClickHandler _ch, PVector _pos, PVector _dim, int _radius){
ch = _ch;
pos = _pos.copy();
dim = _dim.copy();
radius = _radius;
mode = CORNER;
c = color(200);
mouseOver = false;
ch.addl(new LiveMethodRelay(this, "clicked", float.class, float.class));
}
Button(ClickHandler _ch, PVector _pos, PVector _dim){
this(_ch, _pos, _dim, 0);
}
void setMode(int m){
if(m == CORNER || m == CORNERS || m == CENTER || m == RADIUS){
mode = m;
return;
}
return;
}
void display(){
rectMode(mode);
new MethodRelay(this,"mouseOver" + str(mode), float.class, float.class).execute(mouseX,mouseY);
if (mouseOver){
fill(100);
}else{fill(c);}
rect(pos.x,pos.y,dim.x,dim.y,radius);
}
void clicked(float x, float y){
if(mouseOver){
println(x + " " + y + " mouse pos");
}
}
// DETECT IF MOUSE IS OVER BUTTON //
// The numbers in the method name correspond to the mode ids because the method gets called with a relay
void mouseOver0(float x, float y){ // CORNER
//println("CORNER");
if(x < pos.x || x > dim.x + pos.x || y < pos.x || y > dim.y + pos.y)
{
mouseOver = false;
return;
}
mouseOver = true;
}
void mouseOver1(float x, float y){ // CORNERS
//println("CORNERS");
if(x < (pos.x > dim.x ? dim.x : pos.x) ||
x > (pos.x > dim.x ? pos.x : dim.x) ||
y < (pos.y > dim.y ? dim.y : pos.y) ||
y > (pos.y > dim.y ? pos.y : dim.y))
{
mouseOver = false;
return;
}
mouseOver = true;
}
void mouseOver2(float x, float y){ // RADIUS
//println("RADIUS");
if(x < pos.x - dim.x ||
x > pos.x + dim.x ||
y < pos.x - dim.y ||
y > pos.x + dim.y)
{
mouseOver = false;
return;
}
mouseOver = true;
}
void mouseOver3(float x, float y){ // CENTER
//println("CENTER");
if(x < pos.x - dim.x/2 ||
x > pos.x + dim.x/2 ||
y < pos.x - dim.y/2 ||
y > pos.y + dim.y/2)
{
mouseOver = false;
return;
}
mouseOver = true;
}
}

View File

@@ -0,0 +1,50 @@
class MathPad{
B12Math math;
MathPad(B12Math _math){
math = _math;
}
// TODO draw a grid for buttons
// TODO draw characters in grid
// TODO detect mousepresses on the buttons (maybe a global mouse handler?)
// TODO send characters to math
void addchar(){
//math.expression.add(new B12Char('/'));
}
}
// Deprecated since MethodRelay added
//class Button{
// PVector pos; // Position to render from
// PVector dim; // Second coordinate for CORNERS or len/wid for CORNER and CENTER
// int radius; // Optional corner radius
// color c;
// Listener trigger;
// BListener clickListener;
// Button(PVector _pos, PVector _dim, Listener _trigger){
// pos = _pos.copy();
// dim = _dim.copy();
// trigger = _trigger;
// }
// Button(PVector _pos, PVector _dim, int _radius, Listener _trigger){
// pos = _pos.copy();
// dim = _dim.copy();
// trigger = _trigger;
// radius = _radius;
// }
// class BListener extends Listener{
// Button parent;
// BListener(Handler mh, Button t){
// super(mh);
// parent = t;
// }
// void trigger(){
// parent.trigger();
// }
// }
//}