[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
gnokii/common/phones nk6100.c, 1.154, 1.155 nk6510.c, 1.125, 1.126 nokia
From: |
BORBELY Zoltan <address@hidden> |
Subject: |
gnokii/common/phones nk6100.c, 1.154, 1.155 nk6510.c, 1.125, 1.126 nokia.c, 1.34, 1.35 |
Date: |
Fri, 24 Oct 2003 12:49:07 +0000 |
Update of /cvsroot/gnokii/gnokii/common/phones
In directory subversions:/tmp/cvs-serv28077/common/phones
Modified Files:
nk6100.c nk6510.c nokia.c
Log Message:
ringtone handling updates
Index: nk6100.c
===================================================================
RCS file: /cvsroot/gnokii/gnokii/common/phones/nk6100.c,v
retrieving revision 1.154
retrieving revision 1.155
diff -C2 -d -r1.154 -r1.155
*** nk6100.c 23 Oct 2003 01:13:52 -0000 1.154
--- nk6100.c 24 Oct 2003 12:49:04 -0000 1.155
***************
*** 116,119 ****
--- 116,120 ----
static gn_error GetRawRingtone(gn_data *data, struct gn_statemachine *state);
static gn_error SetRawRingtone(gn_data *data, struct gn_statemachine *state);
+ static gn_error DeleteRingtone(gn_data *data, struct gn_statemachine *state);
static gn_error PressOrReleaseKey(bool press, gn_data *data, struct
gn_statemachine *state);
static gn_error PressOrReleaseKey1(bool press, gn_data *data, struct
gn_statemachine *state);
***************
*** 352,355 ****
--- 353,358 ----
case GN_OP_SetRawRingtone:
return SetRawRingtone(data, state);
+ case GN_OP_DeleteRingtone:
+ return DeleteRingtone(data, state);
case GN_OP_PlayTone:
return pnok_play_tone(data, state);
***************
*** 2777,2786 ****
static gn_error SetRawRingtone(gn_data *data, struct gn_statemachine *state)
{
! unsigned char req[512] = {0x00, 0x01, 0xa0, 0x00, 0x00,
! 0x0c, 0x2c, 0x01,
! 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
! 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
! 0x02, 0xfc, 0x09};
gn_error error;
if (!data || !data->ringtone || !data->raw_data ||
!data->raw_data->data)
--- 2780,2790 ----
static gn_error SetRawRingtone(gn_data *data, struct gn_statemachine *state)
{
! unsigned char req[512] = {0x00, 0x01, 0xa0,
! 0x00, /* location */
! 0x00, 0x0c, 0x2c, 0x01, 0x00, 0x00, 0x00,
0x00,
! 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00,
! 0x00, 0x02, 0xfc, 0x09}; /* data */
gn_error error;
+ int len;
if (!data || !data->ringtone || !data->raw_data ||
!data->raw_data->data)
***************
*** 2790,2801 ****
req[3] = data->ringtone->location - 17;
snprintf(req + 8, 13, "%s", data->ringtone->name);
! memcpy(req + 24, data->raw_data->data, data->raw_data->length);
if ((error = pnok_extended_cmds_enable(0x01, data, state))) return
error;
! if (sm_message_send(24 + data->raw_data->length, 0x40, req, state))
return GN_ERR_NOTREADY;
return sm_block(0x40, data, state);
}
static gn_error get_imei(gn_data *data, struct gn_statemachine *state)
{
--- 2794,2833 ----
req[3] = data->ringtone->location - 17;
snprintf(req + 8, 13, "%s", data->ringtone->name);
! if (memcmp(data->raw_data->data, req + 20, 3) == 0) {
! memcpy(req + 20, data->raw_data->data, data->raw_data->length);
! len = 20 + data->raw_data->length;
! } else {
! /* compatibility */
! memcpy(req + 24, data->raw_data->data, data->raw_data->length);
! len = 24 + data->raw_data->length;
! }
if ((error = pnok_extended_cmds_enable(0x01, data, state))) return
error;
! if (sm_message_send(len, 0x40, req, state)) return GN_ERR_NOTREADY;
return sm_block(0x40, data, state);
}
+ static gn_error DeleteRingtone(gn_data *data, struct gn_statemachine *state)
+ {
+ gn_ringtone ringtone;
+ gn_raw_data rawdata;
+ unsigned char buf[] = {0x00, 0x02, 0xfc, 0x0b};
+ gn_data d;
+
+ if (!data->ringtone) return GN_ERR_INTERNALERROR;
+
+ memset(&ringtone, 0, sizeof(ringtone));
+ ringtone.location = (data->ringtone->location < 0) ? 17 :
data->ringtone->location;
+ memset(&rawdata, 0, sizeof(gn_raw_data));
+ rawdata.data = buf;
+ rawdata.length = sizeof(buf);
+ gn_data_clear(&d);
+ d.ringtone = &ringtone;
+ d.raw_data = &rawdata;
+
+ return SetRawRingtone(&d, state);
+ }
+
static gn_error get_imei(gn_data *data, struct gn_statemachine *state)
{
***************
*** 2887,2893 ****
data->ringtone->location = message[3] + 17;
snprintf(data->ringtone->name, sizeof(data->ringtone->name),
"%s", message + 8);
if (data->raw_data && data->raw_data->data) {
! memcpy(data->raw_data->data, message + 24, length - 24);
! data->raw_data->length = length - 24;
}
break;
--- 2919,2926 ----
data->ringtone->location = message[3] + 17;
snprintf(data->ringtone->name, sizeof(data->ringtone->name),
"%s", message + 8);
+ if (data->raw_data->length < length - 20) return
GN_ERR_MEMORYFULL;
if (data->raw_data && data->raw_data->data) {
! memcpy(data->raw_data->data, message + 20, length - 20);
! data->raw_data->length = length - 20;
}
break;
Index: nokia.c
===================================================================
RCS file: /cvsroot/gnokii/gnokii/common/phones/nokia.c,v
retrieving revision 1.34
retrieving revision 1.35
diff -C2 -d -r1.34 -r1.35
*** nokia.c 7 Oct 2003 22:08:36 -0000 1.34
--- nokia.c 24 Oct 2003 12:49:05 -0000 1.35
***************
*** 508,513 ****
--- 508,516 ----
gn_ringtone_note *note;
int notes[] = {0, 1, 2, 3, 4, 6, 7, 8, 9, 10, 11, 12};
+ int dct4, base;
ringtone->tempo = 120;
+ dct4 = 0;
+ base = 114;
recode:
***************
*** 564,567 ****
--- 567,573 ----
/* unknown */
+ } else if (c == 0x02) {
+ /* unknown */
+
} else if (c == 0x05) {
/* begin repeat */
***************
*** 593,597 ****
gn_ringtone_set_duration(ringtone, note -
ringtone->notes, 8000 * p);
! } else if (114 <= c && c <= 161) {
/* normal tone */
if (c == lastc) {
--- 599,603 ----
gn_ringtone_set_duration(ringtone, note -
ringtone->notes, 8000 * p);
! } else if (66 <= c && c <= 161) {
/* normal tone */
if (c == lastc) {
***************
*** 605,629 ****
}
! note->note = 14 * ((c - 114) / 12) + notes[(c - 114) %
12];
! gn_ringtone_set_duration(ringtone, note -
ringtone->notes, 8000 * p);
!
! } else if (66 <= c && c <= 113) {
! /*
! * FIXME:
! * octave(s) below limit! we should be more
! * intelligent in the future -- bozo
! */
!
! if (c == lastc) {
! lastp += p;
! p = lastp;
} else {
! if (ringtone->notes_count >=
GN_RINGTONE_MAX_NOTES) return GN_ERR_INVALIDSIZE;
! note = ringtone->notes +
ringtone->notes_count++;
! lastc = c;
! lastp = p;
}
-
- note->note = notes[(c - 66) % 12];
gn_ringtone_set_duration(ringtone, note -
ringtone->notes, 8000 * p);
--- 611,624 ----
}
! if (c < base) {
! if (!dct4) {
! dct4 = 1;
! base = 90;
! goto recode;
! }
! note->note = notes[(c - 66) % 12];
} else {
! note->note = 14 * ((c - base) / 12) + notes[(c
- base) % 12];
}
gn_ringtone_set_duration(ringtone, note -
ringtone->notes, 8000 * p);
***************
*** 668,677 ****
}
! gn_error pnok_ringtone_to_raw(char *raw, int *rawlen, const gn_ringtone
*ringtone)
{
! int i, c, p, l, freq;
int rleft, vtime, vstat;
const gn_ringtone_note *note;
! char header[] = {0x00, 0x0a, 0x01};
char tailer[] = {0x0a, 0x0a, 0x0a, 0xfe, 0x40, 0x20, 0x07, 0x0b, 0xff,
0xff, 0xff, 0xff};
char vibr_on[] = {0x0a, 0x01};
--- 663,672 ----
}
! gn_error pnok_ringtone_to_raw(char *raw, int *rawlen, const gn_ringtone
*ringtone, int dct4)
{
! int i, c, p, l, freq, base;
int rleft, vtime, vstat;
const gn_ringtone_note *note;
! char header[] = {0x00, 0x02, 0xfc, 0x0a, 0x01};
char tailer[] = {0x0a, 0x0a, 0x0a, 0xfe, 0x40, 0x20, 0x07, 0x0b, 0xff,
0xff, 0xff, 0xff};
char vibr_on[] = {0x0a, 0x01};
***************
*** 682,685 ****
--- 677,681 ----
vtime = 0;
vstat = 1;
+ base = dct4 ? 90 : 114;
if (rleft < sizeof(header)) return GN_ERR_MEMORYFULL;
***************
*** 706,710 ****
p++;
} else {
! c = 12 * (note->note / 14) + notes[note->note % 14] +
114;
}
while (p > 1) {
--- 702,706 ----
p++;
} else {
! c = 12 * (note->note / 14) + notes[note->note % 14] +
base;
}
while (p > 1) {
Index: nk6510.c
===================================================================
RCS file: /cvsroot/gnokii/gnokii/common/phones/nk6510.c,v
retrieving revision 1.125
retrieving revision 1.126
diff -C2 -d -r1.125 -r1.126
*** nk6510.c 23 Oct 2003 00:35:01 -0000 1.125
--- nk6510.c 24 Oct 2003 12:49:05 -0000 1.126
***************
*** 123,126 ****
--- 123,128 ----
static gn_error NK6510_GetRingtone(gn_data *data, struct gn_statemachine
*state);
static gn_error NK6510_SetRingtone(gn_data *data, struct gn_statemachine
*state);
+ static gn_error NK6510_DeleteRingtone(gn_data *data, struct gn_statemachine
*state);
+ static gn_error NK6510_PlayTone(gn_data *data, struct gn_statemachine *state);
static gn_error NK6510_GetProfile(gn_data *data, struct gn_statemachine
*state);
static gn_error NK6510_SetProfile(gn_data *data, struct gn_statemachine
*state);
***************
*** 160,163 ****
--- 162,166 ----
static gn_error NK6510_IncomingWAP(int messagetype, unsigned char *message,
int length, gn_data *data, struct gn_statemachine *state);
static gn_error NK6510_IncomingToDo(int messagetype, unsigned char *message,
int length, gn_data *data, struct gn_statemachine *state);
+ static gn_error NK6510_IncomingSound(int messagetype, unsigned char *message,
int length, gn_data *data, struct gn_statemachine *state);
#ifdef SECURITY
***************
*** 197,200 ****
--- 200,204 ----
{ NK6510_MSG_WAP, NK6510_IncomingWAP },
{ NK6510_MSG_TODO, NK6510_IncomingToDo },
+ { NK6510_MSG_SOUND, NK6510_IncomingSound },
{ 0, NULL }
};
***************
*** 364,367 ****
--- 368,375 ----
case GN_OP_GetRingtoneList:
return NK6510_GetRingtoneList(data, state);
+ case GN_OP_DeleteRingtone:
+ return NK6510_DeleteRingtone(data, state);
+ case GN_OP_PlayTone:
+ return NK6510_PlayTone(data, state);
default:
return GN_ERR_NOTIMPLEMENTED;
***************
*** 2496,2505 ****
/* set raw ringtone result */
case 0x0f:
! if (message[4] == 0x00 && message[5] == 0x00) {
! break;
! } else if (message[4] == 0x03 || message[5] == 0x00) {
! /* FIXME: some kind of ringtone error */
! return GN_ERR_UNKNOWN;
! } else return GN_ERR_UNHANDLEDFRAME;
break;
--- 2504,2524 ----
/* set raw ringtone result */
case 0x0f:
! if (message[5] != 0x00) return GN_ERR_UNHANDLEDFRAME;
! switch (message[4]) {
! case 0x00: break;
! case 0x03: return GN_ERR_INVALIDLOCATION;
! default: return GN_ERR_UNHANDLEDFRAME;
! }
! break;
!
! /* delete ringtone result */
! case 0x11:
! if (message[5] != 0x00) return GN_ERR_UNHANDLEDFRAME;
! switch (message[4]) {
! case 0x00: break;
! case 0x03: return GN_ERR_INVALIDLOCATION;
! case 0x0a: return GN_ERR_EMPTYLOCATION;
! default: return GN_ERR_UNHANDLEDFRAME;
! }
break;
***************
*** 2551,2563 ****
static gn_error NK6510_SetRawRingtone(gn_data *data, struct gn_statemachine
*state)
{
! unsigned char req[32768] = {FBUS_FRAME_HEADER, 0x0e, 0x7f, 0xff, 0xfe};
unsigned char *pos;
if (!data->ringtone || !data->raw_data) return GN_ERR_INTERNALERROR;
- /* FIXME: where is the location field? */
- if (data->ringtone->location < 0) data->ringtone->location =
NK6510_RINGTONE_USERDEF_LOCATION;
dprintf("Setting raw ringtone %d...\n", data->ringtone->location);
! pos = req + 7;
*pos = strlen(data->ringtone->name);
char_unicode_encode(pos + 1, data->ringtone->name, *pos);
--- 2570,2589 ----
static gn_error NK6510_SetRawRingtone(gn_data *data, struct gn_statemachine
*state)
{
! unsigned char req[32768] = {FBUS_FRAME_HEADER, 0x0e, 0x00, 0x00, 0xfe};
unsigned char *pos;
if (!data->ringtone || !data->raw_data) return GN_ERR_INTERNALERROR;
dprintf("Setting raw ringtone %d...\n", data->ringtone->location);
!
! pos = req + 4;
! if (data->ringtone->location < 0) {
! *pos++ = 0x7f;
! *pos++ = 0xff;
! } else {
! *pos++ = data->ringtone->location / 256;
! *pos++ = data->ringtone->location % 256;
! }
! pos++;
*pos = strlen(data->ringtone->name);
char_unicode_encode(pos + 1, data->ringtone->name, *pos);
***************
*** 2611,2615 ****
d.raw_data = &rawdata;
! if ((err = pnok_ringtone_to_raw(rawdata.data, &rawdata.length,
data->ringtone)) != GN_ERR_NONE)
return err;
--- 2637,2641 ----
d.raw_data = &rawdata;
! if ((err = pnok_ringtone_to_raw(rawdata.data, &rawdata.length,
data->ringtone, 1)) != GN_ERR_NONE)
return err;
***************
*** 2617,2620 ****
--- 2643,2663 ----
}
+ static gn_error NK6510_DeleteRingtone(gn_data *data, struct gn_statemachine
*state)
+ {
+ unsigned char req[] = {FBUS_FRAME_HEADER, 0x10, 0x00, 0x00};
+
+ if (!data->ringtone) return GN_ERR_INTERNALERROR;
+
+ if (data->ringtone->location < 0) {
+ req[4] = 0x7f;
+ req[5] = 0xfe;
+ } else {
+ req[4] = data->ringtone->location / 256;
+ req[5] = data->ringtone->location % 255;
+ }
+
+ SEND_MESSAGE_BLOCK(NK6510_MSG_RINGTONE, 6);
+ }
+
/*************/
***************
*** 3873,3876 ****
--- 3916,3974 ----
dprintf("Setting ToDo\n");
SEND_MESSAGE_BLOCK(NK6510_MSG_TODO, 10 + strlen(data->todo->text) * 2);
+ }
+
+ /********************/
+ /****** SOUND *******/
+ /********************/
+
+ static gn_error NK6510_IncomingSound(int messagetype, unsigned char *message,
int length, gn_data *data, struct gn_statemachine *state)
+ {
+ switch (message[3]) {
+ /* response to init1 - meaning unknown */
+ case 0x01:
+ case 0x02:
+ break;
+
+ /* buzzer on/off - meaning unknown */
+ case 0x14:
+ case 0x15:
+ case 0x16:
+ break;
+
+ default:
+ return GN_ERR_UNHANDLEDFRAME;
+ }
+
+ return GN_ERR_NONE;
+ }
+
+ static gn_error NK6510_PlayTone(gn_data *data, struct gn_statemachine *state)
+ {
+ unsigned char init1[] = {0x00, 0x06, 0x01, 0x00, 0x07, 0x00};
+ unsigned char init2[] = {0x00, 0x06, 0x01, 0x14, 0x05, 0x05, 0x00, 0x00,
+ 0x00, 0x01, 0x03, 0x08, 0x05, 0x00, 0x00, 0x08,
+ 0x00, 0x00};
+ unsigned char req[] = {0x00, 0x06, 0x01, 0x14, 0x05, 0x04, 0x00, 0x00,
+ 0x00, 0x03, 0x03, 0x08, 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x03, 0x08, 0x01, 0x00,
+ 0x00, 0x00, /* frequency */
+ 0x00, 0x00, 0x03, 0x08, 0x02, 0x00, 0x00,
+ 0x05, /* volume */
+ 0x00, 0x00};
+ gn_error err;
+
+ if (!data->tone) return GN_ERR_INTERNALERROR;
+
+ if (sm_message_send(6, 0x0b, init1, state)) return GN_ERR_NOTREADY;
+ if ((err = sm_block(NK6510_MSG_SOUND, data, state)) != GN_ERR_NONE)
return err;
+ if (sm_message_send(18, 0x0b, init2, state)) return GN_ERR_NOTREADY;
+ if ((err = sm_block(NK6510_MSG_SOUND, data, state)) != GN_ERR_NONE)
return err;
+
+ req[31] = data->tone->volume;
+ req[22] = data->tone->frequency / 256;
+ req[23] = data->tone->frequency % 255;
+
+ dprintf("Playing tone\n");
+ SEND_MESSAGE_BLOCK(NK6510_MSG_SOUND, 34);
}
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- gnokii/common/phones nk6100.c, 1.154, 1.155 nk6510.c, 1.125, 1.126 nokia.c, 1.34, 1.35,
BORBELY Zoltan <address@hidden> <=