816
void mfsk::updateRxPic(unsigned char data, int pos)
818
picRx->pixel(data, pos);
821
void cb_picRxClose( Fl_Widget *w, void *who)
823
mfsk *me = (mfsk *)who;
825
me->picRxWin->hide();
826
me->rxstate = mfsk::RX_STATE_DATA;
831
void cb_picRxSave( Fl_Widget *w, void *who)
833
mfsk *me = (mfsk *)who;
835
File_Select("Save Image file?","*.{gif,jpg,png}", "", 0);
837
me->picRx->save_jpeg(fn);
840
void mfsk::makeRxViewer(int W, int H)
844
winW = W < 136 ? 140 : W + 4;
846
picX = (winW - W) / 2;
850
picRxWin = new Fl_Window(winW, winH);
851
picRxWin->xclass(PACKAGE_NAME);
852
picRx = new picture(picX, picY, W, H);
853
btnpicRxSave = new Fl_Button(winW/2 - 65, H + 6, 60, 24,"Save");
854
btnpicRxSave->callback(cb_picRxSave,this);
855
btnpicRxClose = new Fl_Button(winW/2 + 5, H + 6, 60, 24, "Close");
856
btnpicRxClose->callback(cb_picRxClose,this);
858
picRxWin->size(winW, winH);
859
picRx->resize(picX, picY, W, H);
860
btnpicRxSave->resize(winW/2 - 65, H + 6, 60, 24);
861
btnpicRxClose->resize(winW/2 + 5, H + 6, 60, 24);
868
void mfsk::load_file(const char *n) {
870
unsigned char *img_data;
876
TxImg = Fl_Shared_Image::get(n);
879
img_data = (unsigned char *)TxImg->data()[0];
883
if (xmtimg) delete [] xmtimg;
884
xmtimg = new unsigned char [W * H * 3];
886
memcpy(xmtimg, img_data, W*H*3);
889
for (i = 0; i < W*H; i++) {
891
xmtimg[j] = img_data[k];
892
xmtimg[j+1] = img_data[k+1];
893
xmtimg[j+2] = img_data[k+2];
897
for (i = 0; i < W*H; i++) {
899
xmtimg[j] = xmtimg[j+1] = xmtimg[j+2] = img_data[i];
904
TxViewerResize(W, H);
906
// load the picture widget with the rgb image
908
picTx->video(xmtimg, W * H * 3);
909
if (print_time_left(W * H * 3, txclr_tooltip, sizeof(txclr_tooltip), "Time needed: ") > 0)
910
btnpicTxSendColor->tooltip(txclr_tooltip);
911
btnpicTxSendColor->activate();
912
if (print_time_left(W * H, txgry_tooltip, sizeof(txgry_tooltip), "Time needed: ") > 0)
913
btnpicTxSendGrey->tooltip(txgry_tooltip);
914
btnpicTxSendGrey->activate();
918
void mfsk::updateTxPic(unsigned char data)
921
pixelnbr = rgb + row + 3*col;
922
picTx->pixel(data, pixelnbr);
923
if (++col == TxImg->w()) {
927
row += 3 * TxImg->w();
931
picTx->pixel( data, pixelnbr++ );
932
picTx->pixel( data, pixelnbr++ );
933
picTx->pixel( data, pixelnbr++ );
937
void cb_picTxLoad(Fl_Widget *,void *who) {
938
mfsk *TxWho = (mfsk *)who;
940
File_Select("Image file?","*.{gif,jpg,png}", "", 0);
942
TxWho->load_file(fn);
945
void cb_picTxClose( Fl_Widget *w, void *who)
947
mfsk *me = (mfsk *)who;
949
me->picTxWin->hide();
953
void cb_picTxSendColor( Fl_Widget *w, void *who)
955
mfsk *my = (mfsk *)who;
959
if (my->xmtpicbuff) delete [] my->xmtpicbuff;
960
my->xmtpicbuff = new unsigned char [W*H*3];
961
unsigned char *outbuf = my->xmtpicbuff;
962
unsigned char *inbuf = my->xmtimg;
964
for (iy = 0; iy < H; iy++) {
965
rowstart = iy * W * 3;
966
for (rgb = 0; rgb < 3; rgb++)
967
for (ix = 0; ix < W; ix++)
968
outbuf[rowstart + rgb*W + ix] = inbuf[rowstart + rgb + ix*3];
970
snprintf(my->picheader, PICHEADER - 1, "\nSending Pic:%dx%dC;", W, H);
971
my->xmtbytes = W * H * 3;
978
my->btnpicTxSendColor->hide();
979
my->btnpicTxSendGrey->hide();
980
my->btnpicTxLoad->hide();
981
my->btnpicTxClose->hide();
982
my->btnpicTxSendAbort->show();
985
// start the transmission
987
if (trx_state != STATE_TX)
988
trx_state = STATE_TX;
989
fl_unlock(&trx_mutex);
990
wf->set_XmtRcvBtn(true);
994
void cb_picTxSendGrey( Fl_Widget *w, void *who)
996
mfsk *my = (mfsk *)who;
1000
if (my->xmtpicbuff) delete [] my->xmtpicbuff;
1001
my->xmtpicbuff = new unsigned char [W*H];
1002
unsigned char *outbuf = my->xmtpicbuff;
1003
unsigned char *inbuf = my->xmtimg;
1004
for (int i = 0; i < W*H; i++)
1005
outbuf[i] = ( 31 * inbuf[i*3] + 61 * inbuf[i*3 + 1] + 8 * inbuf[i*3 + 2])/100;
1006
snprintf(my->picheader, PICHEADER - 1, "\nSending Pic:%dx%d;", W, H);
1007
my->xmtbytes = W * H;
1014
my->btnpicTxSendColor->hide();
1015
my->btnpicTxSendGrey->hide();
1016
my->btnpicTxLoad->hide();
1017
my->btnpicTxClose->hide();
1018
my->btnpicTxSendAbort->show();
1020
// start the transmission
1021
fl_lock(&trx_mutex);
1022
if (trx_state != STATE_TX)
1023
trx_state = STATE_TX;
1024
fl_unlock(&trx_mutex);
1025
wf->set_XmtRcvBtn(true);
1026
my->startpic = true;
1030
void cb_picTxSendAbort( Fl_Widget *w, void *who)
1032
mfsk *my = (mfsk *)who;
1033
my->abortxmt = true;
1034
// reload the picture widget with the rgb image
1036
my->picTx->video(my->xmtimg, my->TxImg->w() * my->TxImg->h() * 3);
1040
void mfsk::TxViewerResize(int W, int H)
1044
winW = W < 246 ? 250 : W + 4;
1045
winH = H < 180 ? 180 : H + 30;
1046
picX = (winW - W) / 2;
1047
picY = (winH - 30 - H)/2;
1049
picTxWin->size(winW, winH);
1050
picTx->resize(picX, picY, W, H);
1052
btnpicTxSendColor->resize(winW/2 - 123, winH - 28, 60, 24);
1053
btnpicTxSendGrey->resize(winW/2 - 61, winH - 28, 60, 24);
1054
btnpicTxSendAbort->resize(winW/2 - 123, winH - 28, 122, 24);
1055
btnpicTxLoad->resize(winW/2 + 1, winH - 28, 60, 24);
1056
btnpicTxClose->resize(winW/2 + 63, winH - 28, 60, 24);
1060
void mfsk::makeTxViewer(int W, int H)
1064
winW = W < 246 ? 250 : W + 4;
1065
winH = H < 180 ? 180 : H + 30;
1066
picX = (winW - W) / 2;
1070
picTxWin = new Fl_Window(winW, winH);
1071
picTxWin->xclass(PACKAGE_NAME);
1072
picTx = new picture (picX, picY, W, H);
1073
btnpicTxSendColor = new Fl_Button(winW/2 - 123, winH - 28, 60, 24, "XmtClr");
1074
btnpicTxSendColor->callback(cb_picTxSendColor, this);
1075
btnpicTxSendGrey = new Fl_Button(winW/2 - 61, winH - 28, 60, 24, "XmtGry");
1076
btnpicTxSendGrey->callback( cb_picTxSendGrey, this);
1077
btnpicTxSendAbort = new Fl_Button(winW/2 - 123, winH - 28, 122, 24, "Abort Xmt");
1078
btnpicTxSendAbort->callback(cb_picTxSendAbort, this);
1079
btnpicTxLoad = new Fl_Button(winW/2 + 1, winH - 28, 60, 24, "Load");
1080
btnpicTxLoad->callback(cb_picTxLoad, this);
1081
btnpicTxClose = new Fl_Button(winW/2 + 63, winH - 28, 60, 24, "Close");
1082
btnpicTxClose->callback(cb_picTxClose,this);
1083
btnpicTxSendAbort->hide();
1084
btnpicTxSendColor->deactivate();
1085
btnpicTxSendGrey->deactivate();
1087
picTxWin->size(winW, winH);
1088
picTx->resize(picX, picY, W, H);
1089
btnpicTxSendColor->resize(winW/2 - 123, winH - 28, 60, 24);
1090
btnpicTxSendGrey->resize(winW/2 - 61, winH - 28, 60, 24);
1091
btnpicTxSendAbort->resize(winW/2 - 123, winH - 28, 122, 24);
1092
btnpicTxLoad->resize(winW/2 + 1, winH - 28, 60, 24);
1093
btnpicTxClose->resize(winW/2 + 63, winH - 28, 60, 24);
1094
btnpicTxSendColor->show();
1095
btnpicTxSendGrey->show();
1096
btnpicTxLoad->show();
1097
btnpicTxClose->show();
1098
btnpicTxSendAbort->hide();
1104
int mfsk::print_time_left(size_t bytes, char *str, size_t len,
1105
const char *prefix, const char *suffix)
1107
float time_sec = bytes * 0.001;
1108
int time_min = (int)(time_sec / 60);
1109
time_sec -= time_min * 60;
1112
return snprintf(str, len, "%s%02dm%2.1fs%s",
1113
prefix, time_min, time_sec, suffix);
1115
return snprintf(str, len, "%s%2.1fs%s", prefix, time_sec, suffix);